[zxspectrum] Re: Tanto tempo fa

So che risultero facinoroso e sarò tacciato di fare dietrologia...

Vi ricordate la disfida nella quale è emersa la superiorita dello Spectrum 
rispetto al C64? 

http://www.alfonsomartone.itb.it/rqftcg.html

Ebbene la routine in L/M, con una piccola accortezza può essere migliorata sia 
sullo Spectrum (con riduzione oltre il 26%) che sul C64 (con riduzione solo del 
17%).

L'accortezza che bisogna imporre è di non usare mai un valore iniziale 
"dispari" sul byte meno significativo... che non credo sia così peregrina come 
richiesta visto che basta fare una DEC(HL) o un a DEC $8000 condizionata fuori 
ciclo per garantire questa condizione.

Ecco la routine modificata: ho solo aggiunto una INC(HL) nel loop più interno e 
allungato l'offset dei salti in modo appropriato.

   DI            ; 4 clocks    F3
   LD HL, $8002  ; 10          21 02 80
a: DEC HL        ; 6           2B
b: DEC HL        ; 6           2B
c: INC (HL)      ; 11          34
   INC (HL)      ; 11          34
   JR NZ, c      ; 7/12        20 FC
   INC HL        ; 6           23
   INC (HL)      ; 11          34
   JR NZ, b      ; 7/12        20 F7
   INC HL        ; 6           23
   INC (HL)      ; 11          34
   JR NZ, a      ; 7/12        20 F2
   EI            ; 4           FB
   RET           ; 10          C9

In pratica, cambia solo la durata del loop più interno che passa da 5883 a 4347 
T-State: lo "sconto" è quindi circa del 26%.

Lo stesso accorgimento sul C64 invece non funziona così bene

   CLI           ; 2 cycles    58
a: INC $8000     ; 6           EE 00 80
   INC $8000     ; 6           EE 00 80
   BNE a         ; 2/3         D0 FA
   INC $8001     ; 6           EE 01 80
   BNE a         ; 2/3         D0 F5
   INC $8002     ; 6           EE 02 80
   BNE a         ; 2/3         D0 F0
   SEI           ; 2           78
   RTS           ; 6           60

Il loop più interno passa da 2303 a 1919, con una riduzione del 17% soltanto.

Non è vero quindi, come dice Alfonso, che si trattava di una situazione 
sfavorevole allo Z80 che manca di un'istruzione di incremento diretto alla 
memoria. Anzi, è il 6510 che proprio non ha alternativa, cioè non ha altri modi 
di incrementare una cella, mentre lo Z80 ne ha altri due!

Ora farò un ragionamento "a spanne", tanto per capire il motivo della 
differenza (26% contro 17%): l'istruzione INC $8000 è meno efficiente di INC 
(HL) in quanto è un'istruzione lunga tre byte, cioè il 6510 deve leggere 
effettivamente tre byte per poter poi effettuare l'istruzione di incremento di 
una cella di memoria. Questo significa che (a spanne) i byte mandati 
"avanti-e-indietro" sul bus sono cinque (tre dell'istruzione stessa, più la 
lettura, più la scrittura). Usando lo stesso ragionamento deriva che nella INC 
(HL) i byte mandati "avanti-e-indietro" sono solo tre.

Non voglio infierire, ma anche a distanza di 25 anni non posso proprio 
tacere... ;-)

Saluti.

Mat.


_________________________________________________________________
Foto, blog, amici… Crea e perosnalizza il tuo Spaces!
http://home.services.spaces.live.com/

Other related posts: