3D Golf Simulation

Un cartucho de MSX sin una sola instrucción Z80: dentro hay un programa BASIC de 246 líneas que el intérprete ejecuta directamente desde la ROM. El campo entero —nueve hoyos con sus bunkers, sus lagos y sus árboles— cabe en 4.000 bytes de coordenadas, y el juego no tiene mapa de terreno: le pregunta a la pantalla de qué color está pintado el suelo bajo la bola.

T&E Soft · © 1983 · Cartucho de 16 KB · MSX1 · página 2 · Volcado 95d4e9dd…

Aquí no hay ninguna ilustración ni captura del juego. Los nueve hoyos —el plano y la vista en perspectiva— están dibujados desde los bytes del cartucho, ejecutando en Python las mismas subrutinas del programa sobre una emulación de la pantalla SCREEN 2 con sus atributos de color, y comparados contra la VRAM de openMSX: 15.737 de 15.744 píxeles idénticos en el plano —el que el juego lee para saber de qué es el terreno— y 18.011 de 18.432 en la vista 3D. La única imagen que no sale entera del cartucho es la pantalla de título, y está dicho por qué: el cartucho no trae ni una letra dibujada.

El cartucho en cifras

100 %del binario identificado
0instrucciones Z80
100 %de las líneas explicadas
246líneas de BASIC, 718 órdenes
9 hoyospar 36, 2.990 m
4.000bytes de campo

Lo que apareció al desmontarlo

Un cartucho de MSX sin una sola instrucción Z80

Lo primero que se hace con un cartucho es desensamblarlo. Aquí sale basura: el punto de entrada es nop / dec h / add a,b / ld bc,09700h / illegal sequence. No es que el desensamblador falle: es que ahí no hay código.

La cabecera lo dice si se lee entera. INIT, STATEMENT y DEVICE a cero, y lo único declarado es TEXT=0x8010: «aquí hay un programa BASIC». El intérprete lo ejecuta desde la propia ROM, sin copiarlo a RAM. La única llamada a código máquina del juego, USR(0) en la línea 30000, apunta a la dirección 0: pulsar STOP reinicia la máquina.

El juego le pregunta a la pantalla de qué es el terreno

No hay mapa lógico ni tabla de casillas. La línea 380 lleva la posición de la bola al plano cenital del panel derecho y lee con POINT el color pintado ahí. Ese color es el terreno: 2 la calle, 3 el green, 4 el agua, 6 fuera de límites, 13 un árbol, 14 un búnker, y 0 —el fondo sin pintar— el rough.

De ahí salen la postura del golfista, las penalizaciones y cómo bota la bola. El plano no es un adorno: es la estructura de datos del juego, y por eso el orden de los marcadores de color importa tanto.

El campo entero en 4.000 bytes

Los nueve hoyos ocupan 4.000 bytes justos, de 0xB000 a 0xBF9F, uno detrás de otro. Cada uno es una lista de valores de 16 bits que van de tres en tres —x, altura, profundidad— y un valor suelto entre 30001 y 30015 es un marcador: cambia el color de lo que viene detrás y, de paso, desplaza el reparto en uno.

El color no es decoración: dice de qué está hecho el tramo siguiente y con él se rellena el anterior. Y el orden es el mismo en los nueve: contorno, calle, green, asta de la bandera, búnkers, agua y árboles.

El asta de la bandera está dibujada en los datos, y eso ata la lectura

El tramo de color 1 de cada hoyo son cuatro puntos: un mástil vertical de 8 de alto y una banderita en la punta. Y está plantado exactamente en la posición que el DATA de ese hoyo declara como bandera, en los nueve.

Eso importa porque el orden de los DATA no es obvio —la bandera son los dos últimos valores de la línea, no los primeros—. Se sabe porque tres cuentas distintas cuadran a la vez: los pares suman 36 y coinciden con la cadena PQ$; las semillas de relleno que gasta la subrutina 4000 son exactamente las que sobran en cada DATA; y el asta cae en su bandera.

El cartucho lleva dentro una partida de verdad

Los 3.231 bytes entre el programa y los datos de campo son la tabla de variables del intérprete, congelada tal y como quedó en una sesión real del juego. Ése es el truco que hace arrancar a un cartucho BASIC sin rutina INIT: la ROM trae el programa y su estado ya montado.

Se lee entera, y cuenta una partida: hoyo 2, doce golpes en total, once de ellos gastados en el hoyo 1. El puntero de lectura del campo vale 0xB37A, que es donde empieza el hoyo 3 —jugándose el 2, su contorno ya se había leído—, y HX, HZ y P son la bandera y el par del hoyo 2. Cuatro cifras que cuadran con los datos de campo sin usar el programa para nada.

El 30006 no cierra el hoyo: cierra el plano

Parecía el final del recorrido, y no lo es. Es donde la subrutina 4000 deja de dibujar. Lo que va detrás sigue siendo del hoyo, y la vista 3D lo dibuja: dos o tres tramos con coordenadas de hasta 20.000, que son las líneas de fuga hacia el horizonte, y en el hoyo 3 una pared de 2.000×400 a profundidad 1.200: la montaña del fondo.

Y en esa vista el color no se usa para nada: la línea 5166 lo calcula y no lo mira nadie, porque el trazado es siempre blanco. Los colores sólo valen para el plano.

