ZX-News #01: Intercambio de Experiencias: Creación de YES DEMO

INTERCAMBIO DE EXPERIENCIAS.

En esta sección se hablará sobre la creación del programa de demostración YES DEMO. Analizaremos todo el programa: desde los procedimientos auxiliares de BASIC hasta el cargador. Pero antes de estudiar el material que se presenta a continuación, ejecute este programa y estúdielo cuidadosamente en funcionamiento.

¡ATENCIÓN! Para entender el material, el lector debe tener ciertos conocimientos.

La elaboración de cualquier programa comienza con la planificación de la pantalla. En la pantalla, tanto como sea posible, no debe haber espacio vacío. La disposición de todos los elementos de la presentación debe seguir ciertas reglas (esto está relacionado, en particular, con la incómoda organización del área de atributos). Por ejemplo, el marco, así como la imagen en el centro, se encuentran estrictamente en las posiciones de caracteres. También debe señalarse que los elementos móviles del programa (indicadores, texto en movimiento, "YES" volador) no se superponen entre sí, ya que esto no está previsto. La presentación fue dibujada en ART STUDIO. El archivo en formato A.S. se llama SCREEN. Para reducir el volumen de memoria ocupado por la presentación, fue comprimido y se llama SCREEN+.

La longitud del archivo SCREEN+ es de 1562 bytes, mientras que el archivo SCREEN tiene una longitud de 6912 bytes. El generador de caracteres (fuente) también fue dibujado en ART STUDIO. La longitud del generador de caracteres es de 768 bytes (96 caracteres de ocho bytes cada uno). Este archivo se llama ABC.fnt. Ahora pasamos a considerar el bloque BASIC. Dado que la direccionamiento del área de pantalla ZX-SPECTRUM no es muy conveniente y el programa gastaría mucho tiempo en recalcular coordenadas, se crea una tabla de direcciones para el segundo tercio de la pantalla. Esta tabla se crea en las líneas 100 - 110 del programa BASIC (durante la ejecución de estas líneas, el programa muestra qué direcciones se están registrando en la tabla). La tabla contiene 64 direcciones de dos bytes y, por lo tanto, tiene una longitud de 128 bytes. El nombre del archivo de la tabla es TABL 01$.

Ahora un poco sobre el "YES" volador (en adelante sprite). La posición del sprite en la pantalla (horizontalmente) no se puede predecir, y por lo tanto fue dibujado (nuevamente en ART STUDIO, archivo SPRITE) en las ocho posiciones posibles. Cada sprite tiene un tamaño de 2 por 5 caracteres y una longitud de 80 bytes. Después de cada sprite va su máscara. La máscara es necesaria para que toda la vecindad del sprite permanezca intacta. La máscara corta un lugar para el sprite. Este truco, por cierto, se utiliza en todos los programas de juegos. Y nuevamente, los ocho sprites y máscaras están dispuestos de manera incómoda para su uso, por lo que mediante las líneas 10-40 del programa BASIC todo esto fue convertido a otro formato, guardado con el nombre SPRITE+.

El sprite se mueve a lo largo de una trayectoria elíptica. Calcular cada vez la siguiente coordenada de la trayectoria requeriría mucho tiempo de máquina, por lo que las líneas 200-210 de ese mismo programa BASIC crean una tabla de coordenadas de la trayectoria. En el programa considerado, la tabla de coordenadas contiene 101 coordenadas, definidas en el sistema X,Y. Así, la tabla ocupa 202 bytes. El signo de finalización de la tabla son dos ceros. La longitud final de la tabla es de 204 bytes, nombre ELIPS.

Para escribir el texto se utilizaron las líneas 300-380 del programa BASIC. Al final del texto hay un cero - signo de finalización. Todo el mensaje tiene una longitud de 516 bytes y se llama TEXT. La música fue escrita en el editor SOUND TRACKER. La longitud de la melodía es de 3336 bytes, dirección de colocación - 34458, nombre - MUSIC.

Pasamos a considerar la parte del código del programa. Si tiene la versión oficial de la revista, se adjuntó una impresión del ensamblador de la demostración al disco. La escritura del programa comenzó con la elaboración de procedimientos separados (en adelante p/p). Es conveniente escribir y depurar cada p/p por separado. Primero consideraremos el p/p del texto en movimiento, su inicio es la línea 1820. Al llamar a este p/p ocurre lo siguiente: 1. desplazamiento de toda la línea un píxel hacia la izquierda mediante el p/p SCROLL; 2. verificación del final del texto (1830-1900); 3. búsqueda del inicio de la letra en el generador de caracteres (1910-1960); 4. establecimiento de la dirección de salida del bit de la letra y la cantidad de líneas a mostrar (1970-1980); 5. salida de un bit de la letra (1990-2180); 5.1. verificación de cuánto se debe desplazar el byte de la letra (2000-2040); Contador de desplazamientos - SCHET7; 5.2. líneas 2060-2070 desplazamiento del byte; 5.3. salida inmediata del bit de la letra (2100-2140); 5.4. establecimiento de la siguiente dirección del área de pantalla (2150) y la siguiente dirección del byte de la letra (2160); 5.5. verificación del final de la salida del octavo bit de la letra (2170-2180); 6. verificación de SCHET7 en cero (2190-2210). Si no es cero, entonces SCHET7 = SCHET7 - 1 y salida (2280-2290). Si es cero, entonces se establece la siguiente dirección de la letra (2220-2240) y la variable SCHET7 (2250-2260).

El p/p SCROLL (1690-1810) comienza con el establecimiento de la dirección de la esquina superior derecha de la línea en movimiento y la cantidad de líneas a desplazar (1690-1700). Desplazamiento de la línea (1710-1800).

El siguiente p/p que se considerará será el p/p de dibujo de indicadores (2300-2680). El p/p utiliza el mismo fragmento (2470-2680) seis veces (para dibujar seis niveles de indicadores). Para el correcto funcionamiento de esta parte del p/p, se debe establecer en HL la dirección de la parte inferior del indicador, y en A el número del registro del coprocesador musical, del cual se debe leer la amplitud actual del canal. En las líneas (2300-2460) se establecen estos parámetros seis veces y se utiliza el fragmento INDIC. Las líneas 2470-2500 leen los valores de amplitud, y 2510-2670 dibujan directamente el indicador, con la altura indicada en el registro A.

El p/p de desplazamiento de color por el marco (2690-3140). Este p/p no se llama en cada interrupción, sino cada dos, ya que en la variable SCHET6 se establece un dos. Pero al inicio de la ejecución, en lugar de dos, hay un número 190 y por lo tanto el color comienza a mezclarse después de unos segundos. La mezcla ocurre así: desplazamiento a la derecha de la línea horizontal superior (2770-2810), desplazamiento hacia abajo de la vertical derecha (2850-2950), desplazamiento a la izquierda de la línea horizontal inferior (2970-3010), desplazamiento hacia arriba de la vertical izquierda (3070-3120).

El p/p de parpadeo de la imagen en el centro de la pantalla (3150-3330). Al inicio de este procedimiento hay un RET, pero se quita cuando comienza a mezclarse el color por el marco (2740). Sin embargo, después de reemplazar RET por NOP, el parpadeo no comenzará de inmediato, ya que en la variable SCHETS hay un número 190, y no 2.

En la variable (3450) se almacena el número de color con el que se pintará la imagen. El valor de esta variable cambia cíclicamente de 7 a 0. En las líneas 3280 - 3290 se establece la altura de la imagen B=5 y la dirección de la esquina superior izquierda. El procedimiento (3300-3420) realiza el llenado de un rectángulo de 5 por 7 caracteres.

Ahora sobre dos p/p que trabajan en pareja. Son RESTOR y WRITE. Estos dos p/p sirven para la salida del sprite que se mezcla. Este proceso se ve así: 1. Borrado de la "YES" previamente dibujada (RESTOR); 2. Salida del sprite en las nuevas coordenadas de la trayectoria (WRITE); 3. Delay y vuelta a 1.

Al inicio del p/p RESTOR (1080-1380) se establece la altura del sprite que se va a borrar (1080). En el ciclo (1090-1370) se repite lo siguiente: conversión de coordenadas, definidas en DE a la dirección (1110-1240) utilizando la tabla de direcciones del segundo tercio; búsqueda de la dirección del búfer (1250-1280), del cual se tomará la información para restaurar la pantalla; restauración de la línea en cinco bytes (1290-1320); incremento de la coordenada vertical (1340-1350); bucle hasta que se hayan restaurado todas las 16 líneas. El p/p WRITE tiene una estructura similar a la del p/p RESTOR. Igualmente, los datos de entrada son los registros del par DE con las coordenadas vertical y horizontal. Solo en las líneas 700-770 se calcula qué sprite de los ocho se utilizará, y luego todo sigue el mismo escenario. Las líneas 960-990 son la salida inmediata del sprite en la pantalla.

