Browse Source

Improve ESPSD Reliability

pull/610/head
Wayne Warthen 5 months ago
parent
commit
a6f04b8be2
No known key found for this signature in database GPG Key ID: 8B34ED29C07EEB0A
  1. 101
      Source/HBIOS/espsd.asm

101
Source/HBIOS/espsd.asm

@ -33,10 +33,10 @@
; 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-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
@ -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
;
@ -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

Loading…
Cancel
Save