Yie Ar Kung-Fu

El fondo del templo escrito como TILES por un guion, el oponente dibujado con tiles y el jugador con sprites, y las dos compilaciones del cartucho cotejadas instruccion a instruccion.

Konami - (c) Konami 1985 - Cartucho RC-725, 16 KB - MSX1 - pagina 1 - Volcado 644c78c7...

Aqui no hay ninguna captura. Todas las imagenes estan dibujadas desde los bytes de la ROM, ejecutando en Python los mismos interpretes que corre el Z80, y comprobadas contra la VRAM del emulador: cero diferencias en las tablas de color y de patron, 12.288 bytes. El listado y las cifras se reproducen con make.

LAS DOS COMPILACIONES

De Yie Ar Kung-Fu hay dos cartuchos distintos circulando, y no es un rumor: aqui estan los dos, y tools/coteja_builds.py los compara instruccion a instruccion. Son el mismo programa -comparten el 97,0 % de las instrucciones- pero no se juegan igual.

FACILDIFICIL
sha256644c78c7...61c86ad4...
cada cuanto reacciona el oponentesiempre 1 cuadro de cada 321 de cada 32, 16 u 8 segun el nivel
el arma larga de CHENdura 18 cuadros y crece hasta 8dura 22 y crece hasta 10
la marca oculta de KonamiNO la llevaSI: RC-725 y el titulo en katakana
el listado de este repositorioestesolo cotejada

O sea: en el cartucho dificil, al nivel mas alto el oponente reacciona cuatro veces mas a menudo que en el facil, y eso en el facil no pasa nunca. Lo demas son cinco constantes del arma de CHEN y un cambio de forma en tres umbrales de altura.

El cartucho en cifras

100 %del binario explicado
569rutinas con nombre
44,0 %del listado comentado
7.494bytes de codigo
8.890bytes de datos
0bytes sin identificar

Lo que aparecio al desmontarlo

Las dos compilaciones difieren en el 95 % de los bytes y comparten el 97 % de las instrucciones

De este cartucho circulan dos volcados, que los archivos llaman easy y hard. Byte a byte se parecen en nada: 15.618 de 16.384 bytes distintos, el 95,3 %. Esa cifra no vale para nada, porque las dos estan relocalizadas: un byte de mas en un sitio desplaza todo lo que va detras y con ello todas las direcciones absolutas.

Cotejadas por INSTRUCCION -sustituyendo por un comodin todo operando de 16 bits que caiga dentro del cartucho- comparten 3.798 de las 3.917 instrucciones, el 97,0 %. Son el mismo programa.

Lo que cambia de verdad: una mascara fija que se vuelve variable

La version facil deja pasar un cuadro de cada 64 y de cada 32 con mascaras escritas dentro del codigo (and 03fh, and 03eh). La dificil mete delante, en esos dos sitios exactos, ocho instrucciones que no aparecen ni una vez en la facil:

ld b,03eh / ld a,(0e056h) / and a / jr z,+7
ld b,01eh / dec a / jr z,+2 / ld b,00eh

y cambia el and 03fh por un and b. La mascara la elige el nivel: 0x3E, 0x1E o 0x0E. En el nivel mas alto el oponente reacciona cuatro veces mas a menudo, y en la version facil eso no pasa nunca.

Lo demas son cinco constantes, todas del arma larga del tercer oponente: dura 22 cuadros en vez de 18 y se estira hasta 10 en vez de hasta 8.

Solo una de las dos lleva la marca oculta de Konami

Konami escondia su numero de catalogo y el titulo en katakana al final de muchos cartuchos; lo descubrio Manuel Pazos (@ManuelPazosMSX). La version dificil la lleva: RC-725 y el titulo en katakana, cerrando en el ultimo byte.

La version facil no. En ese mismo hueco tiene el titulo en ASCII latino, YIE AR KUNG FU, que no lo lee nadie: el cartucho no sabe leer ASCII, porque su alfabeto empieza la A en el tile 0x21. Lo que eso quiera decir sobre cual salio antes no lo dice el binario, y aqui no se supone.

El fondo del templo no esta en la tabla de patrones: esta en la de nombres

El cartucho tiene dos interpretes de dibujo. El de GUIONES (0x442c) escribe por el puerto de datos del VDP y se usa para patrones y colores; el de LISTAS (0x44a6) escribe tiles con WRTVRM. De los catorce guiones largos del cartucho, uno solo escribe en 0x3800: el de 0x5da4, y lo que pone ahi es el templo entero -las columnas, las lamparas, el cartel de los dos kanjis, el gong, las ventanas y el suelo de ladrillo-, 327 bytes.

Las tablas que parecian cinco escenarios son los cinco oponentes