Y ahora el último y más simple p/p de procesamiento de interrupciones. El p/p comienza con la prohibición de interrupciones y la colocación de todos los registros en la pila (1390-1510). Luego se llaman a los p/p de mezcla de color, salida de la siguiente parte de la música y parpadeo (1520-1540). Después de esto, se restauran todos los registros, se permite la interrupción y se realiza el retorno del p/p. Ha llegado el momento de considerar el "núcleo" del programa (180 - 690). Al principio, se configura el programa para trabajar (180-340), es decir, inicialización de la música, limpieza y oscurecimiento de la pantalla, salida de la presentación, formación del búfer del segundo tercio de la pantalla, establecimiento de un nuevo generador de caracteres y parámetros de interrupción. Luego sigue el ciclo principal del programa (350 - 580):

1. Restauración de la parte de la pantalla sobre la que se superpuso el sprite (350-360);
2. Cálculo de la siguiente coordenada de la trayectoria (370-450);
3. Establecimiento de las coordenadas de la siguiente restauración (460);
4. Llamada a los p/p de dibujo del sprite de texto en movimiento e indicadores (470-490);
5. Delay y sincronización (500);
6. Establecimiento de la siguiente dirección de la tabla de trayectoria (510-540);
7. Verificación de la pulsación de la barra espaciadora. Si la barra espaciadora no está presionada, todo el proceso se repite desde el primer punto. Si la barra espaciadora está presionada, se produce el retorno de todos los parámetros del sistema (590-660) y se pasa a la dirección cero de la ROM TR-DOS (670-690), es decir, reinicio y lanzamiento del boot.

Después de ensamblar, el código máquina tiene una longitud de 660 bytes y una dirección de colocación de 37794, nombre CODE+. En el disco hay dos archivos: uno llamado CODE, que se puede cargar en GENS (que también se adjunta) y un archivo llamado CODE+, que ya está listo para usar.

Así que todo está listo para el funcionamiento de la demostración. Cargamos secuencialmente en la memoria los archivos:

dirección longitud nombre

Z0000 204 ELIPS
Z0204 128 TABL01$
Z0332 1280 SPRITE+
Z1612 768 ABC.fnt
Z2380 1562 SCREEN+
Z3994 516 TEXT
Z4458 3336 MUSIC
Z7794 660 CODE+

Descargamos el archivo desde la dirección Z0000, con una longitud de 8424 bytes (nombre LIBRARY), que incluye todo lo necesario para el funcionamiento. Ahora, si el archivo LIBRARY se carga en la dirección Z0000 y se ejecuta desde la dirección Z7794, la demostración comenzará a funcionar, pero de esta manera no es conveniente iniciar el programa, por lo que es necesario hacer un cargador. Haremos el cargador como un monobloque (un solo archivo). Para esto, cargamos el archivo de código GENS en la dirección Z0000; en BASIC escribimos dos líneas: 1 REM ... 2 RANDOMIZE USR VAL "23872". Bajo "..." entender 34 espacios (justo la cantidad de bytes necesarios para colocar el cargador). Ejecutamos GENS (RANDOMIZE USR 30000) y escribimos el programa del cargador:

10 ORG 23872
20 ENT $
30 LD SP,29999
40 XOR A
50 LD BC,6911
60 LD DE,16385
70 LD HL,16384
80 LD (HL),A
90 LDIR
100 OUT (254),A
110 LD BC,#2105
120 LD DE,(23796)
130 LD HL,30000
140 CALL 15635
150 JP 37794

Ensamblamos y salimos del ensamblador. Ahora en BASIC se puede ver que después de REM se ha escrito alguna tontería, esta es la parte de código máquina del cargador. Tomamos un disco limpio y en BASIC escribimos: RANDOMIZE USR 15619:REM:SAVE "YES DEMO" LINE 2.

