Circus Charlie

Un juego entero que vive dentro de la interrupcion, cinco numeros de circo repartidos por un solo byte, y la pista dibujada desde las tablas del cartucho, cuadro a cuadro, sin un byte distinto del emulador.

Konami - (c) Konami 1984 - Cartucho RC-712, 16 KB - MSX1 - pagina 1 - Volcado 89e1bada...

Aqui no hay ninguna captura. Todas las imagenes estan dibujadas desde los bytes de la ROM: el decorado con las maquinas del cartucho escritas en Python, y los personajes con el cuadro de partida escrito desde sus tablas, cotejado contra openMSX a cero bytes. El listado y las cifras se reproducen con make, y el reensamblado devuelve la ROM byte a byte.

El cartucho en cifras

100 %del binario explicado
576rutinas con nombre
47,1 %del listado comentado
7.894bytes de codigo
8.490bytes de datos
0bytes sin identificar

Lo que aparecio al desmontarlo

El juego entero vive en la interrupcion

INIT (0x407B) engancha H.KEYI con un jp 0x402C, pone a cero el kilobyte de RAM y se queda para siempre en el jr $ de 0x40A9. Todo lo demas pasa en el gancho, una vez por cuadro: el sonido, los mandos y la escena. El cerrojo de 0xE005 cuenta las interrupciones solapadas y atiende la que entro mientras tanto sin volver a la pila.

La pista, desde las tablas

Los personajes y los obstaculos no los pone el montaje: los pone el juego cuadro a cuadro. tools/pista.py reescribe ese cuadro desde las tablas del cartucho -moviles 0x549B, poses 0x5116, arranques 0x6161- y contra 43 volcados de openMSX da 0 bytes distintos.

Cinco numeros, un byte

(0xE052) dice que atraccion es, de 0 a 4, y el cartucho reparte por el cuatro tablas pegadas detras de sus call: el montaje (0x5FEF), el arranque (0x60B6), el cuadro (0x4C93) y la tabla de moviles (0x549B). Tres de ellas estaban rotuladas corridas uno en el listado; lo destapo la RAM medida al arrancar cada numero.

Un decorado que se repite cada 240 bytes

0x458F lee por DE y escribe por HL, al reves de lo que parece. Por eso 0x7477 copia 0x2AC0 sobre 0x2BB0, solapado, y el decorado del caballo se repite solo.

El parpadeo de 1P mira el reloj

El ld hl,(0xE002) trae las banderas en L y el contador de cuadros en H. El bit 5,h no mira el numero de jugadores: alterna la mascara entre pintar y borrar cada 32 cuadros.

Cuatro sprites por linea

El VDP no pinta el quinto sprite que cruza una linea. En el trapecio son seis los que cruzan las lineas 48 a 52, y se come dos. Con ese tope el dibujo casa con la foto del emulador en 49.152 puntos de 49.152.

Lo que el cartucho dibuja

Debajo de cada imagen esta de donde sale y que se esta viendo.

El trapecio, con la cama elastica abajo. Dibujado desde las tablas, no una captura.
El trapecio, con la cama elastica abajo. Dibujado desde las tablas, no una captura.
El leon y el aro de fuego, que esta pintado con tiles del fondo.
El leon y el aro de fuego, que esta pintado con tiles del fondo.
La cuerda floja y los monos.
La cuerda floja y los monos.
Las bolas.
Las bolas.
El caballo.
El caballo.
La pantalla de titulo, montada desde la ROM y cotejada a cero bytes.
La pantalla de titulo, montada desde la ROM y cotejada a cero bytes.
La pantalla de la casa. Comparte decorado con la de titulo byte a byte; solo cambia la tabla de nombres.
La pantalla de la casa. Comparte decorado con la de titulo byte a byte; solo cambia la tabla de nombres.
Los patrones de sprite, de 0x61BA y 0x5FCF. En la pantalla de titulo estan a cero: el cartucho no los sube hasta que empieza una fase.
Los patrones de sprite, de 0x61BA y 0x5FCF. En la pantalla de titulo estan a cero: el cartucho no los sube hasta que empieza una fase.