Una comprobación que no puede darse, y dos trozos que nadie lee

La línea 440 mira si el terreno vale 12 y frena la bola si es así. Esa condición no puede cumplirse: ningún hoyo pinta el color 12, en ninguno de los nueve. Es código muerto —probablemente el rough de una versión anterior, antes de que el rough pasara a ser el color de fondo—.

Y hay más de lo mismo: D2(240) se reserva en el DIM y no aparece en ninguna otra línea —482 bytes de RAM apartados para nada— y a ZL$ se le asigna "0000" sin que nadie la lea.

La partida es de una sola vuelta, y el putter en la arena cuesta un golpe

El programa no hace RESTORE en ninguna línea, y el puntero que lee el campo tampoco se rebobina. Al acabar el hoyo 9, la línea 720 es un GOTO 720: un bucle infinito. Volver a jugar exige reiniciar, y no es un descuido —no habría manera de rebobinar aunque se saltara al principio—.

Y una regla que no está en ningún manual: si la bola está en un búnker y eliges el putter, la línea 280 devuelve el turno al principio... que es la línea 225, la que suma un golpe. Intentarlo cuesta un golpe cada vez, sin que la bola se mueva.

Lo que el cartucho dibuja

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

<b>Los nueve hoyos del campo</b>, dibujados uno a uno con la misma subrutina 4000 que corre el intérprete, desde los 4.000 bytes de coordenadas que empiezan en 0xB000. Rojo el fuera de límites, negro el rough, verde la calle, verde claro el green con el hoyo dentro, gris los búnkers y azul el agua
Los nueve hoyos del campo, dibujados uno a uno con la misma subrutina 4000 que corre el intérprete, desde los 4.000 bytes de coordenadas que empiezan en 0xB000. Rojo el fuera de límites, negro el rough, verde la calle, verde claro el green con el hoyo dentro, gris los búnkers y azul el agua
La pantalla entera del hoyo 1 tal y como queda al empezar: la vista en perspectiva a la izquierda y el plano a la derecha. Es la imagen que se comparó contra la VRAM del emulador —<b>15.737 de 15.744 píxeles idénticos</b> en el plano, que es el que el juego lee con POINT—. El hueco de abajo a la izquierda es el panel, que se escribe con la fuente de la máquina y no con datos del cartucho
La pantalla entera del hoyo 1 tal y como queda al empezar: la vista en perspectiva a la izquierda y el plano a la derecha. Es la imagen que se comparó contra la VRAM del emulador —15.737 de 15.744 píxeles idénticos en el plano, que es el que el juego lee con POINT—. El hueco de abajo a la izquierda es el panel, que se escribe con la fuente de la máquina y no con datos del cartucho
La vista de salida del hoyo 1. Todo son segmentos de alambre trasladados por la cámara, rotados con una matriz que sólo gira sobre un eje, recortados contra las cuatro paredes del campo de visión y proyectados dividiendo por la profundidad. Las dos líneas que se pierden en el horizonte no están en el plano: son tramos que empiezan después del marcador 30006
La vista de salida del hoyo 1. Todo son segmentos de alambre trasladados por la cámara, rotados con una matriz que sólo gira sobre un eje, recortados contra las cuatro paredes del campo de visión y proyectados dividiendo por la profundidad. Las dos líneas que se pierden en el horizonte no están en el plano: son tramos que empiezan después del marcador 30006
El hoyo 2, par 3 de 155 metros: <b>el único sin calle</b>. Sus datos van directos del contorno exterior al green, sin el marcador de color 2 que llevan los otros ocho
El hoyo 2, par 3 de 155 metros: el único sin calle. Sus datos van directos del contorno exterior al green, sin el marcador de color 2 que llevan los otros ocho
El hoyo 5, con el lago cruzando el campo de lado a lado. El azul se derrama hasta el marco porque el polígono del agua llega al borde del campo: el relleno del intérprete se para en el color de borde, y ahí no hay ninguno
El hoyo 5, con el lago cruzando el campo de lado a lado. El azul se derrama hasta el marco porque el polígono del agua llega al borde del campo: el relleno del intérprete se para en el color de borde, y ahí no hay ninguno
El hoyo 9, el más largo: par 5 y 482 metros, y el que más bytes ocupa de los nueve (474)
El hoyo 9, el más largo: par 5 y 482 metros, y el que más bytes ocupa de los nueve (474)
La salida del hoyo 4, un par 5 de 441 metros. Cuanto más lejos está un punto, más junto sale: la perspectiva es una división por la profundidad y nada más
La salida del hoyo 4, un par 5 de 441 metros. Cuanto más lejos está un punto, más junto sale: la perspectiva es una división por la profundidad y nada más
La pantalla de título. <b>Ésta es la única imagen que no sale entera del cartucho, y no puede salir</b>: la posición y el texto los pone el programa (líneas 2 y 3, tres LOCATE y tres PRINT), pero las letras las dibuja el juego de caracteres de la ROM de la máquina, que no viene aquí. Los trazos salen de un volcado de VRAM del emulador
La pantalla de título. Ésta es la única imagen que no sale entera del cartucho, y no puede salir: la posición y el texto los pone el programa (líneas 2 y 3, tres LOCATE y tres PRINT), pero las letras las dibuja el juego de caracteres de la ROM de la máquina, que no viene aquí. Los trazos salen de un volcado de VRAM del emulador