[zxspectrum] Re: poveri processori

  • From: Paolo Ferraris <pieffe8@xxxxxxxxxxxxx>
  • To: zxspectrum@xxxxxxxxxxxxx
  • Date: Wed, 01 Mar 2006 12:20:18 -0600

La routine e` gia` quasi al massimo della velocita`. Solo alcune cose si possono migliorare, secondo me:
1) Evitare l'uso di un counter
2) usare JP invece di JR: JP condizionato e` piu` veloce del JR condizionato quando il salto avviene.


spiinbyte
    push bc
    push hl

sostituiamo la seguente riga
ld b,8 ; bit count
con
        ld l,1

    in a,(SPI_OUTREG)    ; output register state
    ld c,a            ; clock HIGH
    res CLOCK_BIT,a
    ld h,a            ; clock LOW
l_spirx
    ld a,h            ; 4T
    out (SPI_OUTREG),a    ; 11T
    ld a,c            ; 4T
    out (SPI_OUTREG),a    ; 11T

    in a,(SPI_INREG)    ; 11T
    rlca            ; 4T input bit D7 --> carry
    rl l            ; 8T carry shifted in

sostituiamo la seguente riga
djnz l_spirx ; 8T (13T if jump takes place)
con
        jp nc,l_spirx           ; 10T always

    ld a,l
    cpl            ; input bit is complemented by hardware
    pop hl
    pop bc
    ret

Spiegazione: il bit 0 di h e` settato a 1. Ogni volta che l'istruzione rl l e` eseguita, il bit si muove di uno, e generera` il carry dopo esattamente 8 cicli.


Sfortunatamente il guadagno in tempo e` minimo: solo 8+(13*7)-10*8=19 cicli.
Pero` risparmiamo un registro. Nel prossimo messaggio provo a scrivere una routine che legge 512 bytes, ed il registro risparmiato potrebbe diventare rilevante.



-p


Other related posts: