Hole in One

Un campo de dieciocho hoyos, par 72 y 6.430 metros, metido en 16 KB: cada hoyo cabe en unos trescientos bytes porque declara tres materiales en su cabecera y luego pinta con ellos, la tabla de patrones se guarda una vez y sirve para los tres tercios de la pantalla, y el rótulo del título se cuela en catorce tiles que se cargan encima.

HAL Laboratory · © HAL 1984 · Cartucho de 16 KB · MSX1 · página 2 · Volcado 14311cc2…

Aquí no hay ninguna ilustración. El rótulo, el marcador y los dieciocho hoyos están dibujados desde los bytes de la ROM, ejecutando en Python los mismos descompresores y el mismo intérprete de guiones que corre el Z80, y comprobados contra la VRAM del emulador: 13.655 de 13.664 bytes idénticos —los nueve que bailan son los dígitos del marcador, que el juego escribe en marcha— y las 480 celdas de cada hoyo clavadas en seis volcados de partida. La única captura de pantalla de esta página es la de CALL GOLF, porque ahí lo que se enseña es justamente el cartucho corriendo. El listado y las cifras salen del binario y se reproducen con make.

El cartucho en cifras

100 %del binario explicado
358rutinas identificadas
18hoyos, par 72, 6.430 m
6.065bytes de código
10.319bytes de datos
0bytes sin identificar

Lo que apareció al desmontarlo

Los dieciocho hoyos son un solo mapa, y se apilan de abajo arriba

Las dieciocho pantallas no son dieciocho decorados sueltos: son ventanas de un mismo campo de 20 × 415 casillas. El hoyo 1 está en el extremo sur, el 18 en el norte, y dos hoyos seguidos comparten una fila: la de arriba del hoyo n es la de abajo del n+1. Por eso el lago con el que acaba el hoyo 1 está al pie del 2, y el mar que corona el 2 es el que baña el 3.

Lo vio theNestruo. Aquí está medido: la fila que comparten coincide en el 70.9 % de sus veinte casillas, frente al 41.6 % de dos filas pegadas cualesquiera dentro de un mismo hoyo —que es la línea base que hay que superar— y al 21.0 % de dos filas sueltas. Las diecisiete junturas la superan, una a una. Y el solape es de una fila exacta: probando de una a seis, la de una gana en las diecisiete parejas.

Apilado al revés —el hoyo 2 debajo del 1, que es como se publicó aquí primero— da el 35.9 %: por debajo de la línea base. Lo que fallaba era la medida, no el mapa.

En el guión de un hoyo no hay ni una coordenada: la continuidad está dibujada, no calculada. Y el sentido lo dice el propio juego, porque los dieciocho tees caen en las filas de arriba y las dieciocho banderas en las de abajo: cada hoyo se juega de norte a sur, y el campo se recorre de sur a norte.

Cada hoyo declara sus tres materiales y luego pinta con ellos

Un hoyo entero ocupa unos trescientos bytes, y el truco está en los tres primeros. El cartucho los copia a 0xE451 y ahí se quedan: son la paleta del hoyo. Después, en el guión, un byte 0x3n, 0x4n o 0x5n repite n+1 veces el primero, el segundo o el tercero de esos materiales.

Lo que engancha las dos cosas es una cuenta de tres. El índice de la paleta es el nibble alto del opcode, y la tabla empieza en 0xE44E —tres bytes antes de la cabecera—, justo para que el 3, el 4 y el 5 caigan encima de ella. Así que no hay tabla de paleta: hay una resta que hace que la cabecera del hoyo sea la paleta.

Los tres tercios de la pantalla salen de una sola tabla

El SCREEN 2 del MSX son tres tercios independientes, y para que los tres tengan lo mismo hay que escribirlo tres veces. 0x9505 hace las seis llamadas —tres de patrones y tres de color— pero 0x9834 vuelve a poner DE=0xB324 en cada una, así que las tres descomprimen la misma fuente.

Salen 2 KB de cartucho por 6 KB de tabla, y lo mismo con el color. La tabla de patrones entera del juego cabe en 1.613 bytes comprimidos.

El rótulo se carga entrando a mitad de una instrucción

