El cartucho

16384 bytes. Sin cargador y sin bloques: el MSX mapea el cartucho en 0x4000-0x7FFF —la página 1— y ese es el mapa de memoria entero, sin solapes: ninguna dirección significa dos cosas distintas en dos momentos distintos.

Por dónde entra

Los dieciséis primeros bytes son la cabecera que lee la BIOS:

41 42 77 40 00 00 00 00 00 00 00 00 00 00 00 00
'A' 'B'  \_ INIT = 0x4077

Las dos letras marcan un cartucho ejecutable; de los cuatro vectores solo está puesto INIT —STATEMENT, DEVICE y TEXT, los de BASIC, van a cero—.

Lo que hace el arranque

INIT (0x4077), por orden:

Esos dos bytes son el programa principal. El juego entero corre dentro de la interrupción, cincuenta o sesenta veces por segundo, y el programa ya no vuelve.

El candado

Como el juego es la interrupción, un fotograma que se pase de tiempo se reentraría a sí mismo. 0xE005 lo impide: el gancho (0x4038) lee el estado del VDP para bajar la petición, toca el sonido —siempre, antes que nada— y solo entonces mira el candado. Si está echado, eso es todo lo que hace esa interrupción (0x4067): la música sigue y al fotograma que aún corre no se le toca.

Dónde vive el estado

Todo lo que el juego guarda cabe en el kilobyte que empieza en 0xE000, con la pila encima, en 0xE400.

0xE000 / 0xE001el estado del juego, 0 a 19, y su subestado
0xE002las opciones: teclado, dos jugadores, partida en marcha, de quién es el turno
0xE005el candado: la interrupción está dentro
0xE008 / 0xE009lo pulsado el fotograma pasado y este, en formato de joystick
0xE010-0xE02Dlos tres canales de sonido, diez bytes cada uno
0xE038-0xE03Fla copia de los ocho registros del VDP
0xE040-0xE048el récord y los puntos de los dos jugadores, en BCD
0xE050-0xE06Fel jugador en juego: vidas, fase, SCENE, tiempo, sentido…
0xE080-0xE09Fla copia del otro jugador, que se intercambia en cada turno
0xE0B0-0xE12Flos 32 atributos de sprite, que suben enteros cada fotograma
0xE130-0xE14Flos contadores y las fases de las lianas y los surtidores
0xE134-0xE13Cel jugador: Y, X, pose, hacia dónde mira, su estado
0xE150-0xE155los seis bytes de parámetros que el motor de decorados copia de la ROM
0xE156 / 0xE158los obstáculos fijos de esta pantalla y los que se mueven
0xE18C-0xE1AElas X de los obstáculos y lo que vale cada uno
0xE200-0xE205el salto: qué arco, en qué sentido, cuántos fotogramas

La pantalla: los colores abajo y los patrones arriba

El VDP se programa con una tabla de ocho bytes en 0x4545, que se copia a 0xE038 y se manda registro a registro (0x4528):

registrovalorlo que dice
00x02modo gráfico 2
10xE216 KB, pantalla encendida, interrupciones, sprites de 16×16
20x0Ela tabla de nombres en 0x3800
30x7Fla tabla de colores en 0x0000
40x07la tabla de patrones en 0x2000
50x76los atributos de sprite en 0x3B00
60x03los patrones de sprite en 0x1800
70xE1el borde

Los colores abajo y los patrones arriba es justo al revés del reparto habitual, y es la razón de que todas las direcciones de este listado parezcan descolocadas si se leen esperando el otro.

En este modo la pantalla son tres tercios, cada uno con su banco de patrones y de colores, y el juego lo aprovecha: la fuente se carga una vez y se copia a los otros dos tercios (0x4583 y 0x4594), mientras que los tiles del decorado se cargan solo en el tercio donde se van a dibujar. La liana es el caso más claro: su fila de arriba se dibuja con los tiles 0xB0-0xB6, que están en el primer tercio, y todo lo de abajo con los 0x60-0x9B, que están en el de en medio.

Cómo están guardados los dibujos

Tres maneras, y cada una para lo que le va:

Dos de las llamadas más pequeñas, repetidas aquí: la tira de hierba de la fila 15 (0x5E71) y la tierra de las filas 16 a 19 (0x5CEA). Entre las dos, doce bytes de parámetros y dos listas cortas.

La tira de hierba de la fila 15

La tierra de las filas 16 a 19

Las mitades que miran a la izquierda no están guardadas. 0x5A4B le da la vuelta a los bits de un tile y 0x5A09 hace lo mismo cruzando las dos mitades de un sprite de 16×16, y las dos corren al cargar: el cartucho lleva 23 sprites y en la memoria de vídeo hay 46.

El reparto completo

Ni un byte sin dueño: 7.448 de código alcanzados por el trazador y 8.936 de datos, cada uno dentro de un rango declarado con la instrucción que lo lee anotada al lado.

0x4000-0x4010la cabecera
0x4010-0x4038las primitivas del VDP, y cuatro 0xFF de relleno
0x4038-0x4077la interrupción
0x4077-0x4149INIT, el bucle principal de dos bytes, el despachador, los mandos y un paso del juego
0x4149-0x4171la tabla de veinte estados
0x4171-0x4468los veinte estados: título, menú, demo, partida, muerte, game over, fase superada, cambio de pantalla
0x4468-0x44C8los créditos, en tiles
0x44C8-0x4626partida nueva, arranque del VDP y del PSG, las rutinas de copia y la cortinilla
0x4626-0x4795la carga de la fuente, los puntos, las vidas extra, el récord, el marcador y las vidas
0x4795-0x47FBla pantalla del título y sus columnas
0x47FB-0x48CEel logotipo ATHLETIC LAND, comprimido
0x48CE-0x4A4Elos 48 glifos de la fuente
0x4A4E-0x4B52los rótulos del marcador y las cuatro opciones del menú
0x4B52-0x4BD8la carga del logotipo KONAMI y el descompresor
0x4BD8-0x4C6Bel logotipo KONAMI, comprimido
0x4C6B-0x503Blos tiles del juego y sus colores
0x503B-0x555Blos 64 sprites
0x555B-0x56DDla liana: nueve punteros y nueve dibujos
0x56DD-0x5857los surtidores: dieciocho punteros y dieciocho bloques
0x5857-0x5C32el fotograma, los mandos de la demo, la carga de gráficos, los espejos y el montaje de la pantalla
0x5C32-0x5C72las dos tablas de treinta y dos pantallas
0x5C72-0x5F65el decorado: los cielos, el seto, la tierra, el estanque, los obstáculos y la entrada del jugador
0x5F65-0x5FD2el motor de decorados
0x5FD2-0x66A6los contadores y las once cosas que se mueven, el reloj y los puntos
0x66A6-0x6DD4el jugador: diecisiete estados, los choques, sus sprites y los arcos de salto
0x6DD4-0x70A5las listas del decorado y los tiles que usan
0x70A5-0x714Fla carga de los patrones y los colores
0x714F-0x77F8las listas de color, los colores y los patrones de los tiles
0x77F8-0x77FEseis bytes sin uso, entre los patrones y el sonido
0x77FE-0x7960el sonido: la petición, el reproductor y los dos formatos
0x7960-0x7C3Elos periodos de las notas, la tabla de 34 pistas y las pistas
0x7C3E-0x8000el relleno hasta los 16 KB: 962 bytes, todos 0xFF