Game Master

No es un juego: es el cartucho de trucos de Konami. Se enchufa en la ranura de al lado, reconoce el juego que tiene enfrente y le parchea el arranque en la RAM para quedarse con su interrupción. Es el único cartucho comercial de MSX cuyo trabajo entero consiste en leer y modificar otro cartucho.

Konami · © Konami 1986 · Cartucho RC-735, 16 KB · MSX1 · página 1 · Volcado 3160911a…

Aquí no hay ninguna ilustración ni captura. El rótulo y todas las pantallas están dibujados desde los bytes de la ROM, ejecutando en Python el mismo descompresor y los mismos pintores que corre el Z80, y cotejados byte a byte contra la VRAM de openMSX. El listado y las cifras salen del binario y se reproducen con make.

El cartucho en cifras

100 %del binario explicado
22.1 %de instrucciones comentadas
28juegos que reconoce
10.522bytes de código
5.862bytes de datos
0rutinas sin explicar

Lo que apareció al desmontarlo

Se cuela buscando una instrucción que llevan los 40 cartuchos de Konami

Copia a la RAM los 256 primeros bytes del arranque del cartucho vecino, leyéndolos con RDSLT, y busca ahí la secuencia 9B FD: es el operando de ld (0xFD9B),hl, la instrucción con la que un juego de Konami instala su rutina de interrupción en el gancho H.KEYI. La sustituye por cinco bytes (0x4CB9) y esa instrucción pasa a ser ld (0xD130),hl + call 0xD814: el gancho del juego queda guardado y el control es del Game Master. Luego ejecuta la copia parcheada, no la original.

Funciona con todo el catálogo porque todos los cartuchos de Konami arrancan igual. Comprobado sobre las 42 ROM de cartucho de la colección: las 40 de Konami llevan esa instrucción en los 256 bytes de su INIT. Las dos únicas que no la llevan son Casio World Open —que no es de Konami— y el propio Game Master.

Reconoce 28 juegos, y no por el nombre: por una suma

Primero mira si el vecino trae la segunda cabecera de 0x4010, la que empieza por AB o CD. De las 42 ROM de la colección sólo la llevan cinco. Para todo lo demás suma los 256 bytes que van de 0x5000 a 0x50FF de la ROM del vecino y busca esa suma de 16 bits en la tabla de 0x5F3A: 62 entradas que apuntan a 29 cabeceras postizas de 19 bytes para 28 juegos —la tabla lleva las compilaciones alternativas de cada uno—.

La tabla está cotejada: de los 28, 25 se han comprobado sumando de verdad los bytes de sus ROM. Los otros tres no tienen ROM aquí y salen del manual, y el binario y el manual coinciden hasta en los huecos: ni uno ni otro tienen RC-719, RC-722 ni RC-726.

Konami dice desde dentro que dos de sus juegos son el mismo

La tabla de trucos de 0x5B02 da una rutina por juego, y hay dos parejas que comparten la suya. Una es RC-710 y RC-711, los dos Hyper Olympic, que se distinguen dentro comparando el número de catálogo. La otra es RC-700 y RC-716: para el Game Master, Athletic Land y Cabbage Patch Kids son el mismo programa y se les tocan las mismas variables. Es exactamente lo que se midió al desensamblar el segundo, ahora dicho por la propia Konami.

El aviso de truco activo es el LED de CAPS

El cartucho no puede pintar en la pantalla del juego sin estropearla, así que avisa con la luz del teclado: 0x4E70 llama a CHGCAP cada vez que se congela o se descongela la partida. Y al congelar calla el PSG de verdad: 0x4E85 se guarda los volúmenes de los tres canales antes de ponerlos a cero, y 0x4EF8 los devuelve al reanudar.

De paso, un ahorro de los que se ven poco: 0xD12D guarda el volumen del canal C y a la vez es el byte bajo del IY con el que se llama entre ranuras. Se puede porque CALSLT sólo mira IYh.

Vive en la misma página que el juego, así que se copia a la RAM para poder moverse

El Game Master ocupa la página 1. El juego al que le hace trucos ocupa también la página 1, en otra ranura: los dos no pueden estar puestos a la vez. Todo el cartucho está construido alrededor de esa pelea. Seis bloques de código se copian a la RAM y se ejecutan allí, porque conmutar la ranura desde la ROM sería serrar la rama en la que uno está sentado.

Eso obliga a leer el listado con cuidado: las direcciones absolutas de esos bloques apuntan a donde se ejecutan, no a donde están guardadas. El trazador lleva una directiva (!reubica) para seguirlos, y con ella el trazado pasó del 52,9 % al 60,0 %.

Los menús se abren encima del juego, sin cambiar de pantalla

