Hole in One Professional

Dos campos de dieciocho hoyos, un editor para hacerte el tuyo y treinta y cinco profesionales de verdad contra los que jugar, en 32 KB. Y el rival no calcula el golpe: lo ensaya con la física de verdad y lo repite hasta que le sale.

HAL Laboratory · © HAL 1985 · Cartucho de 32 KB · MSX1 · páginas 1 y 2 · Volcado 99900247…

Aquí no hay ninguna ilustración ni ninguna captura de pantalla. Los créditos, el menú, el marcador, los sprites, el swing y los treinta y seis hoyos están dibujados desde los bytes de la ROM, ejecutando en Python los mismos descompresores y los mismos intérpretes que corre el Z80. Y no valen por «verse bien»: la VRAM montada así se compara byte a byte contra la de openMSX y coinciden 28.240 de 28.240. El listado y las cifras salen del binario y se reproducen con make.

El cartucho en cifras

100 %del binario explicado
44.4 %de densidad de comentario
36hoyos en dos campos par 72
35golfistas reales
14.186bytes de código
18.582bytes de datos
0bytes sin identificar
0rutinas sin explicar

Lo que apareció al desmontarlo

El rótulo y el campo se turnan los mismos cuarenta y cinco tiles

La pantalla de título lleva un rótulo que ocupa media pantalla: HOLE IN ONE en bloque sobre un degradado rojo y Professional en cursiva sobre verde, con una bola de golf haciendo de punto. Y no está guardado aparte: son los tiles 0xD3 a 0xFF, los mismos cuarenta y cinco que en partida son el tee, el green y la bandera.

El cartucho los intercambia entrando en una instrucción o en la siguiente. 0x66D4 es un or 0AFh, o sea los dos bytes F6 AF: llamando ahí, Z se va a cero y las seis llamadas de detrás cargan los 2 KB del bloque grande de 0x9F85, que traen los tiles del juego. Pero 0x66C6 acaba en un jr $+3 que cae en 0x66D5, el segundo byte de esa misma instrucción, y 0xAF por su cuenta es xor a: A se pone a cero, Z se levanta y entonces las seis cargan sólo los 360 bytes de 0xAA0E y 0xAAFD, que son el rótulo.

(0xCA40) apunta cuál de los dos juegos está puesto, y por eso pulsar F1 en el menú carga los del juego para poder dibujar el marcador y luego devuelve los del rótulo. La pantalla de título gasta 416 de sus 768 casillas en esos cuarenta y cinco tiles.

El rival no calcula el golpe: lo ENSAYA

Lo que hace el ordenador cuando le toca jugar no es resolver una ecuación. 0x5B39 le sortea unos valores de partida —una fuerza entre 0x18 y 0x1B, una curva entre 0x19 y 0x20, el ángulo hacia la bandera y un palo sacado de dividir la distancia por ocho— y entonces entra en el bucle de 0x5BB4, que juega el golpe entero con la física de verdad: la misma rutina, el mismo viento, el mismo terreno.

Al acabar mira dónde ha caído la bola. Si se ha ido al agua, cambia el palo o la fuerza y lo vuelve a tirar. Si se ha pasado, recorta. Si ha entrado, se rebaja un punto para no meterla siempre. Y así hasta que le gusta, o hasta que se le acaban los intentos que le deja (0xC119, que crece si va perdiendo).

Solo entonces 0x5408 lo repite delante del jugador, moviendo las barras de fuerza y curva hasta los valores que ya ha decidido. Lo que se ve no es el golpe: es la reposición del ensayo. Durante el ensayo, (0xC118) a uno apaga el mando, la espera de cuadro y el dibujado, así que las decenas de golpes que se juega el rival caben entre dos fotogramas.

El terreno se decide por el píxel, no por la casilla

