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.
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.
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.
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.
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.
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.
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.
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.
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 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.
call 0x72D4 que no apunta a este cartuchoEn 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.
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.
Debajo de cada imagen está de dónde sale y qué se está viendo.
> es el puntojp: la dirección se mete en la pila y el ret hace de salto© en la arroba y el punto en el >—, la hierba, el agua, la arena, los árboles, el golfista y la casa club