Ready64 Forum
Commodore 64 => Programmazione, Grafica e Musica => Topic aperto da: MarC=ello - 07 Dicembre 2004, 15:50:28
-
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...
-
Per cercare di velocizzare si potrebbe invertire l'array delle potenze di 2
45 for i=0to7:bit(7-i)=2^i:next
110 POKEBY,PEEK(BY)ORbi(x and 7)
cosi' ci rispiarmiamo il NOT x
ma non e' che ci guadagnamo tanto,ho inserito due righe di debug
49 t=ti
125 print ti-t:poke 53265,27:poke53272,21:poke198,0:wait198,1
da 3133 passo a 3068
La divisione credo sia un collo di bottiglia all'interno del ciclo.
-
Giusto ;)