Frogger

Ocho kilobytes, la mitad que cualquier otro Konami de la serie. Los troncos y los coches no gastan un solo sprite: se mueven de dos en dos píxeles con cuatro versiones pregeneradas de cada dibujo, y la demo entera cabe en quince bytes.

Konami · ©KONAMI 1983 · Cartucho RC-704, 8 KB · MSX1 · página 1 · Volcado 0d60ff78…

Aquí no hay ni una captura de pantalla. Las imágenes están dibujadas repitiendo lo que hace el cartucho: se sube a la memoria de vídeo lo mismo que sube él, con sus mismas direcciones, y las filas del río y de la carretera se montan con su mismo motor de carriles. Lo demás —el listado y las cifras— sale del binario y se reproduce con make.

El juego en cifras

100 %del binario explicado
4trazados, para cinco huecos
14tipos de obstáculo
4.880bytes de código
3.312bytes de datos
0bytes sin identificar

Lo que apareció al desmontarlo

Frogger y Time Pilot llevan dentro el mismo reproductor de sonido

No se parecen: son el mismo código. Los 163 bytes de 0x4111–0x41B3 de este cartucho y los de 0x4160–0x4202 de Time Pilot (RC-703) coinciden byte a byte salvo en tres, y dos de esos tres son el byte bajo de un puntero reubicado: 0x41A1 aquí y 0x41F0 allí, exactamente el desfase de 0x4F que separa las dos copias.

El tercero es el único que dice algo distinto: el registro 7 del PSG, la mezcla. Vale 0xA8 aquí y 0x98 allí, o sea que el ruido suena en el canal B en Frogger y en el C en Time Pilot. En los dos cartuchos el reproductor está colocado justo antes de INIT.

La demo entera son quince bytes

Cuando el juego se queda solo, la rana no la mueve ningún generador de números: se lee una lista. Está en 0x584F y son quince bytes, uno por movimiento y con el mismo formato que los mandos:

00 08 01 01 01 01 01 08 01 01 01 01 08 00 01

Es decir: espera, derecha, cinco veces arriba, derecha, cuatro arriba, derecha, espera y una más arriba. El puntero vuelve al principio al montar cada fase, y como solo se le incrementa el byte bajo, la lista no puede cruzar de página.

Trazados distintos hay cuatro, no cinco

La fase se elige con (fase-1) mod 5 sobre una tabla de cinco palabras… pero la segunda y la tercera apuntan al mismo sitio, a 0x5CCD. Las fases 2 y 3 llevan exactamente el mismo trazado de río y carretera.

Lo único que las separa son dos retoques que hace 0x5493 cuando toca el tercer hueco: el primer objeto de la fila de arriba pasa a ser cocodrilo, y a la fila 15 se le pone el bit de «último» al segundo objeto, con lo que esa fila se queda con dos en vez de tres.

Las tortugas que se hunden están elegidas a mano, una por una

Hundirse no es una propiedad de ser tortuga: es un bit. El cuarto byte de la ficha lleva un contador, y solo se anima si tiene el bit 7 puesto. Al montar la fase, 0x5489 lo pone en exactamente dos direcciones: 0xE0C3 y 0xE0EB, o sea el primer grupo de la fila 5 y el segundo de la fila 9.

Y no arrancan iguales: uno empieza en 0x80 y el otro en 0x8A, para que no se hundan a la vez. A partir de la fase 6, 0x54D6 añade una tercera (0xE0E7, con el contador en 0x8F).

A partir de la fase 11 el juego ya no se endurece más

En todo el cartucho hay cuatro comparaciones contra el número de fase, y ninguna más: en la 2 ocho objetos del río suben dos de tipo (0x54A8), en la 3 aparece la rana que hay que rescatar (0x506A), en la 6 dos carriles pasan a moverse un paso por turno y se añade la tercera tortuga que se hunde (0x54C9), y en la 11 la fila 7 se queda con un solo objeto (0x54DB).

De ahí en adelante lo único que cambia es cuál de los cuatro trazados toca, y eso cicla cada cinco fases. La 11, la 47 y la 99 se juegan exactamente igual.

Y no hay final: en la fase 100 el contador vuelve a 1 (0x53F5) y el número del marcador, que es BCD, vuelve a 01. Sin rótulo, sin música y sin pantalla.

Saltar a una casa ya ocupada te mata

Las cinco casas están en las columnas 4, 8, 12, 16 y 20, y cada una tiene su bit en 0xE080. Cuando la rana entra en una, 0x528F mira ese bit; si ya estaba puesto, no hay aviso ni rebote: jp 0x5305, que es la rutina de la muerte.

Los troncos y los coches no gastan un solo sprite

El MSX1 solo puede enseñar cuatro sprites en una línea, así que Frogger los reserva para la rana y el cocodrilo. Todo lo demás son caracteres.

