Konami's Soccer

Un futbol de 1985 que pita el fuera de juego -y solo del nivel 3 en adelante cuando juegas contra la maquina-, doce jugadores que no son sprites sino parches de tres por tres casillas sobre un campo de ochenta columnas guardado en la RAM, y una punteria que no se calcula: se consulta en dos tablas.

Konami - (c) Konami 1985 - Cartucho RC-732, 32 KB - MSX1 - paginas 1 y 2 - Volcado b9536809...

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 cartucho en cifras

100 %del binario explicado
1213rutinas con nombre
36,5 %del listado comentado
20.116bytes de codigo
12.652bytes de datos
0bytes sin identificar

Lo que aparecio al desmontarlo

Una instruccion de 9.755 separa este cartucho de Konami's Football

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 サッカー.

Se pita el fuera de juego

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.

Seis jugadores son casillas y seis son sprites

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:

  1. guarda_el_fondo_del_bando apunta las 3x3 casillas que va a tapar cada jugador
  2. estampa_el_bando_en_el_mapa estampa los seis parches sobre el mapa del campo, que vive en la RAM
  3. pon_el_bando_en_sprites saca al otro bando con cinco sprites por jugador
  4. vuelca_el_campo tira el mapa entero a la VRAM
  5. devuelve_el_fondo_al_mapa vuelve a poner el cesped que taparon los parches

Por 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.

La punteria no se calcula: se consulta

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.

Un bloque comprimido, dos camisetas

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.

Un `jp (bc)` escrito a mano, y 283 bytes de codigo detras

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.

Dos marcadores comparados con una sola resta

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.

La entrada que no sale acaba en choque

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.

Lo que el cartucho dibuja

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

El campo entero: 80 columnas por 23 filas, 640 por 184 pixeles. No es una captura ni un montaje de capturas: es el mapa que 0x8538 descomprime en 0xE600, dibujado casilla a casilla con los patrones y los colores que dejan las diez tandas de graficos de 0x4279. La pantalla solo asoma 32 de esas 80 columnas.
El campo entero: 80 columnas por 23 filas, 640 por 184 pixeles. No es una captura ni un montaje de capturas: es el mapa que 0x8538 descomprime en 0xE600, dibujado casilla a casilla con los patrones y los colores que dejan las diez tandas de graficos de 0x4279. La pantalla solo asoma 32 de esas 80 columnas.
Las 51 poses de los jugadores, sacadas del arbol de parches: 26 de un bando y 25 del otro, cada una nueve casillas de 8x8. Son los mismos dibujos con dos tablas de color distintas. El cesped de detras es el tile 0x01, el mismo con el que el mapa llena el campo.
Las 51 poses de los jugadores, sacadas del arbol de parches: 26 de un bando y 25 del otro, cada una nueve casillas de 8x8. Son los mismos dibujos con dos tablas de color distintas. El cesped de detras es el tile 0x01, el mismo con el que el mapa llena el campo.
La pantalla de titulo con su menu, montada paso a paso como la monta el cartucho. El rotulo grande no es una imagen guardada: son cinco filas de catorce patrones CONSECUTIVOS que 0x4CD3 estampa desde el 0x40. Cotejada contra la VRAM del emulador: cero bytes distintos en las tres tablas.
La pantalla de titulo con su menu, montada paso a paso como la monta el cartucho. El rotulo grande no es una imagen guardada: son cinco filas de catorce patrones CONSECUTIVOS que 0x4CD3 estampa desde el 0x40. Cotejada contra la VRAM del emulador: cero bytes distintos en las tres tablas.
La misma pantalla, montada desde la OTRA compilacion: Konami's Football, el mismo cartucho RC-732 con otro nombre. De sus 9.755 instrucciones solo una es distinta a las de Soccer, y es justo la que dice cuantas filas de tiles mide este rotulo: cinco en Soccer, cuatro aqui. Cotejada contra la VRAM del emulador: cero bytes distintos en las tres tablas.
La misma pantalla, montada desde la OTRA compilacion: Konami's Football, el mismo cartucho RC-732 con otro nombre. De sus 9.755 instrucciones solo una es distinta a las de Soccer, y es justo la que dice cuantas filas de tiles mide este rotulo: cinco en Soccer, cuatro aqui. Cotejada contra la VRAM del emulador: cero bytes distintos en las tres tablas.
Los 44 tiles de la fuente, del 0x10 al 0x3B, puestos en fila para poder mirarlos. El reparto explica los rotulos: las diez cifras arrancan en el 0x10, el 0x20 es el guion que separa los dos goles del marcador, las letras van del 0x21 al 0x3A y el 0x3B es el rombo con el que se dibuja a mano el marco de la pantalla final.
Los 44 tiles de la fuente, del 0x10 al 0x3B, puestos en fila para poder mirarlos. El reparto explica los rotulos: las diez cifras arrancan en el 0x10, el 0x20 es el guion que separa los dos goles del marcador, las letras van del 0x21 al 0x3A y el 0x3B es el rombo con el que se dibuja a mano el marco de la pantalla final.