From a6f04b8be244644d3847fe369c29b855132044c2 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 29 Aug 2025 16:11:41 -0700 Subject: [PATCH] Improve ESPSD Reliability --- Source/HBIOS/espsd.asm | 113 ++++++++++++++++++++++++++++++++--------- 1 file changed, 90 insertions(+), 23 deletions(-) diff --git a/Source/HBIOS/espsd.asm b/Source/HBIOS/espsd.asm index 7bbc97dc..6dd2f381 100644 --- a/Source/HBIOS/espsd.asm +++ b/Source/HBIOS/espsd.asm @@ -28,16 +28,16 @@ ; ; === STATUS REGISTER (READ) === -; BIT 2SD 2CF+1SD +; BIT 2SD 2CF+1SD ; ------ --------- --------- -; BIT-0 SENDACT SENDACT -; BIT-1 SD0_CD SD1_CD -; BIT-2 SD1_CD RCV -; BIT-3 SD0_CS GPIO3 -; BIT-4 SD1_CS ERROR -; BIT-5 DIAG SD1_CS -; BIT-6 ERROR GPIO47 -; BIT-7 RCVRDY RCVRDY +; BIT-0 SENDACT SENDACT +; BIT-1 SD0_CD SD1_CD +; BIT-2 SD1_CD RCV +; BIT-3 /SD0_CS GPIO3 +; BIT-4 /SD1_CS /ERROR +; BIT-5 DIAG /SD1_CS +; BIT-6 /ERROR GPIO47 +; BIT-7 RCVRDY RCVRDY ; ; SENDACT: DATA OUTPUT TO ESP32 PENDING, XMIT REGISTER FULL ; RCVRDY: DATA FROM ESP32 READY TO READ @@ -462,18 +462,14 @@ ESPSD_GEOM: ; ON RETURN, ZF SET INDICATES HARDWARE FOUND ; ESPSD_DETECT: + ; DO A BLIND READ TO RESET INPUT CHANNEL + LD C,(IY+ESPSD_IOBASE) + INC C + IN A,(C) ; WE USE A DUMMY SELECT COMMAND TO TEST FOR PRESENCE LD A,ESPSD_CMD_SEL0 ADD A,(IY+ESPSD_ROLE) - LD E,A - CALL ESPSD_CMD_SLOW - RET NZ - LD E,0 - CALL ESPSD_PUTBYTE_SLOW - RET NZ - CALL ESPSD_PUTBYTE_SLOW - RET NZ - JP ESPSD_GETRESULT + JP ESPSD_RUNCMD ; ; INITIALIZE DEVICE ; @@ -508,7 +504,7 @@ ESPSD_IO: ; CHECK FOR ERROR STATUS AND REINIT? ; #IF (ESPSDTRACE == 1) - LD HL,ESPSD_PRTERR ; SET UP SD_PRTERR + LD HL,ESPSD_PRTERR ; SET UP SD_PRTERR PUSH HL ; ... TO FILTER ALL EXITS #ENDIF ; @@ -557,6 +553,11 @@ ESPSD_IO3: ; INITIALIZE DEVICE ; ESPSD_INITCARD: + ; DO A BLIND READ TO RESET INPUT CHANNEL + LD C,(IY+ESPSD_IOBASE) + INC C + IN A,(C) +; LD A,ESPSD_CMD_INIT0 ; INIT PRIMARY DEVICE ADD A,(IY+ESPSD_ROLE) ; ADJUST FOR PRI/SEC CALL ESPSD_RUNCMD ; USE COMMON CMD ROUTINE @@ -672,6 +673,8 @@ ESPSD_BLKREAD: RET NZ ; LD B,0 ; LOOP COUNTER + +#IF FALSE ESPSD_BLKREAD1: PUSH BC CALL ESPSD_GETBYTE_SLOW @@ -686,6 +689,12 @@ ESPSD_BLKREAD1: LD (HL),E INC HL DJNZ ESPSD_BLKREAD1 +#ELSE + LD C,(IY+ESPSD_IOBASE) ; SET IO PORT + INC C ; START W/ DATA PORT + CALL ESPSD_BLKREAD2 ; DO FIRST 256 BYTES + CALL ESPSD_BLKREAD2 ; DO SECOND 256 BYTES +#ENDIF ; CALL ESPSD_GETBYTE_SLOW ; GET RESULT RET NZ ; HANDLE ERROR @@ -696,6 +705,22 @@ ESPSD_BLKREAD1: OR A ; SET FLAGS RET ; DONE ; +ESPSD_BLKREAD2: + ; READ BYTES FAST (NO TIMEOUT CHECK) + DEC C ; BACK TO STATUS PORT +ESPSD_BLKREAD2A: + IN A,(C) ; GET STATUS + JP P,ESPSD_BLKREAD2A ; LOOP TILL DATA READY + ; DOUBLE CHECK STATUS, FIRST READ CAN BE BOGUS + IN A,(C) ; GET STATUS + JP P,ESPSD_BLKREAD2A ; LOOP TILL DATA READY + ; NOPS NEEDED FOR RELIABILITY + NOP \ NOP \ NOP \ NOP \ NOP \ NOP + INC C ; DATA PORT + INI ; GET BYTE, BUMP PTR + JR NZ,ESPSD_BLKREAD2 ; 256 TIMES + RET +; ; BLOCK WRITE ; ESPSD_BLKWRITE: @@ -704,6 +729,8 @@ ESPSD_BLKWRITE: RET NZ ; LD B,0 ; LOOP COUNTER + +#IF FALSE ESPSD_BLKWRITE1: LD E,(HL) INC HL @@ -718,6 +745,12 @@ ESPSD_BLKWRITE1: POP BC RET NZ DJNZ ESPSD_BLKWRITE1 +#ELSE + LD C,(IY+ESPSD_IOBASE) ; SET IO PORT + INC C ; START W/ DATA PORT + CALL ESPSD_BLKWRITE2 ; DO FIRST 256 BYTES + CALL ESPSD_BLKWRITE2 ; DO SECOND 256 BYTES +#ENDIF ; CALL ESPSD_GETBYTE_SLOW ; GET RESULT RET NZ ; HANDLE ERROR @@ -728,6 +761,24 @@ ESPSD_BLKWRITE1: OR A ; SET FLAGS RET ; DONE ; +ESPSD_BLKWRITE2: + ; WRITE BYTES FAST (NO TIMEOUT CHECK) + DEC C ; BACK TO STATUS PORT +ESPSD_BLKWRITE2A: + IN A,(C) ; GET STATUS + RRA ; SEND RDY BIT TO CF + JR C,ESPSD_BLKWRITE2A ; LOOP WHILE XMIT FULL + ; DOUBLE CHECK STATUS, FIRST READ CAN BE BOGUS + IN A,(C) ; GET STATUS + RRA ; SEND RDY BIT TO CF + JR C,ESPSD_BLKWRITE2A ; LOOP WHILE XMIT FULL + ; NOPS NEEDED FOR RELIABILITY + NOP \ NOP \ NOP \ NOP \ NOP \ NOP + INC C ; DATA PORT + OUTI ; SEND BYTE, BUMP PTR + JR NZ,ESPSD_BLKWRITE2 ; 256 TIMES + RET +; ;============================================================================= ; HARDWARE INTERFACE ROUTINES ;============================================================================= @@ -764,12 +815,20 @@ ESPSD_PUTBYTE: ESPSD_PUTBYTE1: IN A,(C) BIT 0,A - JR Z,ESPSD_PUTBYTE2 + JR NZ,ESPSD_PUTBYTE1A + ; DOUBLE CHECK STATUS, FIRST READ CAN BE BOGUS + IN A,(C) + BIT 0,A + JR NZ,ESPSD_PUTBYTE1A + JR ESPSD_PUTBYTE2 +ESPSD_PUTBYTE1A: DJNZ ESPSD_PUTBYTE1 LD A,ESPSD_STTO OR A RET ESPSD_PUTBYTE2: + ; NOPS NEEDED FOR RELIABILITY + NOP \ NOP \ NOP \ NOP \ NOP \ NOP INC C OUT (C),E ; @@ -785,7 +844,7 @@ ESPSD_PUTBYTE2: ; ESPSD_PUTBYTE_SLOW: PUSH HL - LD HL,100 * CPUMHZ ; CPU SPEED SCALED TIMEOUT + LD HL,200 * CPUMHZ ; CPU SPEED SCALED TIMEOUT ESPSD_PUTBYTE_SLOW1: PUSH HL CALL ESPSD_PUTBYTE @@ -815,12 +874,20 @@ ESPSD_GETBYTE: ESPSD_GETBYTE1: IN A,(C) BIT 7,A - JR NZ,ESPSD_GETBYTE2 + JR Z,ESPSD_GETBYTE1A + ; DOUBLE CHECK STATUS, FIRST READ CAN BE BOGUS + IN A,(C) + BIT 7,A + JR Z,ESPSD_GETBYTE1A + JR ESPSD_GETBYTE2 +ESPSD_GETBYTE1A: DJNZ ESPSD_GETBYTE1 LD A,ESPSD_STTO OR A RET ESPSD_GETBYTE2: + ; NOPS NEEDED FOR RELIABILITY + NOP \ NOP \ NOP \ NOP \ NOP \ NOP INC C IN E,(C) ; @@ -836,7 +903,7 @@ ESPSD_GETBYTE2: ; ESPSD_GETBYTE_SLOW: PUSH HL - LD HL,100 * CPUMHZ ; CPU SPEED SCALED TIMEOUT + LD HL,200 * CPUMHZ ; CPU SPEED SCALED TIMEOUT ESPSD_GETBYTE_SLOW1: PUSH HL CALL ESPSD_GETBYTE