13.06.2013 Views

con - Amiga Magazine Online

con - Amiga Magazine Online

con - Amiga Magazine Online

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!