Lo que aparecio al desmontarlo. Cada uno con la medida al lado.
Los nombres son seis y estan en una tabla de seis punteros (0x5661). Las figuras salen de otra tabla, la de 0x52C9, y esa tiene tres palabras: 0x825C, 0x9670 y 0xABB4, que son las tablas de los archivos de figuras 2, 3 y 4. 0x4F8D la indexa con (0xE207) & 3, y una cuarta palabra caeria en 0x52CF, que ya es codigo. No se lee nunca: 0x423B fuerza el salto al siguiente grupo de dieciseis en cuanto el indice llega a 2.
Y aun asi los seis son distintos, y SANCHESS no es RED WOLF con otro color. Cada figura de los tres archivos de rival lleva una pieza de mas de las que declara su cabecera: el byte de +8 dice N, pero 0x5005 hace inc b en el turno del rival —el bit 1 del contador de cuadros— y recorre N+1 registros y N+1 punteros. La primera es la pieza de la segunda vuelta, y 0x5034 (para los patrones) y 0x5187 (para los atributos de sprite) deciden que hacer con ella mirando (0xE207):
| (0xE207) | rival | lo que 0x5034 hace con la primera pieza |
|---|---|---|
| bit 4 a cero | RED WOLF, M.B.ALLI, MOAI KING | se la salta (0x5048) |
| bit 4 puesto, bit 0 a cero | SANCHESS, MOAI Jr. | la pinta en vez de la segunda (ld a,002h, 0x5040) |
| bit 4 y bit 0 puestos | CHINA KHAN | las pinta todas (inc b, 0x5045) |
Asi que SANCHESS lleva el cuerpo de RED WOLF con otra cabeza: la pieza escondida del archivo 2 (0x9558) es la misma cara con el pelo hasta el cuello, donde 0x856E lo lleva corto. CHINA KHAN es M.B.ALLI mas un sprite negro (0xAB2E, color 1): la coleta que le cuelga de la cabeza. Y MOAI Jr. cambia el sprite vacio de MOAI KING (0xBF7B, color 0) por siete pixeles negros en la cara (0xBF7D), y encima cambia de color: 0x526F y 0x51BE convierten el color 4 en 0x0C —el azul oscuro en verde— solo cuando (0xE207) & 3 vale 2 y el bit 4 esta puesto. El moai es el unico que cambia de color.
Nada de esto es solo una lectura del codigo. La VRAM de los seis cuadrilateros, volcada de openMSX con cada rival impuesto en (0xE207), sale con cero diferencias en los doce atributos de sprite, en los bytes de patron de cada sprite en pantalla y en las casillas del cuerpo de los dos boxeadores (En el emulador).


Al acabarse un golpe, acaba_el_golpe (0x49BC) le suma a quien lo ha dado lo que dice la tabla de 0x6854, y el resultado va a su propio castigo:
| golpe | castiga al otro (0x6850) | cansa al que pega (0x6854) |
|---|---|---|
| 5 | 12 | 3 |
| 6 | 10 | 2 |
| 7 | 9 | 1 |
| 8 | 2 | 1 |
Las dos tablas van en el mismo orden: el golpe que mas castiga es tambien el que mas cansa. Y por encima del nivel 7 ya no sube: cp 007h en 0x49E4.
0x49FB carga 0xC0 en (0xE24C) o (0xE24D), y pega_el_de_la_derecha (0x4CCF) lo gasta con un srl por cuadro, saliendose con ret nc mientras no haya acarreo. De 0xC0, el acarreo solo sale en la septima y la octava vuelta. Fuera de esa ventana el golpe no puede tocar.
(0xE21E) y (0xE21F) son las tarjetas de los jueces, y no van sumando puntos: van sumando faltas.
Al final, 0x4ECD hace 10 - faltas en las dos y luego las sube a la vez hasta que una llega al diez. Es el sistema de los diez puntos del boxeo de verdad.
Con un solo jugador, el boxeador de la izquierda lo lleva decide_la_maquina (0x4A6B) y el humano es el de la derecha, que es el que va con el puerto 1 y el cursor. Lo dicen tres cosas independientes:
En la escena 2 —la demostracion— al de la derecha lo mueve el registro R del Z80 (0x4836): juegan solos los dos.
La maquina devuelve la accion en B con un numero de propina en el nibble alto, y ese numero se va sumando a (0xE254) mientras anda. (0xE254) es lo que luego elige el guion de golpes en 0x4C1C: cuanto mas anda, mas cambia lo que va a hacer.
La cabecera de una figura mide 17 + 5N. De ella, los ocho bytes que 0x500C se salta con un ld a,008h —los que van en figura + 9 + 3N— son la disposicion: uno por fila, con el nibble alto diciendo cuanto se corre a la derecha y el bajo cuantas casillas van seguidas. De 8 en adelante, esa fila no se pinta.
Con ellos la figura se coloca sola, y la prueba no es que quede bonita: la tabla de nombres que sale cuadra byte a byte con la del emulador.
La casilla 0x58 no es la X del ASCII. Dibujando la fuente se ve que es un glifo con la "r" y el punto juntos, asi que el nombre 04 4D 4F 41 49 51 4A 58 se lee MOAI·Jr. —el hijo de MOAI·KING, con el que comparte el archivo de figuras 4, que es un moai.

R7 = 0xE4 sale de los ocho registros de 0x4429, y dice borde azul. Pero monta_una_columna_del_fondo (0x439E) escribe 0xE1 en R7 en cada llamada, y de la presentacion en adelante el fondo es negro. Se vio comparando con el emulador: montar la pantalla con el azul de la tabla la deja de otro color.
Tres trozos que son instrucciones validas, encajan entre las rutinas de al lado y a los que no llega ni un call, ni un jp, ni una palabra de ninguna tabla —comprobado buscando los dos bytes en toda la ROM:
prepara_la_escritura;descomprime_en_tres_bancos que usa vuelca_en_la_vram en vez del descompresor;Y uno mas que si se ejecuta y no hace nada: 0x470D escribe en 0x4F84, que es ROM.