El codigo

246 lineas de MSX-BASIC. El listado esta al 100 % de cobertura: las 246 llevan su comentario propio pegado encima, y salen 702 lineas de explicacion para 718 ordenes del programa.

Como se reparte

lineasque hacen
1-3STOP, la pantalla de titulo y el DEFINT D
10-90arrays, los trece palos, el campo del hoyo 1 y la espera
110-130monta la vista del hoyo y arranca
200-295el turno: postura, palo, y la formula del golpe
300-470la simulacion de vuelo
500-630donde quedo la bola y la camara para el golpe siguiente
700-720hoyo terminado, y el final de la partida
900-1260la bola en la vista, y las tres pantallas de eleccion
2000-2510leer el campo de la ROM
3000-3070buscar donde soltar la bola
4000-4080el plano cenital
5000-5690el motor de la vista 3D
6100-6900los cinco sonidos y el silencio
7000-9900escala, marcador, texto, panel y compas
10200-30000los DATA de los nueve hoyos y el manejador de STOP

El motor 3D

Es una perspectiva conica clasica, escrita a mano tres veces porque no hay una rutina compartida: en la 370-372 para la bola, en la 900-940 para marcar donde quedo, y en la 5000-5690 para el terreno.

La subrutina 5000 hace cuatro pasadas sobre los datos del hoyo:

  1. Copia el contorno a DN().
  2. Traslada cada punto restando la posicion de la camara.
  3. Rota con la matriz Q1-Q9. De sus nueve terminos, seis son constantes: la camara solo gira sobre un eje. Nunca se inclina ni se ladea.
  4. Recorre los segmentos, y cada uno lo recorta antes de proyectarlo.

El recorte (5190-5590) es el clasico contra un tronco de vision a 45 grados: un punto esta fuera por la izquierda si su x es menor que menos su profundidad, y asi las cuatro paredes. Si los dos extremos se salen por la misma, el segmento entero esta fuera. Si no, se sustituye el extremo de fuera por el punto de corte exacto y se vuelve a empezar, porque el punto movido puede salirse por otra. Con cuatro paredes, el bucle no puede dar mas de cuatro vueltas.

La proyeccion son dos divisiones por la profundidad, escaladas a la media anchura y la media altura de la ventana (71 y 63) y centradas en (79,63).

La lectura del campo

La subrutina 2500 lee un valor de 16 bits de la ROM. Como MSX-BASIC no tiene un PEEK de 16 bits, se lo monta a mano:

F1=PEEK(ZM) : F2=PEEK(ZM+1)
F1$=HEX$(F1) : F2$=HEX$(F2) : IF LEN(F2$)=1 THEN F2$="0"+F2$
DI(I)=VAL("&H"+F1$+F2$)

Dos PEEK, dos conversiones a texto hexadecimal, una concatenacion y un VAL. El segundo trozo se rellena con un cero si hace falta; el primero no, porque va en el sitio alto y ahi el cero no estorba. Y como VAL de un hexadecimal de cuatro digitos devuelve un entero con signo, las coordenadas negativas salen solas.

Es lentisimo, y se nota: dibujar el hoyo 1 entero le lleva al interprete mas de cinco minutos de reloj de la maquina.

El texto

No hay consola de texto. Todo se escribe con el truco de abrir la pantalla como si fuera un fichero:

PSET(AX*8,AY*8),0 : OPEN"GRP:"FOR OUTPUT AS #1 : PRINT#1,E$ : CLOSE#1

El PSET esta para mover el cursor grafico a la celda; el texto sale en el color de frente de COLOR, que es blanco. Se comprobo en la VRAM del emulador: las celdas del panel valen 0xF0, o sea tinta 15.

Y el golfista no es un sprite ni un dibujo: son ocho cadenas de texto, J$(0) a J$(7), escritas con ese mismo truco usando el juego de caracteres grafico de la ROM de la maquina. Por eso hace falta un MSX japones para verlas bien.

Los dos sprites

Solo hay dos, y son al reves de lo que parece: el sprite 0, con el patron macizo, es la barra del medidor de potencia; el sprite 1, con un patron de dos pixels, es la bola, y se mueve por el plano cenital, no por la vista 3D. En la vista 3D la bola es la sombra que dibujan las lineas 390-393 -un circulo relleno cuyo radio se encoge con la distancia- y el punto que deja la subrutina 900.