0x629C clasifica lo que hay bajo la bola por el número de casilla: de 0x60 a 0x77 son árboles, de 0x94 a 0xB3 búnker, de 0xB4 a 0xD1 agua. Pero las casillas que están a caballo entre dos terrenos no se pueden resolver así, y para esas el cartucho lee la VRAM.

0x63B1 saca de la tabla de patrones el bit exacto que hay bajo la bola, con la máscara que le toca de las ocho de 0x63E9. Y 0x63D3 lee de la tabla de color el nibble que le corresponde a ese píxel: el alto si el bit está encendido, el bajo si no. Con eso se separa la calle del rough, el búnker del agua y el talud de lo demás.

O sea que la colisión con el decorado la resuelve el dibujo, y no una segunda tabla que hubiera que mantener a juego con él.

La honra del golf está programada

En golf, entre dos jugadores, tira el que está más lejos del hoyo. 0x46FA lo hace: mide las dos distancias con 0x475C—la diferencia en X y en Y, cada una en valor absoluto y a la mitad para que quepan, y la raíz de la suma de cuadrados— y le da el turno al que peor está.

Con un detalle: si los dos han llegado al green, además pasa a la vista corta. Y si uno de los dos ya ha acabado el hoyo, no hay nada que decidir.

Tres pantallas enteras a la vez en la VRAM

El SCREEN 2 del MSX tiene una tabla de nombres, pero el registro 2 del VDP dice dónde está. Este cartucho monta tres y va cambiando ese registro: 0x1800 es la pantalla de juego, 0x1C00 el marcador de dieciocho hoyos y 0x3C00 la clasificación del torneo.

0x678B hace un xor 1 sobre la copia en RAM del registro —que vale 0x400, justo la distancia entre 0x1800 y 0x1C00— y 0x67CC un xor 9, que lleva a 0x3C00. Pulsar F1 o F2 durante la partida no redibuja nada: enseña otra pantalla que ya estaba montada, y al soltar la tecla se vuelve a la de antes sin haber perdido un byte.

Treinta y cinco profesionales de verdad, y una tirada de dados

En 0x5009 hay treinta y cinco nombres del circuito de mediados de los ochenta, guardados uno detrás de otro sin puntero ni longitud: el bit 7 del último carácter marca dónde acaba cada uno. Nicklaus, Ballesteros, Trevino, Watson, Norman, Aoki, los dos Ozaki, Nakajima, Kuramoto…

El torneo no los simula golpe a golpe: por cada hoyo, 0x4EC9 tira un dado, le resta la dificultad propia que a cada uno se le sorteó al empezar (0xC09B), le suma su ajuste fijo de la tabla de 0x5130 —un byte de 0 a 7 por golfista— y mira en qué tramo cae. Los tramos dan +2, +1, par, −1 y −2, y hay tres tablas de tramos: la que se usa depende de si el jugador va por debajo, en el par o por encima. Contra un jugador que va bien, el circuito aprieta.

Cada hoyo declara sus tres materiales y luego pinta con ellos

Un hoyo entero ocupa unos 311 bytes de media, y el truco está en los tres primeros. El cartucho los copia a 0xCEC0 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.

Y lo que engancha las dos cosas es una resta de tres: el índice sale del nibble alto del opcode y la tabla de la que se lee empieza en 0xCEBD, tres bytes antes de la cabecera, justo para que el 3, el 4 y el 5 caigan encima de ella. No hay tabla de paleta: hay un desplazamiento que hace que la cabecera del hoyo sea la paleta.

Es el mismo formato, byte a byte, que el Hole in One de 1984. El intérprete de aquel cartucho lee estos treinta y seis guiónes enteros.

Una sola tirada decide el tee y la bandera del green

0x7005 tira un dado módulo nueve, y con ese número decide dos cosas a la vez. Con la tabla de 0x70F2 coloca la bola dentro de la caja del tee: 0x7024 suma la entrada a las coordenadas del tee y el resultado va a 0xC63F, que es la bola en la vista del campo. Los desplazamientos van de 3 a 17 píxeles, que es justo lo que mide la caja del tee —tres casillas por dos—, y la rejilla es distinta para cada par.

