Demonia

Un juego que no cabe en la RAM visible de un MSX y esconde veintiséis kilobytes debajo de la ROM del BASIC. Y dentro, de polizón, un monitor de código máquina de 1984 del mismo autor: con su puerta trasera todavía enchufada, sus órdenes tapadas por los datos del juego, y en el buffer del paso a paso la última instrucción que ejecutó antes de que alguien grabara la cinta.

Microids · 1986 · Cinta, 58.334 bytes · MSX1 · 64 KB · Firma: (C) 1986 PAR SABLATOU CLAUDE

Aquí no hay ni una captura de pantalla. Todas las imágenes están dibujadas desde la cinta: una herramienta repite el descompresor del propio juego sobre los mapas comprimidos y luego revela cada baldosa como la revelaría el VDP, con sus patrones y sus colores. Que las pantallas salgan bien es la prueba de que las rutinas se han entendido bien. El listado y las cifras salen del binario y se reproducen con make.

La cinta en cifras

100 %de la cinta explicada
13listados
1.308rutinas identificadas
20.299bytes de código
37.597bytes de datos
0bytes sin identificar
33,0 %de densidad de comentarios
26mapas de pantalla dibujados

Lo que apareció al desmontarla

Dentro del juego viaja un monitor de código máquina de 1984

De 0xC000 en adelante, dentro del bloque del juego, hay un programa entero que no es el juego: un monitor de código máquina con su intérprete de órdenes, su desensamblador, su paso a paso, su volcado de registros y sus mensajes de error en francés. Son 4.377 bytes, el 7,5 % de la cinta.

Va firmado, en 0xD948: Auteur:Claude SABLATOU, MONITEUR MSX, Copyright (C) 1984 LORICIELS. Y la portada del juego, que se lee descomprimiendo el mapa de 0x4281, dice (C) 1986 PAR SABLATOU CLAUDE. El autor del juego se dejó dentro su propia herramienta de trabajo: un monitor de Loriciels de 1984 viajando en un juego de Microids de 1986.

Y su puerta trasera sigue enchufada

El punto de entrada del monitor, 0xC924, se llama de verdad desde el código del juego, en 0x9C6D:

9C6D  3A 9B FC    ld a,(0xFC9B)   ; INTFLG
9C70  FE 03       cp 3
9C72  CC 24 C9    call z,0xC924   ; y al monitor

0xFC9B es INTFLG, la variable donde la BIOS anota que se ha pulsado STOP, y el valor 3 es el de CTRL+STOP. Hay una segunda llamada suelta, call 0xC924 en 0xAA95, a la que ya no llega ningún salto.

Medido: los bytes y qué es 0xFC9B. Que la intención fuera dejarse una puerta abierta es una lectura, no un dato.

Pero el monitor ya no obedece a nada

Reconoce sus órdenes buscando la inicial tecleada en una tabla de quince entradas de tres bytes que empieza en 0xD5C6 (ld hl,0xD5C6 / ld b,15, en 0xC28D). En 0xD5C6 no hay ninguna tabla.

Las 24 fichas de pantalla del juego ocupan de 0xD0C0 a 0xD8FF, 88 bytes cada una, y 0xD5C6 cae en mitad de la ficha número 14. Los datos del juego se escribieron encima de la tabla de órdenes. Con las quince claves a cero, cualquier tecla recorre las quince entradas sin éxito, imprime Commande illegale y vuelve a pedir: el monitor arranca, pinta los registros y no hace nada más. De ahí salen 2.094 bytes de código al que no llega nadie.

El fósil: la última instrucción que ese monitor ejecutó

El paso a paso funciona copiando la instrucción del programa detenido a un buffer de cuatro bytes en 0xCC5F y ejecutándola allí. 0xCBB9 pone esos cuatro bytes a cero antes de cada paso, así que lo que quedó grabado en la cinta es lo último que pasó por ahí:

CC5F  2A 78 80 00      ld hl,(0x8078)

Y 0x8078 cae dentro de la página de variables de este mismo juego.

Medido: los cuatro bytes, que 0xCBB9 los borra y 0xCBDB los rellena, y dónde cae 0x8078. Que fuera una sesión de depuración de este juego encaja, pero el binario no lo dice.

Veintiséis kilobytes escondidos debajo de la ROM del BASIC

El juego no cabe en la RAM que ve un MSX arrancado desde BASIC. Lo que hace es buscar un slot con 64 KB y meter 26 KB en las páginas 0 y 1, debajo de la ROM.

Los siete bloques que la cinta trae detrás del cargador no se ejecutan donde se cargan: cada uno lleva pegada una rutinilla que conmuta el slot, hace un LDIR y lo devuelve. Por eso aquí hay trece listados y no siete, y por eso el verify tiene dos pasos.

Los cinco trozos escondidos coinciden byte a byte con la RAM de openMSX con el juego en marcha, y con las instantáneas de un replay grabado en otra máquina. Dos medidas independientes.

Dos ficheros que se llaman igual, y un :RUN que los separa

En la cinta hay tres ficheros con nombre y los tres se llaman DEMON: el cargador BASIC, un BIN de 249 bytes que carga en 0x8180 y un BIN de 24.576 que carga en 0x8000.

La línea 50 del cargador es BLOAD"CAS:DEMON",R:RUN. Como la cinta es secuencial, la primera vez encuentra el BIN pequeño —el cargador de los siete bloques— y, después del RUN, la segunda pasada encuentra el grande, que ya es el juego. Se llaman igual a propósito.

La portada pone DEMONIA, y hubo que dibujarla para verlo

Si el mapa de la portada se vuelca como texto, sólo se leen dos filas: L'INTRUSION en la 17 y (C) 1986 PAR SABLATOU CLAUDE en la 19. Lo demás sale como puntos.

Y no es que no haya nada: es que el título está hecho de baldosas gráficas, no de ASCII. Dibujada con sus patrones, la pantalla pone DEMONIA en letras enormes ocupando las ocho primeras filas, con L'INTRUSION pequeño debajo, de subtítulo. Es el rótulo de la cabecera de esta página, recortado de ahí mismo.

Y cosas que llevan sin ejecutarse desde 1986

0x9134: la misma instrucción escrita dos veces, ld hl,0x8058 seguida de ld hl,0x8058. Tres bytes que no hacen nada.

Ocho bytes de ret condicionales imposibles: en 0x823A hay tres ret nc seguidos, y en 0x8C3E y 0xBFE3 hay pares y ternas de ret nz. Cuando dos vuelven con la misma condición, el segundo no llega a correr nunca.

Cincuenta bytes de NOP dentro de código vivo, en once rachas. Las dos de seis de 0xDC01 y 0xDC12 están justo delante y justo detrás de un LDIR que copia tablas a la RAM escondida: exactamente donde iría una conmutación de slot que alguien quitó.

Lo que la cinta dibuja

Debajo de cada pie está la dirección de donde sale. Todas se rehacen con make imagenes y no hace falta emulador.

DIBUJADA de 0x4281 — la portada. DEMONIA en las ocho primeras filas, en baldosas graficas; debajo, pequenos, el subtitulo L'INTRUSION y la firma del autor
DIBUJADA de 0x4281 — la portada. DEMONIA en las ocho primeras filas, en baldosas graficas; debajo, pequenos, el subtitulo L'INTRUSION y la firma del autor
DIBUJADA de 0x4000 — el primer mapa de la portada, sin el titulo. No lo apunta la tabla de 0xD000: la portada se monta en tres pasadas
DIBUJADA de 0x4000 — el primer mapa de la portada, sin el titulo. No lo apunta la tabla de 0xD000: la portada se monta en tres pasadas
DIBUJADA de 0x418A — la portada casi entera a la baldosa 0. Es el paso intermedio con el que se borra la pantalla antes de poner el titulo
DIBUJADA de 0x418A — la portada casi entera a la baldosa 0. Es el paso intermedio con el que se borra la pantalla antes de poner el titulo
Las pantallas del juego, dibujadas una a una desde los mapas comprimidos de 0x43DE a 0x5468 y puestas juntas. El cementerio de la superficie arriba, las cuevas debajo. Son 24 entradas en la tabla de 0xD000 pero 23 mapas distintos: las pantallas 13 y 14 apuntan al mismo
Las pantallas del juego, dibujadas una a una desde los mapas comprimidos de 0x43DE a 0x5468 y puestas juntas. El cementerio de la superficie arriba, las cuevas debajo. Son 24 entradas en la tabla de 0xD000 pero 23 mapas distintos: las pantallas 13 y 14 apuntan al mismo
DIBUJADA de 0x43DE — la primera pantalla: la puerta, una lapida y la hierba sobre la tierra roja. 204 bytes comprimidos dan las 640 baldosas
DIBUJADA de 0x43DE — la primera pantalla: la puerta, una lapida y la hierba sobre la tierra roja. 204 bytes comprimidos dan las 640 baldosas
DIBUJADA de 0x48FA — 334 bytes comprimidos, de los mas caros de la cinta. Las galerias de ladrillo, con sus estalagmitas
DIBUJADA de 0x48FA — 334 bytes comprimidos, de los mas caros de la cinta. Las galerias de ladrillo, con sus estalagmitas
DIBUJADA de 0x451D — el mapa mas barato de la cinta: 81 bytes. Cuanto mas se repite una baldosa, menos ocupa el mapa
DIBUJADA de 0x451D — el mapa mas barato de la cinta: 81 bytes. Cuanto mas se repite una baldosa, menos ocupa el mapa
DIBUJADA de 0x4E54 — 347 bytes, el mapa mas largo de los 26. La escalera roja y el agua son baldosas como las demas: no hay objetos, solo el mapa
DIBUJADA de 0x4E54 — 347 bytes, el mapa mas largo de los 26. La escalera roja y el agua son baldosas como las demas: no hay objetos, solo el mapa