King's Valley

Dos protecciones anticopia que solo se disparan si el cartucho corre desde RAM, quince piramides dibujadas byte a byte contra la VRAM de una maquina de verdad, y las figuras que miran al otro lado, que no estan en la ROM: se fabrican dandole la vuelta a los bits.

Konami - (c) Konami 1985 - Cartucho RC-727, 16 KB - MSX1 - pagina 1 - Volcado a8f807a0...

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
651rutinas con nombre
45,5 %del listado comentado
9.803bytes de codigo
6.581bytes de datos
0bytes sin identificar

Lo que aparecio al desmontarlo

La tabla de colores va debajo de la de patrones

En SCREEN 2 lo normal es poner los patrones en 0x0000 y los colores en 0x2000. Este cartucho lo hace al reves, y no se ve en ninguna direccion: se ve en los registros. tabla_registros_vdp (0x45C0) vale 02 E2 0E 7F 07 76 03 E4, y en SCREEN 2 los registros 3 y 4 no son una direccion sino base mas mascara: el bit 7 de R3 a cero pone el color en 0x0000, y el bit 2 de R4 a uno pone los patrones en 0x2000.

El propio codigo lo confirma sin ambiguedad: 0x4831 dibuja el logotipo con ld hl,06300h, y 0x6300 enmascarado a catorce bits es 0x2300, dentro de la tabla de patrones. Leerlo al derecho da formas correctas y colores a franjas.

El explorador se mueve en veinticuatro bits

La X no es un byte ni dos: son tres. 0x73F6 suma la velocidad con add hl,de sobre 0xE138/0xE139 y propaga el acarreo a 0xE13A con adc a,c. El byte de menos peso es la fraccion, en 1/256 de pixel, y los dos de mas peso son justo los que lee_celda_de_sala toma como X entera para mirar celdas.

Hace falta tanta X porque la sala es mas ancha que la pantalla: las salas pares miden 64 columnas, 512 pixeles, y no caben en un byte. Cuando el explorador sale por un lateral, la tarea 9 hace ld (0e139h),bc y le cambia el byte alto en uno: un salto de 256 pixeles, una pantalla entera.

Ochenta y siete bytes de codigo que parecian datos

Cinco recorridos de entidades hacen ld hl,<cierre> / push hl antes de despachar, de modo que el ret de la rutina despachada no vuelve al llamador: cae en el cierre, que sube el indice y repite el bucle. Un trazador estatico no puede seguir eso, porque la direccion viaja por la pila como si fuera un dato.

Por eso 87 bytes salian como "sin identificar". Los cinco cierres tienen la misma forma -ld hl,<indice> / inc (hl) / cp (hl) / jp nz,<cuerpo>- y el cuerpo al que saltan es exactamente la etiqueta que los apila.

Dos rutinas que no llama nadie, y una de ellas dice algo

0x4501 son diecinueve bytes que decodifican como otra variante de dibujar un guion en los tres tercios. 0x4542 son diez bytes que son la pareja de prepara_escritura_vdp para LEER de la VRAM: llama a SETRD y coge el puerto de lectura de 0x0007, igual que la otra coge el de escritura de 0x0006.

Ninguna se llama, y no es una impresion: los pares de bytes 01 45 y 42 45 no aparecen en ningun sitio de los 16.384, comprobado byte a byte. La segunda cuenta algo del diseno del juego: este cartucho nunca lee de la VRAM. Escribe y se olvida.

Seis listas de entidades, y que es cada una

El juego lleva seis tablas paralelas de entidades y cada una tiene su propia rutina de acceso. No hay que suponer el tamano de cada entrada: esta en la multiplicacion. 0x6A12 hace i, 3i, 7i con B llevando las potencias de dos, o sea paso 7; 0x65A5 llega a 9i; 0x5AF6 entra a media cadena y llega a 17i; y 0x73D3 hace 2i, 6i, 22i.

Leer el descriptor de nivel byte a byte dice que hay en cada una: paso 7 las puertas de salida y las puertas giratorias, paso 9 las gemas y los muros trampa, paso 17 los cuchillos ya lanzados y paso 22 las momias. Las de paso 7 y 9 comparten indice, pero no son la misma entidad partida en dos: son las puertas y las gemas, y lo que comparten es una variable de contador.

El parpadeo de los sprites esta repartido a proposito

actualiza_tabla_de_sprites escribe siempre los mismos cuatro sprites en la tabla de atributos, pero empezando cada fotograma por uno distinto de un anillo de cuatro entradas, que gira con un contador en 0xE061.

No es un adorno. En el MSX1 solo se ven cuatro sprites por linea y gana el de numero mas bajo; al girar el orden de escritura, el que se pierde cambia en cada fotograma y los cuatro parpadean por igual en vez de desaparecer siempre el mismo.

