Sky Jaguar

Un matamarcianos vertical en 16 KB, con una sola fase de 1.920 filas que se repite, un paisaje que va comprimido en guiones de rachas, y un enemigo gigante al que le dibuja el cuerpo el propio fondo.

Konami · © Konami 1984 · Cartucho RC-721, 16 KB · MSX1 · página 1 · Volcado 58abc5ae…

Aquí no hay ninguna ilustración ni captura. El rótulo, el paisaje y la fase entera están dibujados desde los bytes de la ROM, ejecutando en Python los mismos descompresores que corre el Z80, y comprobados byte a byte contra la VRAM del emulador. El listado y las cifras salen del binario y se reproducen con make.

El cartucho en cifras

100 %del binario explicado
464rutinas identificadas
1.920filas de la única fase
7.086bytes de código
9.298bytes de datos
0bytes sin identificar

Lo que apareció al desmontarlo

No lleva la marca oculta de Konami, y se ha comprobado en serio

Konami escondía al final de muchos cartuchos su número de catálogo y el título en katakana; lo descubrió Manuel Pazos (@ManuelPazosMSX) y el bloque vive en el offset 0x3FF0. Éste no la lleva, y no por no mirar: se rastrearon las 16.384 posiciones de la ROM con un buscador validado antes contra cuatro cartuchos de la misma familia que sí la llevan, que es la única manera de fiarse de un negativo. La razón se ve en el volcado: la ROM llega llena de datos hasta 0x7FFB y sólo sobran cuatro bytes de relleno. No cabe.

Una sola fase de 1.920 filas, y el scroll sale de una tabla

No hay niveles: hay una fase que se repite, y lo único que sube es la dificultad (0xE1D3, con tope 2). El paisaje va comprimido: 244 bytes eligen, cada ocho filas, cuál de veinte tiras se dibuja. Y el desplazamiento fino no se calcula, está guardado: cada tira tiene ocho versiones, la misma empezada de cero a siete filas más abajo, y el índice es 2·(posición y 7).

Al enemigo gigante le dibuja el cuerpo el fondo

Sale dos veces en la fase, en dos mitades, y su cuerpo no son sprites: las tiras de paisaje de tipo 18 y 19 son las únicas del mapa que usan los caracteres 0xB0–0xEC, y cada una aparece una sola vez. Encima van los sprites de las piezas a las que se dispara. El juego lo arranca tres pasos antes de que asome, para que dé tiempo a descomprimir sus gráficos.

La tabla de puntería tiene dos entradas cambiadas

0x6917 son nueve direcciones de disparo, un cuarto de vuelta con radio 320. Siete de las nueve cuadran al bit con 320·sen y 320·cos; las entradas 3 y 5 contienen exactamente lo de la otra. No es redondeo: es una errata, y dos de los nueve ángulos de disparo enemigo apuntan al espejo del que les tocaba.

Dos saltos que caen a mitad de una instrucción, a propósito

En 0x6684 un jr c aterriza en el último byte del ld bc,0x0300 de 0x6686. Ese byte es 0x03, y suelto se ejecuta como inc bc: con acarreo BC queda en 0xFE01, y sin acarreo se ejecuta el ld entero. Un byte ahorrado frente a un jp. En 0x69A1 hacen lo mismo con el 03 de un ld (hl),3.

El mismo guión pinta y borra

De los dos descompresores de la casa, el de la tabla de nombres (0x43D8) tiene una segunda puerta en 0x43F3: entrando por ahí escribe ceros en vez del dato. Así el cartucho no guarda un guión para poner cada cosa y otro para quitarla, sino uno solo.

Lo que el cartucho dibuja

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

<b>La fase entera</b>: las 1.920 filas, cortadas en ocho columnas de 240 y puestas una al lado de otra. Sale de ejecutar en Python el mismo PASO_DE_FONDO (0x5837) del cartucho sobre las 1.920 posiciones. Que es correcta no es una impresión: el mosaico se comparó celda a celda contra pantallas reales volcadas de openMSX, y salieron cero diferencias en 11.592 celdas
La fase entera: las 1.920 filas, cortadas en ocho columnas de 240 y puestas una al lado de otra. Sale de ejecutar en Python el mismo PASO_DE_FONDO (0x5837) del cartucho sobre las 1.920 posiciones. Que es correcta no es una impresión: el mosaico se comparó celda a celda contra pantallas reales volcadas de openMSX, y salieron cero diferencias en 11.592 celdas
El primero de los dos enemigos gigantes, sobre el mar. Lo llamativo es que <b>este cuerpo no son sprites</b>: lo pinta el propio fondo, con una tira de paisaje que aparece una sola vez en todo el mapa
El primero de los dos enemigos gigantes, sobre el mar. Lo llamativo es que este cuerpo no son sprites: lo pinta el propio fondo, con una tira de paisaje que aparece una sola vez en todo el mapa
El segundo gigante, con sus propios caracteres. El juego empieza a montarlo tres pasos antes de que asome por abajo
El segundo gigante, con sus propios caracteres. El juego empieza a montarlo tres pasos antes de que asome por abajo
La pantalla del título, montada con los mismos pasos del cartucho: CARGA_TITULO (0x434D) descomprime las piezas del rótulo y PINTA_ROTULO (0x4374) las coloca en la tabla de nombres
La pantalla del título, montada con los mismos pasos del cartucho: CARGA_TITULO (0x434D) descomprime las piezas del rótulo y PINTA_ROTULO (0x4374) las coloca en la tabla de nombres
Una pantalla de partida con su panel, en la posición de la fase con más caracteres distintos a la vez
Una pantalla de partida con su panel, en la posición de la fase con más caracteres distintos a la vez
Los 104 caracteres con los que se dibuja todo el paisaje (0x40–0xA7), descomprimidos desde 0x6DCA con sus colores de 0x702B
Los 104 caracteres con los que se dibuja todo el paisaje (0x40–0xA7), descomprimidos desde 0x6DCA con sus colores de 0x702B
Los dieciséis caracteres 0x00–0x0F, que <b>no tienen patrón ninguno</b>: 0x4B71 le da a cada uno un color entero, y son el mar y los llanos
Los dieciséis caracteres 0x00–0x0F, que no tienen patrón ninguno: 0x4B71 le da a cada uno un color entero, y son el mar y los llanos
Los 48 sprites de 16×16 del cartucho, del guión de 0x4F1B. Son 1.536 bytes a la VRAM: el avión, los enemigos, los disparos y las explosiones
Los 48 sprites de 16×16 del cartucho, del guión de 0x4F1B. Son 1.536 bytes a la VRAM: el avión, los enemigos, los disparos y las explosiones
La fuente con la que se escribe todo, del rango 0x10–0x59
La fuente con la que se escribe todo, del rango 0x10–0x59