Fixes for MT011 in SD driver

Credit to Douglas Miller for these.
This commit is contained in:
Wayne Warthen
2021-05-02 18:02:07 -07:00
parent ab3abb7936
commit 12fea8a1d0
7 changed files with 71 additions and 2 deletions

View File

@@ -233,6 +233,15 @@ RTCDEF .SET SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE
; WIZNET W5500 AND IS NOT USED HERE. CHANNEL 1 (CD0 & CS0) & 2 (CD1 & CS1)
; ARE ASSUMED TO BE CONNECTED TO SD CARDS.
;
; NOTE THAT DOING AN "IN RDTR" WILL RETURN THE *EXISTING* CONTENTS
; OF THE SHIFT REGISTER, THEN INITIATE AN SPI READ. SO THE "IN" WILL BE
; RETURNING THE DATA RECEIVED FROM THE PRIOR "IN RDTR", OR "OUT WRTR".
; "IN RDNTR" WILL RETURN THE EXISTING SHIFT REGISTER CONTENTS WITHOUT
; INITIATING A NEW SPI READ.
;
; THANKS TO DOUGLAS MILLER FOR BRINGING THIS BEHAVIOR TO MY ATTENTION
; AND SUPPLYING ASSOCIATED FIXES.
;
SD_BASE .EQU $5C ; Module base address
SD_DEVMAX .EQU 2 ; NUMBER OF PHYSICAL UNITS (SOCKETS)
SD_WRTR .EQU SD_BASE + 0 ; Write data and transfer
@@ -1428,6 +1437,10 @@ SD_EXECCMD1:
;
; GET RESULT
LD E,0 ; INIT TIMEOUT LOOP COUNTER
#IF (SDMODE == SDMODE_MT)
CALL SD_GET ; DISCARD STALE DATA FROM PUT
#ENDIF
;
SD_EXECCMD2:
CALL SD_GET ; GET A BYTE FROM THE CARD
OR A ; SET FLAGS
@@ -1555,6 +1568,7 @@ SD_PUTDATA1:
OUT (SD_WRTR),A ; SEND IT TWICE
LD DE,$7FFF ; LOOP MAX (TIMEOUT)
IN A,(SD_RDTR) ; DISCARD STALE DATA FROM OUT
SD_PUTDATA2:
IN A,(SD_RDTR)
#ELSE
@@ -1604,6 +1618,9 @@ SD_PUTDATA3:
;
SD_WAITRDY:
LD DE,$FFFF ; LOOP MAX (TIMEOUT)
#IF (SDMODE == SDMODE_MT)
CALL SD_GET ; DISCARD STALE DATA - UNKNOWN CONTEXT
#ENDIF
SD_WAITRDY1:
CALL SD_GET
INC A ; $FF -> $00