El color de la piedra cambia cada cuatro salas

Las salas salian negras sobre negro hasta dar con quien pone el color de los tiles de pared y suelo. No es prepara_sala_nueva: es columna_decorativa (0x6DA0), y el guion que usa depende del grupo de cuatro niveles -0x6DC4 mas 9 por grupo, con el grupo sacado de (nivel-1) >> 2-.

Por eso las cuatro primeras salas son de piedra ocre y las siguientes cambian de color, con el mismo dibujo de ladrillo: lo unico que cambia son los ocho bytes de color.

Los textos van en ASCII menos 0x20

Los rotulos del cartucho no estan en ASCII ni en una fuente propia con tabla: estan en ASCII desplazado 0x20 hacia abajo. Los bytes 2B 2F 2E 21 2D 29 mas 0x20 dan KONAMI, y con la misma suma salen SCORE, HI, REST, PUSH SPACE KEY, PLAY START, GAME OVER, SOFTWARE y PYRAMID. El 0x00 es el espacio y el 0x1A el simbolo de copyright.

El cartucho se defiende, dos veces

Dos rutinas escriben dentro del propio espacio del cartucho, y corriendo desde ROM ninguna hace nada. No son codigo muerto: son proteccion anticopia, y que no hagan nada es la gracia. Un cartucho pirateado es una copia en RAM, y ahi las escrituras si cuelan.

0x403E machaca el primer byte de la tarea 1 con un pop hl + ret; 0x409C escribe DE encima de 0x43C0, que es el operando del jp nc de 0x43BF. Las identifico Manuel Pazos en su desensamblado de 2009; este proyecto tenia una escrita como parche fallido y la otra como direccion de relleno.

Esta es la primera version, y hay una segunda

En 0x5817 nuestra ROM tiene las tres comparaciones sueltas que la segunda compilacion sustituye por dos restas, y la firma de la segunda no aparece en ninguno de los 16.384 bytes. Lo desensamblado aqui es la version 1, con sus fallos: lanzar un cuchillo mientras la puerta se abre corrompe sus tiles, lanzarlo pegado a un objeto lo atraviesa, y dos muros trampa estan mal colocados.

Cada sala es el doble de ancha de lo que parece

El pop de de 0x6B0E devuelve el puntero a la banda que se acaba de desempaquetar, asi que el cp 030h de dos instrucciones despues mira ESA banda y no la siguiente: la banda 0x3x se dibuja y ademas cierra la lista. Leido al reves se pierde una banda por sala.

El arreglo no es una opinion: el buffer de sala se comparo contra la RAM de una maquina de verdad en las quince piramides, 31.680 celdas sin una diferencia, y las pantallas dibujadas contra su VRAM -nombres, patrones, color y sprites-, tambien con cero.

Si lleva la marca oculta de Konami

