| Code: SN_WIZN EQU 0C000h SN_CTRL EQU 0C100h SN_SPI EQU 0C200h SN_GPIO EQU 0C300h SN_WIZ1 EQU 0C400h SN_WIZ2 EQU 0C500h SN_WIZ3 EQU 0C600h SN_WIZ4 EQU 0C700h SN_RAM EQU 0C800h SN_ROM0 EQU 0D000h SN_ROMN EQU 0D800h SN_WIZB EQU 0E000h
SPIOFF EQU 0 SPIONW EQU 2 SPIONR EQU 3 WIZTX EQU 0 WIZRX EQU 1
STORE_WPEN DB 0 STORE_BP1 DB 0 STORE_BP0 DB 0
; Prepare constants for other subroutines (internal) ; 17+55=72 with CALL
SPI_SETN: ld b,0 ; 7/7 ld c,1 ; 7/14 ld d,128 ; 7/21 ld e,129 ; 7/28 ld hl,SN_GPIO ; 10/38 <<< TEMPORARY ld (hl),b ; 7/45 ret ; 10/55
; Send A to SPI (saved HL, used BC) ; 17+472=489 with CALL (34.9us on 14MHz)
SPI_WRITE_BYTE: push hl ; 11/11 ld b,a ; 4/15 ld c,8 ; 7/22 ld hl,SN_GPIO ; 10/32 <<< TEMPORARY SPI_WRITE_L1: ; LOOP 8*51=408/440 and 128 ; LOOP 7/7 ld (hl),a ; LOOP 7/14 inc a ; LOOP 4/18 ld (hl),a ; LOOP 7/25 ld a,b ; LOOP 4/29 rlca ; LOOP 4/33 ld b,a ; LOOP 4/37 dec c ; LOOP 4/41 jp nz,SPI_WRITE_L1 ; LOOP 10/51 xor a ; 4/445 ld (hl),a ; 7/452 pop hl ; 10/462 ret ; 10/472
; Receive A from SPI (saved HL, used BC and DE) ; 17+337=354 with CALL (25.3us on 14MHz)
SPI_READ_BYTE: push hl ; 11/11 ld b,0 ; 7/18 ld c,1 ; 7/25 ld hl,SN_GPIO ; 10/35 <<< TEMPORARY ld de,SN_SPI ; 10/45 ld (hl),c ; 7/52 === bit 0 ld a,(de) ; 7/59 and c ; 4/63 or b ; 4/67 rlca ; 4/71 ld b,a ; 4/75 ld (hl),0 ; 10/85 ld (hl),c ; 7/92 === bit 1 ld a,(de) ; 7/99 and c ; 4/103 or b ; 4/107 rlca ; 4/111 ld b,a ; 4/115 ld (hl),0 ; 10/125 ld (hl),c ; 7/132 === bit 2 ld a,(de) ; 7/139 and c ; 4/143 or b ; 4/147 rlca ; 4/151 ld b,a ; 4/155 ld (hl),0 ; 10/165 ld (hl),c ; 7/172 === bit 3 ld a,(de) ; 7/179 and c ; 4/183 or b ; 4/187 rlca ; 4/191 ld b,a ; 4/195 ld (hl),0 ; 10/205 ld (hl),c ; 7/212 === bit 4 ld a,(de) ; 7/219 and c ; 4/223 or b ; 4/227 rlca ; 4/231 ld b,a ; 4/235 ld (hl),0 ; 10/245 ld (hl),c ; 7/252 === bit 5 ld a,(de) ; 7/259 and c ; 4/263 or b ; 4/267 rlca ; 4/271 ld b,a ; 4/275 ld (hl),0 ; 10/285 ld (hl),c ; 7/292 === bit 6 ld a,(de) ; 7/299 and c ; 4/303 or b ; 4/307 rlca ; 4/311 ld b,a ; 4/315 ld (hl),0 ; 10/325 ld (hl),c ; 7/332 === bit 7 ld a,(de) ; 7/339 and c ; 4/343 or b ; 4/347 <<< A is ready ld (hl),0 ; 10/357 pop hl ; 10/367 ret ; 10/377
; Remove all CS signals from all SPI devices ; 17+27=44 (3.1us for 14MHz) with CALL
SPI_END: xor a ; 4/4 ld (SN_CTRL),a ; 13/17 ret ; 10/27
; WREN - Set the write enable latch ; 17+255=272 with CALL (19.4us on 14MHz)
SPI_WREN: call SPI_SETN ; 72/72 ld a,SPIONW ; 7/79 ld (SN_CTRL),a ; 13/92 nop ; 4/96 nop ; 4/100 ld (hl),b ; 7/107 ld (hl),c ; 7/114 ld (hl),b ; 7/121 ld (hl),c ; 7/128 ld (hl),b ; 7/135 ld (hl),c ; 7/142 ld (hl),b ; 7/149 ld (hl),c ; 7/156 ld (hl),b ; 7/163 ld (hl),c ; 7/170 ld (hl),d ; 1 ; 7/177 ld (hl),e ; 7/184 ld (hl),d ; 1 ; 7/191 ld (hl),e ; 7/198 ld (hl),b ; 7/205 ld (hl),c ; 7/212 ld (hl),b ; 7/225 ld a,SPIOFF ; 7/232 ld (SN_CTRL),a ; 13/245 ret ; 10/255
; WRDI - Reset the write enable latch ; 17+255=272 with CALL (19.4us on 14MHz)
SPI_WRDI: call SPI_SETN ; 72/72 ld a,SPIONW ; 7/79 ld (SN_CTRL),a ; 13/92 nop ; 4/96 nop ; 4/100 ld (hl),b ; 7/107 ld (hl),c ; 7/114 ld (hl),b ; 7/121 ld (hl),c ; 7/128 ld (hl),b ; 7/135 ld (hl),c ; 7/142 ld (hl),b ; 7/149 ld (hl),c ; 7/156 ld (hl),b ; 7/163 ld (hl),c ; 7/170 ld (hl),d ; 1 ; 7/177 ld (hl),e ; 7/184 ld (hl),b ; 7/191 ld (hl),c ; 7/198 ld (hl),b ; 7/205 ld (hl),c ; 7/212 ld (hl),b ; 7/225 ld a,SPIOFF ; 7/232 ld (SN_CTRL),a ; 13/245 ret ; 10/255
; RDSR - Read Status Register ; flagC is WEL, flagZ is WIP ; 17+557=574 with CALL (41us on 14MHz)
SPI_RDSR: call SPI_SETN ; 72/72 ld a,SPIONW ; 7/79 ld (SN_CTRL),a ; 13/92 nop ; 4/96 nop ; 4/100 ld (hl),b ; 7/107 ld (hl),c ; 7/114 ld (hl),b ; 7/121 ld (hl),c ; 7/128 ld (hl),b ; 7/135 ld (hl),c ; 7/142 ld (hl),b ; 7/149 ld (hl),c ; 7/156 ld (hl),b ; 7/163 ld (hl),c ; 7/170 ld (hl),d ; 1 ; 7/177 ld (hl),e ; 7/184 ld (hl),b ; 7/191 ld (hl),c ; 7/198 ld (hl),d ; 1 ; 7/205 ld (hl),e ; 7/212 ld (hl),b ; 7/225 ld a,SPIONR ; 7/232 ld (SN_CTRL),a ; 13/245 ld de,SN_SPI ; 10/255 ld (hl),c ; 7/262 ld a,(de) ; 7/269 ld (hl),b ; 7/276 and c ; 4/280 ld (STORE_WPEN),a ; 13/293 ld (hl),c ; 7/300 ld a,(de) ; 7/307 ld (hl),b ; 7/314 ld (hl),c ; 7/321 ld a,(de) ; 7/328 ld (hl),b ; 7/335 ld (hl),c ; 7/342 ld a,(de) ; 7/349 ld (hl),b ; 7/356 ld (hl),c ; 7/363 ld a,(de) ; 7/370 ld (hl),b ; 7/377 and c ; 4/381 ld (STORE_BP1),a ; 13/394 ld (hl),c ; 7/401 ld a,(de) ; 7/408 ld (hl),b ; 7/415 and c ; 4/419 ld (STORE_BP0),a ; 13/432 ld (hl),c ; 7/439 ld a,(de) ; 7/446 ld (hl),b ; 7/453 push af ; 11/464 ld (hl),c ; 7/471 ld a,(de) ; 7/478 ld (hl),b ; 7/485 and c ; 4/489 ld b,a ; 4/493 ld a,SPIOFF ; 7/500 ld (SN_CTRL),a ; 13/513 pop af ; 10/523 and c ; 4/527 ld c,a ; 4/531 ld a,b ; 4/535 or a ;flagZ is WIP ; 4/539 ld a,c ; 4/543 rrca ;flagC is WEL ; 4/547 ret ; 10/557
; WRITE - Initiate write sequence starting with address HL ; 17+1212=1229 with CALL (88us on 14MHz)
SPI_WRITE_START: push hl ; 11/11 call SPI_SETN ; 72/83 ld a,SPIONW ; 7/90 ld (SN_CTRL),a ; 13/103 nop ; 4/107 nop ; 4/111 ld (hl),b ; 7/118 ld (hl),c ; 7/125 ld (hl),b ; 7/132 ld (hl),c ; 7/139 ld (hl),b ; 7/146 ld (hl),c ; 7/153 ld (hl),b ; 7/160 ld (hl),c ; 7/167 ld (hl),b ; 7/174 ld (hl),c ; 7/181 ld (hl),b ; 7/188 ld (hl),c ; 7/195 ld (hl),d ; 1 ; 7/202 ld (hl),e ; 7/209 ld (hl),b ; 7/216 ld (hl),c ; 7/223 ld (hl),b ; 7/230 pop hl ; 10/240 ld a,h ; 4/244 call SPI_WRITE_BYTE ; 477/721 (it saves HL) ld a,l ; 4/725 call SPI_WRITE_BYTE ; 477/1202 (it saves HL) ret ; 10/1212
; READ - Initiate read sequence starting with address HL ; 17+1232=1249 with CALL (89us with 14MHz)
SPI_READ_START: push hl ; 11/11 call SPI_SETN ; 72/83 ld a,SPIONW ; 7/90 ld (SN_CTRL),a ; 13/103 nop ; 4/107 nop ; 4/111 ld (hl),b ; 7/118 ld (hl),c ; 7/125 ld (hl),b ; 7/132 ld (hl),c ; 7/139 ld (hl),b ; 7/146 ld (hl),c ; 7/153 ld (hl),b ; 7/160 ld (hl),c ; 7/167 ld (hl),b ; 7/174 ld (hl),c ; 7/181 ld (hl),b ; 7/188 ld (hl),c ; 7/195 ld (hl),d ; 1 ; 7/202 ld (hl),e ; 7/209 ld (hl),d ; 1 ; 7/216 ld (hl),e ; 7/223 ld (hl),b ; 7/230 pop hl ; 10/240 ld a,h ; 4/244 call SPI_WRITE_BYTE ; 477/721 (it saves HL) ld a,l ; 4/725 call SPI_WRITE_BYTE ; 477/1202 (it saves HL) ld a,SPIONR ; 7/1209 ld (SN_CTRL),a ; 13/1222 ret ; 10/1232
| |