12.06.2013 Views

1 - Amiga Magazine Online

1 - Amiga Magazine Online

1 - Amiga Magazine Online

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Essendo il risultato voluto A*B*K, si rende necessaria una<br />

divisione per K, ma il problema è costituito dal fatto che<br />

il risultato della moltiplicazione è a 64 bit. Per fortuna i<br />

più diffusi microprocessori della Motorola (68020, 68030<br />

e 68040, ma non il 68060) posseggono un'istruzione che<br />

permette di moltiplicare due numeri a 32 bit, il risultato a<br />

64 bit verrà suddiviso in due registri:<br />

Tale istruzione moltiplica do per d2 e inserisce la parte<br />

bassa del risultato in d2 e la parte alta in dl. Come già<br />

detto, il risultato è nel formato 32.32 e bisogna convertir-<br />

lo nel formato 16.16. In figura 3 è possibile osservare<br />

chiaramente qual è il risultato della moltiplicazione e<br />

quale parte del risultato a 64 bit bisogna estrarre. In as-<br />

sembly tutto ciò diventa:<br />

muls.1 dO,dl:d2<br />

m0ve.w dl,d2<br />

swap d2<br />

che moltiplica il contenuto di do per quello di d2, e met-<br />

te il risultato in d2. Più semplice a farsi che a dirsi.<br />

Per quanto riguarda la divisione il discorso è analogo ma,<br />

invece di avere un risultato a 64 bit, ne avremo uno sen-<br />

za parte decimale. Sempre volendo passare per buona<br />

Fig. 3 - Moltiplicazione di due numeri in virgola fissa<br />

nel formato 16.16<br />

l'affermazione fatta poco prima, la divisione di due nu-<br />

meri A e B in virgola fissa, vale:<br />

A*K / B*K = A / B<br />

Per evitare che la parte frazionaria venga tagliata fuori, è<br />

sufficiente moltiplicare il dividendo per K, ottenendo il risultato<br />

voluto:<br />

In questo caso, il problema è rappresentato dal fatto che<br />

il dividendo è a 64 bit ma, per fortuna, l'assembly del<br />

68020 ci viene in aiuto con la seguente istruzione:<br />

che divide il numero a 64 bit la cui parte alta è contenuta<br />

in di e la cui parte bassa è in d2, per il numero a 32 bit<br />

in do. La figura 4 mostra chiaramente il formato degli<br />

operandi e del risultato della divisione di due numeri nel<br />

formato 16.16 eseguita dal seguente pezzo di codice as-<br />

sembly:<br />

swap d2<br />

move.1 d2,dl<br />

ext.1 dl<br />

c1r.w d2<br />

divs.1 dO,dl:d2<br />

Le prime quattro istruzioni convertono il dividendo (ini-<br />

zialmente contenuto in d2) nel formato 32.32, inserendo<br />

la parte intera in dl con il segno esteso, e la parte bassa<br />

nella word alta di d2. I1 quoziente viene messo in d2<br />

mentre il resto, quasi del tutto inutile per i nostri scopi,<br />

viene messo in dl .<br />

Fig. 4 - Divisione di due numeri in virgolafissa<br />

nel formato 16.16<br />

Teme mapping e assembly<br />

Nella puntata precedente, iniziando a familiarizzarci con<br />

il texture mapping, abbiamo visto come si implementa lo<br />

zoom di una texture. Ora che conosciamo tutto quel che<br />

ci interessa sul formato dei numeri in virgola fissa, pos-<br />

siamo finalmente tradurre in assembly la routine di zoom<br />

allora presentata:<br />

1: Step = TextureDim / OnScreenDim

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

Saved successfully!

Ooh no, something went wrong!