0x9505 es un or 0AFh, o sea los dos bytes F6 AF: llamando ahí, el flag Z se va a cero y las seis llamadas de detrás cargan las tablas largas. Pero 0x8829 llama a 0x9506, que es el segundo byte de esa misma instrucción, y 0xAF por su cuenta es xor a: entrar por ahí ejecuta el operando, pone A a cero y levanta Z, y entonces las seis cargan dos tablas cortas que sólo pisan los tiles 0x10 a 0x1D de cada tercio.

Esos catorce tiles son las letras de HOLE IN ONE. El resto de la pantalla —el fondo a rayas, los créditos— se monta con la misma rejilla de 20×24 que usa el campo.

Las dos tablas del rótulo se pasan ocho bytes, y no pasa nada

Los dos descompresores paran cuando el puntero de VRAM llega a su tope, no cuando se acaba la fuente. Y las dos tablas del rótulo se quedan cortas: dan 104 de los 112 bytes que hay que escribir.

Así que siguen leyendo. Los ocho últimos bytes del tile 0x1D salen de la cabecera de la tabla de color que viene detrás, y los de la de color, del principio del código de 0xBE0D. Los dieciséis bytes están así en la VRAM del emulador. Sale gratis porque el tile 0x1D no lo nombra nadie: las dos mitades del rótulo sólo llegan al 0x1C.

El par y la longitud van escondidos en el mapa

No hay una tabla con la ficha de los hoyos. El par lo dice el propio tile que dibuja el tee: 0xD9 es un par 3, 0xDD un par 4 y 0xE3 un par 5, y de paso el intérprete apunta dónde está para colocar la bola. La longitud son tres dígitos ASCII pegados detrás del 0x21 que cierra el mapa, y el marcador los escribe tal cual con su «m» al lado.

Sumados los dieciocho, el campo da par 72 y 6.430 metros, con cuatro pares 3, diez pares 4 y cuatro pares 5. Un campo de campeonato, y ni un byte gastado en decirlo.

El marcador cabe en diez columnas, y el campo entra por la once

0x9571 escribe diez celdas por fila y salta veintidós para caer en la siguiente, veinticuatro veces: eso deja el panel de TOP, SHOTS, HOLE, PAR, POWER, CURVE y CLUB ocupando las columnas 1 a 10 de la pantalla.

El campo entra justo detrás. 0x9A66 vuelca las 480 celdas del hoyo en veinte columnas por veinticuatro filas desde 0x180B, que es la columna 11. Las dos mitades no se pisan nunca porque ninguna se dibuja centrada: cada una sabe su ancho.

Lo que el cartucho dibuja

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

