Dunk Shot

Baloncesto de tres contra tres en una pista de 56 columnas que se asoma por una ventana de 32, jugadores hechos de cuatro sprites, equipos de la máquina que se fabrican por nivel y se graban en cinta como un BSAVE. Todo dibujado desde la ROM.

HAL Laboratory - (c) 1986 HAL Laboratory - Cartucho de 32 KB - MSX - Volcado a1891e03...

Aquí no hay ninguna captura. Todas las imágenes están dibujadas desde los bytes de la ROM con las tablas del propio cartucho: el logotipo, el título y sus menús, la pista entera en sus tres colores, el partido, la ficha de equipo, las 160 poses de los jugadores y sus 32 aspectos. Seis pantallas están cotejadas contra openMSX byte a byte en ocho volcados, con 0 diferencias, y los 24 sprites de los seis jugadores del saque también. 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
1.289rutinas con nombre
43,2 %del listado comentado
20.642bytes de código
12.126bytes de datos
0bytes sin identificar

Lo que apareció al desmontarlo

La pista mide 56 columnas y se ve por una ventana de 32

Toda la pista, con las gradas y la pancarta SUPER PLAYERS DUNK SHOT * HAL LABORATORY, es un mapa de 56 × 24 patrones comprimido en 0xB69E. No hay desplazamiento por hardware: 0x5F33 copia a la tabla de nombres, fila a fila, las 32 columnas que empiezan en la de 0xE830 (de la 0 a la 24), y 0x5E7C la mueve de columna en columna cuando el balón cruza el centro. El marcador de 21 × 4 (0x77AB) va encima, en la columna 6.

Cada jugador son cuatro sprites, y de ahí el parpadeo

Pelo, piel de arriba, camiseta y piel de abajo: cuatro sprites de 16 × 16 por jugador, seis jugadores, más la red, el balón, su sombra y la flecha. El TMS9918 solo pinta cuatro sprites por línea, así que 0x5E1B ordena los siete grupos por profundidad, 0x5C0B los monta en ese orden, 0x5BAB los copia también al revés y los dos órdenes van a dos tablas de atributos (0x1B00 y 0x1F00) que el registro 5 alterna cada cuadro (0x5B77): un cuadro van delante los cercanos y al siguiente los lejanos. El parpadeo está programado a propósito. En un MSX2, con ocho sprites por línea, un parche de 164 bytes lo baja de 66,7 sprites sin pintar por cuadro a 1,7.

Las 160 poses y los 32 aspectos

Una pose son cuatro números de patrón (0xA4CE) y cuatro desplazamientos (0xA38E, uno por grupo de cuatro poses) que 0x5C40 resta de la posición de los pies; los 196 patrones viven en RAM, descomprimidos de 0x9725, 0x9B08, 0x9F80 y 0xA360. El aspecto de cada jugador es una de las 32 parejas de 0x80E4 (piel 0x0B, 0x0A o 0x01 y once colores de pelo) y la camiseta es el color del equipo (0xEA2C/0xEA5C).

Pose, patrones y colores están cotejados en los seis jugadores de dos volcados de openMSX.

Los equipos de la máquina se fabrican por nivel

ELM, JNR, HIG, COL, YUG, ESP, USA y PRO no son plantillas guardadas: son los niveles 1 a 8. Al elegir uno, 0x72CA genera ocho jugadores con 30, 20 y 25 puntos de habilidad más 30 por cada nivel por encima del primero, y un aspecto al azar sacado del registro R del Z80. El nombre se copia de la lista de 0x7CA1 y el nivel se guarda en el byte 3 del equipo.

Los equipos se graban en cinta como un BSAVE

SAVE DATA escribe con la BIOS de casete el bloque del equipo (0xEC bytes: nombre, nivel, color y ocho jugadores de 29) con la cabecera de los binarios, diez 0xD0, y un nombre de seis letras: las tres del equipo y tres 0x7F (0x8C33). LOAD DATA lo busca y lo lee (0x8C71) y VERIFY lo compara byte a byte (0x8C87).

Tres pistas, una tabla de colores cada una

COLOR OF COURT elige entre tres tablas de color comprimidas (0xABA8, 0xACB0 y 0xADB8: 264 bytes cada una, 2.000 al descomprimir) para los mismos 250 patrones. Verde, azul y roja; las gradas y la pancarta no cambian.

Las jugadas de la máquina

La tabla de 720 bytes de 0xAF5F son cinco formaciones con seis variantes cada una, y en cada variante un guion de ocho bytes por jugador: una espera y puntos (Y, X, código) hasta un 0x80. 0x6F48 elige la variante con la formación en curso y un bit al azar, y el botón 2 del equipo con balón en campo contrario pasa a la siguiente.

Lo que no se pinta y lo que no corre nadie

Tres patrones de la pista (0x73, 0x85 y 0x86) y la E y la S de un ESC del juego de patrones del logotipo (0xFB, 0xFC) no salen nunca; la C (0xFD) sí, en el título. Un patrón de sprite, el 195, no lo usa ninguna pose. Y diecisiete trozos de código a los que no se llega: entradas alternativas, un contador de cinco cifras (0x7AAE) y una rutina que escribe un cero en la propia ROM (0x8B3C), de cuando el programa corría en RAM.