Konami escondio su numero de catalogo y el titulo en katakana al final de muchos cartuchos; lo descubrio Manuel Pazos (@ManuelPazosMSX). Este lo lleva, cerrando en 0x7FFF: RC-727 y OU KE NO TA NI, que es el titulo japones del juego, 王家の谷, el Valle de los Reyes.

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 con los pasos del propio cartucho y comprobada byte a byte contra la VRAM de una maquina real. El rotulo del juego no es un dibujo suelto: son veintidos pasos, uno por columna, cada uno escribiendo dos patrones consecutivos a partir del 0x9B, mas la pata de la G, que baja una fila mas
La pantalla de titulo, montada con los pasos del propio cartucho y comprobada byte a byte contra la VRAM de una maquina real. El rotulo del juego no es un dibujo suelto: son veintidos pasos, uno por columna, cada uno escribiendo dos patrones consecutivos a partir del 0x9B, mas la pata de la G, que baja una fila mas
La pantalla ANTERIOR a esa: el <b>logotipo de Konami</b> subiendo, que es la tarea 0. La tarea 1 lo borra entero y pinta el del juego encima. Son dos pantallas distintas, y confundirlas es lo que tuvo aqui el logotipo equivocado hasta el 2026-09-04
La pantalla ANTERIOR a esa: el logotipo de Konami subiendo, que es la tarea 0. La tarea 1 lo borra entero y pinta el del juego encima. Son dos pantallas distintas, y confundirlas es lo que tuvo aqui el logotipo equivocado hasta el 2026-09-04
<b>Todas las figuras del cartucho, con su nombre.</b> El explorador tiene tres juegos de sprites -con las manos vacias, con el cuchillo y con el pico- que se cargan en la MISMA direccion de VRAM, y por eso solo puede haber uno a la vez. Mirando al otro lado no hay dibujos: se fabrican al vuelo dandole la vuelta a los bits. Los rotulos de esta lamina estan escritos con la tipografia del propio cartucho
Todas las figuras del cartucho, con su nombre. El explorador tiene tres juegos de sprites -con las manos vacias, con el cuchillo y con el pico- que se cargan en la MISMA direccion de VRAM, y por eso solo puede haber uno a la vez. Mirando al otro lado no hay dibujos: se fabrican al vuelo dandole la vuelta a los bits. Los rotulos de esta lamina estan escritos con la tipografia del propio cartucho
El <b>mapa del valle</b>: las quince piramides y el rotulo GOAL. No es una lista de niveles sino un <b>anillo</b>, y cada puerta de cada piramide lleva escrito a cual lleva. El pergamino se ve blanco por un color que dejo la pantalla de titulo y que nadie vuelve a tocar en toda la partida: dibujado sobre una VRAM limpia sale negro, y asi salia aqui hasta el 2026-09-04
El mapa del valle: las quince piramides y el rotulo GOAL. No es una lista de niveles sino un anillo, y cada puerta de cada piramide lleva escrito a cual lleva. El pergamino se ve blanco por un color que dejo la pantalla de titulo y que nadie vuelve a tocar en toda la partida: dibujado sobre una VRAM limpia sale negro, y asi salia aqui hasta el 2026-09-04
La <b>primera</b>: cuatro gemas, ocho escaleras, un cuchillo y dos momias
La primera: cuatro gemas, ocho escaleras, un cuchillo y dos momias
La <b>segunda</b>, de dos pantallas: siete picos, dos puertas giratorias y dos muros trampa
La segunda, de dos pantallas: siete picos, dos puertas giratorias y dos muros trampa
La <b>tercera</b>: cinco gemas, y el primer muro trampa en una sala de una sola pantalla
La tercera: cinco gemas, y el primer muro trampa en una sala de una sola pantalla
La <b>cuarta</b>, con dieciseis escaleras: las mas de todo el juego
La cuarta, con dieciseis escaleras: las mas de todo el juego
La <b>quinta</b>, la que juega la demo cuando nadie toca nada
La quinta, la que juega la demo cuando nadie toca nada
La <b>sexta</b>: diez picos, y el cambio a la piedra del segundo grupo
La sexta: diez picos, y el cambio a la piedra del segundo grupo
La <b>septima</b>, sin puertas giratorias ni trampas: solo escaleras y gemas
La septima, sin puertas giratorias ni trampas: solo escaleras y gemas
La <b>octava</b>, con tres muros trampa y cuatro cuchillos
La octava, con tres muros trampa y cuatro cuchillos
La <b>novena</b>, la unica con una sola momia
La novena, la unica con una sola momia
La <b>decima</b>, ya con la piedra roja del tercer grupo
La decima, ya con la piedra roja del tercer grupo
La <b>undecima</b>: dos puertas giratorias en una sala de una pantalla
La undecima: dos puertas giratorias en una sala de una pantalla
La <b>duodecima</b>, con ocho picos y dos giratorias
La duodecima, con ocho picos y dos giratorias
La <b>decimotercera</b>: ocho picos y ninguna trampa
La decimotercera: ocho picos y ninguna trampa
La <b>decimocuarta</b>, doce picos -la que mas- y la piedra verde del ultimo grupo
La decimocuarta, doce picos -la que mas- y la piedra verde del ultimo grupo
La <b>ultima</b>: seis gemas, y su salida vuelve a la primera piramide
La ultima: seis gemas, y su salida vuelve a la primera piramide
La <b>pantalla final</b>, con sus rotulos que se estiran. No son un dibujo: <code>rotulo_horizontal</code> (0x76A7) escribe un tile de remate y va rellenando hacia un lado, bajando una fila y creciendo una celda en cada vuelta hasta pasar de la VRAM 0x3A80
La pantalla final, con sus rotulos que se estiran. No son un dibujo: rotulo_horizontal (0x76A7) escribe un tile de remate y va rellenando hacia un lado, bajando una fila y creciendo una celda en cada vuelta hasta pasar de la VRAM 0x3A80
El <b>marco de la pantalla de juego</b> sin sala dentro, tal como lo deja <code>prepara_sala_nueva</code> (0x4FC9). Los tiles de pared ya estan cargados pero todavia sin color: ese lo pone <code>columna_decorativa</code> despues, y es lo que hace que cada grupo de cuatro salas tenga su piedra
El marco de la pantalla de juego sin sala dentro, tal como lo deja prepara_sala_nueva (0x4FC9). Los tiles de pared ya estan cargados pero todavia sin color: ese lo pone columna_decorativa despues, y es lo que hace que cada grupo de cuatro salas tenga su piedra