Konami's Ping Pong

Una mesa cuya mitad derecha no esta guardada -se dibuja reflejando la izquierda byte a byte-, cuarenta fotogramas que llevan pegado detras el puntero a sus propios patrones, y el reglamento del tenis de mesa entero escrito en BCD.

Konami - (c) Konami 1985 - Cartucho RC-731, 16 KB - MSX1 - pagina 1 - Volcado 8e0f57b2...

Aqui no hay ninguna captura. Todas las imagenes estan dibujadas desde los bytes de la ROM, ejecutando en Python los dos interpretes de guiones que corre el Z80. 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
548rutinas con nombre
64,3 %del listado comentado
7.676bytes de codigo
8.708bytes de datos
0bytes sin identificar

Lo que aparecio al desmontarlo

La mitad derecha de la mesa no esta guardada

La pista se dibuja una sola vez, y la otra mitad sale de reflejarla. La rutina de 0x7060 copia 768 bytes de VRAM a VRAM pasando cada uno por 0x47A6, que le da la vuelta a sus ocho bits con ocho rr c / rla. El bucle que la llama recupera el origen con un pop en cada vuelta y solo sube el destino, asi que el mismo trozo se refleja en los tres tercios de la pantalla.

Se ve en la hoja de patrones: donde el primer tercio pone KONAMI, el reflejo pone IMANOK.

Cuarenta fotogramas que llevan detras el puntero a sus patrones

Los munecos no tienen una tabla de graficos. Cada fotograma es [dy, dx, patron] por sprite, un 0x81 si lleva menos de los que pide el bucle, y pegado detras, el puntero a su propio bloque comprimido. El descompresor de 0x5E9B no recibe el bloque: lo saca de ahi.

De ese puntero salen los 3.135 bytes de 0x73A7..0x7D25, y encaja por dos caminos independientes: encadenando bloques desde 0x73A7 la cadena cae exactamente en 0x7D26 en cuarenta saltos, y los cuarenta punteros de los fotogramas son uno por uno esos cuarenta arranques. Veinte para el jugador de cerca y veinte para el del fondo.

El reglamento del tenis de mesa, en BCD

El tanteo se lleva en decimal codificado: 0x6760 suma con add a,001h / daa. Leyendolo asi, las reglas salen enteras y son las de verdad:

La comprobacion de los dos puntos de diferencia acepta 0x02 y tambien 0x08, y no es un error: la resta es binaria sobre BCD, asi que 21 menos 19 da 0x08 y son dos puntos igual.

Una tabla de seno para la pelota

0x6EAD son 92 bytes que suben de 12 a 255, bajan, pasan por cero y vuelven a subir. Que es un seno esta medido: los 31 valores del primer cuarto contra 255·sin(i·90/31) se desvian 4,7 como mucho, sobre un recorrido de 255.

Y los dos sitios que la leen, 0x6E99 y 0x6EA3, estan separados 31 posiciones: un cuarto de onda. De una sola tabla salen el seno y el coseno.

El despacho va en dos niveles, y el segundo no gasta tabla

La escena la reparte el despachador de 0x4062 con una tabla pegada detras del call: el pop hl recupera su propia direccion de retorno, que es donde empieza la tabla.

Pero la SUBescena no gasta tabla: se elige bajando por una cadena de djnz, cada uno de dos bytes, y el trozo que corre es aquel en que B llega a cero. Veinticinco escalones en cincuenta bytes.

Un interprete de rotulos con cuatro puertas

El mismo bucle sirve para las cuatro combinaciones de lo que puede variar: si lee del guion la direccion de destino o le llega ya puesta, y si la mascara deja pasar los bytes o escribe ceros.

La cuarta es la buena: con la mascara a cero, el mismo guion que escribio el rotulo lo borra dejando su geometria.

La perspectiva, con multiplicaciones y una division a mano

El Z80 no multiplica ni divide. 0x6BA1 convierte las tres coordenadas de la mesa en fila y columna de pantalla con dos rutinas propias -0x6F65 multiplica sumando y desplazando ocho veces, 0x6F88 divide restando y desplazando dieciseis- y tres factores fijos: 0xD4 para la profundidad, 0xBF para la anchura y 0x8E para la fila.