Contenido de la publicación: ZX-News #01

  • Экспертиза
    Introducción al juego HERO QUEST-1, desarrollado por GREMLIN GRAPHICS LIMITED en 1991. El juego consiste en reunir objetos mágicos para detener las fuerzas del caos. Incluye descripciones de personajes e instrucciones de juego.
  • Pericia
    Reseña del juego Seymour at the Movies por Code Masters, continuando la serie Dizzy. El protagonista asume el papel de director de Hollywood. Publicado en ZX-News #01, 1995.
  • Дебют
    Jugabilidad de un elfo navegando laberintos, usando magia y hechizos para resolver acertijos. Se describen hechizos como LIGHTING, FIRE BALL y REVIVAL. Se discuten estrategias para recolectar insectos y usar objetos mágicos para avanzar.
  • Дебют
    Resumen de un juego lógico polaco de 1990 llamado LOGO. Descripción de mecánicas de juego y estrategias para completar niveles. Incluye lista de códigos de nivel para facilitar el progreso.
  • Задание
    Desafío de encontrar el Oscar en SEYMOUR AT THE MOVIE y contar pantallas en el laberinto de SPOOKED.
  • Фантазия
    Una novela informática basada en el juego 'Last Ninja 2' combina combate y acertijos. El protagonista, el samurái Uira, emprende una misión para recuperar una esfera de poder robada. La historia sigue sus aventuras a través de diversos obstáculos y enemigos.
  • Parada de Éxitos
    Análisis de programas populares entre usuarios de Spectrum en Lugansk. Destacan ELITE y juegos de aventura. Cambio hacia juegos inteligentes e interés por software de demostración musical.
  • Система
    Discusión de dos programas del sistema, ADM 7.08 para desensamblar programas y ADS 2.00p para gestión de disquetes. ADM es útil para la modificación y análisis de programas. ADS optimiza operaciones de la unidad de disco y repara sectores de disco.
  • Intercambio de Experiencias
    Una guía detallada sobre la creación de YES DEMO para ZX Spectrum, cubriendo todo desde procedimientos auxiliares básicos hasta cargadores. Las técnicas clave incluyen planificación de pantallas, manejo de sprites e integración de sonido. La demo combina programación en ensamblador y BASIC para una demostración efectiva.
  • Electrónica
    Descripción de un dispositivo para jugar juegos de 'twitch' con ilustración de esquema.
  • Publicidad
    Presentación de la revista ZX-News por el grupo ACTION con disculpas por errores y una propuesta para un club ZX-SPECTRUM en Lugansk.
  • Macro-Modem v2.1
    Introducción de Macro-Modem v2.1, un programa terminal para Vicomm. Las características incluyen manejo de archivos, soporte de macros y mejoras para Scorpion. Opera de forma autónoma durante el intercambio de archivos.
  • Enlight '96
    Cobertura de los participantes y resultados del evento Enlight '96, discutiendo los aspectos destacados de la demoparty en competencias de música y gráficos. Especulaciones sobre el futuro de las tecnologías de la escena demo y logros artísticos. Perspectivas sobre desafíos organizacionales y actuaciones notables.
  • FIDO
    El artículo trata sobre el papel de FIDO y la terminología en las comunicaciones por módem y el uso de BBS.
  • Авторы
    Detalles sobre los colaboradores de ZX-NEWS #02, métodos de distribución y contactos para envíos.
  • ¡Concurso!
    ZX-News extiende el concurso por tres números, animando a los participantes a enviar una partida guardada de UFO-2. El ganador se determina por el tiempo de juego más rápido. El premio es de 20 disquetes GMD-130 o TDK.
  • Anuncios
    El artículo detalla los anuncios de pago en ZX-News, incluyendo precios, métodos de contacto y ejemplos de anuncios actuales.
  • От редакции
    Reflexiones editoriales sobre comentarios de los lectores, mejoras de la revista y cambios en las secciones.
  • Cartas
    Discusión sobre el feedback de la demoparty Enlight a través de dos cartas contrastantes. Observaciones sobre preferencias de plataformas: Amiga, ZX Spectrum e IBM. Se destacan los desafíos en la organización de grandes eventos.
  • Parada de Éxitos
    Clasificación de los mejores juegos y demos según la demanda semanal. El enfoque está en títulos populares como 'UFO-2' y 'Vibration'. Refleja los intereses cambiantes de los entusiastas de ZX Spectrum.