Quote:
... remembering that the data stored at the SSR must have its bits flipped, since the 6522 SR is least significant bit first rather than most significant bit first.
Dietrich
Code: Select all
BIT PORTA ; trigger /ACK for clock circuit
; ... per byte
STA SR ; trigger transfer
LDX #$FF
L0 LDA #4
L1 BIT IFR ; check
BEQ L1
LDA PORTA ; read incoming data
STX SR ; trigger next transfer (by sending $ff in this case)
; process received data (e.g.)
STA (ZP),Y
INY
BNE L0
Code: Select all
SPI_BIN LDA IFR ;read byte from SPI
AND #$04 ;test SR bit
BEQ SPI_BIN
STA IFR ;clear SR bit
LDA SR
RTSCode: Select all
SPI_BIN: LDA #4
1$: BIT IFR
BEQ 1$ ; (shorter loop)
LDA SR ; (This clears the IFR's SR bit.)
RTSCode: Select all
lda #0
ldx #BITS_CS_LO
ldy #BITS_CS_LO | BIT_SCK
sty SD_PORT ; 4 set sck hi
bit SD_PORT ; 4 test miso
stx SD_PORT ; 4 set sck lo
bvc *+4 ; 2/3 branch if miso is low
ora #$80 ; 2 set bit 0
sty SD_PORT ; 4 set sck hi
bit SD_PORT ; 4 test miso
stx SD_PORT ; 4 set sck lo
bvc *+4 ; 2/3 branch if miso is low
ora #$40 ; 2 set bit 0
sty SD_PORT ; 4 set sck hi
bit SD_PORT ; 4 test miso
stx SD_PORT ; 4 set sck lo
bvc *+4 ; 2/3 branch if miso is low
ora #$20 ; 2 set bit 0
sty SD_PORT ; 4 set sck hi
bit SD_PORT ; 4 test miso
stx SD_PORT ; 4 set sck lo
bvc *+4 ; 2/3 branch if miso is low
ora #$10 ; 2 set bit 0
sty SD_PORT ; 4 set sck hi
bit SD_PORT ; 4 test miso
stx SD_PORT ; 4 set sck lo
bvc *+4 ; 2/3 branch if miso is low
ora #$08 ; 2 set bit 0
sty SD_PORT ; 4 set sck hi
bit SD_PORT ; 4 test miso
stx SD_PORT ; 4 set sck lo
bvc *+4 ; 2/3 branch if miso is low
ora #$04 ; 2 set bit 0
sty SD_PORT ; 4 set sck hi
bit SD_PORT ; 4 test miso
stx SD_PORT ; 4 set sck lo
bvc *+4 ; 2/3 branch if miso is low
ora #$02 ; 2 set bit 0
sty SD_PORT ; 4 set sck hi
bit SD_PORT ; 4 test miso
stx SD_PORT ; 4 set sck lo
bvc *+4 ; 2/3 branch if miso is low
ora #$01 ; 2 set bit 0
Code: Select all
ldy #$7f
cpy SD_PORT
rol
cpy SD_PORT
rol
cpy SD_PORT
rol
cpy SD_PORT
rol
cpy SD_PORT
rol
cpy SD_PORT
rol
cpy SD_PORT
rol
cpy SD_PORT
rol
Code: Select all
bit SD_PORT ; 4 test miso
bvc *+4 ; 2/3 branch if miso is low
ora #$80 ; 2 set bit 0
bit SD_PORT ; 4 test miso
bvc *+4 ; 2/3 branch if miso is low
ora #$40 ; 2 set bit 0
bit SD_PORT ; 4 test miso
bvc *+4 ; 2/3 branch if miso is low
ora #$20 ; 2 set bit 0
bit SD_PORT ; 4 test miso
bvc *+4 ; 2/3 branch if miso is low
ora #$10 ; 2 set bit 0
bit SD_PORT ; 4 test miso
bvc *+4 ; 2/3 branch if miso is low
ora #$08 ; 2 set bit 0
bit SD_PORT ; 4 test miso
bvc *+4 ; 2/3 branch if miso is low
ora #$04 ; 2 set bit 0
bit SD_PORT ; 4 test miso
bvc *+4 ; 2/3 branch if miso is low
ora #$02 ; 2 set bit 0
bit SD_PORT ; 4 test miso
bvc *+4 ; 2/3 branch if miso is low
ora #$01 ; 2 set bit 0