|
|
|
@ -13,6 +13,7 @@ |
|
|
|
; |
|
|
|
; TODO: |
|
|
|
; - AVOID RESELECTING PRI/SEC ON EVERY I/O CALL |
|
|
|
; - REDUCE PUSH/POP CALLS IN GET/PUTBYTE, BLKREAD/WRITE |
|
|
|
; |
|
|
|
; NOTES: |
|
|
|
; |
|
|
|
@ -34,7 +35,7 @@ |
|
|
|
; |
|
|
|
; XIN: DATA READ FROM ESP32 PENDING |
|
|
|
; ERR: ERROR ACTIVE |
|
|
|
; DSW: OLED DISPLAY ACTIVATION |
|
|
|
; DSW: OLED DISPLAY ACTIVATION SWITCH |
|
|
|
; CS1: SD CARD 1 CHIP SELECT |
|
|
|
; CS0: SD CARD 0 CHIP SELECT |
|
|
|
; CD1: SD CARD 1 MEDIA PRESENT (CARD DETECT) |
|
|
|
@ -51,18 +52,53 @@ |
|
|
|
; XIN: UNUSED??? |
|
|
|
; XOUT: ACTIVATE WRITE TO ESP32 |
|
|
|
; |
|
|
|
; COMMAND/DATA EXCHANGES |
|
|
|
; ---------------------- |
|
|
|
; |
|
|
|
; ->CMD_INIT1, <-STATUS |
|
|
|
; ->CMD_INIT2, <-STATUS |
|
|
|
; ->CMD_SEL1, <-STATUS |
|
|
|
; ->CMD_SEL2, <-STATUS |
|
|
|
; ->CMD_SETTRKSEC, ->[Track (byte), Sector (byte)], <-STATUS |
|
|
|
; ->CMD_READ, <-[Sector Data (512 bytes)], <-STATUS |
|
|
|
; ->CMD_WRITE, ->[Sector Data (512 bytes)], <-STATUS |
|
|
|
; ->CMD_FORMAT, <-STATUS |
|
|
|
; ->CMD_RESET |
|
|
|
; |
|
|
|
; NEW/PROPOSED: |
|
|
|
; |
|
|
|
; ->CMD_FWVER, <-[Version: Major (byte), Minor (byte)], <-STATUS |
|
|
|
; ->CMD_SETLBA, ->[LBA value (4 bytes, MS first)], <-STATUS |
|
|
|
; ->CMD_TYPE, <-[SD Card Type (1 byte)], <-STATUS |
|
|
|
; ->CMD_CAP, <-[Sector Count (4 bytes, MS first)], <-STATUS |
|
|
|
; ->CMD_CID, <-[CID Data (16 bytes), <-STATUS |
|
|
|
; ->CMD_CSD, <-[CSD Data (16 bytes), <-STATUS |
|
|
|
; |
|
|
|
; IF AN ERROR OCCURS IN ANY COMMAND THAT RETURNS DATA BEFORE THE |
|
|
|
; STATUS BYTE, THEN DUMMY PADDING DATA MUST BE SENT BEFORE THE |
|
|
|
; ERROR STATUS. |
|
|
|
; |
|
|
|
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_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_SETTRKSEC .EQU $84 ; SET TRACK/SECTOR 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_FORMAT .EQU $87 ; FORMAT SECTOR ON SELECTED SD CARD AT CURRENT LBA |
|
|
|
ESPSD_CMD_RESET .EQU $88 ; RESET ESP32 MODULE |
|
|
|
ESPSD_CMD_FWVER .EQU $90 ; REPORT ESP32 FIRMWARE VERSION |
|
|
|
ESPSD_CMD_SETLBA .EQU $91 ; SET NEW CURRENT LBA (32-BIT) |
|
|
|
ESPSD_CMD_TYPE .EQU $92 ; REPORT CARD TYPE OF SELECTED SD CARD |
|
|
|
ESPSD_CMD_CAP .EQU $93 ; REPORT CAPACITY (SECTORS) OF SELECTED SD CARD |
|
|
|
ESPSD_CMD_CID .EQU $94 ; REPORT CID DATA OF SELECTED SD CARD |
|
|
|
ESPSD_CMD_CSD .EQU $95 ; REPORT CSD DATA OF SELECTED SD CARD |
|
|
|
; |
|
|
|
ESPSD_STAT_OK .EQU $00 ; OPERATION COMPLETED OK |
|
|
|
ESPSD_STAT_ERR .EQU $1A ; OPERATION FAILED |
|
|
|
; |
|
|
|
; ESPSD DEVICE STATUS CODES |
|
|
|
; |
|
|
|
@ -74,9 +110,7 @@ ESPSD_STNOTRDY .EQU -4 |
|
|
|
; |
|
|
|
; IDE DEVICE CONFIGURATION |
|
|
|
; |
|
|
|
ESPSD_CFGSIZ .EQU 12 ; SIZE OF CFG TBL ENTRIES |
|
|
|
; |
|
|
|
; PER DEVICE DATA OFFSETS |
|
|
|
; PER DEVICE DATA OFFSETS IN CFG BLOCK |
|
|
|
; |
|
|
|
ESPSD_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) |
|
|
|
ESPSD_ROLE .EQU 1 ; 0=PRIMARY, 1=SECONDARY |
|
|
|
@ -85,6 +119,8 @@ ESPSD_STAT .EQU 3 ; LAST STATUS (BYTE) |
|
|
|
ESPSD_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD) |
|
|
|
ESPSD_LBA .EQU 8 ; OFFSET OF LBA (DWORD) |
|
|
|
; |
|
|
|
ESPSD_CFGSIZ .EQU 12 ; SIZE OF CFG TBL ENTRIES |
|
|
|
; |
|
|
|
ESPSD_CFGTBL: |
|
|
|
; |
|
|
|
#IF (ESPSDCNT >= 1) |
|
|
|
@ -275,12 +311,10 @@ ESPSD_DEFMED: |
|
|
|
; |
|
|
|
ESPSD_READ: |
|
|
|
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR |
|
|
|
|
|
|
|
;;;CALL NEWLINE |
|
|
|
;;;LD A,'R' |
|
|
|
;;;CALL COUT |
|
|
|
;;;CALL PRTHEXWORDHL |
|
|
|
|
|
|
|
LD A,ESPSD_CMD_READ ; SETUP FOR BLOCK READ CMD |
|
|
|
JP ESPSD_IO ; CONTINUE TO GENERIC IO ROUTINE |
|
|
|
; |
|
|
|
@ -288,12 +322,10 @@ ESPSD_READ: |
|
|
|
; |
|
|
|
ESPSD_WRITE: |
|
|
|
CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR |
|
|
|
|
|
|
|
;;;CALL NEWLINE |
|
|
|
;;;LD A,'W' |
|
|
|
;;;CALL COUT |
|
|
|
;;;CALL PRTHEXWORDHL |
|
|
|
|
|
|
|
LD A,ESPSD_CMD_WRITE ; SETUP FOR BLOCK WRITE CMD |
|
|
|
JP ESPSD_IO ; CONTINUE TO GENERIC IO ROUTINE |
|
|
|
; |
|
|
|
@ -526,7 +558,7 @@ ESPSD_RUNCMD: |
|
|
|
; A 16-BIT LBA. |
|
|
|
; |
|
|
|
ESPSD_SETLBA: |
|
|
|
LD E,ESPSD_CMD_SETLBA |
|
|
|
LD E,ESPSD_CMD_SETTRKSEC |
|
|
|
CALL ESPSD_CMD_SLOW |
|
|
|
RET NZ |
|
|
|
LD E,H |
|
|
|
@ -540,7 +572,7 @@ ESPSD_SETLBA: |
|
|
|
LD A,E ; RESULT TO ACCUM |
|
|
|
OR A ; SET FLAGS |
|
|
|
RET Z ; GOOD RETURN |
|
|
|
LD A,ESPSD_STIOERR ; CALL THIS AN IO ERROR |
|
|
|
LD A,ESPSD_STIOERR ; CALL THIS AN IO ERROR |
|
|
|
OR A |
|
|
|
RET |
|
|
|
; |
|
|
|
@ -555,22 +587,25 @@ ESPSD_BLKREAD: |
|
|
|
ESPSD_BLKREAD1: |
|
|
|
PUSH BC |
|
|
|
CALL ESPSD_GETBYTE_SLOW |
|
|
|
POP BC |
|
|
|
RET NZ |
|
|
|
LD (HL),E |
|
|
|
INC HL |
|
|
|
PUSH BC |
|
|
|
CALL ESPSD_GETBYTE_SLOW |
|
|
|
POP BC |
|
|
|
RET NZ |
|
|
|
LD (HL),E |
|
|
|
INC HL |
|
|
|
POP BC |
|
|
|
DJNZ ESPSD_BLKREAD1 |
|
|
|
; |
|
|
|
CALL ESPSD_GETBYTE_SLOW ; GET RESULT |
|
|
|
RET NZ ; HANDLE ERROR |
|
|
|
LD A,E ; RESULT TO ACCUM |
|
|
|
;;;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
OR A ; SET FLAGS |
|
|
|
RET Z ; GOOD RETURN |
|
|
|
LD A,ESPSD_STIOERR ; CALL THIS AN IO ERROR |
|
|
|
LD A,ESPSD_STIOERR ; CALL THIS AN IO ERROR |
|
|
|
OR A ; SET FLAGS |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
@ -583,16 +618,18 @@ ESPSD_BLKWRITE: |
|
|
|
; |
|
|
|
LD B,0 ; LOOP COUNTER |
|
|
|
ESPSD_BLKWRITE1: |
|
|
|
PUSH BC |
|
|
|
LD E,(HL) |
|
|
|
INC HL |
|
|
|
PUSH BC |
|
|
|
CALL ESPSD_PUTBYTE_SLOW |
|
|
|
POP BC |
|
|
|
RET NZ |
|
|
|
LD E,(HL) |
|
|
|
INC HL |
|
|
|
PUSH BC |
|
|
|
CALL ESPSD_PUTBYTE_SLOW |
|
|
|
RET NZ |
|
|
|
POP BC |
|
|
|
RET NZ |
|
|
|
DJNZ ESPSD_BLKWRITE1 |
|
|
|
; |
|
|
|
CALL ESPSD_GETBYTE_SLOW ; GET RESULT |
|
|
|
@ -663,6 +700,7 @@ ESPSD_PUTBYTE2: |
|
|
|
ESPSD_PUTBYTE_SLOW: |
|
|
|
PUSH HL |
|
|
|
LD HL,50 * CPUMHZ ; CPU SPEED SCALED TIMEOUT |
|
|
|
;;;LD HL,0 ; *DEBUG* |
|
|
|
ESPSD_PUTBYTE_SLOW1: |
|
|
|
PUSH HL |
|
|
|
CALL ESPSD_PUTBYTE |
|
|
|
@ -714,6 +752,7 @@ ESPSD_GETBYTE2: |
|
|
|
ESPSD_GETBYTE_SLOW: |
|
|
|
PUSH HL |
|
|
|
LD HL,50 * CPUMHZ ; CPU SPEED SCALED TIMEOUT |
|
|
|
;;;LD HL,0 ; *DEBUG* |
|
|
|
ESPSD_GETBYTE_SLOW1: |
|
|
|
PUSH HL |
|
|
|
CALL ESPSD_GETBYTE |
|
|
|
|