Índice de entradas
Esta serie de artículos han sido traducidos a partir del documento "How to
Write ZX Spectrum Games" con permiso de su autor, Jonathan Cauldwell, un gran
desarrollador de juegos para el Spectrum, os recomiendo
visitar su Web donde está
el texto original. El documento original, y por tanto esta traducción, tiene
© Jonathan Cauldwell y solo puede duplicarse con permiso expreso por escrito
de su autor.
Juegos que carguen y se ejecuten automáticamente
Aunque esto es bastante simple para un programador experimentado en Sinclair
BASIC, se trata de un área que se suele pasar por alto. En particular, los programadores
que se han pasado al Spectrum desde otras máquinas no estarán familiarizados
con la forma como se hace.
Para poder ejecutar una rutina en código de máquina tenemos que empezar desde
el BASIC. Usando este escribimos un pequeño programa cargador básico, que reserva sitio para el código máquina, carga dicho código y luego lo ejecuta. El tipo
más simple de cargador sería el contenido es estas líneas:
10 CLEAR 24575: LOAD ""CODE: RANDOMIZE USR 24576
El primer comando, CLEAR, establece la variable RAMTOP
por debajo de la zona ocupada por el código máquina, de modo que el
BASIC no lo sobrescriba. También borra la pantalla y mueve la pila fuera del
camino. El número que sigue por lo general debe estar un byte por debajo del
primer byte de tu juego. LOAD ""CODE carga el siguiente archivo
de código desde la cinta, y RANDOMIZE USR llama a la rutina
en código máquina en la dirección especificada, en este caso 24576. Este debe
ser el punto de entrada para tu juego. En un Spectrum, la ROM se encuentra en
los primeros 16K, y va seguido por varias cosas como la memoria de video, las
variables del sistema y del BASIC. Un lugar seguro para tu código es por encima
de esta zona, en cualquier lugar hasta el final de la RAM en la dirección 65535.
Solo con un pequeño cargador en BASIC a la dirección de inicio 24576, o incluso
24000, te dará un montón de espacio para su juego.
Este programa cargador se guarda a continuación en cinta con un comando como
este
SAVE "name" LINE 10
LINE 10 indica que cuando termine de cargar, el programa en
BASIC se auto-ejecuta desde la línea 10.
Después del cargador BASIC viene el archivo de código. Puedes guardar un archivo
de código así:
SAVE "name" CODE 24576,40960
CODE le dice al Spectrum que guarde un archivo de código,
en lugar de en BASIC. El primer número de después es la dirección de inicio
del bloque de código, y el último número es su longitud.
Esto es bastante simple, pero ¿y si queremos añadir una pantalla de carga? Bueno,
es bastante sencillo. Podemos cargar una pantalla utilizando
LOAD ""SCREEN$
Lo que esto va a hacer es cargar un bloque de código de 6912 bytes de longitud,
al inicio de la dirección de pantalla en 16384. Poner el archivo de pantalla
en memoria es un poco más complicado, ya que no podemos simplemente guardar
la pantalla como un archivo ya que las dos líneas de la
parte inferior se
pueden sobrescribir con mensajes del tipo "Start tape, then press any key".
Así que cargaremos nuestra imagen en otro punto de la memoria RAM, como 32768,
para a continuación utilizar
SAVE "name" CODE 32768,6912
6912 es el tamaño de la RAM de pantalla del Spectrum. Cuando volvemos a cargar el
bloque de cinta utilizando LOAD ""SCREEN$, estamos especificando
que queremos forzar a que el archivo de código se cargue en la memoria de pantalla.
En estas circunstancias, no importa donde se encontraba el archivo de código
cuando se guardó.
Ahora tenemos otro posible problema: ¿el mensaje Bytes: name que se
imprime antes de la carga del código no aparecerá tapando parte de nuestra pantalla?
Bueno, sí que lo hará. Podemos superar esto pokeando en el flujo de salida.
POKE 23739,111
Esto hará el truco para nosotros. Así que nuestro cargador BASIC ahora se ve
así:
10 CLEAR 24575: LOAD ""SCREEN$: POKE 23739,111: LOAD ""CODE: RANDOMIZE USR 24576
Excelente Truco, gracias por guardar este conocimiento!
ResponderEliminar