Hola amigos, he descartado la idea de acceder directamente
a la memoria desde Forth para imprimir un sprite, porque para
acceder a ese nivel es preferible hacerlo desde el código máquina,
que es muchísimo más veloz, y en mi búsqueda de soluciones
alternativas he construido la palabra PLOTSPRITE, que imprime
un sprite en pantalla mediante la palabra PLOT, previamente habiendo
introducido los datos del sprite en la pila, mediante la palabra SPRITE,
y habiendo colocado en las variables ANCHO y ALTO sus dimensiones
en pixels, y sus coordenadas en POSXI y POSYI.
Despues, para probar el sprite en movimiento en construido las palabras
PUTSPRITE, GETSPRITE y MOVESPRITE, y finalmente para verlo en acción
la palabra DEMOSPRITE.
La prueba ha sido un fracaso, por la lentitud del asunto, y veo 3
soluciones para continuar, una de ellas es intentar meter Código Máquina
en el compilador de Forth para crear la nueva palabra PUTSPRITE,
pero el problema es que no sé cómo hacerlo todavía, utilizo el Forth de
Abersoft. Otra es utilizar UDGs y utilizar la palabra adecuada de Forth
para imprimirlos, y hacer todas las animaciones posibles para simular el
movimiento pixel a pixel, y la última es no liarme tanto, usar UDGs y hacer
que el movimiento sea de 8 en 8 pixeles. ;-(
Ya veremos, de momento os dejo el listado para introducirlo en el compilador
de Forth de Abersoft. Leeros primero sus instrucciones para poder introducirlo, ya que su editor es un tanto peculiar.
( PLOTSPRITE: IMPRIME UN SPRITE MEDIANTE PLOTS )
100 VARIABLE POSXI
100 VARIABLE POSYI
0 VARIABLE POSXF
0 VARIABLE POSX
0 VARIABLE POSY
8 VARIABLE ANCHO
8 VARIABLE ALTO
0 VARIABLE COLORSPR
: SPRITE 1111 1111
1111 1111
1111 1111
1111 1111
1111 1111
1111 1111
1111 1111
1111 1111 ;
: PLOT0001 POSX @ 3 + POSY @ PLOT ;
: PLOT0010 POSX @ 2 + POSY @ PLOT ;
: PLOT0011 PLOT0001 PLOT0010 ;
: PLOT0100 POSX @ 1 + POSY @ PLOT ;
: PLOT0101 PLOT0001 PLOT0100 ;
: PLOT0110 PLOT0010 PLOT0100 ;
: PLOT0111 PLOT0001 PLOT0110 ;
: PLOT1000 POSX @ POSY @ PLOT ;
: PLOT1001 PLOT0001 PLOT1000 ;
: PLOT1010 PLOT0010 PLOT1000 ;
: PLOT1011 PLOT0011 PLOT1000 ;
: PLOT1100 PLOT0100 PLOT1000 ;
: PLOT1101 PLOT0001 PLOT1100 ;
: PLOT1110 PLOT0010 PLOT1100 ;
: PLOT1111 PLOT0011 PLOT1100 ;
: PUTPLOTS CASE 0001 OF PLOT0001 ENDOF
0010 OF PLOT0010 ENDOF
0011 OF PLOT0011 ENDOF
0100 OF PLOT0100 ENDOF
0101 OF PLOT0101 ENDOF
0110 OF PLOT0110 ENDOF
0111 OF PLOT0111 ENDOF
1000 OF PLOT1000 ENDOF
1001 OF PLOT1001 ENDOF
1010 OF PLOT1010 ENDOF
1011 OF PLOT1011 ENDOF
1100 OF PLOT1100 ENDOF
1101 OF PLOT1101 ENDOF
1110 OF PLOT1110 ENDOF
1111 OF PLOT1111 ENDOF
ENDCASE ;
: PUTXPLOTS ANCHO @ 4 / 1 + 1 DO PUTPLOTS POSX @
4 - POSX ! LOOP ;
: PUTYPLOTS ALTO @ 1 + 1 DO PUTXPLOTS POSY @
1 + POSY ! POSXF @ POSX ! LOOP ;
: PLOTSPRITE POSXI @ ANCHO @ + 4 - DUP POSX !
POSXF ! POSYI @ ALTO @ - POSY !
COLORSPR @ INK PUTYPLOTS ;
( PUTSPRITE: IMPRIME UN SPRITE MEDIANTE PLOTSPRITE )
: PUTSPRITE 0 COLORSPR ! SPRITE PLOTSPRITE ;
( GETSPRITE: BORRA EL SPRITE MEDIANTE PLOTSPRITE )
: GETSPRITE 7 COLORSPR ! SPRITE PLOTSPRITE ;
( MOVESPRITE: MUEVE EL SPRITE UN PIXEL A LA DERECHA )
: MOVESPRITE GETSPRITE POSXI @ 1 + POSXI ! PUTSPRITE ;
( DEMOSPRITE: PRUEBA DE MOVIMIENTO DEL SPRITE )
: DEMOSPRITE PUTSPRITE 20 1 DO MOVESPRITE LOOP ;
Hasta la próxima amigos!!!