King's Valley

El premio secreto de la casa -5730 puntos, que en japones se leen go-na-mi-, una demostracion que no es inteligencia sino una partida grabada de 77 pulsaciones, y un juego que no guarda mapa de colisiones: lee la pantalla para saber por donde se puede pasar.

Konami - (c) Konami 1985 - Cartucho RC-728, 16 KB - MSX1 - pagina 1 - Volcado 89ae5bdd...

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.

El cartucho en cifras

100 %del binario explicado
512rutinas con nombre
53,0 %del listado comentado
7.789bytes de codigo
8.595bytes de datos
0bytes sin identificar

Lo que aparecio al desmontarlo

5730 puntos son, en japones, la palabra KONAMI

En una zona de bonus, si el protagonista se pone en la casilla exacta X=0x90 e Y=0x39, el juego escribe KONAMI 5730 PTS y suma esos 5730 puntos. Las dos cifras cuadran solas: el rotulo lo dice y el ld de,05730h de 0x4931 lo suma.

La cifra no es arbitraria. En japones los numeros se leen tambien por su sonido: 5 = go, 7 = na, 3 = mi, o sea go-na-mi. Es un huevo de pascua que la casa repitio en muchos de sus juegos, tambien en los recreativos.

La demostracion no es inteligencia: es una partida grabada

Cuando nadie juega, el muneco se mueve solo. No hay ninguna rutina que decida: hay 77 pulsaciones grabadas, comprimidas en 0x5D82, que se descomprimen a 0xE342 y que la rutina de 0x468F va metiendo por donde entraria el mando, una cada dos cuadros, hasta encontrar un 0xFF.

Los valores son las mismas mascaras que da el joystick -0x01 arriba, 0x02 abajo, 0x04 izquierda, 0x08 derecha, 0x10 el boton-, asi que el resto del juego no distingue si esta jugando una persona o el guion.

El mapa de colisiones es la propia pantalla

Este cartucho no guarda en memoria por donde se puede andar. Para saberlo lee la pantalla: llama a RDVRM y mira que patron hay dibujado en la casilla. Todo patron por debajo de 0x80 se trata como pared, y de 0x90 en adelante se puede pasar.

Eso explica un detalle que si no pareceria caprichoso: cada vez que se pone un objeto en la pantalla, el juego se apunta que habia debajo. Si no lo hiciera, al cogerlo se abriria un agujero por donde se podria caminar.

Cincuenta zonas sobre veinticinco mapas

El juego anuncia cincuenta zonas, y mapas distintos solo hay veinticinco: en 0x498E, cuando el numero de zona llega a 25, se le restan 25 y se vuelve a empezar por el primer mapa.

Y de esos veinticinco, cuatro son el mismo: las entradas 4, 9, 14, 19 y 24 apuntan las cinco al bloque de 0x6E87. Una de cada cinco zonas es de bonus, y todas comparten pantalla.

La prueba de que los mapas estan bien leidos no es que se vean bien: es que los veinticinco, comprimidos con el RLE de la casa y sin llevar el tamano escrito en ninguna parte, descomprimen a 120 bytes clavados cada uno.

Los colores van debajo de los patrones, al reves de lo normal

En SCREEN 2 lo habitual es poner los patrones en 0x0000 y los colores en 0x2000. Aqui es al reves, y lo dicen los ocho bytes que el cartucho carga en los registros del VDP (la tabla de 0x45F7, que vale 02 E2 0E 7F 07 76 03 E0): R3=0x7F pone los colores en 0x0000 y R4=0x07 los patrones en 0x2000.

Leerlo al reves no da un error visible de golpe: da formas correctas y colores a franjas. Es la trampa clasica de este modo.

Los enemigos son cinco, y ninguno persigue igual

El reparto de 0x569F manda a cada tipo a su propia rutina:

La tabla de sprites se rota entera en cada cuadro

El MSX1 solo puede ensenar cuatro sprites por linea, y los que ganan son siempre los primeros de la tabla: los ultimos desaparecen sin mas.

La rutina de 0x459A lo resuelve volcando la tabla empezando cada cuadro dieciseis bytes mas adelante y dando la vuelta al llegar al final. Como el orden va cambiando, el que se pierde no es siempre el mismo, y lo que se ve es un parpadeo repartido en vez de un personaje invisible.

El decorado que fluye no guarda ni un fotograma

Las animaciones del fondo no tienen dibujos alternativos en la ROM. Se coge el patron que ya esta en la memoria de video y se le rotan los bits con rrca o rlca: un pixel de desplazamiento por vuelta, ocho bytes por patron.

La otra variante mueve los bytes enteros una fila con un lddr, y devuelve por arriba el que se sale por abajo.

Una direccion de este cartucho no significa nada sin decir cuando

0xE0B0 es dos cosas distintas segun el momento: mientras se monta la zona guarda el mapa descomprimido, 120 bytes; durante la partida son los 32 atributos de sprite, 128 bytes que se vuelcan de un tiron a 0x3B00 -que es donde R5 pone su tabla-.

El mismo kilobyte sirve para las dos cosas porque nunca hacen falta a la vez.

Un bucle que cuenta catorce sobre una lista de trece