Las tablas de 0x4b9c y 0x4ba6 dan un guion de patron y otro de color por cada valor de 0xE054, y se dibujan al montar la pantalla, asi que parecen cinco fondos. No lo son: montando la pantalla con los cinco y comparandolas cambian unos 4.000 bytes de VRAM, pero ninguno de los tiles que cambian esta en uso en la tabla de nombres del fondo. El templo se ve igual con los cinco.

Lo que cambia es la figura del oponente: WANG, TAO, CHEN, LANG y WU, en el mismo orden que sus nombres en 0x6c35.

La prueba del 0x78: el jugador es de sprites y el oponente de tiles

El MSX no sabe reflejar ni un sprite ni un tile, asi que un luchador que mira a los dos lados necesita las dos versiones guardadas. 0x4c3e copia los tiles del oponente de la VRAM 0x2880 a la 0x2440 dandole la vuelta a cada byte: del tile 0x10 al 0x88, o sea 0x78 mas alla.

Y el descompresor de poses, cuando le toca espejar un bloque (0x5454), cambia cada tile por su gemelo sumandole 0x78. Las dos mitades del truco, a 10 KB de distancia una de otra.

El mismo rotulo de doce bytes, dos premios distintos

La lista de 0x47cc dice PERFECT 3000 y se dibuja en la fila 16 por la puerta normal, 0x449e, que se lee sus dos primeros bytes como direccion de VRAM.

Pero 0x48ad entra por 0x449a, que no lee direccion, con DE dos bytes mas alla -saltandose justamente esa direccion- y HL en la fila 4. Y acto seguido escribe el tile del digito 5 encima del 3. El mismo texto pasa a decir PERFECT 5000, y lo que se suma son 0x5000 en BCD.

Cada figura del luchador lleva su destino delante, y se dibuja por dos caminos

Los trece guiones de 0x596f van pegados, pero la tabla de 0x4cf0 no apunta al principio de cada uno: apunta dos bytes mas alla. Esos dos bytes son una direccion de VRAM.

No es un descuadre: el bucle de 0x4ca4 entra por la puerta que quiere el destino en HL y por eso empieza pasados los dos bytes, y el de 0x5098 entra por el cuerpo del comando 0x80, que lee el destino del propio guion. Lo demuestra una cuenta: veinticuatro palabras del bloque de recetas valen exactamente una de esas trece direcciones menos dos, y ninguna vale una de la tabla.

Una tabla de despacho con una entrada de mas metia 178 bytes de basura en el listado

La regla para saber cuantas entradas tiene una tabla de punteros -leer palabras mientras caigan dentro del cartucho- da seis para la de 0x6b4b. Son cinco: la sexta, 0x583A, cae dentro de un guion de dibujo, y seguirla como codigo llenaba el listado de rst 18h y sbc a,a.

Cinco es lo que dice el indice, que es el oponente, y de esos hay cinco. Y la prueba de que la tabla acaba en 0x6b55 es que 0x4182 hace call 0x6b55: ahi empieza codigo al que se llama por su nombre.

Un salto que aterriza dentro de otra instruccion

El jr z de 0x4625 tiene desplazamiento 8, o sea que salta a 0x462F. Y 0x462F no es el principio de nada: es el tercer byte del jp 0x46cf que empieza en 0x462d.

Cayendo ahi, el Z80 se encuentra el byte 0x46 suelto y lo ejecuta como lo que es, ld b,(hl), y luego cae en el call de 0x4630. El byte alto de una direccion haciendo de instruccion de paso, y dos bytes ahorrados. Que es asi y no un fallo del trazado lo dice el desplazamiento: es 0x08 y no 0x09.

El azar del oponente es un registro de diez bytes con semilla fija

0x6d2c corre un registro de desplazamiento de diez bytes, de 0xE135 a 0xE13E: saca el bit por arriba, lo arrastra por los nueve de abajo y lo vuelve a meter por arriba, dos veces por llamada. Devuelve los dos bits bajos, un numero de 0 a 3.

La semilla son diez bytes de la ROM, y hay cuatro juegos distintos elegidos por el nivel. Con eso el oponente no se repite pero tampoco depende de nada de fuera: la partida sale igual jugada igual, que es justo lo que hace falta para poder comprobarla.

Tres trozos de codigo que no alcanza nadie

Veintiseis bytes en 0x73b3, tres en 0x73df y ocho en 0x74ae decodifican como codigo Z80 coherente. No los alcanza nadie, y no es una impresion: se busco la palabra de 16 bits en los 16.384 bytes del cartucho, no solo en el listado, y ninguna direccion cae dentro. Delante de los tres hay un salto que pasa por encima.

Lo que el cartucho dibuja

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

