Hola amigos, os voy a explicar mi pequeña experiencia con el lenguaje Forth de Abersoft.
Cómo comenté anteriormente, quiero hacer el juego ASTEROIDS, los gráficos los he podido realizar a mano en una libreta
cuadriculada, utilizando el sistema artesanal de rellenar los cuadritos que representan los pixels, hasta aquí ningún problema.
Después pensé cómo los representaría en pantalla, en forma de UDGs, con lo cual necesitaría varios bancos de gráficos para
representarlos, y el movimiento se limitaría a baja resolución 32 columnas x 24 filas, 768 posiciones y de 8 en 8 pixels, lo cual
no me satisfacía. Hize una prueba en Forth de utilizar la palabra PLOT para imprimir sprites punto a punto y así utilizar 256 x 192,
49152 posiciones y de 1 a 1 pixel, pero la velocidad de representación era pésima.
Ahora estoy desarrollando las rutinas que imprimen un sprite en alta resolución, pero accediendo directamente a la memoria de
pantalla, pero todavía no lo he acabado, y aún no puedo deciros si merece la pena. La verdad es que programar en FORTH me
cuesta bastante, a veces me es más fácil utilizar el ensamblador. También pienso, porque FORTH tiene muchísimas palabras, y
las instrucciones están en inglés ( Advanced Spectrum Forth, es un libro en el que me baso para programar ).
Quizás me plantee crear un pseudoForth muy básico, a nivel de assembler, más bien compilado, utilizando la estructura de palabras
de la que se rige, y con él desarrollar ASTEROIDS
, o más bien pensármelo y utilizar el assembler que me es más familiar
.
Aquí teneis un ejemplo de mi primera incursión formal en FORTH de Abersoft, la palabra que calcula la dirección en pantalla según
coordenadas X,Y:
( CALCDIRPANT: Calcular direccion pantalla )
0 VARIABLE COORDX ( 0 a 255 )
0 VARIABLE COORDY ( 0 a 191 )
0 VARIABLE COL ( 0 a 31 )
0 VARIABLE FIL ( 0 a 23 )
0 VARIABLE BASEPANT ( 16384 18432 20480 )
0 VARIABLE LINEA ( 0 a 191 )
0 VARIABLE NUMLINEA ( 0 A 7 )
0 VARIABLE DESPNUMLINEA ( 0 256 512 768 1024 1280 1536 1792 )
0 VARIABLE DESPFIL ( 0 32 64 96 128 160 192 224 )
0 CONSTANT FALSE
1 CONSTANT TRUE
: COLUMNA COORDX @ 8 / COL ! ;
: FILA COORDY @ 8 / FIL ! ;
: TERCIO1? FIL @ 8 < IF TRUE ELSE FALSE ENDIF ;
: TERCIO2? FIL @ 16 < IF TRUE ELSE FALSE ENDIF ;
: DIRBASEPANT TERCIO1? TRUE = IF 16384 BASEPANT ! ELSE
TERCIO2? TRUE = IF 18432 BASEPANT ! ELSE
20480 BASEPANT ! ENDIF ( Esta en tercio 3 )
ENDIF ;
: LINEA0ALTA FIL @ 8 * LINEA ! ;
: NUMLINEAFILA COORDY @ LINEA @ - NUMLINEA ! ;
: DESPLAZA1 NUMLINEA @ 256 * DESPNUMLINEA ! ;
: DESPLAZA2 TERCIO1? TRUE = IF FIL @ 32 * DESPFIL ! ELSE
TERCIO2? TRUE = IF FIL @ 8 - 32 * DESPFIL ! ELSE
FIL @ 16 - 32 * DESPFIL ! ENDIF ( Esta en tercio 3 )
ENDIF ;
: DIRPANT BASEPANT @ DESPNUMLINEA @ DESPFIL @ COL @ + + + ;
: CALCDIRPANT COLUMNA FILA DIRBASEPANT LINEA0ALTA NUMLINEAFILA DESPLAZA1 DESPLAZA2 DIRPANT ;
( Fin de CALCDIRPANT )
La palabra CALCDIRPANT previamente habiendo introducido en las variables COORDX y COORDY las coordenadas de pantalla,
dejará en la pila la dirección de pantalla. Cómo habreis visto, FORTH es bastante modular, debes crear las palabras base iniciales,
para que la palabra principal funcione, esto te obliga a programar de abajo hacia arriba. No se si esto es bueno o es malo ¿?.
Bueno compis, hasta pronto !!!