En 0x4EEC, además, todo apunta a un fallo del original: carga ld hl,(0xE6DF) donde el código vecino hace pensar en ld hl,0xE6DF, y compara y escribe en la dirección que forman «quién tiró» y «saltador izquierdo», que al arrancar es 0xFFFF.

Lo que el cartucho dibuja

Debajo de cada imagen está de dónde sale y qué se está viendo.

El título: las 17 filas de la tabla de nombres de 0xB0FE, los 80 patrones del logotipo (0xB33E) con sus colores (0xB491), los nombres de los equipos y los créditos de 0x7D5A. Cotejado contra openMSX en dos instantes: 0 diferencias.
El título: las 17 filas de la tabla de nombres de 0xB0FE, los 80 patrones del logotipo (0xB33E) con sus colores (0xB491), los nombres de los equipos y los créditos de 0x7D5A. Cotejado contra openMSX en dos instantes: 0 diferencias.
El primer menú sobre el título: el cuadro de 0x7FC1, las cuatro opciones de 0x7D32 y la bola del cursor (0x8AC9). Cotejado: 0 diferencias.
El primer menú sobre el título: el cuadro de 0x7FC1, las cuatro opciones de 0x7D32 y la bola del cursor (0x8AC9). Cotejado: 0 diferencias.
SET-UP: la tabla de nombres entera de 0xB22A, los nombres, las marcas de LENGTH OF HALF y COLOR OF COURT (0x81BB, 0x81DC) y el cursor. Cotejado: 0 diferencias.
SET-UP: la tabla de nombres entera de 0xB22A, los nombres, las marcas de LENGTH OF HALF y COLOR OF COURT (0x81BB, 0x81DC) y el cursor. Cotejado: 0 diferencias.
La pantalla de equipo con la ficha de un equipo de la máquina: el menú de 0x7CD3, el cuadro de la ficha (0x7B75) con la barra del color y el nombre, y COMPUTER TEAM LEVEL 1 (0x8B81). Cotejado: 0 diferencias.
La pantalla de equipo con la ficha de un equipo de la máquina: el menú de 0x7CD3, el cuadro de la ficha (0x7B75) con la barra del color y el nombre, y COMPUTER TEAM LEVEL 1 (0x8B81). Cotejado: 0 diferencias.
LOAD DATA sin cinta: SURE? y encima ERROR! (0x870F, 0x8740). Cotejado contra los dos volcados: 0 diferencias.
LOAD DATA sin cinta: SURE? y encima ERROR! (0x870F, 0x8740). Cotejado contra los dos volcados: 0 diferencias.
El partido al saque con la ventana en la columna 12: las 24 filas del mapa (0x5F33) y el marcador de 0x77AB relleno por 0x7A17. Cotejado contra dos volcados: 0 diferencias. Los jugadores son sprites y van aparte.
El partido al saque con la ventana en la columna 12: las 24 filas del mapa (0x5F33) y el marcador de 0x77AB relleno por 0x7A17. Cotejado contra dos volcados: 0 diferencias. Los jugadores son sprites y van aparte.
La pista entera, 56 columnas, con la primera tabla de color (0xABA8): la verde. El juego enseña 32 columnas cada vez.
La pista entera, 56 columnas, con la primera tabla de color (0xABA8): la verde. El juego enseña 32 columnas cada vez.
La misma pista con la segunda tabla de color (0xACB0): la azul.
La misma pista con la segunda tabla de color (0xACB0): la azul.
Y con la tercera (0xADB8): la roja. Las gradas y la pancarta no cambian.
Y con la tercera (0xADB8): la roja. Las gradas y la pancarta no cambian.
Las 160 poses (0xA4CE y 0xA38E), cada una montada de sus cuatro sprites, con piel 0x0B, pelo 0x01 y camiseta roja.
Las 160 poses (0xA4CE y 0xA38E), cada una montada de sus cuatro sprites, con piel 0x0B, pelo 0x01 y camiseta roja.
Lo mismo con piel 0x01, pelo 0x05 y la camiseta del otro equipo.
Lo mismo con piel 0x01, pelo 0x05 y la camiseta del otro equipo.
Los 32 aspectos de 0x80E4 (piel y pelo) sobre la pose del saque, con las dos camisetas.
Los 32 aspectos de 0x80E4 (piel y pelo) sobre la pose del saque, con las dos camisetas.
La red en sus tres cuadros (0x9665), el balón, su sombra y la flecha del cursor (0x96C5).
La red en sus tres cuadros (0x9665), el balón, su sombra y la flecha del cursor (0x96C5).
Los 196 patrones de sprite de los jugadores tal como quedan en RAM (0xCC00-0xE47F).
Los 196 patrones de sprite de los jugadores tal como quedan en RAM (0xCC00-0xE47F).
Los 250 patrones de la pista, los menús y la fuente (0xA74E) con los colores de la pista verde.
Los 250 patrones de la pista, los menús y la fuente (0xA74E) con los colores de la pista verde.
Los 80 patrones del logotipo (0xB0-0xFF, 0xB33E) con sus colores (0xB491).
Los 80 patrones del logotipo (0xB0-0xFF, 0xB33E) con sus colores (0xB491).
Lo que no se pinta nunca: los patrones 0x73, 0x85 y 0x86 de la pista y la E y la S de ESC; la C sale en el título.
Lo que no se pinta nunca: los patrones 0x73, 0x85 y 0x86 de la pista y la E y la S de ESC; la C sale en el título.