Autore Topic: Grafica Bitmap  (Letto 3644 volte)

MarC=ello

  • Utente
  • **
  • Post: 337
  • Gioco Preferito: CBM BASIC 2.0
Grafica Bitmap
« il: 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...
-=MarC=ellO=-

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Grafica Bitmap
« Risposta #1 il: 07 Dicembre 2004, 23:26:17 »
 Per cercare di velocizzare si potrebbe invertire l'array delle potenze di 2
Codice: [Seleziona]
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
Codice: [Seleziona]
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.
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

MarC=ello

  • Utente
  • **
  • Post: 337
  • Gioco Preferito: CBM BASIC 2.0
Grafica Bitmap
« Risposta #2 il: 08 Dicembre 2004, 13:23:52 »
 Giusto ;)  
-=MarC=ellO=-