Y con la tabla de 0x7128, el mismo número coloca el hoyo dentro del green: 0x7043 monta con él la casilla donde 0x715F escribe el tile 0xD6. Así que de dónde sales y dónde está la bandera cuando llegas son la misma tirada.

La bandera de la vista larga, en cambio, sí viene en el guión: es el tile 0xE9, y 0x6FA5 apunta dónde cae. Lo que se sortea, además del tee, son el viento y el desnivel del green, y el nivel decide cuánto: en AVERAGE 0x7073 le quita al viento el bit 6, o sea que sopla la mitad.

El fichero que graba el editor es el del cartucho de 1984

El modo GAME >>CONSTRUCTION no es un juego: es un editor de campos completo, con SETCHR para elegir con qué casilla se pinta, SHOT para probar el hoyo de verdad, y SAVE, LOAD, COPY, SWAP y CLEAR.

Y lo que graba no es un formato propio. Los veintiun bytes que 0xBF14 pone delante del fichero son exactamente los que llevan delante los ficheros SDATA, WDATA y NDATA de la cinta Hole In One Extension Course de 1985, y las distancias cuadran: 0x16 y 0x3A del principio a las dos tablas, igual que allí. O sea que un campo hecho con este cartucho de 1986 se carga en el Hole in One de 1984 con BLOAD y CALL GOLF.

El call 0x72D4 que no apunta a este cartucho

En 0xBE32 hay un call 072d4h, y 0x72D4 cae en medio de los guiónes de campo. No es un error de trazado: es que esa dirección ya no es el cartucho cuando se ejecuta.

0xBE16 hace ENASLT con EXPTBL[0] y la página 1 pasa a ser la ROM de BASIC; 0x6FD7, 0x700B, 0x72D4 y 0x72E9 son sus rutinas de casete. La página 2, donde vive todo este código, no se toca, y por eso puede seguir corriendo mientras su propia primera mitad está fuera. Al acabar, 0xBE1B la devuelve con la ranura que init guardó en 0xFEDB.

Diecinueve bytes que no llama nadie

0xB885 es una rutina completa —monta 10×H+L de (0xCEF9) y devuelve carry si el resultado es cero o pasa de 18, o sea que comprueba un número de hoyo— y sus dos bytes no aparecen en ningún sitio de la ROM. La rutina de antes acaba en un ret, así que tampoco se cae dentro. Es código muerto del editor.

Lo que el cartucho dibuja

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

