El ZX Spectrum puede usarse para escribir programas nada más

Anuncio
El ZX Spectrum puede usarse para escribir programas nada más encender el ordenador. Para hacer una prueba rápida, enciende el
ordenador, y en el menú de arranque elije +3 BASIC usando los cursores y la tecla ENTER.
El ordenador está listo para recibir instrucciones en lenguaje BASIC. Por ejemplo, para escribir un programa que muestre centrando
en la pantalla el texto “Hola mundo” en color amarillo sobre fondo azul, escribe estas líneas:
10
20
30
40
50
BORDER 1 (pone el borde de color azul)
PAPER 1 (pone el color de fondo en azul)
INK 6 (pone el color de primer plano en amarillo)
CLS (borra la pantalla)
PRINT AT 11,10;”Hola, mundo!” (escribe el mensaje en las coordenadas 11,10)
Cada línea tiene un número de línea que hay que teclear. Por costumbre, se emplea una numeración de 10 en 10, así si necesitamos
escribir una línea que vaya entre otras dos que ya existen, basta con asignarle un número de línea intermedio entre esas dos. El
programa se ordena en pantalla según el número de línea, así que se pueden teclear las líneas en el orden que se quiera, ya que el
ordenador las pondrá en su sitio. Cada línea se termina pulsando ENTER. No se pone punto y coma detrás de cada línea, como se
hace en C o JAVA. Se pueden poner varias órdenes en la misma línea separando una orden de la anterior mediante el símbolo : (dos
puntos). Por ejemplo, así:
10 BORDER 1: PAPER 1: INK 6: CLS: PRINT AT 11,10;”Hola, mundo!”
Para ver el código del programa teclear:
LIST
Y para ejecutarlo, teclear:
RUN
Como ejemplo, prueba a teclear el siguiente programa. Tal vez te suene la mecánica de este juego de otro donde hay pájaros que se
lanzan sobre cabezas de cerdos ;) Si quieres ampliar el programa, o probar otras órdenes, un voluntario de Imaginática de podrá
prestar el manual de BASIC del ZX Spectrum.
10 BORDER 0: PAPER 0: INK 7: CLS (pantalla negra)
20 LET xt=15+RND*16: LET yt=10+RND*11 (xt,yt coordenadas del objetivo, aleatorias)
30 LET tiros=1
40 CLS : PRINT AT yt,xt;INK 4;BRIGHT 1;"O" (pintamos el objetivo)
50 PRINT AT 21,0;"/" (pintamos el cañón)
60 PRINT AT 0,0;"Tiros gastados: ";INK 5;tiros,, (marcador)
70 INPUT "Velocidad (0-200)? ";v
80 INPUT "Angulo (0-90)? ";a
90 LET a=a*PI/180
100 LET vx=v*COS a: LET vy=v*SIN a
110 LET t=0: LET ax=0: LET ay=-9.8 (iniciamos variables físicas: velocidad, aceleración, etc.)
120 LET xb=8: LET yb=8
130 PLOT INK 6;BRIGHT 1;xb,yb (dibujamos proyectil)
140 LET xb=8+vx*t+ax*t*t
150 LET yb=8+vy*t+ay*t*t (actualizamos posición del proyectil)
160 LET t=t+0.1: BEEP 0.01,yb/3 (el tiempo avanza…)
170 IF xb>255 OR yb>175 OR yb<0 THEN PRINT AT 0,0; INVERSE 1;"Tiro fallido. Prueba de
nuevo": PAUSE 0: LET tiros=tiros+1: GO TO 50 (si el proyectil se sale de la pantalla, tiro fallido)
180 IF ABS (xb-xt*8)>8 OR ABS (yb-(21-yt)*8)>8 THEN GO TO 130 (si no se alcanzó el objetivo, seguir
dibujando)
190 PRINT AT 0,0; FLASH 1;"Objetivo alcanzado en ";tiros;" tiros": DRAW 8,8,59^3*PI:
PAUSE 0: RUN
Ejemplos de programación BASIC para microordenadores. ©2011 Miguel Angel Rodríguez Jódar.
Dpto. Arquitectura y Tecnología de Computadores.
Universidad de Sevilla.
Algunas particularidades del BASIC del Spectrum.
Dentro de un programa. para asignar un valor a una variable, por ejemplo, asignar a la variable x el resultado de multiplicar a por 3.5
y sumarle b:
LET x=a*3.5+b
Si queremos preguntar por tecleado un valor para una variable, hacemos así:
INPUT “Cual es el valor de X? “;x
Para ejecutar una serie de órdenes en función de que una condición sea cierta se usa IF, así:
10 IF nota>=5 THEN PRINT “Has aprobado!”: GO TO 120
20 PRINT “Has suspendido :(“
30 (resto del programa…)
Para hacer un bucle usamos FOR, así:
10
20
30
40
50
INPUT “Dame un numero para la tabla: “;n
PRINT “Tabla de multiplicar del “;n
FOR i=1 TO 10
PRINT n;” X “;i;” = “;n*i
NEXT i
Si queremos que el ordenador toque un sonido, podemos usar dos órdenes:
BEEP dur,nota
Hace que el ordenador toque una nota durante “dur” segundos (puede tener decimales) y de altura tonal “nota”. El DO central es el 0,
y la máxima altura tonal es 69.
Si queremos usar polifonía, se hace con la orden PLAY. Por ejemplo:
PLAY “c”,”e”,”g”
Toca un acorde de DO mayor (DO-MI-SOL)
Los colores se codifican con un número del 0 al 7. La correspondencia es la siguiente:
0
1
2
3
4
5
6
7
Negro
Azul
Rojo
Magenta
Verde
Cyan
Amarillo
Blanco
Se pueden dibujar gráficos con bastante facilidad. Para ello se usan las siguientes órdenes:
PLOT x,y : dibuja un punto en las coordenadas x,y (0-255,0-175)
DRAW x,y : dibuja una línea desde el último punto dibujado, desplazando x píxeles en horizontal e y píxeles en vertical.
CIRCLE x,y,c : dibuja un círculo con el centro en las coordenadas x,y y centro c.
Por ejemplo:
10
20
30
40
CLS (borra la pantalla)
PLOT 128,88: DRAW 40,0: DRAW 0,40: DRAW -40,0: DRAW 0,-40 (dibuja un cuadrado)
DRAW 40,40: PLOT 128,48: DRAW 40,-40 (dibuja las dos diagonales del cuadrado)
CIRCLE 148,108,20 (dibuja un círculo inscrito en el cuadrado)
Si quieres seguir haciendo programas para este microordenador, puedes usar alguno de los múltiples emuladores que hay de ZX
Spectrum para Windows, MacOS o Linux. Entre ellos: ZXSpin, FUSE, o Spectaculator.
Ejemplos de programación BASIC para microordenadores. ©2011 Miguel Angel Rodríguez Jódar.
Dpto. Arquitectura y Tecnología de Computadores.
Universidad de Sevilla.
El Commodore 64 puede usarse para escribir programas nada más encender el ordenador. Para hacer una prueba rápida, enciende el
ordenador, y cuando aparezca el mensaje READY, ya está listo para recibir un programa. Por defecto, el teclado está en mayúsculas.
Esto no supone ningún problema por lo general, ya que las órdendes las acepta tanto en mayúsculas como en minúsculas.
Por ejemplo, para escribir un programa que muestre 10 veces el mensaje “Hola, mundo!” en la pantalla, escribir esto (RETURN
después de terminar cada línea):
10
20
30
40
PRINT CHR$(147) (borra la pantalla)
FOR I=1 TO 10
PRINT “Hola, mundo!”
NEXT I
Cada línea tiene un número de línea que hay que teclear. Por costumbre, se emplea una numeración de 10 en 10, así si necesitamos
escribir una línea que vaya entre otras dos que ya existen, basta con asignarle un número de línea intermedio entre esas dos. El
programa se ordena en pantalla según el número de línea, así que se pueden teclear las líneas en el orden que se quiera, ya que el
ordenador las pondrá en su sitio. Cada línea se termina pulsando RETURN. No se pone punto y coma detrás de cada línea, como se
hace en C o JAVA. Se pueden poner varias órdenes en la misma línea separando una orden de la anterior mediante el símbolo : (dos
puntos). Por ejemplo, así:
10 PRINT CHR$(147): FOR I=1 TO 10: PRINT “Hola, mundo!”: NEXT I
Para ver el código del programa teclear:
LIST
Y para ejecutarlo, teclear:
RUN
El siguiente programa que te invitamos a teclear permite hacer uso de una de las características más destacadas del C64: los sprites.
Un “sprite” es un objeto que puede ser movido en pantalla a voluntad del programa, y de forma independiente de lo que haya escrito
en ella. En este ejemplo, el sprite es un globo con el símbolo de Commodore (la C) en el centro, que se mueve por toda la pantalla. Es
el ejemplo de la página 68 del manual de programación de BASIC del C64, que puedes pedir prestado a un voluntario de Imaginática
si quieres ampliar o comprender qué hace el programa:
5 print chr$(147)
10 v=53248 (direccion base registros chip de video)
11 poke v+21,4 (alzamos bit 2, para indicar que usaremos el sprite 2)
12 poke 2042,13 (iniciar almacenamiento en memoria del sprite 2)
20 for n=0 to 62:read q:poke 832+n,q:next n (se leen los
63 bytes que componen el sprite y se envían a la memoria del chip de video con
POKE)
30 x=24:y=50:dx=1:dy=1
40 poke v+4,x and 255:poke v+5,y (se posiciona el sprite en las
coordenadas x,y)
45 poke v+16,x/256*4
50 x=x+dx:if x=24 or x=319 then dx=-dx
60 y=y+dy:if y=50 or y=226 then dy=-dy
70 goto 40
200 data 0,127,0,1,255,192,3,255,224,3,231,224
210 data 7,217,240,7,223,240,7,217,240,3,231,224
220 data 3,255,224,3,255,224,2,255,160,1,127,64
230 data 1,62,64,0,156,128,0,156,128,0,73,0,0,73,0
240 data 0,62,0,0,62,0,0,62,0,0,28,0
El sprite es un gráfico de 24 pixels de ancho por 21 de alto. Ocupa pues 63 bytes en memoria. Esos 63 bytes son los datos que
aparecen en las líneas 200 en adelante.
Se puede cambiar el sprite del globo por otro cualquiera. No hay más que dibujar el gráfico que queramos usar en una rejilla de
24x21, y pasar los datos de la rejilla en binario, a decimal. Por ejemplo, si queremos poner el logo del 25 aniversario, lo dibujamos en
la rejilla. Ahora, comenzando por la primera línea, traducimos cada secuencia de 8 píxeles horizontales a un número binario en donde
un pixel negro es un 1, y uno blanco es un 0. El resultado, un byte, se transforma a decimal.
Así, los seis primeros valores que habría que poner en los DATA’s y que corresponden a las dos primeras líneas del sprite del logo 25
aniversario, son:
200 DATA 0,192,0,3,240,0,… resto de números….
Ejemplos de programación BASIC para microordenadores. ©2011 Miguel Angel Rodríguez Jódar.
Dpto. Arquitectura y Tecnología de Computadores.
Universidad de Sevilla.
Algunas particularidades del BASIC del Commodore 64.
Para ejecutar una serie de órdenes en función de que una condición sea cierta se usa IF, así:
10 IF nota>=5 THEN PRINT “Has aprobado!”: GO TO 120
20 PRINT “Has suspendido :(“
30 (resto del programa…)
Para hacer un bucle usamos FOR, así:
10
20
30
40
50
INPUT “Numero para la tabla“;n
PRINT “Tabla de multiplicar del “;n
FOR i=1 TO 10
PRINT n;” X “;i;” = “;n*i
NEXT i
Si queremos tener una serie de datos con la idea de ir leyéndolos de forma secuencial (parecido a tener un pequeño fichero de acceso
secuencial, pero en memoria) se usa DATA, READ y RESTORE. Mirar como se usa en el programita de ejemplo.
DATA contiene números separados por comas.
READ va leyendo secuencialmente números almacenados en líneas DATA consecutivas. Cuando se llega al final y se intenta leer más
datos se produce un error.
RESTORE restaura el puntero de datos al principio. Es equivalente a “rebobinar” el fichero.
El BASIC del C64 es muy limitado en cuanto a órdenes. Tiene pocas en comparación con otras versiones de BASIC. Los usuarios que
empezaban con BASIC, al poco se pasaban al lenguaje máquina, que permite sacar mucho más partido del ordenador. Para hacer algo
vistoso en BASIC había que usar mucho la orden POKE, que escribe a bajo nivel en la memoria y registros de E/S del ordenador.
Por otro lado, el manual de programación trae muchos ejemplos de cómo usar cada una de las características del micro. En el ejemplo
hemos usado los sprites, pero este microordenador es aún más famoso por su chip de sonido, que hoy día se sigue utilizando en
estudios de música, y como parte de racks MIDI.
La edición de líneas en este ordenador es un poco enfarragosa. Se usan los cursores para mover el cuadrado de posición de texto. Si se
escribe, no se inserta, sino que se sobreescribe sobre lo que ya hay. Si se quiere “abrir hueco” se pulsa SHIFT + INS/DEL.
Hay que tener en cuenta que, después de todo, el intérprete de BASIC ocupa solamente 8KB.
Si quieres seguir haciendo programas para este microordenador, puedes usar alguno de los emuladores que hay de Commodore 64
para Windows, MacOS o Linux. Entre ellos está el VICE, en sus múltiples ports para diferentes sistemas operativos (la versión de
Windows se llama WinVICE)
Ejemplos de programación BASIC para microordenadores. ©2011 Miguel Angel Rodríguez Jódar.
Dpto. Arquitectura y Tecnología de Computadores.
Universidad de Sevilla.
El MSX puede usarse para escribir programas nada más encender el ordenador. Para hacer una prueba rápida, retira el cartucho de
juegos, si lo hubiera, y enciende el ordenador. Ya está listo para recibir instrucciones en lenguaje BASIC. Por ejemplo, para escribir
un programa que muestre centrando en la pantalla el texto “Hola mundo” en color amarillo sobre fondo azul, escribe estas líneas:
10
20
30
40
50
COLOR 11,4,4 (color de primer plano amarillo, de fondo azul, y de borde azul)
CLS
KEY OFF (borramos la lista de órdenes rápidas)
LOCATE 11,14 (centro de la pantalla)
PRINT ”Hola, mundo!”
Cada línea tiene un número de línea que hay que teclear. Por costumbre, se emplea una numeración de 10 en 10, así si necesitamos
escribir una línea que vaya entre otras dos que ya existen, basta con asignarle un número de línea intermedio entre esas dos. El
programa se ordena en pantalla según el número de línea, así que se pueden teclear las líneas en el orden que se quiera, ya que el
ordenador las pondrá en su sitio. Cada línea se termina pulsando ENTER. No se pone punto y coma detrás de cada línea, como se
hace en C o JAVA. Se pueden poner varias órdenes en la misma línea separando una orden de la anterior mediante el símbolo : (dos
puntos). Por ejemplo, así:
10 COLOR 11,4,4: CLS: KEY OFF: LOCATE 11,14: PRINT ”Hola, mundo!”
Para ver el código del programa teclear:
LIST
Y para ejecutarlo, teclear:
RUN
El BASIC del MSX permite usar de forma muy cómoda los recursos del micro. Como prueba de ello, teclea este programa de poco
más de 30 líneas y ejecútalo. Las órdenes pueden escribirse en minúsculas o mayúsculas. Tu nave se mueve con los cursores derechaizquierda, y el disparo es la barra espaciadora.
Compara la forma en la que se gestionan los sprites en este micro con la forma en la que se hace en el Commodore 64. El MSX
permite usar desde BASIC interrupciones. El ejemplo a continuación usa dos de ellas: interrupción cuando se pulsa la tecla de
disparo, e interrupción cuando dos sprites colisionan.
10 SCREEN 2:COLOR 15,1,1:KEY OFF:CLS (pantalla gráfica, en negro)
20 FOR N=0 TO 100:PSET (RND(1)*255,RND(1)*191):NEXT N (pintamos 100 estrellas)
30 FOR SP=1 TO 3 (este bucle inicializa 3 sprites)
40 SPR$=""
50 FOR I=1 TO 8: READ A: SPR$=SPR$+CHR$(A):NEXT I (aquí se crea la variable de cadena con los datos de un sprite)
60 SPRITE$(SP)=SPR$ (que es asignado al sprite correspondiente)
70 NEXT SP
80 X=0: Y=0: DX=2: DY=2
90 XB=128:YB=180
100 TIRO=0:XT=0:YT=0
110 ON STRIG GOSUB 290 (si se pulsa la tecla disparo en cualquier momento, ir a la línea 290)
120 ON SPRITE GOSUB 250 (si se detecta colisión entre sprites, ir a la línea 250)
130 SPRITE ON (activamos interrupción por colisión de sprites)
140 STRIG(0) ON (activamos interrupción por pulsación del disparo)
150 PUT SPRITE 0,(X,Y),7,1 (sprite del ovni enemigo)
160 PUT SPRITE 1,(XB,YB),2,2 (sprite de nuestra nave)
170 X=X+DX: Y=Y+DY (el ovni enemigo se mueve en diagonal por la pantalla)
180 IF X>248 OR X<0 THEN DX=-DX
190 IF Y>88 OR Y<0 THEN DY=-DY
200 DIR=STICK(0) (leemos los cursores)
210 IF DIR=7 AND XB>0 THEN XB=XB-2 (y actualizamos la posición de nuestra nave)
220 IF DIR=3 AND XB<248 THEN XB=XB+2
230 IF TIRO THEN PUT SPRITE 2,(XT,YT),15,3:YT=YT-2:IF YT<-8 THEN TIRO=0 (si se ha pulsado el disparo,
ir dibujando el proyectil)
240
250
260
270
280
290
GOTO 150
PLAY "L16o4cdefgabo5c" (sonido de ovni alcanzado)
FOR N=0 TO 128:COLOR ,,N MOD 16:NEXT N:COLOR ,,1 (efecto de color con el borde)
PUT SPRITE 2,(-8,-8),15,3: TIRO=0 (escondemos proyectil)
RETURN
IF TIRO=0 THEN TIRO=1:XT=XB:YT=YB-8:PLAY "L64o8co7ba#ag#gf#fed#dc#c" (se señaliza que hay un
disparo en marcha y se reproduce el efecto de sonido del disparo)
300
310
320
330
RETURN
DATA &h18,&h3c,&h66,&hdb,&he7,&h7e,&h24,&h42 (sprite del ovni)
DATA 16,16,16,255,255,255,255,255 (sprite de nuestra nave)
DATA 0,0,16,16,16,16,0,0 (sprite del proyectil)
Ejemplos de programación BASIC para microordenadores. ©2011 Miguel Angel Rodríguez Jódar.
Dpto. Arquitectura y Tecnología de Computadores.
Universidad de Sevilla.
Algunas particularidades del BASIC del MSX.
El MSX tiene quizás uno de los BASIC’s más completos que se escribieron para microordenadores personales. Te habrás fijado que el
intérprete tiene copyright de Microsoft, y es que esta empresa estuvo en gran parte detrás del diseño y concepto del MSX. Hoy día se
mira “mal” a Microsoft, pero en la época del MSX, tener un micro con BASIC Microsoft era sinónimo de potencia y compatibilidad.
Si aprendiste BASIC en un PC, seguramente hayas aprendido una versión muy parecida del BASIC que tiene el MSX. Conceptos
como el de las órdenes rápidas en las teclas de función que tenía el IBM BASIC y el GW BASIC ya estaban en el BASIC del MSX.
Para ejecutar una serie de órdenes en función de que una condición sea cierta se usa IF, así:
10 IF nota>=5 THEN PRINT “Has aprobado!”: GO TO 120
20 PRINT “Has suspendido :(“
30 (resto del programa…)
Para hacer un bucle usamos FOR, así:
10
20
30
40
50
INPUT “Numero para la tabla“;n
PRINT “Tabla de multiplicar del “;n
FOR i=1 TO 10
PRINT n;” X “;i;” = “;n*i
NEXT i
El ejemplo de la página anterior usa sprites. El manejo de los mismos es muy sencillo:
-
Usando líneas DATA se crea una variable de cadena que contenga la ristra de bytes que compondrán el sprite. El MSX
soporta sprites de 8x8 píxeles y de 16x16 píxeles. En el ejemplo los hemos usado de 8x8, así que necesitamos 8 bytes.
-
Esa cadena se asigna a uno de los elementos del vector predefinido SPRITE$(n) donde n es el número de sprite que
queremos almacenar (0-255)
-
Cuando queramos pintar un sprite en una posición de pixel de pantalla haremos: PUT SPRITE p,(x,y),c,n donde p es
la prioridad del sprite (si se dibujará encima o debajo de otro), (x,y) son las coordenadas a dibujarlo (pueden ser negativas
para esconderlo) y n es el número de sprite definido.
Para incorporar sonido se usa PLAY. El sonido se reproduce en segundo plano. Por ejemplo:
PLAY “o4cdefgabo5c”
Toca una escala completa, en la octava central.
PLAY “c”,”e”,”g”
Toca un acorde de DO mayor.
Si queremos tener una serie de datos con la idea de ir leyéndolos de forma secuencial (parecido a tener un pequeño fichero de acceso
secuencial, pero en memoria) se usa DATA, READ y RESTORE. Mirar como se usa en el programita de ejemplo.
DATA contiene números separados por comas.
READ va leyendo secuencialmente números almacenados en líneas DATA consecutivas. Cuando se llega al final y se intenta leer más
datos se produce un error.
RESTORE restaura el puntero de datos al principio. Es equivalente a “rebobinar” el fichero.
Si quieres seguir haciendo programas para este microordenador, puedes usar alguno de los emuladores que hay de MSX para
Windows, MacOS o Linux. El más completo que conozco se llama BlueMSX.
Ejemplos de programación BASIC para microordenadores. ©2011 Miguel Angel Rodríguez Jódar.
Dpto. Arquitectura y Tecnología de Computadores.
Universidad de Sevilla.
Descargar