<b>El protagonista, montado.</b> No es un sprite: son <b>SEIS</b>, y sus seis numeros de patron -04 08 0C 10 14 18, los de 0x50A6- no cambian nunca. Lo que cambia en cada pose es DONDE va cada uno y QUE dibujo tiene dentro, y las dos cosas las dice la receta de 0x50AC. Los desplazamientos y los colores de aqui estan comprobados contra la tabla de atributos de sprites de una maquina en marcha: <b>doce volcados, doce poses reconocidas</b>
El protagonista, montado. No es un sprite: son SEIS, y sus seis numeros de patron -04 08 0C 10 14 18, los de 0x50A6- no cambian nunca. Lo que cambia en cada pose es DONDE va cada uno y QUE dibujo tiene dentro, y las dos cosas las dice la receta de 0x50AC. Los desplazamientos y los colores de aqui estan comprobados contra la tabla de atributos de sprites de una maquina en marcha: doce volcados, doce poses reconocidas
<b>La pantalla del titulo</b>, montada con los pasos del propio cartucho: el color plano de los dieciseis primeros tiles (0x560f), el guion de la fuente en la VRAM 0x2080, el relleno de 0xF0 y los dos guiones del rotulo, y encima las listas de tiles de 0x5909 y 0x559b, que traen el logotipo, el PUSH SPACE KEY y el copyright
La pantalla del titulo, montada con los pasos del propio cartucho: el color plano de los dieciseis primeros tiles (0x560f), el guion de la fuente en la VRAM 0x2080, el relleno de 0xF0 y los dos guiones del rotulo, y encima las listas de tiles de 0x5909 y 0x559b, que traen el logotipo, el PUSH SPACE KEY y el copyright
El mismo fondo con la <b>otra lista</b>, la de 0x55c8: el <b>VIDEO CARTRIDGE</b> que la escena 0 dibuja uno de cada dos cuadros antes de dar paso al logotipo
El mismo fondo con la otra lista, la de 0x55c8: el VIDEO CARTRIDGE que la escena 0 dibuja uno de cada dos cuadros antes de dar paso al logotipo
<b>La pantalla de combate</b>. El templo -las columnas, las lamparas, el cartel, el gong, las ventanas y el ladrillo- lo escribe como tiles el guion de 0x5da4 en la tabla de NOMBRES; los patrones y los colores vienen de 0x605b y 0x6207. Comparada con la VRAM del emulador a los 120 segundos de partida: <b>cero diferencias</b> en color y en patron
La pantalla de combate. El templo -las columnas, las lamparas, el cartel, el gong, las ventanas y el ladrillo- lo escribe como tiles el guion de 0x5da4 en la tabla de NOMBRES; los patrones y los colores vienen de 0x605b y 0x6207. Comparada con la VRAM del emulador a los 120 segundos de partida: cero diferencias en color y en patron
<b>WANG</b>, el primer oponente, con sus siete poses. Los oponentes NO son sprites como el protagonista: son <b>tiles</b> escritos en la tabla de nombres, y cada pose es un RECTANGULO de alto por ancho con sus tiles comprimidos dentro del propio bloque. La de reposo de WANG es <code>00 10 E3 FF 11</code>: un hueco, la cabeza, tres huecos y quince tiles correlativos. Veinte, que es 5 x 4
WANG, el primer oponente, con sus siete poses. Los oponentes NO son sprites como el protagonista: son tiles escritos en la tabla de nombres, y cada pose es un RECTANGULO de alto por ancho con sus tiles comprimidos dentro del propio bloque. La de reposo de WANG es 00 10 E3 FF 11: un hueco, la cabeza, tres huecos y quince tiles correlativos. Veinte, que es 5 x 4
<b>TAO</b>, el segundo. Cada oponente tiene su propia anchura de pose -TAO 4 tiles, WANG 5, CHEN y LANG 5, WU 4-, y por eso ponerlos todos a cuatro por fila, que es lo que hacia esta web hasta el 2026-09-04, partia las figuras
TAO, el segundo. Cada oponente tiene su propia anchura de pose -TAO 4 tiles, WANG 5, CHEN y LANG 5, WU 4-, y por eso ponerlos todos a cuatro por fila, que es lo que hacia esta web hasta el 2026-09-04, partia las figuras
<b>CHEN</b>, el tercero, el de la cadena. Es el unico al que la version dificil le cambia constantes -cinco-, todas de su arma larga
CHEN, el tercero, el de la cadena. Es el unico al que la version dificil le cambia constantes -cinco-, todas de su arma larga
<b>LANG</b>, el cuarto, con ocho poses
LANG, el cuarto, con ocho poses
<b>WU</b>, el quinto y ultimo, tambien con ocho. Su tabla de poses tiene VEINTE entradas, dos mas que la de los otros cuatro
WU, el quinto y ultimo, tambien con ocho. Su tabla de poses tiene VEINTE entradas, dos mas que la de los otros cuatro