Dunk Shot — MSX2 patch

El baloncesto de HAL Laboratory parpadea porque cada jugador son cuatro sprites y el MSX1 pinta cuatro por línea. Un MSX2 pinta ocho: este parche de 164 bytes lleva el juego a SCREEN 4 y apaga el reparto, y en un MSX1 se sigue jugando como el original.

HAL Laboratory - (c) 1986 HAL Laboratory - Parche IPS de 292 bytes, extraoficial - MSX2 (y MSX1 tal cual) - Original a1891e03...

Probado en openMSX, todavía no en una máquina real. Las capturas son de la ROM parcheada corriendo en openMSX (un MSX1 y un Philips NMS 8250), y las cifras salen de una sonda que cuenta, cuadro a cuadro, los sprites que el VDP no pinta. No se distribuye ninguna ROM: solo el IPS. Sale del desensamblado comentado, donde se puede buscar cada dirección.

El parche en cifras

66,7sprites sin pintar por cuadro, original en MSX1
1,7sprites sin pintar por cuadro, parcheado en MSX2
166 → 22en el peor cuadro
164bytes cambiados en 24 tramos
292bytes de IPS
0patrones movidos

Lo que hace, y lo que hubo que saber

El parpadeo lo gestiona el juego

Cada cuadro 0x5E1B ordena los siete grupos por profundidad, 0x5C0B monta sus atributos en ese orden, 0x5BAB los copia también al revés y la interrupción (0x5B77) enseña una u otra tabla: un cuadro van delante los cercanos y al siguiente los lejanos. En un MSX2 el parche deja siempre la ordenada: el más cercano delante y sin cambiar de un cuadro a otro.

En el modo 2, colores primero y atributos en +0x200

El registro 5 señala un bloque de 1 KB: la tabla de colores de sprite, 16 bytes por sprite, ocupa la primera mitad, y los atributos van 0x200 más allá. Ponerlos al revés deja la pantalla sin un solo sprite, y eso fue lo primero que salió.

El único sitio libre era 0x3C00

Bajo los 16 KB del MSX1 el juego no usa nada de 0x3C00 a 0x3FFF: colores en 0x3C00, atributos en 0x3E00 y la segunda tabla del MSX1 en 0x3F00. No se mueve ni un patrón, y el mismo fichero vale en los dos MSX.

El código nuevo, en huérfanos del cartucho

El relleno de 0xBFD4 y tres rutinas que no llama nadie (0x6EA0, 0x6F30, 0x7AAE), encontradas al trazar el desensamblado. Y la figura de muestra de los menús de equipo conserva sus colores: el modo 2 no lee el color del atributo, así que el parche se los copia a la tabla de colores.

En openMSX

Capturas de openMSX con la ROM de cada pie; las órdenes que las sacan están en En el emulador.

El original en un MSX1 (C-BIOS_MSX1_JP): en este cuadro faltan jugadores, y al del centro le faltan el pelo y la camiseta. 66,7 sprites sin pintar por cuadro en treinta segundos de partido.
El original en un MSX1 (C-BIOS_MSX1_JP): en este cuadro faltan jugadores, y al del centro le faltan el pelo y la camiseta. 66,7 sprites sin pintar por cuadro en treinta segundos de partido.
El parcheado en el Philips NMS 8250: SCREEN 4, ocho sprites por línea, todos los jugadores de la ventana enteros, con el balón y la red. 1,7 sprites sin pintar por cuadro.
El parcheado en el Philips NMS 8250: SCREEN 4, ocho sprites por línea, todos los jugadores de la ventana enteros, con el balón y la red. 1,7 sprites sin pintar por cuadro.
El parcheado en un MSX1: las dos tablas siguen alternando, ahora en 0x3E00 y 0x3F00, y parpadea como el original.
El parcheado en un MSX1: las dos tablas siguen alternando, ahora en 0x3E00 y 0x3F00, y parpadea como el original.
TRADE en el MSX2: la figura de muestra con su piel, su pelo y su camiseta, copiados a la tabla de colores de sprite por 0x6F30.
TRADE en el MSX2: la figura de muestra con su piel, su pelo y su camiseta, copiados a la tabla de colores de sprite por 0x6F30.