Aqui no hay ninguna captura. Todas las imagenes estan dibujadas desde los bytes de la ROM, ejecutando en Python los dos interpretes de guiones que corre el Z80. El listado y las cifras se reproducen con make, y el reensamblado devuelve la ROM byte a byte.
En una zona de bonus, si el protagonista se pone en la casilla exacta X=0x90 e Y=0x39, el juego escribe KONAMI 5730 PTS y suma esos 5730 puntos. Las dos cifras cuadran solas: el rotulo lo dice y el ld de,05730h de 0x4931 lo suma.
La cifra no es arbitraria. En japones los numeros se leen tambien por su sonido: 5 = go, 7 = na, 3 = mi, o sea go-na-mi. Es un huevo de pascua que la casa repitio en muchos de sus juegos, tambien en los recreativos.
Cuando nadie juega, el muneco se mueve solo. No hay ninguna rutina que decida: hay 77 pulsaciones grabadas, comprimidas en 0x5D82, que se descomprimen a 0xE342 y que la rutina de 0x468F va metiendo por donde entraria el mando, una cada dos cuadros, hasta encontrar un 0xFF.
Los valores son las mismas mascaras que da el joystick -0x01 arriba, 0x02 abajo, 0x04 izquierda, 0x08 derecha, 0x10 el boton-, asi que el resto del juego no distingue si esta jugando una persona o el guion.
Este cartucho no guarda en memoria por donde se puede andar. Para saberlo lee la pantalla: llama a RDVRM y mira que patron hay dibujado en la casilla. Todo patron por debajo de 0x80 se trata como pared, y de 0x90 en adelante se puede pasar.
Eso explica un detalle que si no pareceria caprichoso: cada vez que se pone un objeto en la pantalla, el juego se apunta que habia debajo. Si no lo hiciera, al cogerlo se abriria un agujero por donde se podria caminar.
El juego anuncia cincuenta zonas, y mapas distintos solo hay veinticinco: en 0x498E, cuando el numero de zona llega a 25, se le restan 25 y se vuelve a empezar por el primer mapa.
Y de esos veinticinco, cuatro son el mismo: las entradas 4, 9, 14, 19 y 24 apuntan las cinco al bloque de 0x6E87. Una de cada cinco zonas es de bonus, y todas comparten pantalla.
La prueba de que los mapas estan bien leidos no es que se vean bien: es que los veinticinco, comprimidos con el RLE de la casa y sin llevar el tamano escrito en ninguna parte, descomprimen a 120 bytes clavados cada uno.
En SCREEN 2 lo habitual es poner los patrones en 0x0000 y los colores en 0x2000. Aqui es al reves, y lo dicen los ocho bytes que el cartucho carga en los registros del VDP (la tabla de 0x45F7, que vale 02 E2 0E 7F 07 76 03 E0): R3=0x7F pone los colores en 0x0000 y R4=0x07 los patrones en 0x2000.
Leerlo al reves no da un error visible de golpe: da formas correctas y colores a franjas. Es la trampa clasica de este modo.
El reparto de 0x569F manda a cada tipo a su propia rutina:
El MSX1 solo puede ensenar cuatro sprites por linea, y los que ganan son siempre los primeros de la tabla: los ultimos desaparecen sin mas.
La rutina de 0x459A lo resuelve volcando la tabla empezando cada cuadro dieciseis bytes mas adelante y dando la vuelta al llegar al final. Como el orden va cambiando, el que se pierde no es siempre el mismo, y lo que se ve es un parpadeo repartido en vez de un personaje invisible.
Las animaciones del fondo no tienen dibujos alternativos en la ROM. Se coge el patron que ya esta en la memoria de video y se le rotan los bits con rrca o rlca: un pixel de desplazamiento por vuelta, ocho bytes por patron.
La otra variante mueve los bytes enteros una fila con un lddr, y devuelve por arriba el que se sale por abajo.
0xE0B0 es dos cosas distintas segun el momento: mientras se monta la zona guarda el mapa descomprimido, 120 bytes; durante la partida son los 32 atributos de sprite, 128 bytes que se vuelcan de un tiron a 0x3B00 -que es donde R5 pone su tabla-.
El mismo kilobyte sirve para las dos cosas porque nunca hacen falta a la vez.
La rutina de 0x41D5 busca el numero de zona en la lista de las que llevan razzon grande y, si no lo encuentra, escribe el aviso NO BIG RAZZON. Entra con ld b,00eh, o sea catorce vueltas, pero de 0x609E a 0x60AA solo hay trece bytes.
La decimocuarta comparacion cae ya en el bloque siguiente, el de la zona 0, y vale 0x08. Los trece de la lista van en orden creciente y ese 0x08 lo rompe. El efecto se puede decir sin suponer intenciones: la zona 8 tambien da coincidencia, y por eso no le sale el aviso aunque no este en la lista.
En 0x4575 hay una rutina de diez bytes que prepara la LECTURA de la memoria de video: la gemela exacta de la de escritura que si se usa. No hay un solo call ni jp a esa direccion en toda la ROM, ni aparece como palabra en ninguna tabla. Se quedo dentro.
Debajo de cada imagen esta de donde sale y que se esta viendo.
inc d por celda. El color lo pone un relleno de 480 bytes que alterna entre dos valores, y por eso el rotulo cambia de colorcp 00ch y el cp 00ah con los que cuenta el bucle de 0x64CDNO BIG RAZZON sin estar en la lista