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