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.
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.
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 tanteo se lleva en decimal codificado: 0x6760 suma con add a,001h / daa. Leyendolo asi, las reglas salen enteras y son las de verdad:
cp 021h)cp 020h)0x683D suma los dos tanteos, hace daa y mira si el digito de las unidades es 0 o 5La 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.
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.
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.
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.
0x4764 cabecera si, pinta0x476C cabecera no, con todo puesto0x475C cabecera no, pinta0x4760 cabecera si, BORRALa cuarta es la buena: con la mascara a cero, el mismo guion que escribio el rotulo lo borra dejando su geometria.
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.
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.
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.
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.
Debajo de cada imagen esta de donde sale y que se esta viendo.