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.
| lineas | que hacen |
|---|---|
| 1-3 | STOP, la pantalla de titulo y el DEFINT D |
| 10-90 | arrays, los trece palos, el campo del hoyo 1 y la espera |
| 110-130 | monta la vista del hoyo y arranca |
| 200-295 | el turno: postura, palo, y la formula del golpe |
| 300-470 | la simulacion de vuelo |
| 500-630 | donde quedo la bola y la camara para el golpe siguiente |
| 700-720 | hoyo terminado, y el final de la partida |
| 900-1260 | la bola en la vista, y las tres pantallas de eleccion |
| 2000-2510 | leer el campo de la ROM |
| 3000-3070 | buscar donde soltar la bola |
| 4000-4080 | el plano cenital |
| 5000-5690 | el motor de la vista 3D |
| 6100-6900 | los cinco sonidos y el silencio |
| 7000-9900 | escala, marcador, texto, panel y compas |
| 10200-30000 | los DATA de los nueve hoyos y el manejador de STOP |
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:
DN().Q1-Q9. De sus nueve terminos, seis son constantes: la camara solo gira sobre un eje. Nunca se inclina ni se ladea.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 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.
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.
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.