Io stavo parlando di ottimizzazione dei programmi BASIC, ed ho scelto un compito non adatto per il BASIC in modo da far vedere meglio i guadagni di tempo che si ottengono con l'ottimizzazione (considerando un lasso di tempo più lungo, i guadagni sono relativi ad una grande quantità e pertanto risultano più evidenti).
Nessuno, Alberto, sosteneva che bisogna usare il BASIC per azzerare un segmento di 8K. Il mio thread aveva come argomento L'OTTIMIZZAZIONE DEI PROGRAMMI BASIC, non l'azzeramento (o comunque il filling) di un segmento di memoria wink.gif
Bellissimo comunque il programma di Ian, che, previa sua autorizzazione, gradirei molto inserire nella Guida al futuro capitolo sull'interfacciamento fra BASIC e linguaggio macchina (spero che Ian sarà d'accordo; ovviamente ci saranno tutti i crediti del caso :-)).
In ogni caso, l'ottimizzazione dei programmi BASIC è importante. Infatti, guardate un po' la differenza fra il programma non ottimizzato e quello ottimizzato:
5 TI$="000000"
10 FORT=0TO7999:POKE8192+T,0:NEXT:PRINTTI$
15 A=8192:B=16191
20 TI$="000000":FORT=ATOB:POKET,0:NEXT:PRINTTI$
Digitando RUN (e, se siete su VICE, premendo ALT + W onde evitare di attendere una vita) si otterrà:
000111
000028
Questo significa che il programma non ottimizzato impiega 1 minuto e 28 secondi per svolgere l'azzeramento delle locazioni da 8192 a 16191; il programma ottimizzato impiega "solo" 28 secondi... a me non sembra una cosa da poco.
L'esempio del segmento di memoria non è certo dei più felici per il BASIC.
Consideriamo allora il seguente programma:
Programma LENTO:
100 REM FINTO RASTER
110 REM VERSIONE NON OTTIMIZZATA
240 PRINTCHR$(147);
250 FORT=1TO24:FORK=1TO40:PRINTCHR$(63+T);:NEXTK:NEXTT
260 FORT=12288TO12288+(8*24):POKET,0:NEXT
270 POKE 53272,(PEEK(53272)AND240)OR12
280 FORK=0TO192:POKE12288+K,255:NEXTK
290 FORK=192TO0STEP-1:POKE12288+K,0:NEXTK
300 GOTO280
Programma VELOCE (fa la stessa cosa del precedente, ma è ben più veloce):
100 REM FINTO RASTER
110 REM VERSIONE PARZIALMENE OTTIMIZZATA
240 PRINTCHR$(147);
250 FORT=1TO24:FORK=1TO40:PRINTCHR$(63+T);:NEXTK:NEXTT
260 FORT=12288TO12288+(8*24):POKET,0:NEXT
270 POKE 53272,(PEEK(53272)AND240)OR12
275 S=12288:F=12480
280 A=255:FORK=STOF:POKEK,A:NEXTK
290 A=0:FORK=FTOSSTEP-1:POKEK,A:NEXTK
300 GOTO280
Basta eseguire i due programmi, per rendersi conto che l'ottimizzazione può consentire il conseguimento di risultati stimolanti anche in BASIC (that's BASIC hacking, guys!!).
Ovviamente il programma può essere ottimizzato ancora... basta abbassare i numeri di linea, modificare la routine che effettua delle POKE direttamente sullo schermo con delle istruzioni PRINT, ecc... ecc... Non mi sono concentrato sulla velocità di visualizzazione dei caratteri sullo schermo, quanto alla "raster" routine vera e propria (ovviamente questo programma simula una routine raster, per questo il termine è fra virgolette - lo dico per chi non ha mai programmato il raster; per le vere routine raster è indispensabile il linguaggio macchina). I numeri di linea sono grandi perché ho preso il programma da un altro mio programma più grande (e non ho avuto voglia di cambiare i numeri di linea...).
(Se qualcuno non capisse qualcosa, chiedetemi pure :-)).
Comunque, buona Pasqua a tutti!