<b>El campo entero</b>: los dieciocho hoyos apilados en la tira de 20 × 415 casillas que forman de verdad, con el 1 abajo del todo y el 18 arriba. Está cortado en seis columnas de tres hoyos porque entero mide una casilla de ancho por veinte de alto; cada columna sigue por arriba de la de su derecha, y la fila con la que empieza cada una es la misma con la que acaba la anterior. Los números son los del hoyo, escritos con la fuente del propio cartucho. El río, el mar y el desierto cruzan las junturas sin cortarse: el campo es <b>una isla</b>
El campo entero: los dieciocho hoyos apilados en la tira de 20 × 415 casillas que forman de verdad, con el 1 abajo del todo y el 18 arriba. Está cortado en seis columnas de tres hoyos porque entero mide una casilla de ancho por veinte de alto; cada columna sigue por arriba de la de su derecha, y la fila con la que empieza cada una es la misma con la que acaba la anterior. Los números son los del hoyo, escritos con la fuente del propio cartucho. El río, el mar y el desierto cruzan las junturas sin cortarse: el campo es una isla
Cuatro junturas de cerca —hoyos 1/2, 6/7, 11/12 y 17/18—, cinco filas a cada lado de la que comparten. El lago, la arena y la orilla siguen de un hoyo al otro sin un salto. La juntura de los hoyos 6 y 7 es la más floja de las diecisiete y aun así el desierto cruza entero
Cuatro junturas de cerca —hoyos 1/2, 6/7, 11/12 y 17/18—, cinco filas a cada lado de la que comparten. El lago, la arena y la orilla siguen de un hoyo al otro sin un salto. La juntura de los hoyos 6 y 7 es la más floja de las diecisiete y aun así el desierto cruza entero
<b>SOUTH</b>, el primero de los tres campos de la cinta <i>Hole In One Extension Course</i> (HAL, 1985). Par 72 y 6.147 metros, dieciocho hoyos que <b>no están en el cartucho</b>: se cargan en RAM desde la cinta y se juegan con <code>CALL GOLF</code>. Dibujados con el mismo intérprete y los mismos tiles que los del cartucho, porque es el mismo formato
SOUTH, el primero de los tres campos de la cinta Hole In One Extension Course (HAL, 1985). Par 72 y 6.147 metros, dieciocho hoyos que no están en el cartucho: se cargan en RAM desde la cinta y se juegan con CALL GOLF. Dibujados con el mismo intérprete y los mismos tiles que los del cartucho, porque es el mismo formato
Y SOUTH también es <b>una sola tira</b>, apilado de sur a norte igual que el del cartucho: la costa y el desierto cruzan las junturas sin cortarse. Su fila compartida coincide en el <b>72,6 %</b> frente al 38,9 % de dos filas pegadas dentro de un mismo hoyo, y las diecisiete junturas superan esa base. Es un archipiélago
Y SOUTH también es una sola tira, apilado de sur a norte igual que el del cartucho: la costa y el desierto cruzan las junturas sin cortarse. Su fila compartida coincide en el 72,6 % frente al 38,9 % de dos filas pegadas dentro de un mismo hoyo, y las diecisiete junturas superan esa base. Es un archipiélago
<b>WEST</b>, el segundo de la cinta y el único <b>par 73</b> de los cuatro campos: 6.540 metros, el más largo. Trae desiertos con cactus, acantilados negros y un hoyo final con gradas
WEST, el segundo de la cinta y el único par 73 de los cuatro campos: 6.540 metros, el más largo. Trae desiertos con cactus, acantilados negros y un hoyo final con gradas
<b>NORTH</b>, el tercero: par 72 y 6.428 metros, casi los mismos que el campo del cartucho (6.430) y sin embargo dieciocho hoyos distintos. Su juntura es la que mejor encaja de los cuatro, un <b>73,5 %</b>
NORTH, el tercero: par 72 y 6.428 metros, casi los mismos que el campo del cartucho (6.430) y sin embargo dieciocho hoyos distintos. Su juntura es la que mejor encaja de los cuatro, un 73,5 %
<b>Un campo que no está en la ROM.</b> Dieciocho hoyos escritos con <code>tools/campo.py</code> en el formato del propio cartucho: calle de arena, un lago que cambia de lado, y una barra de agua arriba de tantas casillas como el número de hoyo. Están dibujados con el <b>mismo</b> intérprete que dibuja los de la ROM —si el formato estuviera mal entendido, aquí saldría ruido—
Un campo que no está en la ROM. Dieciocho hoyos escritos con tools/campo.py en el formato del propio cartucho: calle de arena, un lago que cambia de lado, y una barra de agua arriba de tantas casillas como el número de hoyo. Están dibujados con el mismo intérprete que dibuja los de la ROM —si el formato estuviera mal entendido, aquí saldría ruido—
Y el cartucho lo juega. Arrancado con la tecla pulsada, el campo puesto en 0xC000 y <code>CALL GOLF</code> tecleado en el BASIC: la exhibición dibuja el hoyo 2 <b>generado</b> —480 de 480 celdas— y el marcador lee su <b>PAR 4</b> y sus <b>302 m</b>, que no son los 168 m par 3 de la ROM. Capturado de openMSX por <code>tools/omsx_call_golf.tcl</code>
Y el cartucho lo juega. Arrancado con la tecla pulsada, el campo puesto en 0xC000 y CALL GOLF tecleado en el BASIC: la exhibición dibuja el hoyo 2 generado —480 de 480 celdas— y el marcador lee su PAR 4 y sus 302 m, que no son los 168 m par 3 de la ROM. Capturado de openMSX por tools/omsx_call_golf.tcl
<b>Los dieciocho hoyos del campo</b>, dibujados uno a uno con el mismo intérprete de guiones que corre el Z80, siguiendo los punteros de 0x9C33. Que están bien no es una impresión: las 480 celdas de cada uno se compararon contra volcados de openMSX tomados con el juego en marcha, con <b>cero diferencias</b>
Los dieciocho hoyos del campo, dibujados uno a uno con el mismo intérprete de guiones que corre el Z80, siguiendo los punteros de 0x9C33. Que están bien no es una impresión: las 480 celdas de cada uno se compararon contra volcados de openMSX tomados con el juego en marcha, con cero diferencias
La pantalla del título, montada con los pasos del propio cartucho: la rejilla de 0x8864 con el fondo a rayas, las dos mitades del rótulo y los créditos que le pasa 0x8954
La pantalla del título, montada con los pasos del propio cartucho: la rejilla de 0x8864 con el fondo a rayas, las dos mitades del rótulo y los créditos que le pasa 0x8954
El hoyo 1 entero, con el panel del marcador a la izquierda tal como lo escribe 0x9571. Par 4 y 331 metros: la calle sube entre árboles hasta un green con el lago detrás
El hoyo 1 entero, con el panel del marcador a la izquierda tal como lo escribe 0x9571. Par 4 y 331 metros: la calle sube entre árboles hasta un green con el lago detrás
El hoyo 4, el par 5 más largo del campo con sus 556 metros. La mancha negra no es un fallo del dibujo: es el tile 0x00, que este hoyo declara como uno de sus tres materiales, y el juego lo pinta igual
El hoyo 4, el par 5 más largo del campo con sus 556 metros. La mancha negra no es un fallo del dibujo: es el tile 0x00, que este hoyo declara como uno de sus tres materiales, y el juego lo pinta igual
El hoyo 2, el par 3 más corto: 168 metros de tee a green, casi todo agua por medio
El hoyo 2, el par 3 más corto: 168 metros de tee a green, casi todo agua por medio
La misma pantalla con el otro texto. El montador de 0x8864 recibe una dirección y de ahí saca los tres renglones de abajo: con 0x8954 salen los créditos, y con 0x8975 el número de jugadores
La misma pantalla con el otro texto. El montador de 0x8864 recibe una dirección y de ahí saca los tres renglones de abajo: con 0x8954 salen los créditos, y con 0x8975 el número de jugadores
El rótulo de cerca. Son los catorce tiles que cargan las dos tablas cortas de 0xBDAB y 0xBDDB, colocados en dos bloques de cinco filas por catorce columnas
El rótulo de cerca. Son los catorce tiles que cargan las dos tablas cortas de 0xBDAB y 0xBDDB, colocados en dos bloques de cinco filas por catorce columnas
Los tres greens. Son el modo alternativo de 0xB1CB, y llevan el mismo formato de guión que los hoyos —480 celdas y un 0x21 al final— pero sin los tres dígitos de longitud detrás, porque en ese modo el intérprete no llega a leerlos. Con 109, 112 y 115 bytes cada uno son lo más apretado del cartucho
Los tres greens. Son el modo alternativo de 0xB1CB, y llevan el mismo formato de guión que los hoyos —480 celdas y un 0x21 al final— pero sin los tres dígitos de longitud detrás, porque en ese modo el intérprete no llega a leerlos. Con 109, 112 y 115 bytes cada uno son lo más apretado del cartucho
Los 256 tiles con su color, tal como quedan en la VRAM después de descomprimir 0xB324 y 0xB971. Ahí está todo el campo: hierba, agua, arena, árboles, el tee, la bandera y la casa del club
Los 256 tiles con su color, tal como quedan en la VRAM después de descomprimir 0xB324 y 0xB971. Ahí está todo el campo: hierba, agua, arena, árboles, el tee, la bandera y la casa del club
Los diecinueve sprites de 16×16 que descomprime 0xBE0D en la tabla de patrones de sprite: el golfista, la bola y las flechas del medidor
Los diecinueve sprites de 16×16 que descomprime 0xBE0D en la tabla de patrones de sprite: el golfista, la bola y las flechas del medidor
La fuente con la que se escribe todo, del 0x20 al 0x5F. Es ASCII corriente, con la «m» de los metros y el © metidos donde caben
La fuente con la que se escribe todo, del 0x20 al 0x5F. Es ASCII corriente, con la «m» de los metros y el © metidos donde caben