S100 ESP SD Driver Tweaks

- Tune timeout
- Implement card detect
This commit is contained in:
Wayne Warthen
2025-08-13 13:59:02 -07:00
parent 2eb4e5606c
commit 15e44ecd8e
7 changed files with 40 additions and 76 deletions

View File

@@ -57,3 +57,4 @@ LPTENABLE .SET TRUE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
;
ESPSDENABLE .SET TRUE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
ESPSDCNT .SET 1 ; ESPSD: NUMBER OF BOARDS TO DETECT (1-2), 1-2 DEVICES PER BOARD
ESPSD0DUAL .SET TRUE ; ESPSD 0: DUAL INTERFACE BOARD (DUAL SD)

View File

@@ -74,4 +74,4 @@ SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY
;
ESPSDENABLE .SET TRUE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
ESPSDCNT .SET 1 ; ESPSD: NUMBER OF BOARDS TO DETECT (1-2), 1-2 DEVICES PER BOARD
ESPSD0DUAL .SET TRUE ; ESPSD 0: DUAL INTERFACE BOARD (DUAL SD)

View File

@@ -12,8 +12,7 @@
;
;
; TODO:
; - ADD TIMEOUT TO DETECTION!!!
; - ADD CARD DETECT FUNCTIONALITY
; - AVOID RESELECTING PRI/SEC ON EVERY I/O CALL
;
; NOTES:
;
@@ -22,7 +21,6 @@
; COMMAND/RESPONSE PROTOCOL. THE DUAL SD BOARD SUPPORTS TWO SD CARD
; DEVICES. SEPARATE INIT AND SELECT COMMANDS ARE PROVIDED TO HANDLE
; THIS AS NEEDED. THE 2CF+1SD SUPPORTS ONLY A SINGLE SD CARD DEVICE.
; ONLY THE INIT/SELECT COMMANDS WITH A "0" SUFFIX CAN BE USED.
;
; TWO SEQUENTIAL I/O ADDRESSES ARE IMPLEMENTED. THE FIRST IS
; FOR STATUS AND THE SECOND IS FOR COMMAND & DATA EXCHANGE.
@@ -53,35 +51,30 @@
; XIN: UNUSED???
; XOUT: ACTIVATE WRITE TO ESP32
;
ESPSD_IO_STATUS .EQU 0 ; OFFSET OF STATUS PORT FROM BASE I/O ADDRESS
ESPSD_IO_STATUS .EQU 0 ; OFFSET OF STATUS PORT FROM BASE I/O ADDRESS
ESPSD_IO_DATA .EQU 1 ; OFFSET OF DATA PORT FROM BASE I/O ADDRESS
;
ESPSD_CMD_INIT0 .EQU $80 ; Initialize primary SD Card
ESPSD_CMD_INIT1 .EQU $81 ; INITIALIZE SECONDARY SD CARD
ESPSD_CMD_INIT0 .EQU $80 ; Initialize primary SD Card
ESPSD_CMD_INIT1 .EQU $81 ; INITIALIZE SECONDARY SD CARD
ESPSD_CMD_SEL0 .EQU $82 ; (RE)SELECT PRIMARY SD CARD
ESPSD_CMD_SEL1 .EQU $83 ; (RE)SELECT SECONDARY SD CARD
ESPSD_CMD_SETLBA .EQU $84 ; SET LBA FOR SUBSEQUENT I/O
ESPSD_CMD_READ .EQU $85 ; READ SECTOR FROM SELECTED SD CARD AT CURRENT LBA
ESPSD_CMD_WRITE .EQU $86 ; WRITE SECTOR TO SELECTED SD CARD AT CURRENT LBA
ESPSD_CMD_WRITE .EQU $86 ; WRITE SECTOR TO SELECTED SD CARD AT CURRENT LBA
ESPSD_CMD_FORMAT .EQU $87 ; FORMAT SECTOR ON SELECTED SD CARD AT CURRENT LBA
ESPSD_CMD_RESET .EQU $88 ; RESET ESP32 MODULE
ESPSD_CMD_RESET .EQU $88 ; RESET ESP32 MODULE
;
; ESPSD DEVICE STATUS CODES
;
ESPSD_STOK .EQU 0
ESPSD_STINVUNIT .EQU -1
ESPSD_STNOMEDIA .EQU -2
ESPSD_STCMDERR .EQU -3
ESPSD_STIOERR .EQU -4
ESPSD_STRDYTO .EQU -5
ESPSD_STDRQTO .EQU -6
ESPSD_STBSYTO .EQU -7
ESPSD_STNOTSUP .EQU -8
ESPSD_STNOTRDY .EQU -9
ESPSD_STNOMEDIA .EQU -1
ESPSD_STIOERR .EQU -2
ESPSD_STTO .EQU -3
ESPSD_STNOTRDY .EQU -4
;
; IDE DEVICE CONFIGURATION
;
ESPSD_CFGSIZ .EQU 12 ; SIZE OF CFG TBL ENTRIES
ESPSD_CFGSIZ .EQU 12 ; SIZE OF CFG TBL ENTRIES
;
; PER DEVICE DATA OFFSETS
;
@@ -414,6 +407,18 @@ ESPSD_DETECT:
; INITIALIZE DEVICE
;
ESPSD_INITDEV:
; CHECK CARD DETECT
LD A,(IY+ESPSD_ROLE) ; GET ROLE
LD B,%00000010 ; MASK FOR PRIMARY
OR A ; TEST ROLE
JR Z,ESPSD_INITDEV1 ; IF PRIMARY, JUMP AHEAD
LD B,%00000100 ; MASK FOR SECONDARY
ESPSD_INITDEV1:
LD C,(IY+ESPSD_IOBASE) ; STATUS PORT
IN A,(C) ; GET STATUS
AND B ; APPLY MASK
JP Z,ESPSD_NOMEDIA ; IF NO CARD, HANDLE AS NO MEDIA
;
CALL ESPSD_INITCARD ; PERFORM DEVICE INIT
JP NZ,ESPSD_NOMEDIA ; CONVERT TO NO MEDIA ERROR
;
@@ -638,7 +643,7 @@ ESPSD_PUTBYTE1:
JR Z,ESPSD_PUTBYTE2
;JR ESPSD_PUTBYTE1 ; *DEBUG*
DJNZ ESPSD_PUTBYTE1
LD A,ESPSD_STBSYTO
LD A,ESPSD_STTO
OR A
RET
ESPSD_PUTBYTE2:
@@ -657,7 +662,7 @@ ESPSD_PUTBYTE2:
;
ESPSD_PUTBYTE_SLOW:
PUSH HL
LD HL,$1000 ; *TODO* TUNE THIS VALUE!!!
LD HL,50 * CPUMHZ ; CPU SPEED SCALED TIMEOUT
ESPSD_PUTBYTE_SLOW1:
PUSH HL
CALL ESPSD_PUTBYTE
@@ -667,7 +672,7 @@ ESPSD_PUTBYTE_SLOW1:
LD A,H
OR L
JR NZ,ESPSD_PUTBYTE_SLOW1
LD A,ESPSD_STBSYTO
LD A,ESPSD_STTO
ESPSD_PUTBYTE_SLOW_Z:
;CALL PC_SPACE ; *DEBUG*
;CALL PRTHEXWORDHL ; *DEBUG*
@@ -689,7 +694,7 @@ ESPSD_GETBYTE1:
BIT 7,A
JR NZ,ESPSD_GETBYTE2
DJNZ ESPSD_GETBYTE1
LD A,ESPSD_STBSYTO
LD A,ESPSD_STTO
OR A
RET
ESPSD_GETBYTE2:
@@ -708,7 +713,7 @@ ESPSD_GETBYTE2:
;
ESPSD_GETBYTE_SLOW:
PUSH HL
LD HL,$1000 ; *TODO* TUNE THIS VALUE???
LD HL,50 * CPUMHZ ; CPU SPEED SCALED TIMEOUT
ESPSD_GETBYTE_SLOW1:
PUSH HL
CALL ESPSD_GETBYTE
@@ -718,7 +723,7 @@ ESPSD_GETBYTE_SLOW1:
LD A,H
OR L
JR NZ,ESPSD_GETBYTE_SLOW1
LD A,ESPSD_STBSYTO
LD A,ESPSD_STTO
ESPSD_GETBYTE_SLOW_Z:
;CALL PC_SPACE ; *DEBUG*
;CALL PRTHEXWORDHL ; *DEBUG*
@@ -732,36 +737,16 @@ ESPSD_GETBYTE_SLOW_Z:
;
; ERROR HANDLERS
;
ESPSD_INVUNIT:
LD A,ESPSD_STINVUNIT
JR ESPSD_ERR2 ; SPECIAL CASE FOR INVALID UNIT
;
ESPSD_NOMEDIA:
LD A,ESPSD_STNOMEDIA
JR ESPSD_ERR
;
ESPSD_CMDERR:
LD A,ESPSD_STCMDERR
JR ESPSD_ERR
;
ESPSD_IOERR:
LD A,ESPSD_STIOERR
JR ESPSD_ERR
;
ESPSD_RDYTO:
LD A,ESPSD_STRDYTO
JR ESPSD_ERR
;
ESPSD_DRQTO:
LD A,ESPSD_STDRQTO
JR ESPSD_ERR
;
ESPSD_BSYTO:
LD A,ESPSD_STBSYTO
JR ESPSD_ERR
;
ESPSD_NOTSUP:
LD A,ESPSD_STNOTSUP
ESPSD_TO:
LD A,ESPSD_STTO
JR ESPSD_ERR
;
ESPSD_NOTRDY:
@@ -771,7 +756,6 @@ ESPSD_NOTRDY:
ESPSD_ERR:
LD (IY+ESPSD_STAT),A ; SAVE NEW STATUS
;
ESPSD_ERR2:
#IF (ESPSDTRACE >= 2)
CALL ESPSD_PRTSTAT
#ENDIF
@@ -791,8 +775,6 @@ ESPSD_PRTSTAT:
PUSH DE
PUSH HL
LD A,(IY+ESPSD_STAT)
CP ESPSD_STINVUNIT
JR Z,ESPSD_PRTSTAT2 ; INVALID UNIT IS SPECIAL CASE
CALL ESPSD_PRTPREFIX ; PRINT UNIT PREFIX
JR ESPSD_PRTSTAT3
ESPSD_PRTSTAT2:
@@ -816,28 +798,13 @@ ESPSD_PRTSTATSTR:
LD DE,ESPSD_STR_STOK
JR Z,ESPSD_PRTSTATSTR1
INC A
LD DE,ESPSD_STR_STINVUNIT
JR Z,ESPSD_PRTSTATSTR1
INC A
LD DE,ESPSD_STR_STNOMEDIA
JR Z,ESPSD_PRTSTATSTR1
INC A
LD DE,ESPSD_STR_STCMDERR
JR Z,ESPSD_PRTSTATSTR1
INC A
LD DE,ESPSD_STR_STIOERR
JR Z,ESPSD_PRTSTATSTR1
INC A
LD DE,ESPSD_STR_STRDYTO
JR Z,ESPSD_PRTSTATSTR1
INC A
LD DE,ESPSD_STR_STDRQTO
JR Z,ESPSD_PRTSTATSTR1
INC A
LD DE,ESPSD_STR_STBSYTO
JR Z,ESPSD_PRTSTATSTR1
INC A
LD DE,ESPSD_STR_STNOTSUP
LD DE,ESPSD_STR_STTO
JR Z,ESPSD_PRTSTATSTR1
INC A
LD DE,ESPSD_STR_STNOTRDY
@@ -869,16 +836,11 @@ ESPSD_PRTPREFIX1:
;=============================================================================
;
ESPSD_STR_STOK .TEXT "OK$"
ESPSD_STR_STINVUNIT .TEXT "INVALID UNIT$"
ESPSD_STR_STNOMEDIA .TEXT "NO MEDIA$"
ESPSD_STR_STCMDERR .TEXT "COMMAND ERROR$"
ESPSD_STR_STIOERR .TEXT "IO ERROR$"
ESPSD_STR_STRDYTO .TEXT "READY TIMEOUT$"
ESPSD_STR_STDRQTO .TEXT "DRQ TIMEOUT$"
ESPSD_STR_STBSYTO .TEXT "BUSY TIMEOUT$"
ESPSD_STR_STNOTSUP .TEXT "NOT SUPPORTED$"
ESPSD_STR_STTO .TEXT "TIMEOUT$"
ESPSD_STR_STNOTRDY .TEXT "NOT READY$"
ESPSD_STR_STUNK .TEXT "UNKNOWN ERROR$"
ESPSD_STR_STUNK .TEXT "UNKNOWN ERROR$"
;
;=============================================================================
; DATA STORAGE