El código

Empezar · El juego · La cinta · Hallazgos · Preguntas abiertas

El mapa de memoria, una vez cargado

Cuando los siete trozos han terminado de moverse, la memoria del MSX queda así. Son 50.712 bytes ocupados de los 65.536, el 77,4 % del mapa:

direcciónbytesqué hayde qué trozo
0x0000-0x1F317.986primer banco de sprites: 242 registros de 33 bytescarga 4
0x1F32-0x3AC77.062segundo banco: 214 registroscarga 5
0x4000-0x54675.224los 26 mapas de pantalla comprimidoscarga 3
0x6000-0x6FFF4.096los decorados: 2.048 de patrón y 2.048 de colorcarga 6
0x7900-0x7FE71.768la músicacarga 7
0x8000-0xDFFF24.576el juego enteroel BIN grande

Las cuatro primeras filas y la quinta están debajo de la ROM del BASIC: son las páginas 0 y 1, que en un MSX arrancado normalmente no son RAM. Sólo el bloque de 0x8000 vive donde se le ve.

Y 0x5480, justo detrás de los mapas comprimidos, es donde el descompresor deja el mapa de la pantalla en curso: 640 baldosas sin comprimir.

Las tres tablas que gobiernan el juego

Están las tres seguidas, al final del bloque del juego:

direccióntamañoqué es
0xD00024 × 2puntero al mapa comprimido de cada pantalla
0xD03024 × 4 punterosla conducta de cada pantalla
0xD0C024 × 88 bytesla ficha de cada pantalla

La tabla de conducta es lo más parecido a un guion que tiene este juego: cada pantalla declara hasta cuatro rutinas, y las que no usa no se dejan a cero sino apuntando a 0xFD9A, el vector del sonido. Es una forma barata de decir «aquí no hay nada que hacer» sin tener que comprobar nada.

Las fichas se acotaron por una marca que llevan todas en el byte 84: FF <número de pantalla en ASCII> FF. La primera cae en 0xD114 y la última en 0xD8FC, siempre a 88 bytes de distancia; con eso se pudo separar una a una sin suponer nada.

Código que se escribe encima

Este juego se automodifica en varios sitios, y conviene saberlo antes de leer el listado:

Los mismos operandos hacen de variables: el cargador de cinta guarda en 0x81F8 el puntero a la entrada que está leyendo y en 0x81FA la dirección de ejecución del trozo, y los escribe los dos antes de leerlos, así que los valores que trae la cinta dan igual.

Cómo se hizo el listado

No es un desensamblado lineal. Se traza el flujo de verdad desde los puntos de entrada y sólo se marca como código lo que se alcanza; el resto queda como datos y hay que explicarlo.

El trazado se validó además con el emulador: se muestreó el contador de programa durante 200 segundos de juego real en un Philips VG-8020 y salieron 1.357 direcciones distintas. Las 1.357 caen dentro de lo que el trazador marca como código, ni una fuera.

(Al revés no vale: ese muestreo coge el PC cada 0,5 ms y ve una fracción mínima de lo que corre, así que no dice nada sobre qué código está muerto. Para eso está Hallazgos, que lo mide de otra manera.)

Los comentarios, medidos

De poco sirve un listado completo si está mudo. La vara de la serie es doble:

make densidad

TOTAL             9790    3230     33,0%     1308       0

Nueve mil setecientas noventa instrucciones, tres mil doscientas treinta con comentario de línea: 33,0 % de densidad. Y la segunda cifra, que es la que cuesta: cero rutinas por debajo del 10 %, de 1.308.

El listón de la serie es 22 % de densidad y ninguna rutina floja. Este es, de los desensamblados publicados, uno de los más densos.