<b>El rótulo</b>, dibujado desde la ROM: la tabla de nombres de 0xABA1 con los tiles de 0xAA0E encima. Comprobado contra el emulador: las seis tablas de patrones y color y la tabla de nombres entera, <b>13.056 bytes sin una diferencia</b>
El rótulo, dibujado desde la ROM: la tabla de nombres de 0xABA1 con los tiles de 0xAA0E encima. Comprobado contra el emulador: las seis tablas de patrones y color y la tabla de nombres entera, 13.056 bytes sin una diferencia
<b>La portada del cartucho</b>, montada con sus propios pasos: el rótulo de 0xABA1 y 0xAA0E y encima las cuatro filas de veintiun caracteres que 0x51BF suelta desde 0x1A46. Dice quién lo hizo: <b>© HAL LABORATORY 1985</b>, producido por <b>F. NAKAMURA</b> y programado por <b>S. IWATA</b>. La arroba es el símbolo de copyright de esta fuente, y el <code>></code> es el punto
La portada del cartucho, montada con sus propios pasos: el rótulo de 0xABA1 y 0xAA0E y encima las cuatro filas de veintiun caracteres que 0x51BF suelta desde 0x1A46. Dice quién lo hizo: © HAL LABORATORY 1985, producido por F. NAKAMURA y programado por S. IWATA. La arroba es el símbolo de copyright de esta fuente, y el > es el punto
El menú, con sus valores de fábrica. Cuatro líneas y tres tablas paralelas: 0x40CC dice qué rutina baja el valor, 0x40D4 cuál lo sube y 0x40DE sobre qué variable de RAM trabaja. El salto no es un <code>jp</code>: la dirección se mete en la pila y el <code>ret</code> hace de salto
El menú, con sus valores de fábrica. Cuatro líneas y tres tablas paralelas: 0x40CC dice qué rutina baja el valor, 0x40D4 cuál lo sube y 0x40DE sobre qué variable de RAM trabaja. El salto no es un jp: la dirección se mete en la pila y el ret hace de salto
<b>El hoyo 1 de QUEEN SIDE</b>, par 4 y 352 metros, con el panel a la izquierda tal como lo escribe 0x67EF y el mapa entrando por la columna once. Es la pantalla que se coteja contra el emulador: la tabla de nombres <b>entera</b>, 624 casillas de 768, con <b>cero diferencias</b> —las 144 que se dejan fuera son las seis columnas donde el juego escribe cifras vivas—
El hoyo 1 de QUEEN SIDE, par 4 y 352 metros, con el panel a la izquierda tal como lo escribe 0x67EF y el mapa entrando por la columna once. Es la pantalla que se coteja contra el emulador: la tabla de nombres entera, 624 casillas de 768, con cero diferencias —las 144 que se dejan fuera son las seis columnas donde el juego escribe cifras vivas—
<b>QUEEN SIDE entero</b>: los dieciocho hoyos, par 72 y 6.166 metros, dibujados uno a uno con el mismo intérprete de guiónes que corre el Z80. Cuatro pares 3, diez pares 4 y cuatro pares 5. Fíjate en el hoyo 10, que tiene forma de pie, y en el 16, que dibuja un tres
QUEEN SIDE entero: los dieciocho hoyos, par 72 y 6.166 metros, dibujados uno a uno con el mismo intérprete de guiónes que corre el Z80. Cuatro pares 3, diez pares 4 y cuatro pares 5. Fíjate en el hoyo 10, que tiene forma de pie, y en el 16, que dibuja un tres
<b>KING SIDE</b>, el segundo campo: también par 72 y con el mismo reparto de pares, pero <b>6.290 metros</b> y a simple vista mucho más duro. Más agua, calles más estrechas y mucho más negro, que es la casilla 0x00 y el juego la trata como fuera de límites
KING SIDE, el segundo campo: también par 72 y con el mismo reparto de pares, pero 6.290 metros y a simple vista mucho más duro. Más agua, calles más estrechas y mucho más negro, que es la casilla 0x00 y el juego la trata como fuera de límites
<b>La segunda tabla de nombres</b>, la de 0x1C00: el marcador de dieciocho hoyos con la ida y la vuelta. Los números de hoyo y los pares no están en la tabla: los escribe 0x49D8 leyendo el par del tile del tee de cada guión. Aquí están puestos con esa misma cuenta, y caen exactos en las casillas que apunta la tabla de 0x4A18
La segunda tabla de nombres, la de 0x1C00: el marcador de dieciocho hoyos con la ida y la vuelta. Los números de hoyo y los pares no están en la tabla: los escribe 0x49D8 leyendo el par del tile del tee de cada guión. Aquí están puestos con esa misma cuenta, y caen exactos en las casillas que apunta la tabla de 0x4A18
<b>La tercera tabla de nombres</b>, la de 0x3C00, con los primeros dieciocho de los treinta y cinco profesionales de 0x5009, escritos con la fuente del propio cartucho. El orden es el de la tabla, no el de una partida: en el torneo se barajan al empezar
La tercera tabla de nombres, la de 0x3C00, con los primeros dieciocho de los treinta y cinco profesionales de 0x5009, escritos con la fuente del propio cartucho. El orden es el de la tabla, no el de una partida: en el torneo se barajan al empezar
Y los diecisiete restantes. Ballesteros, Nicklaus, Norman, Trevino, Aoki, Nakajima, Kuramoto y los dos Ozaki: el circuito de mediados de los ochenta, europeo, americano y japonés
Y los diecisiete restantes. Ballesteros, Nicklaus, Norman, Trevino, Aoki, Nakajima, Kuramoto y los dos Ozaki: el circuito de mediados de los ochenta, europeo, americano y japonés
<b>Los siete tiempos del swing</b>, sacados de 0x9F21. Cada dibujo son cuatro por cinco casillas y cada fila empieza por una máscara de cuatro bits: un bit a uno es hueco y uno a cero se lleva la casilla siguiente de la tira. Los guiónes de 0x9EC0 los encadenan, y en el tercero —el del impacto— suena la pista 5
Los siete tiempos del swing, sacados de 0x9F21. Cada dibujo son cuatro por cinco casillas y cada fila empieza por una máscara de cuatro bits: un bit a uno es hueco y uno a cero se lleva la casilla siguiente de la tira. Los guiónes de 0x9EC0 los encadenan, y en el tercero —el del impacto— suena la pista 5
<b>La vista corta.</b> El guión del green es uno solo para los treinta y seis hoyos (0x9D6C) y se monta en 0xCCE0 en vez de en 0xCB00; los patrones y colores que lo dibujan se descomprimen encima de los del campo, y por eso las seis filas de abajo del panel se borran antes. El hoyo se pone donde diga la tabla de 0x7128, que es la misma rejilla de nueve sitios pero en coordenadas de green
La vista corta. El guión del green es uno solo para los treinta y seis hoyos (0x9D6C) y se monta en 0xCCE0 en vez de en 0xCB00; los patrones y colores que lo dibujan se descomprimen encima de los del campo, y por eso las seis filas de abajo del panel se borran antes. El hoyo se pone donde diga la tabla de 0x7128, que es la misma rejilla de nueve sitios pero en coordenadas de green
<b>La tabla de patrones entera</b>, 256 casillas de 2 KB que se descomprimen desde 0x9F85 y se copian a los tres tercios de la pantalla. Están el marco del panel, la fuente —con el <code>©</code> en la arroba y el punto en el <code>></code>—, la hierba, el agua, la arena, los árboles, el golfista y la casa club
La tabla de patrones entera, 256 casillas de 2 KB que se descomprimen desde 0x9F85 y se copian a los tres tercios de la pantalla. Están el marco del panel, la fuente —con el © en la arroba y el punto en el >—, la hierba, el agua, la arena, los árboles, el golfista y la casa club
Los veintitrés sprites, descomprimidos desde 0x6898 a 0x3800. La bola en cinco tamaños —crece con la altura, que es como se ve que está en el aire—, su sombra, la bandera, las ocho flechas del viento y los cuadros del cursor del editor
Los veintitrés sprites, descomprimidos desde 0x6898 a 0x3800. La bola en cinco tamaños —crece con la altura, que es como se ve que está en el aire—, su sombra, la bandera, las ocho flechas del viento y los cuadros del cursor del editor
Y el banner del marcador, que es lo más parecido a un título que hay en la ROM: <b>HAL COUNTRY CLUB</b>
Y el banner del marcador, que es lo más parecido a un título que hay en la ROM: HAL COUNTRY CLUB
La pantalla de la clasificación del torneo tal como sale de la ROM, antes de que nadie escriba en ella. RANK, PLAYER, SCORE y HOLE, y dieciocho renglones que 0x674E monta repitiendo dieciocho veces el mismo bloque de treinta y dos casillas
La pantalla de la clasificación del torneo tal como sale de la ROM, antes de que nadie escriba en ella. RANK, PLAYER, SCORE y HOLE, y dieciocho renglones que 0x674E monta repitiendo dieciocho veces el mismo bloque de treinta y dos casillas