Una de las cosas que más me llamó la atención cuando me pasé de Sinclair BASIC a Commodore 64 BASIC a cacharrear, es que no hay ¡ PRINT AT !.
¿Como se les puede haber pasado el implementar esta funcionalidad en el comando PRINT del BASIC ?. ¡En qué estaban pensando!.
Bueno, he aquí un par de posibilidades para simular el comando PRINT AT.
Una de ellas, la primera, se basa en "engañar" al comando PRINT del BASIC, con alguna instrucción que otra, para que se posicione donde queremos imprimir en pantalla.
La segunda, fija directamente el cursor en la posición de la pantalla donde queremos imprimir, usando POKEs.
La primera quedaría tal que así:
10 REM Buscando una altgernativa al PRINT AT
20 REM de Sinclair BASIC para el C64 BASIC
30 REM Posibilidad 1. Usando caracteres especiales
40 REM del C64 BASIC y el comando BASIC
50 REM ********* Modo 1 **************************
55 print "{clear}"
60 X$="{home}{right*39}"
70 Y$="{down*24}"
80 x=1:y=1
90 print left$(x$,x)right$(y$,y)" AAAAAAAAAAAAAAAAAAAAAA";
100 x=2:y=2 110
110 print left$(x$,x)right$(y$,y)"hola";
120 x=2:y=10 130
130 print left$(x$,x)right$(y$,y)"mundo";
140 x=10:y=10 150
150 print left$(x$,x)right$(y$,y)"hola mundo!";
152 x=1:y=12:print left$(x$,x)right$(y$,y)"";
155 rem *************************************
Si ejecutamos el programa, vemos el resultado :
Usamos X e Y para fijar donde queremos imprimir, y luego imprimimos el texto en pantalla usando print left$(x$,x)right$(y$,y) + el texto que queremos.
Hay una segunda opción, que es la que más me gusta, que es directamente posicionar el cursor en pantalla, donde queremos imprimir, y luego simplemente usar PRINT.
En C64 BASIC esto se consigue con la siguiente rutina, que puedes usar en tus programas:
999 REM Rutina que posiciona el cursor en un determinado sitio
1000 poke 780,0:REM fijamos cero para resetear
1010 poke 781,row:REM a memoria la fila(X)
1020 poke 782,col:REM a memoria la columna(Y)
1030 sys 65520 : REM fijamos el cursor en X,Y
1040 return
SAREG 030C 780 Storage for 6502 .A Register
SXREG 030D 781 Storage for 5502 .X Register
SYREG 030E 782 Storage for 6502 .Y Register
PLOT $FFF0 65520 Read/set X,Y cursor position
Usar la rutina se convierte simplemente en esto:
200 row = 5:col = 10:gosub 1000
210 print "hola"
Este método es mucho mejor y más limpio que el primero, en mi opinión, aunque ambos nos permiten saber donde hemos dejado el cursor después de haber impreso en pantalla.
Un pequeño vídeo del programa de demostración en cuestión:
Como entorno de desarrollo estoy usando CBM .prg Studio de Arthur Jordison .
He aqui otro ejemplo del modo 2, usando otros registros del sistema:
10 PRINT CHR$(147)
20 SP = 20: ZE = 3: A$ = "Good Morning!": GOSUB 1000: GOSUB 2000
30 SP = 10: ZE = 3: A$ = "I'm the Commodore 64": GOSUB 1000: GOSUB 2000
40 SP = 12: ZE = 6: A$ = "And what is your name ?": GOSUB 1000
100 END
1000 REM cursor positioning and printing
1010 POKE 211,SP :POKE 214, ZE: SYS 58640 : PRINT A$
1020 RETURN
2000 REM delay-loop
2010 FOR X=0 TO 3000: NEXT X
2020 RETURN
No hay comentarios:
Publicar un comentario