Aqui no hay ninguna captura. Todas las imagenes estan dibujadas desde los bytes de la ROM, ejecutando en Python el descompresor y el interprete de rotulos que corre el Z80, y cotejadas byte a byte contra la VRAM de openMSX: el titulo da cero diferencias y el campo tambien. El listado y las cifras se reproducen con make, y el reensamblado devuelve la ROM byte a byte.
El mismo juego salio tambien como Konami's Football, con el mismo numero de catalogo RC-732. Comparados byte a byte se diferencian en 28.586 de los 32.768, o sea el 87 %, y ese numero no vale para nada: la segunda compilacion esta CORRIDA. El logotipo de Football ocupa menos, todo lo que va detras se desplaza y cada call apunta a otro sitio aunque llame a lo mismo.
Alineando las dos ROM el desplazamiento solo cambia cuatro veces en 32 KB -de 0 a -46, -44, -40 y -38-, y con ese mapa se pueden desensamblar las dos y traducir las direcciones de una al espacio de la otra. Entonces sale el numero de verdad: de 9.755 instrucciones, UNA es distinta. El ld c,005h de 0x4CDB, que en Football vale 4: las filas de tiles que mide el rotulo del titulo.
En los datos, 97 de los 125 bloques son identicos byte a byte. De los otros veintiocho, veinticuatro son tablas de punteros movidas por la relocalizacion, y los cuatro que quedan son el mismo cambio: el logotipo, un tile mas en el juego del campo, su color y siete casillas del mapa -las de la valla publicitaria-. Hasta la marca oculta de Konami es la misma: el titulo en katakana de dentro sigue diciendo サッカー.
Un cartucho de 32 KB de 1985, y lleva la regla dentro. 0xB667 corre en el momento del pase, y pide tres cosas a la vez: que la pelota vaya hacia la porteria contraria -el signo del byte alto de (0xE2A8)-, que el que la recibe este en la mitad de campo rival -pasado el pixel 0x140 de los 640 que mide el campo- y que este por delante de los seis rivales, uno por uno.
El arbitro no pita ahi: espera. 0xB6F2 deja que la pelota caiga -(0xE2AB), su velocidad vertical, a cero- y entonces mira (0xE546): si por el camino reboto en alguien, la falta se anula. Solo si el pase llego y se controlo suena el 0x25 y sale el rotulo OFFSIDE.
Y hay una condicion mas, que cambia como se juega: con dos jugadores se pita siempre; con uno solo, solo del nivel 3 en adelante (cp 003h en 0xB671). En los niveles 1 y 2 la regla no existe.
Un MSX1 solo saca cuatro sprites por linea de pantalla. Con veintidos figuras en el campo no hay manera, asi que el cartucho parte el problema por la mitad y dibuja cada bando de una manera distinta. Se ve en el orden del cuadro, en 0x5882..0x5892:
guarda_el_fondo_del_bando apunta las 3x3 casillas que va a tapar cada jugadorestampa_el_bando_en_el_mapa estampa los seis parches sobre el mapa del campo, que vive en la RAMpon_el_bando_en_sprites saca al otro bando con cinco sprites por jugadorvuelca_el_campo tira el mapa entero a la VRAMdevuelve_el_fondo_al_mapa vuelve a poner el cesped que taparon los parchesPor eso el mapa de la RAM, mirado en el emulador en cualquier otro momento, esta limpio: las 1.840 casillas coinciden con las que salen de descomprimir 0x853E, y las unicas dos que bailan son los dos porteros.
Las poses no son sprites guardados: son un arbol de dos niveles -(ix+0x0C) elige el grupo y (ix+0x0D) la pose- con hojas de once bytes, dos de correccion y las nueve casillas. Salen 26 poses para un bando y 25 para el otro, y estan todas dibujadas mas abajo.
El Z80 no multiplica ni divide, y aqui hay que decidir con que fuerza sale un pase para que caiga donde se quiere. La solucion de 0x92E2 es no calcular nada.
Se miden las dos distancias al objetivo y se parten en escalones de dieciseis, que es quedarse con el nibble alto de cada una: sale un numero de 0 a 15 para el ancho y otro de 0 a 11 para el alto. Con esos dos se entra en dos tablas de dos niveles que viven al final del cartucho: la de 0xBF0F da el empuje vertical y la de 0xBD6F las dos componentes del suelo. La trayectoria entera esta tabulada.
Encima quedan dos correcciones. En el saque de banda el golpe se ablanda a tres cuartos -o a la mitad si el objetivo esta a menos de tres escalones en las dos direcciones-, y en el saque de centro el empuje vertical y la gravedad se doblan.
Los dos equipos comparten los mismos dibujos. Lo que cambia es la tabla de COLOR, y la escribe el mismo descompresor pasando cada byte por 0x4846, que parte el byte en sus dos nibbles -la tinta arriba, el fondo abajo-, mete cada uno en una paleta de cinco entradas y los vuelve a juntar. A donde apunta la paleta lo dice (0xE52A).
0x6F31 deja cuatro volcados de patron en 0x2320, 0x2458, 0x2590 y 0x26C8 -dos derechos y dos espejados-, y 0x742D los pinta: los dos primeros con la paleta de 0xE051 y los dos ultimos con la de 0xE056.
Las paletas se arman en dos pasos, y saltarse el segundo cuesta caro: 0x5A45 copia 39 bytes de fabrica a 0xE050, y despues 0x5C02 machaca las entradas 2, 3 y 4 de cada una con el juego de tres tonos que se eligio en el menu. Montando la pantalla sin ese segundo paso, la tabla de COLOR sale distinta en 4.092 de sus 6.144 bytes.
El Z80 tiene jp (hl), pero no jp (bc). En 0xB2DA el cartucho lo escribe a mano: apila BC y hace ret. Para cualquier trazador eso es el final de una rutina, y ahi se paraba: detras habia 283 bytes que nadie alcanzaba, con su tabla de cinco entradas en 0xB2DC.
El encaje que la fija en cinco y no en seis es que la sexta palabra ya cae fuera del cartucho. Es el unico push bc / ret de los 32 KB; de push hl / ret hay veintisiete, y esos no se han repasado uno a uno.
Al final del partido hay que saber si hubo penaltis, o sea si los dos equipos acabaron empatados. Cada marcador son dos bytes: la cifra en BCD y el acarreo. Comparar dos parejas pide dos restas.
0xB903 hace una. Arma dos parejas cruzadas -una cifra baja de cada equipo con un acarreo de cada equipo- y las resta con un solo sbc hl,bc de 16 bits. El resultado es cero exactamente cuando coinciden las dos comparaciones a la vez.
Robar la pelota depende de por donde se entra. 0xABCA compara el rumbo del que entra con el del que la lleva, y si coinciden -o van a cinco de distancia- el robo sale, con su pitido. Si no, chocan.
Y el choque esta escrito con detalle. Al que la llevaba le caen 16 cuadros quieto; al que entro se le redondea el rumbo a la diagonal siguiente, se le pone el dibujo 4 -por el suelo- y resbala dos veces, ocho pixeles cada una y ocho cuadros entre ellas, con la pelota siguiendole a los pies. Al levantarse, la lleva el.
Mientras dura, la fisica de la pelota no corre: las entradas 6 y 7 de la tabla de 0x8C70 -el choque y el fuera de juego- son un ret pelado.
Debajo de cada imagen esta de donde sale y que se esta viendo.