Y el tamano de la pelota no se calcula: sale de dos tablas de cinco patrones, elegidas por la altura contra cuatro escalones.

La marca oculta de Konami

Los ultimos quince bytes del cartucho son el titulo en katakana -コナミのピンポン, Konami no Ping Pong-, su longitud 0x0C y el 0x31 de RC-731. Delante van 70 bytes de 0xFF: lo que sobro del cartucho.

Esa marca la descubrio Manuel Pazos, y de el es el hallazgo.

El mismo armazon que Road Fighter

No es parecido: es el mismo, pieza por pieza. El despachador con la tabla pegada detras, las dos sumas de 8 sobre 16 bits, el interprete de rotulos, el descompresor y su bucle de tercios.

Y los ocho bytes de los registros del VDP son identicos, uno por uno: 02 E2 0E 7F 07 76 03 E4. Dejan la VRAM al reves de lo acostumbrado -el COLOR abajo, en 0x0000, y los PATRONES arriba, en 0x2000- porque R3 y R4 no son direcciones sino base y mascara.

Dos escrituras que no llegan a ninguna parte

0x4013 escribe en 0x40EE y 0x4052 en 0x40F8. Las dos direcciones caen dentro de la propia ROM, que no admite escritura: los dos ld se ejecutan en cada partida y no cambian nada.

Lo que el cartucho dibuja

Debajo de cada imagen esta de donde sale y que se esta viendo.

La pantalla de titulo, montada paso a paso como la monta el cartucho. El rotulo lo escribe 0x4B93 columna a columna desde la derecha, y la
La pantalla de titulo, montada paso a paso como la monta el cartucho. El rotulo lo escribe 0x4B93 columna a columna desde la derecha, y la "O" de PONG no es un tile: son dos sprites del mismo color en el mismo sitio. Cotejada contra la VRAM del emulador.
La mesa. Su mitad derecha no esta guardada en el cartucho: se dibuja reflejando la izquierda byte a byte. Cero bytes de diferencia contra la VRAM del emulador.
La mesa. Su mitad derecha no esta guardada en el cartucho: se dibuja reflejando la izquierda byte a byte. Cero bytes de diferencia contra la VRAM del emulador.
El menu de nivel, que va encima de la mesa ya montada. Los cinco valores -1, 3, 5, 7 y 9- salen de la tabla de 0x461F, y el cursor es el patron 0x88 puesto en la columna que ella dice.
El menu de nivel, que va encima de la mesa ya montada. Los cinco valores -1, 3, 5, 7 y 9- salen de la tabla de 0x461F, y el cursor es el patron 0x88 puesto en la columna que ella dice.
La hoja de patrones del segundo tercio. Arriba, la fuente: 45 tiles desde el 0x10, que es el codigo del '0'. Abajo, la mesa y su reflejo: donde uno pone KONAMI, el otro pone IMANOK.
La hoja de patrones del segundo tercio. Arriba, la fuente: 45 tiles desde el 0x10, que es el codigo del '0'. Abajo, la mesa y su reflejo: donde uno pone KONAMI, el otro pone IMANOK.
El logotipo de la casa, que 0x4A2F dibuja subiendo una fila por pasada. No es una imagen guardada: son tres rachas de patrones CONSECUTIVOS -tres desde 0x40, once desde 0x43 y doce desde 0x4E- mas doce ceros que borran el rastro de la pasada anterior. Cero bytes de diferencia contra la VRAM del emulador.
El logotipo de la casa, que 0x4A2F dibuja subiendo una fila por pasada. No es una imagen guardada: son tres rachas de patrones CONSECUTIVOS -tres desde 0x40, once desde 0x43 y doce desde 0x4E- mas doce ceros que borran el rastro de la pasada anterior. Cero bytes de diferencia contra la VRAM del emulador.
La tabla de patrones de sprite tal como queda en la pantalla de titulo: las pelotas en sus cinco tamanos, la red y las palas. Los munecos no estan aqui: sus cuarenta fotogramas se descomprimen uno a uno, segun hacen falta.
La tabla de patrones de sprite tal como queda en la pantalla de titulo: las pelotas en sus cinco tamanos, la red y las palas. Los munecos no estan aqui: sus cuarenta fotogramas se descomprimen uno a uno, segun hacen falta.