You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Diduttica AMIGA MAGAZINE<br />
.*.*.m.m.* .m * ...............................................<br />
non avendo più preoccupazioni di<br />
ambiente o di lunghezza.<br />
Partiamo dal facile e arriviamo al dif-<br />
ficile. Cominciamo quindi ad analiz-<br />
zare Bootlnstall.<br />
Lo scopo del programma è di pren-<br />
dere un programma di nome Booter<br />
dalla directory corrente e di scriver-<br />
lo nei primi due blocchi del drive in-<br />
dicato come argomento. Per com-<br />
prendere il suo funzionamento è pe-<br />
rò necessario un breve excursus in<br />
tre punti.<br />
1 ) Il formato oggetto standard di A-<br />
miga. Un qualunque programma A-<br />
miga, quale ad esempio quello ge-<br />
nerato da un linker, non <strong>con</strong>siste<br />
semplicemente in una sequenza di<br />
istruzioni e di dati.<br />
Poiché <strong>Amiga</strong> è una macchina mul-<br />
titask, un programma deve essere<br />
descritto in un formato che <strong>con</strong>ten-<br />
ga le informazioni per posizionarlo<br />
correttamente ovunque nella me-<br />
moria. Se così non fosse, tutti i pro-<br />
grammi dovrebbero essere caricati<br />
a locazioni fisse, rendendo il multi-<br />
task impossibile. Un file oggetto di<br />
<strong>Amiga</strong> è quindi formato da diversi<br />
"hunk", ovvero blocchi di informa-<br />
zioni per ognuno dei quali viene in-<br />
dicato il tipo di trattamento da effet-<br />
tuare: nessuna rilocazione, riloca-<br />
zione a 16 bit, a 32 bit eccetera. Per<br />
semplificare la situazione, <strong>con</strong>side-<br />
reremo solo programmi formati da<br />
un singolo hunk. In pratica, dovremo<br />
saltare i primi 32 byte (ovvero 4 pa-<br />
role lunghe) del file oggetto e scar-<br />
tare gli ultimi quattro (ovvero 1 paro-<br />
la lunga), in quanto <strong>con</strong>tenenti dati<br />
descriventi gli hunk, e quindi per noi<br />
di scarso interesse. Il restoè il nostro<br />
programma.<br />
2) 11 formato standard del bootblock.<br />
I primi quattro byte del bootblock<br />
devono <strong>con</strong>tenere necessariamen-<br />
te i caratteri 'D','O','S1,O (non 'O'!),<br />
cioè in pratica la stringa "DOS" in<br />
formato C. I se<strong>con</strong>di quattro byte<br />
formano una parola lunga che costi-<br />
tuisce il checksum del blocco. I ter-<br />
zi quattro byte formano una parola<br />
lunga che <strong>con</strong>tiene sempre 880, ov-<br />
vero i Kbyte del disco: dopo viene il<br />
nostro programma. La massima at-<br />
tenzione deve essere prestata al fat-<br />
to che il checksum viene calcolato<br />
negando logicamente la somma e-<br />
stesa di tutte le parole lunghe che<br />
formano il blocco, ove somma este-<br />
sastaasignificare che ogni qualvol-<br />
ta c'è un trabocco dell'aritmetica a<br />
32 bit, e quindi un riporto, questo va<br />
pure sommato sotto forma di 1. Inu-<br />
tile dire che "le parole lunghe del<br />
blocco" indica le parole lunghe che<br />
cominciano ad offset multipli di 4<br />
dall'inizio del blocco, e che il "tutte"<br />
esclude la parola lunga di check-<br />
sum.<br />
3) Le tecniche di 110 di Exec. Il DOS<br />
non <strong>con</strong>sente di effettuare 110 a livel-<br />
lo di blocco, bensì solo a livello di fi-<br />
le. Per scrivere quindi nei blocchi O<br />
e 1 dovremo tuffarci nella gestione<br />
delle device di Exec, il <strong>con</strong>trollore<br />
del traffico multitask di <strong>Amiga</strong>. Per<br />
scrivere dei dati in un punto specifi-<br />
co del disco, occorre:<br />
1) Allocare una struttura di tipo 10-<br />
StdReq;<br />
2) Aprire, mediante OpenDevice(),<br />
la trackdisk.device;<br />
3) Dare il comando di Write;<br />
4) Dare il comando di UpDate, che<br />
fa eseguire fisicamente la scrittura;<br />
5) Fermare il motore del drive.<br />
Torniamo ora a Bootlnstall. Dopo gli<br />
#include necessari (gli utenti Manx<br />
eliminino quelli che cominciano <strong>con</strong><br />
protol, poiché I'Aztec C non permet-<br />
te il prototype checking e tantomeno<br />
l'in-line call per le funzioni di libre-<br />
ria), vengono dichiarate le variabili<br />
statiche del caso: il buffer di scrittu-<br />
ra (b[1030]), la porta di comunica-<br />
zione necessaria per fare dellll10<br />
<strong>con</strong> Exec e la IOStdReq di cui sopra.<br />
Per semplicità, sono stati dati gli<br />
stessi nomi dei tipi alle strutture. Il<br />
programma dovrà essere compilato<br />
<strong>con</strong> l'opzione che impone il carica-<br />
mento dei dati in CHIP RAM, poiché<br />
è lì che b deve necessariamente ri-<br />
siedere. L'oblio della raccomanda-<br />
zione avrà come <strong>con</strong>seguenza la<br />
scrittura di "spazzatura" varia nel<br />
bootblock.<br />
Dopo un breve <strong>con</strong>trollo degli argo-<br />
menti che non si presta ad equivoci,<br />
Bootlnstall prova ad aprire Booter.<br />
In caso positivo, salta <strong>con</strong> una Seek<br />
i primi 32 byte, e ne legge 1017.<br />
101 7 !? Certamente: 101 2 costitui-<br />
s<strong>con</strong>o la lunghezza massima per il<br />
bootblock, 4 formano la parola fina-<br />
le di informazione per lo hunk, e un<br />
byte in più ci serve (nel caso venga<br />
effettivamente letto) per avvisare I'u-<br />
tente del fatto che il file è troppo lun-<br />
go. Una lunghezza di 1016 andreb-<br />
be ancora bene, in quanto l'ultima<br />
parola lunga non ci interessa. Nota-<br />
te come essa non venga cancellata<br />
espressamente, e quindi, se la lun-<br />
ghezza del programma è minore di<br />
101 2, risieda anch'essa nel boot-<br />
block (che fastidio ci dà?).<br />
Eseguita I'inizializzazione dei primi<br />
12 byte (il codice dovrebbe parlare<br />
da solo, dopo le spiegazioni prece-<br />
denti; date un'occhiata al calcolo<br />
del checksum!), Bootlnstall cerca di<br />
aprire la trackdisk.device utilizzan-<br />
do il numero di unità fornito dall'u-<br />
tente. Nel caso tutto vada bene, ini-<br />
zializza la porta di comunicazioni<br />
<strong>con</strong> Exec (per gli interessati, Exec<br />
non usa WaitPort(Port), bensì<br />
Wait(sigbit), e quindi la mancata al-<br />
locazione del segnale causerebbe<br />
l'arresto a tempo indeterminato del<br />
programma, piantato su una Wait(0)<br />
) ed effettua le operazioni di cui so-<br />
pra. Notate che nella prima opera-<br />
zione di 110 IOStdReq.io-Offset=O<br />
indica che vogliamo scrivere dal<br />
blocco O (se volessimo scrivere dal<br />
blocco 1, comunque, dovremmo<br />
scrivere 512, 1024 per il blocco 2,<br />
eccetera), mentre nella terza 10-<br />
StdReq.io-Length=O indica che vo-<br />
gliamo spegnere il motore del drive<br />
(nel caso volessimo accenderlo, sa-<br />
rebbe l).<br />
Non c'è che da chiudere la<br />
trackdisk.device e stampare un<br />
<strong>con</strong>fortante messaggio.<br />
Proseguendo sulla nostra strada,<br />
andiamo a commentare Loader. Il<br />
simbolo ITEMS deve essere egua-<br />
gliato al numero di programmi che<br />
Booter intendevisualizzare (anche lì<br />
è chiamato ITEMS). PROGNUM-<br />
LOC indica invece la locazione di<br />
memoria mediante la quale Booter e<br />
Loader si scambiano le informazio-<br />
ni. La mia scelta è caduta su $24, in