lunes, 8 de febrero de 2016

Como hacer un PRINT AT Y,X de Sinclair BASIC en Commodore 64 BASIC

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


Los POKE 781 y 782 son los registros .X y .Y en la máquina, y la istrucción sys 65520 posiciona el cursor en pantalla en las coordenadas que están en 781 y 782.

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 .

Puedes descargar el entorno de aquí y el proyecto de este ejemplo de este otro enlace

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: