El trabajo lo hace el gancho de la interrupción. En cada cuadro mete los bancos del sonido, llama al reproductor, le da sus pasos al scroll, corre los objetos y saca el buffer de sprites. Al bucle principal solo le queda la máquina de modos: título, demo, partida, pantalla de fase, fin de partida.
Las veintidós filas de treinta y dos casillas viven en 0xED00, no en la VRAM. En cada paso de scroll:
ldir de 0x1F bytes.outi, sin pasar por la BIOS.La columna que entra sale del guión de la fase: la distancia recorrida menos el principio del tramo, partida por cuatro, indexa renglones de seis números de pieza, y cada pieza son cuatro por cuatro caracteres. Cinco piezas dan veinte filas y la sexta da las dos últimas. Fuera del tramo, la columna es cielo: una estrella, en la fila que diga la tabla de 0x478E.
Hay dos juegos de piezas: el de 0x8000 del banco 11 y el de 0x8FF0. Las fases 5, 9, 10 y 12 usan el segundo.
Doce ranuras de 32 bytes en 0xE300, más ocho de 0x20 contadas hacia atrás en 0xE460 para los disparos con puntería, diez en 0xE500, cinco en 0xEB00 y ocho de 8 bytes en 0xE700 para el fondo. Dentro de una ranura:
| byte | qué es |
|---|---|
| 0 | el tipo, del 1 al 0x1F; a cero, la ranura está libre |
| 1 | por qué paso de su propia máquina va |
| 3, 4 | la fila, con su parte decimal |
| 5, 6 | la columna, con su parte decimal |
| 7, 8 | la velocidad vertical |
| 9, 10 | la velocidad horizontal |
| 11 | se dibuja con caracteres en vez de con un sprite |
| 12, 13 | el dibujo y su color |
| 0x17..0x1A | las dos aceleraciones |
| 0x1B | banderas: si se le puede disparar, si se dibuja |
saca_un_objeto (0x6A72) es la rutina más llamada del banco 1: se le entra con el tipo, dónde va y un byte de ajuste, y ella busca ranura libre, la rellena con la ficha de cuatro bytes de 0x6BA3 y sube la cuenta de vivos. Tres tipos se salen de lo normal: el 0x1E necesita tres ranuras seguidas, el 0x0E va a la otra tabla, y los demás a la de 0xE300.
Y después el tipo manda en dos tablas gemelas: p00:0x5DFD dice quién lo mueve y p01:0x6B46 quién acaba de montarlo. Veinte de los treinta y un tipos tienen en el banco 3 al menos una de las dos, y dieciséis las dos; por eso 0xA7B9..0xB537 es el trozo de código más largo del cartucho.
El byte de ajuste es la marca del bicho. Los dieciséis bytes de 0xA5C7 se leen en redondo: tres de cada cuatro salen con la marca a cero, uno de cada cuatro con un 1 y uno de cada dieciséis con un 2. Un bicho marcado se pinta del color 8, el rojo, y deja algo distinto al morir.
Cada tipo es una maquinita propia, y ninguno usa trigonometría. Algunas formas:
El banco 7 es el reproductor y el 8 los datos; la interrupción mete los dos y llama a 0x8063. Tres canales, cada uno una ficha de 0x11 bytes en 0xE010, 0xE021 y 0xE032, cada una recorriendo su propio flujo de mandos. Todo llega al PSG por la BIOS, con WRTPSG. La tabla de 0x8328 tiene ochenta punteros, uno por sonido; la entrada 0 no es una dirección, así que el sonido 0 no existe, y las tres últimas apuntan al primer byte de relleno del banco 8, o sea al silencio.
El MSX dibuja cuatro sprites por línea y tira el resto, siempre los últimos de la tabla. Por eso 0x47CE no sube el buffer de un tirón: lo sube en treinta y dos trozos de cuatro bytes, empezando cada cuadro por un sitio distinto — 0xE17F sube 0x1C y da la vuelta en 0x7C — y avanzando de 0x0C en 0x0C. Así cada objeto cae en una casilla distinta de la tabla de atributos en cada cuadro, y el parpadeo se reparte entre todos.