La rutina de 0x41D5 busca el numero de zona en la lista de las que llevan razzon grande y, si no lo encuentra, escribe el aviso NO BIG RAZZON. Entra con ld b,00eh, o sea catorce vueltas, pero de 0x609E a 0x60AA solo hay trece bytes.

La decimocuarta comparacion cae ya en el bloque siguiente, el de la zona 0, y vale 0x08. Los trece de la lista van en orden creciente y ese 0x08 lo rompe. El efecto se puede decir sin suponer intenciones: la zona 8 tambien da coincidencia, y por eso no le sale el aviso aunque no este en la lista.

Codigo que no llama nadie

En 0x4575 hay una rutina de diez bytes que prepara la LECTURA de la memoria de video: la gemela exacta de la de escritura que si se usa. No hay un solo call ni jp a esa direccion en toda la ROM, ni aparece como palabra en ninguna tabla. Se quedo dentro.

Lo que el cartucho dibuja

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

<b>La pantalla de titulo</b>, montada ejecutando los pasos del propio cartucho. El rotulo grande no es un dibujo suelto: son <b>tres filas de veinte celdas con patrones consecutivos</b> a partir del 0xC0, escritas por el bucle de 0x44A8 con un <code>inc d</code> por celda. El color lo pone un relleno de 480 bytes que alterna entre dos valores, y por eso el rotulo cambia de color
La pantalla de titulo, montada ejecutando los pasos del propio cartucho. El rotulo grande no es un dibujo suelto: son tres filas de veinte celdas con patrones consecutivos a partir del 0xC0, escritas por el bucle de 0x44A8 con un inc d por celda. El color lo pone un relleno de 480 bytes que alterna entre dos valores, y por eso el rotulo cambia de color
La misma pantalla con el otro color. No son dos dibujos: es el mismo, con el relleno de color puesto en 0xC0 en vez de 0xD0 segun el bit 0 del contador de 0xE043
La misma pantalla con el otro color. No son dos dibujos: es el mismo, con el relleno de color puesto en 0xC0 en vez de 0xD0 segun el bit 0 del contador de 0xE043
El <b>marco del area de juego</b> sin ninguna zona dentro, tal como lo deja la rutina de 0x4A61: dos filas de veinticuatro celdas arriba y abajo, cuatro columnas de veintidos a los lados, y encima el guion de 0x71F7 con el resto del decorado
El marco del area de juego sin ninguna zona dentro, tal como lo deja la rutina de 0x4A61: dos filas de veinticuatro celdas arriba y abajo, cuatro columnas de veintidos a los lados, y encima el guion de 0x71F7 con el resto del decorado
La <b>primera zona</b>. Cada uno de los 120 bytes del mapa es un <b>metatile</b>, un cuadro de 2x2 celdas cuyos cuatro indices salen de la tabla de 0x6EF3. Doce de ancho por diez de alto, y esas dos cifras no salen del aspecto del dibujo: son el <code>cp 00ch</code> y el <code>cp 00ah</code> con los que cuenta el bucle de 0x64CD
La primera zona. Cada uno de los 120 bytes del mapa es un metatile, un cuadro de 2x2 celdas cuyos cuatro indices salen de la tabla de 0x6EF3. Doce de ancho por diez de alto, y esas dos cifras no salen del aspecto del dibujo: son el cp 00ch y el cp 00ah con los que cuenta el bucle de 0x64CD
La <b>tercera zona</b>, ya con los macizos que hacen de obstaculo. El dibujo sale de descomprimir el bloque de 0x6648 con el RLE del cartucho y montar sus metatiles: no hay ninguna captura de por medio
La tercera zona, ya con los macizos que hacen de obstaculo. El dibujo sale de descomprimir el bloque de 0x6648 con el RLE del cartucho y montar sus metatiles: no hay ninguna captura de por medio
La <b>zona de bonus</b>, que es la misma para las cinco que la usan (las entradas 4, 9, 14, 19 y 24 apuntan todas al bloque de 0x6E87). Dibuja letras con los propios metatiles del decorado
La zona de bonus, que es la misma para las cinco que la usan (las entradas 4, 9, 14, 19 y 24 apuntan todas al bloque de 0x6E87). Dibuja letras con los propios metatiles del decorado
La zona de indice <b>8</b> -la que el marcador llama la 9-, la del descuadre: por el bucle que cuenta catorce sobre una lista de trece, es la unica que se libra del aviso <code>NO BIG RAZZON</code> sin estar en la lista
La zona de indice 8 -la que el marcador llama la 9-, la del descuadre: por el bucle que cuenta catorce sobre una lista de trece, es la unica que se libra del aviso NO BIG RAZZON sin estar en la lista
La <b>decimotercera</b>, de las mas cerradas del cartucho
La decimotercera, de las mas cerradas del cartucho
La <b>vigesimo primera</b>. A partir de la 25 el juego vuelve a usar estos mismos mapas: cincuenta zonas anunciadas, veinticinco dibujos
La vigesimo primera. A partir de la 25 el juego vuelve a usar estos mismos mapas: cincuenta zonas anunciadas, veinticinco dibujos
La <b>vigesimo cuarta</b>, la ultima antes de la zona de bonus que cierra la vuelta
La vigesimo cuarta, la ultima antes de la zona de bonus que cierra la vuelta