Los menús de disco y cinta sólo borran 0x100 bytes desde 0x3A00, o sea las ocho filas de abajo: lo demás se queda como estaba. Y antes, 0x4275 llama a la rutina que se lleva la VRAM del juego a la RAM para poder devolverla. Así que en la máquina real la mitad de arriba de esas pantallas es la partida corriendo, no un fondo del cartucho.

Cuatro rutinas y dos puertas a las que no llega nadie

Cuatro trozos (0x6445, 0x6787, 0x6904 y 0x6938) desensamblan a Z80 correcto, empiezan justo detrás de un ret y acaban justo donde arranca una etiqueta que sí se usa. Pero no hay ni una referencia de 16 bits ni un salto relativo que caiga en ellos, buscados por los 16.384 bytes del cartucho. Más dos puertas de dos bytes (0x5022 y 0x6FB5), cada una un ld b,N puesto para poder entrar a la rutina de al lado con otro valor, a las que no salta nadie. Son restos de una compilación anterior: de este cartucho hay tres.

Sí lleva la marca oculta de Konami, y confirma un carácter que faltaba

En los últimos 22 bytes: RC-735 y 19 bytes de katakana que dicen 10バイタノシムカートリッジ —«el cartucho para disfrutar diez veces más»—, que era su eslogan. El formato lo descubrió Manuel Pazos (@ManuelPazosMSX). De paso, esta marca confirma que el 0xBA es el alargamiento ー, que hasta ahora estaba sin cerrar.

Lo que el cartucho dibuja

Debajo de cada imagen está de dónde sale y qué se está viendo.

<b>La pantalla de título</b>, montada paso a paso como la monta el cartucho: los cuatro bloques comprimidos del fondo, los dos rectángulos de caracteres, el bloque de rótulos con el <code>© KONAMI 1986</code> que fecha la compilación, y los seis atributos de sprite. Cotejada contra la VRAM de openMSX: de los 16.384 bytes, el único que discrepa es <b>0x39A9</b>, y no es un error — es el cursor parpadeando
La pantalla de título, montada paso a paso como la monta el cartucho: los cuatro bloques comprimidos del fondo, los dos rectángulos de caracteres, el bloque de rótulos con el © KONAMI 1986 que fecha la compilación, y los seis atributos de sprite. Cotejada contra la VRAM de openMSX: de los 16.384 bytes, el único que discrepa es 0x39A9, y no es un error — es el cursor parpadeando
<b>El MODIFY MODE</b>, que es a lo que se viene: elegir en qué fase empezar y con cuántas vidas. Las bandas de colores de arriba y abajo no son un dibujo guardado: las escribe un bucle (0x504E) que repite cada casilla dos veces, del 1 al 15 y vuelta a empezar, cuatro filas enteras por banda
El MODIFY MODE, que es a lo que se viene: elegir en qué fase empezar y con cuántas vidas. Las bandas de colores de arriba y abajo no son un dibujo guardado: las escribe un bucle (0x504E) que repite cada casilla dos veces, del 1 al 15 y vuelta a empezar, cuatro filas enteras por banda
El menú de arranque, con <b>el puntero de tiza</b> señalando la opción elegida. Los tres punteros son doce casillas cada uno (0x4FA9, 0x4FB5 y 0x4FC1) que se pintan en el mismo sitio de la pantalla, y para saber qué eran hubo que dibujarlos: leídos como bytes no dicen nada
El menú de arranque, con el puntero de tiza señalando la opción elegida. Los tres punteros son doce casillas cada uno (0x4FA9, 0x4FB5 y 0x4FC1) que se pintan en el mismo sitio de la pantalla, y para saber qué eran hubo que dibujarlos: leídos como bytes no dicen nada
El menú de disco y cinta. En la máquina real <b>la mitad de arriba es el juego corriendo</b>: esta pantalla sólo borra las ocho filas de abajo, y antes se ha llevado la VRAM del juego a la RAM para devolverla al salir. Aquí sale sobre negro porque no hay juego que poner
El menú de disco y cinta. En la máquina real la mitad de arriba es el juego corriendo: esta pantalla sólo borra las ocho filas de abajo, y antes se ha llevado la VRAM del juego a la RAM para devolverla al salir. Aquí sale sobre negro porque no hay juego que poner
El <b>SELF MODE</b>, el menú de comprobaciones: el patrón de prueba de color y la carga de pantallas guardadas
El SELF MODE, el menú de comprobaciones: el patrón de prueba de color y la carga de pantallas guardadas
El modo <b>RANKING</b>. El cartucho guarda una tabla de récords por juego, la imprime si hay impresora, y cuando se borra deja los seis puestos con el nombre de la casa: <code>KONAMI</code>
El modo RANKING. El cartucho guarda una tabla de récords por juego, la imprime si hay impresora, y cuando se borra deja los seis puestos con el nombre de la casa: KONAMI