On Wednesday, March 01, 2006 5:21 PM [GMT+1],
Mario <mario.prato@xxxxxxxx> wrote:
beh, pensandoci bene costa poco aggiungere un microcontrollore con
interfaccia seriale hardware che faccia il lavoro sporco al posto
dello Z80, a quel punto viste le velocita' delle sd/mmc attuali ci
vorrebbero pochi secondi a caricare tutti e 128K. Dal punto di vista
"sinclair style" invece sarebbe un gravissimo reato... :D
Uno dei problemi che mi hanno fatto passare la voglia di implementarlo in
quel modo era la comunicazione efficiente fra micro e Z80. Il micro fa
fatica a seguire i tempi di esecuzione di un ciclo I/O Z80 mediante semplice
polling (ma forse a 3.5MHz neanche tanto, io volevo farlo andare a 21)...
c'e` un pic che ha una porta a 8 bit che funziona come una periferica I/O,
solo che i deficienti non hanno integrato una logica che consenta di capire
sui due lati quando e se un byte viene letto/scritto. Che non convenga fare
una spi con una cpld?
Visto che non mi viene in mente nessuna altra puttanata da aggiungere al
badaloc, sto cercando di ottimizzare al massimo il loop di lettura di un
byte. Ho gia` limato parecchio tempo scegliendo piu` oculatamente le
istruzioni. Adesso sono passato da 2,5 a 1,8 secondi per 48K. L'attuale loop
di lettura di un byte e` allegato, cosi` mi date un parere.
Certo che scrivere una routine dedicata per la lettura di 512 bytes sarebbe
un bel passo avanti... non dovrei nemmeno perdere tempo a salvare i
registri. Vedro`.
Ciao!
spiinbyte
push bc
push hl
ld b,8 ; bit count
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
djnz l_spirx ; 8T (13T if jump takes place)
ld a,l
cpl ; input bit is complemented by hardware
pop hl
pop bc
ret