En el emulador

Las imágenes de esta web están dibujadas desde la ROM, no capturadas. Lo que hace el emulador aquí es otra cosa: decidir si esos dibujos son los de verdad.

El cotejo contra la VRAM

make vram

Lanza openMSX con el cartucho y tools/omsx_vram.tcl, que en varios instantes vuelca los 16 KB de VRAM enteros, los ocho registros del VDP y los 2 KB de RAM de trabajo. Después:

python3 tools/coteja_vram.py hypersports3.rom 0x4000 work/omsx

compara byte a byte lo que monta Python con lo que el VDP tiene de verdad, y lo hace por tablas, porque no todas dicen lo mismo:

tabladirecciónqué es
color0x00000x17FFlos ocho bytes de color de cada tile
patrones de sprite0x18000x1FFFlos dibujos de los sprites
patrones0x20000x37FFlos dibujos de los tiles
nombres0x38000x3AFFqué tile va en cada casilla

Las tres primeras son estáticas: se montan una vez y no se tocan hasta que cambia la pantalla, así que tienen que salir a cero. La tabla de nombres sí se mueve —el atleta, los marcadores, los rótulos que parpadean—, y ahí lo que se mira es cuántas casillas bailan y si son las que deben.

Cómo está

pantallacolorpatr. spritepatronesnombres
título00014
ciclismo0000
triple salto07700
curling00034
pértiga0000

El ciclismo cierra a cero en las cuatro tablas y además en los 128 bytes de atributos de sprite: 15.104 bytes de VRAM idénticos a los del emulador.

Los 14 del título son el cursor parpadeando y los 34 del curling son el TEMP y el marcador, que se escriben después del montaje. Los 77 del triple salto y los patrones de sprite de la pértiga son la postura del atleta: el volcado del montaje todavía no lo tiene dibujado, y el fotograma en que sí lo dibuja tiene la pista ya desplazada. Contra ese fotograma, la pértiga sale a cero de 2.048 bytes de patrón y con los seis sprites idénticos.

No hace falta jugar

La demostración pasa sola por las cuatro pruebas, pero hay que esperar. El truco es más rápido: la escena 4 es call limpia_la_pantalla / call monta_la_prueba, y monta_la_prueba lee la prueba de (0xE06A) en 0x53CB. Un punto de ruptura entre las dos que escriba ahí el número de prueba deja al cartucho montando y jugando esa prueba. No es una pantalla congelada.

echo 2 > work/prueba.txt      # 0 ciclismo, 1 triple salto, 2 curling, 3 pértiga
make vram

Y sale mejor que jugando: así la prueba hereda la VRAM del título, que es exactamente lo que hereda en la máquina de verdad. Entre pantalla y pantalla el cartucho no borra los patrones ni el color —solo esconde los sprites y borra la tabla de nombres—, así que lo de debajo sigue ahí. Montar una prueba desde cero mete cientos de bytes de diferencia que no son un error de lectura sino la herencia que falta.

Y el trazado de las llamadas de dibujo

"openmsx" -machine Philips_VG_8020 -cart hypersports3.rom -script tools/omsx_montaje.tcl

Pone un punto de ruptura en cada rutina de dibujo del cartucho y apunta, en orden y con sus argumentos, todas las llamadas que caen dentro de la ventana del montaje. Ejecutando esa lista en Python sobre la herencia volcada, la pantalla sale idéntica al emulador. Es lo que separa «falta un bloque» de «el formato está mal leído» sin mirar un solo byte a ojo.