Ciao a tutti!
Solo poco tempo fa ho trovato nel libro "Mapping the 64" una formula per il plotting da BASIC 2.0 nello schermo bitmap molto interessante. Ecco a seguire due appunti che mi sono scritto, con una versione ottimizzata, da me scritta, del programma della Guida di Riferimento che traccia una sinusoide.
* Formula rapida di plotting in BASIC 2.0 *
Se le variabili X e Y contengono le coordinate del punto da accendere, il byte è fornito dalla formula:
BY=BASE+40*(Y AND 248)+(Y AND 7)+(X AND 504)
Per accendere il punto desiderato:
POKE BY, PEEK(BY) OR (2^(NOTX AND 7)
L'operazione di elevamento ad esponente (potenza) è molto lenta. Per velocizzare ulteriormente la routine, possiamo creare un array, nel quale a ciascun elemento corrisponda una potenza di due:
FOR I=0 TO 7:BIT(I)=2^I:NEXT
In questo modo, l'espressione 2^I, che è di lenta valutazione, può essere sostituita da BI(I); l'interprete BASIC potrà così reperire, tramite l'array BI(I), i valori già calcolati delle potenze di 2.
*Azzeramento rapido e colorazione rapida dello schermo bmp *
Modificando il valore contenuto nella locazione 648, che contiene la pagina della memoria ove è contenuta la locazione iniziale della memoria dello schermo, è possibile inserire molto rapidamente dei valori in memoria usando l'istruzione PRINT. Il seguente programma, in puro BASIC 2.0, disegna una sinusoide in tempi dignitosi:
start tok64 {sin}
5 rem fast sinus plotting - marcello
10 poke 53265,peek(53265)or32:rem attiva la modalita' bit map
20 poke 53272,(peek(53272)and240)or8:rem schermo bitmap a partire da 8192
30 base=8192
40 gosub200: gosub400
45 for i=0to7:bit(i)=2^i:next
50 FORX=0TO319STEP.5:
60 Y=INT(90+80*SIN(X/10))
90 BY=BASE+40*(y and 248)+(y and 7)+(x and 504)
110 POKEBY,PEEK(BY)OR(bi(notx and 7))
120 NEXTX
125 POKE1024,16
130 GOTO130
200 rem cancellazione rapida dello schermo bitmap in basic
230 a=8192/256:b=30
240 s$="@"
250 forc=1to64:a$=a$+s$:next:rem a$ = 64 @
280 forl=0tob
290 poke 648,a+l:print"{home}";
300 forc=1to4
310 print a$;
320 nextc
340 nextl
350 poke648,16128/256:print"{home}";
360 printa$;
380 poke 648,4
390 return
400 rem colorazione rapida dello schermo
403 print"{home}";
405 m$="c":sc=3
406 forc=1to39:g$=g$+m$:next:h$=g$+m$
410 fort=1to24:printh$;:next
420 printg$;:poke2023,sc
430 return
stop tok64
Se qualcuno vuole può compattare il programma, ed andrà ancora più veloce. Io l'ho postato "espanso" per una migliore leggibilità
Per convertirlo, potete usare bastext oppure tok64 (non è un gran che ma è molto diffuso). Se usate tok64, salvate il testo del programma come file di testo (es, sinus.txt), quindi scrivete, da MS-DOS ovviamente:
tok64 /mult sinus.txt
In alternativa - scelta consigliata - potete usare Bastext, lo trovate anche nel sito di Ian CooG, versione ottimizzata.
Ciao!
Nota: ovviamente in Simon's BASIC si fa MOLTO prima, ma programmare in BASIC 2.0 mi ha sempre divertito...