Casio World Open

Un campo de dieciocho hoyos en 32 KB, construido con sólo diez trazados: ocho se juegan dos veces, y en cada pareja uno va espejado, con el propio bucle de dibujo dándole la vuelta al patrón bit a bit. Y lo que el cartucho comprime no son dibujos, son diferencias entre códigos de tile.

Casio · © Casio 1985 · Cartucho de 32 KB · MSX1 · páginas 1 y 2 · Volcado 7b03fd41…

Aquí no hay ninguna ilustración ni captura. El rótulo y los dieciocho planos de hoyo están dibujados desde los bytes de la ROM, ejecutando en Python la misma cadena que corre el Z80. Y está contrastado contra la VRAM del emulador: los 304 bytes del logotipo y los 32 de color, idénticos; un plano de hoyo con 186 de sus 190 celdas iguales, patrón y color; y 718 de las 768 celdas de un cuadro de partida dibujadas con la tabla de patrones del cartucho.

El cartucho en cifras

100 %del binario explicado
435rutinas identificadas
18hoyos, par 72, 10 trazados
8.185bytes de código
24.583bytes de datos
0bytes sin identificar

Lo que apareció al desmontarlo

Dieciocho hoyos con diez trazados, y la mitad jugados del revés

La tabla de 0x6299 tiene dieciocho punteros, pero apuntan a diez listas distintas. Ocho de ellas sirven a dos hoyos cada una, y sólo el 1 y el 18 tienen trazado propio.

Lo que distingue a los dos hoyos de cada pareja es un bit: el 7 del primer byte de su ficha en 0x45A8. Con él puesto, el bucle de dibujo adelanta el puntero nueve posiciones y luego recorre los datos hacia atrás, y 0x5E7C le da la vuelta al patrón bit a bit con rlc y rra. En las ocho parejas, sin una excepción, uno lleva el bit y el otro no.

La perspectiva no se calcula: viene dibujada, tramo a tramo

La vista del campo parece 3D y no hay una sola cuenta de proyección detrás. La tabla de 0x6A2B guarda ochenta mapas de 21×19 celdas, entre cuatro y seis por hoyo, y avanzar por el hoyo es cambiar de mapa: (0xE0B5) dice en qué tramo está la bola.

Cada mapa se monta en dos trozos que quedan pegados en RAM: 105 bytes de cielo, iguales para todo el hoyo, y 294 de suelo del tramo. Son 21×5 y 21×14, y 0xEA00+105 da exactamente 0xEA69, que es donde el código descomprime el segundo. Y acercarse no es un zoom: es pintar una fila nueva de veintiuna celdas e ir moviendo el puntero de veintiuno en veintiuno.

El golfista son nueve sprites encajados, y hay tres

En el cartucho no hay ningún dibujo de un golfista: hay piezas. Cada postura la compone 0x4F8A con hasta nueve sprites de 16×16 superpuestos, cada uno de un color —la única manera de sacar una figura multicolor en un MSX1—, leyendo una lista de piezas y una tabla de tres bytes: cuánto sube, cuánto se corre y de qué color. El número de patrón ni siquiera está guardado: sale de índice×4 + 0x60.

Y hay tres golfistas, que elige el palo: de 22, 29 y 35 piezas, con seis fotogramas de swing cada uno. Crece con el palo porque crece la cámara. El listado los tenía llamados «planos de hoyo 15, 16 y 17».

Lo que se comprime no son dibujos, son diferencias entre tiles

0xA8CB no descomprime una imagen. Descomprime, separa cada byte con un cero —convirtiendo la tira en valores de dieciséis bits— y hace la suma acumulada de todos ellos. Lo que queda en RAM es una lista de códigos de tile.

Y hacen falta dieciséis bits por una razón concreta: la tabla de patrones tiene 570 entradas, así que un byte no llega. Por eso 0x5B61 hace add hl,bc dos veces, que es indexado de dieciséis bits.

Y encima de eso, todo lo demás son índices

Los planos de hoyo, las vistas de terreno y los cuadros del golfista no guardan tiles: guardan posiciones dentro de esa lista acumulada. Un byte por celda, y el tile sale de la indirección.

Así que el mismo mapa de índices dibuja cosas distintas según qué lista se haya acumulado antes, que es lo que permite que el terreno cambie sin tocar los mapas.

El par de cada hoyo cabe en medio byte

El nibble bajo del primer byte de la ficha de 0x45A8 es el par: 3, 4 o 5. El bit 7 del mismo byte es el espejo. Un byte lleva las dos cosas.

Sumados los dieciocho, el campo da par 72, con dos pares 3 y dos pares 5.

Sólo hay diez sprites, y son la misma bola cinco veces

De todo lo que el cartucho comprime, lo único que acaba en la tabla de patrones de sprite del VDP son los 320 bytes que 0x60A2 deja en VRAM 0x3800: diez sprites de 16×16.

Y la mitad son la misma cosa a distinto tamaño: la bola, de un punto a una bola gorda, para que se vea alejarse. Todo lo demás que se mueve en pantalla —el golfista, los árboles, el terreno— está pintado en el bitmap, no es un sprite.

La pantalla de título es SCREEN 1 y la de juego SCREEN 2

El título usa el modo de texto de 32 columnas, con la fuente de la propia máquina y sólo 32 bytes de color para toda la pantalla: uno por cada ocho patrones. El logotipo son 304 bytes copiados tal cual desde 0x4301.

Y al pasar al juego, 0x44F3 hace algo bonito: entra en SCREEN 1 sólo para quedarse con el juego de caracteres que carga la BIOS, lo copia a RAM, y ya en SCREEN 2 lo vuelca como patrones del campo. La fuente de la máquina acaba siendo parte del decorado.

Lo que el cartucho dibuja

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

<b>Los dieciocho planos de hoyo</b>, el panel que el juego lleva a la derecha de la pantalla. Los pinta 0x5DEC: diecinueve filas de diez celdas desde la columna 22, con los índices de <code>plano_hoyo_NN</code> sobre la lista de códigos que se acumula desde 0xB349. Los espejados salen del propio bucle, no de darles la vuelta después
Los dieciocho planos de hoyo, el panel que el juego lleva a la derecha de la pantalla. Los pinta 0x5DEC: diecinueve filas de diez celdas desde la columna 22, con los índices de plano_hoyo_NN sobre la lista de códigos que se acumula desde 0xB349. Los espejados salen del propio bucle, no de darles la vuelta después
El rótulo de cerca, con su palmera. Son los 304 bytes de 0x4301 puestos en dos bloques de la tabla de nombres; contra la VRAM del emulador salen <b>idénticos, byte a byte</b>
El rótulo de cerca, con su palmera. Son los 304 bytes de 0x4301 puestos en dos bloques de la tabla de nombres; contra la VRAM del emulador salen idénticos, byte a byte
Los diez sprites de 16×16 que 0x60A2 descomprime y copia a VRAM 0x3800. Cinco de ellos son la bola a cinco tamaños, que es como se ve alejarse. No son los únicos del cartucho: detrás, en 0x3B00, van las piezas del golfista
Los diez sprites de 16×16 que 0x60A2 descomprime y copia a VRAM 0x3800. Cinco de ellos son la bola a cinco tamaños, que es como se ve alejarse. No son los únicos del cartucho: detrás, en 0x3B00, van las piezas del golfista
<b>Los tres golfistas</b>, con sus seis fotogramas de swing. No hay ningún dibujo del golfista en el cartucho: cada postura son hasta <b>nueve sprites de 16×16 superpuestos</b>, cada uno de su color, que 0x4F8A coloca leyendo una lista de piezas y una tabla de tres bytes. El palo elige cuál de los tres, y por eso cambia de tamaño: es la distancia a la que está la cámara
Los tres golfistas, con sus seis fotogramas de swing. No hay ningún dibujo del golfista en el cartucho: cada postura son hasta nueve sprites de 16×16 superpuestos, cada uno de su color, que 0x4F8A coloca leyendo una lista de piezas y una tabla de tres bytes. El palo elige cuál de los tres, y por eso cambia de tamaño: es la distancia a la que está la cámara
<b>Los dieciocho hoyos vistos desde el tee</b>, con sus dos marcas blancas en primer plano. Cada uno es el primer tramo de su hoyo, resuelto celda a celda como lo hace el cartucho: el mapa de índices contra la lista de códigos acumulada, y de ahí a los patrones de 8×8
Los dieciocho hoyos vistos desde el tee, con sus dos marcas blancas en primer plano. Cada uno es el primer tramo de su hoyo, resuelto celda a celda como lo hace el cartucho: el mapa de índices contra la lista de códigos acumulada, y de ahí a los patrones de 8×8
<b>Los cinco tramos del hoyo 1</b>, del tee al green, dibujados desde la ROM. Cada uno es un mapa de 19×21 índices que se monta en dos trozos: las cinco filas de cielo, comunes al hoyo, y las catorce de suelo del tramo. La perspectiva no se calcula en ninguna parte: <b>viene dibujada</b>
Los cinco tramos del hoyo 1, del tee al green, dibujados desde la ROM. Cada uno es un mapa de 19×21 índices que se monta en dos trozos: las cinco filas de cielo, comunes al hoyo, y las catorce de suelo del tramo. La perspectiva no se calcula en ninguna parte: viene dibujada
Los 570 patrones de 8×8 de 0x8B5E, sin comprimir, con los que se dibuja todo lo que no es un sprite. Que son de verdad los del juego no es una impresión: <b>718 de las 768 celdas</b> de un cuadro de partida real salen de aquí
Los 570 patrones de 8×8 de 0x8B5E, sin comprimir, con los que se dibuja todo lo que no es un sprite. Que son de verdad los del juego no es una impresión: 718 de las 768 celdas de un cuadro de partida real salen de aquí