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.

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).

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

Saved successfully!

Ooh no, something went wrong!