Para moverlos sin saltos, 0x473C guarda en la memoria de vídeo cuatro versiones de cada dibujo, desplazadas 0, 2, 4 y 6 píxeles: corre el juego entero de patrones dos bits y deja que los bits que se salen entren en el carácter de al lado. La posición de cada objeto va en cuartos de carácter, y sus dos bits de abajo eligen la versión.

Tres tercios de pantalla igualados con una sola copia

SCREEN 2 tiene los patrones y los colores partidos en tres tercios de 2 KB, y el juego los quiere iguales. En vez de tres copias, 0x471A hace una de 4095 bytes con el destino 2 KB por delante del origen: al pasar del primer tercio ya está leyendo lo que acaba de escribir, así que el segundo se propaga solo al tercero.

Las mismas letras subidas dos veces, solo por el color

En SCREEN 2 el color va por línea de patrón, no por casilla: dos casillas con el mismo carácter no pueden tener colores distintos. Así que INIT sube el juego de letras dos veces, a los caracteres 0x98 y 0xD8 (0x4235 y 0x4240 repiten los bytes que ya había subido el bloque anterior).

La tabla de color que se carga justo después da cian a los primeros y blanco a los segundos: por eso el menú del título sale en cian y el marcador de la partida en blanco.

Una rutina que no llama nadie

En 0x57F7 hay seis bytes de código perfectamente formado: la versión para tablas de un byte del buscador de 0x57FF, que devuelve en B el byte número A de una tabla incrustada detrás del call y salta al byte de después del 0xFF que la cierra.

Funciona. Pero ninguna instrucción del cartucho la llama: las cuatro llamadas que hay van todas a la versión de dos bytes.

Lo que el cartucho dibuja

Cada una de estas imágenes es el cartucho repetido fuera de él: los caracteres se suben como los sube la ROM, con sus colores, y las filas se montan con el mismo motor de carriles. Debajo de cada pie está la dirección de donde sale.

0x4A04 y las cuatro listas de 0x4A42 — la pantalla de título, montada con las mismas listas de rótulos que usa el cartucho. Las teclas 1 y 2 juegan con joystick y la 3 y la 4 con el teclado
0x4A04 y las cuatro listas de 0x4A42 — la pantalla de título, montada con las mismas listas de rótulos que usa el cartucho. Las teclas 1 y 2 juegan con joystick y la 3 y la 4 con el teclado
0x434D y 0x55E5 — la pantalla de partida entera: el decorado de 0x55A4, el marcador de 0x4B02 y las ocho filas montadas con el motor de carriles, cada objeto en su versión desplazada
0x434D y 0x55E5 — la pantalla de partida entera: el decorado de 0x55A4, el marcador de 0x4B02 y las ocho filas montadas con el motor de carriles, cada objeto en su versión desplazada
0x5C85 — el primer trazado, el de las fases 1, 6, 11… Ninguna fila pasa de cuatro objetos
0x5C85 — el primer trazado, el de las fases 1, 6, 11… Ninguna fila pasa de cuatro objetos
0x5CCD — el segundo, que sirve para DOS huecos del ciclo: las fases 2 y 3 son este mismo, y en la 3 el primer tronco de arriba se convierte en cocodrilo
0x5CCD — el segundo, que sirve para DOS huecos del ciclo: las fases 2 y 3 son este mismo, y en la 3 el primer tronco de arriba se convierte en cocodrilo
0x5D11 — el de las fases 4, 9, 14… Ya trae cocodrilo de serie y la fila 15 va a velocidad −3, la más rápida de las cuatro
0x5D11 — el de las fases 4, 9, 14… Ya trae cocodrilo de serie y la fila 15 va a velocidad −3, la más rápida de las cuatro
0x5D55 — el de las fases 5, 10, 15… La fila de arriba se queda con un solo objeto, y es el cocodrilo: por eso aquí sale vacía, porque el cocodrilo es lo único del río que va con sprites
0x5D55 — el de las fases 5, 10, 15… La fila de arriba se queda con un solo objeto, y es el cocodrilo: por eso aquí sale vacía, porque el cocodrilo es lo único del río que va con sprites
0x59FF — los dibujos de sprite, en blanco porque el MSX1 no da más de un color por sprite: la rana en sus cuatro sentidos, el cocodrilo y el bicho del río
0x59FF — los dibujos de sprite, en blanco porque el MSX1 no da más de un color por sprite: la rana en sus cuatro sentidos, el cocodrilo y el bicho del río
0x585E y 0x2100 — los caracteres del decorado con su color: el agua, la mediana de ladrillo, la orilla y las cinco casas
0x585E y 0x2100 — los caracteres del decorado con su color: el agua, la mediana de ladrillo, la orilla y las cinco casas
0x58D1 — y aquí se ve el truco: cada dibujo aparece cuatro veces seguidas, desplazado 0, 2, 4 y 6 píxeles. Eso es lo que mueve troncos y coches sin gastar sprites
0x58D1 — y aquí se ve el truco: cada dibujo aparece cuatro veces seguidas, desplazado 0, 2, 4 y 6 píxeles. Eso es lo que mueve troncos y coches sin gastar sprites