You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Didattica AMICA MAGAZINE<br />
.......................................................................<br />
quanto vi è memorizzato I'indirizzo<br />
di una routine che il 68000 esegue<br />
automaticamente dopo ogni istru-<br />
zione quando è in trace mode. Poi-<br />
ché nessuno in generale usa il trace<br />
mode su <strong>Amiga</strong>, e in particolare è<br />
improbabile che qualcuno lo faccia<br />
mentre usa AutoBootBlock, la loca-<br />
zione è relativamente sicura, sia per<br />
il sistema che per noi (altre scelte<br />
sono ovviamente possibili, ad e-<br />
sempio la $100). 1 due macro che<br />
seguono sono identici. La ragione<br />
delladistinzione denominativasta in<br />
una maggiore chiarezza a livello di<br />
documentazione: in questo modo è<br />
più chiaro se si stia chiamando il<br />
DOS o Exec.<br />
La prima azione del programma è<br />
quella di aprire la dos.library, in mo-<br />
do da disporre della funzione Exe-<br />
cute(). La posizione in memoria<br />
dell'exec.library (necessaria per<br />
chiamare OldOpenLibrary() ) è otte-<br />
nuta tramite il puntatore memorizza-<br />
to nella locazione $4, che, come tut-<br />
ti sanno, è l'unica locazione fissa di<br />
tutto il software di sistema <strong>Amiga</strong><br />
che risiede in RAM. Usiamo Old0-<br />
penLibrary() in luogo della più mo-<br />
derna OpenLibraryO semplicemen-<br />
te perchè la prima non <strong>con</strong>trolla il<br />
numero di release della libreria, e ci<br />
<strong>con</strong>sente quindi di risparmiare i 2<br />
byte di cui avremmo bisogno per az-<br />
zerare DO.<br />
Immediatamente dopo, viene e-<br />
stratto il numero in PROGNUMLOC,<br />
lo si complementa a (ITEMS-l), e si<br />
<strong>con</strong>trolla che il risultato sia minore di<br />
ITEMS (strettamente minore, in<br />
quanto al primo programma com-<br />
pete il codice 0). Notate come dalla<br />
corretta assegnazione di ITEMS di-<br />
penda non solo il test di <strong>con</strong>trollo,<br />
ma anche il vero e proprio calcolo<br />
del codice del programma (ad e-<br />
sempio, l'ultimo programma che I'u-<br />
tente può scegliere fa sempre depo-<br />
sitare a Booter uno zero in $24, men-<br />
tre il codice reale è ITEMS-1, dipen-<br />
dente quindi da ITEMS). Attraverso<br />
una semplice ricerca Loader deter-<br />
mina poi quale dei comandi debba<br />
essere eseguito e chiama Execute()<br />
per lanciarlo. Non resta a questo<br />
punto che chiudere la dos.library e<br />
uscire. Per inserire i comandi nella<br />
tabella basta scriverli nella stessa<br />
forma della stringa 'dos.libraryl,<br />
cioè racchiusi tra apostrofi e segui-<br />
ti da uno zero (peraltro già presente<br />
nel listato).<br />
Eccoci arrivati "all'acme di questa<br />
sciarada programmatoria".<br />
Parleremo ora diffusamente del<br />
bootblock vero e proprio, ovvero di<br />
Booter. Esso è in realtà composto<br />
da due programmi separati, e uno di<br />
questi non verrà eseguito dal 68000.<br />
Infatti è una Copper List, ovvero una<br />
serie di comandi per il Copper (co-<br />
processore), che è programmabile<br />
mediante un set relativamente ridot-<br />
to, ma molto potente di istruzioni. In<br />
particolare, noi ne useremo solo<br />
due: WAIT e MOVE.<br />
Il Copper, infatti, ha lacapacità di ar-<br />
restare I'esecuzione di un proprio<br />
programma fino a che il pennello e-<br />
lettronico del monitor non abbia rag-<br />
giunto una certa posizione o non<br />
l'abbia oltrepassata, attraverso I'i-<br />
struzione WAIT.<br />
Inoltre, attraverso l'istruzione MOVE<br />
può inserire dei valori nei registri<br />
hardware di <strong>Amiga</strong>, che <strong>con</strong>sento-<br />
no il <strong>con</strong>trollo completo del sistema<br />
audiolvideo e, mediante il Blitter, an-<br />
che della memoria.<br />
Il programma <strong>con</strong>tenuto in Booter fa<br />
sì che venga visualizzato uno scher-<br />
mo di nostra creazione, avente co-<br />
me sfondo una serie di striscie colo-<br />
rate che sfumano dal blu al nero e vi-<br />
ceversa. Il risultato non è ottenuto u-<br />
tilizzando 32 colori, bensì modifi-<br />
cando in tempo reale il colore di<br />
sfondo mano a mano che il pennel-<br />
lo elettronico si muove (pensando al<br />
fatto che quest'ultimo visualizza<br />
l'immagine sul monitor 60 volte al<br />
se<strong>con</strong>do, vi renderete <strong>con</strong>to della<br />
potenza del Copper). Questo com-<br />
porta che il nostro fabbisogno di bi-<br />
tplane sia ridotto ad uno solo: vo-<br />
gliamo un colore per scrivere il testo<br />
(bianco, ovvero OxFFF), e uno di<br />
sfondo da fare modificare al Cop-<br />
per. Il programma del Copper viene,<br />
infatti, eseguito unavolta per ogni vi-<br />
deo frame (cioè 60 volte al se<strong>con</strong>do,<br />
come sopra). Andiamo ora ad esa-<br />
minare in dettaglio la Copper List<br />
che si trova in fondo al listato.<br />
Le prime due istruzioniscrivono nei<br />
puntatori al primo (ed ultimo, in<br />
quanto unico) bitplane I'indirizzo<br />
della memoria CHIP da noi allocata<br />
a questo scopo (la scrittura a destra<br />
del punto e virgola è puramente<br />
mnemonica, ed è irrilevante ai fini<br />
della compilazione). Notate come il<br />
formato dell'istruzione MOVE sia in<br />
pratica: (indirizzo del registro hard-<br />
ware), (<strong>con</strong>tenuto da immagazzi-<br />
narvi), ove il primo è pensato come<br />
spostamento da$DFF000 ed è sem-<br />
pre pari, in quanto il bit O della prima<br />
parola deve essere tassativamente<br />
O (coerentemente col fatto che i re-<br />
gistri hanno la dimensione di una<br />
parola). Notate anche che I'indirizzo<br />
del bitplane è lasciato a zero, e ver-<br />
rà scritto durante I'esecuzione. La<br />
ragione di questo fatto sta nella<br />
scelta di utilizzare AllocMem() per<br />
ottenere la memoria di cui abbiso-<br />
gnamo, anziché utilizzare una loca-<br />
zione RAM fissa, come fa la maggior<br />
parte dei bootblock (per esempio,<br />
$50000). L'impagabile vantaggio è<br />
che se abbiamo in RAM un qualun-<br />
que tipo di registrazione residente<br />
(come il RAD: del Workbench 1.3)<br />
questa non verrà disturbato dal<br />
bootblock, che potrebbe invece<br />
danneggiarla usandola indiscrimi-<br />
natamente come memoria video.<br />
Le sei istruzioni successive sono<br />
completamente standard, e ci <strong>con</strong>-<br />
sentono di visualizzare senza pro-<br />
blemi uno schermo 320 x 256 a bas-<br />
sa risoluzione (per i particolari, ve-<br />
dasi <strong>Amiga</strong> Hardware Manual della<br />
Addison-Wesley).<br />
Le due istruzioni successive sono<br />
più importanti: la prima mette a O x<br />
OOF, cioè azzurro, il colore di sfon-<br />
do, mentre la se<strong>con</strong>da mette a bian-<br />
co il colore di scrittura. Quindi il Cop-<br />
per aspetta di arrivare alla riga 42, e<br />
inserisce il colore O x OOE (azzurro<br />
un po' più scuro del precedente) nel<br />
registro di sfondo. Da questo punto<br />
in poi, ogni nove righe il colore di<br />
sfondo verrà modificato fino ad arri-<br />
vare al nero O x 000 al centro dello<br />
schermo, e poi tornare al blu al fon-<br />
do (potete ovviamente modificare a<br />
vostro piacimento la variazione del<br />
colore agendo sulle istruzioni della<br />
forma MOVE $xxxx,COLOROO).