[zxspectrum] Ancora sulla disfida Spectrum vs C64
- From: Matteo Vitturi <mattsteel@xxxxxxxxxx>
- To: <zxspectrum@xxxxxxxxxxxxx>
- Date: Fri, 28 Nov 2008 22:05:10 +0100
[ Chiedo scusa per la precedente mail con l'oggetto sbagliato... ]
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.
Visita il suo Spaces! Doretta ti “cerca”…
_________________________________________________________________
Sei pronto per la sfida? 50 nuovi schemi per giocare su CrossWire!
http://livesearch.games.msn.com/crosswire/play_it/
Other related posts:
- » [zxspectrum] Ancora sulla disfida Spectrum vs C64 - Matteo Vitturi