diff --git a/Source/HBIOS/espsd.asm b/Source/HBIOS/espsd.asm index e99ef950..63d3e00c 100644 --- a/Source/HBIOS/espsd.asm +++ b/Source/HBIOS/espsd.asm @@ -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 diff --git a/Source/ver.inc b/Source/ver.inc index 01ff111e..b5ab0bb1 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 6 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.6.0-dev.18" +#DEFINE BIOSVER "3.6.0-dev.19" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index de03258f..1b841c39 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 6 rup equ 0 rtp equ 0 biosver macro - db "3.6.0-dev.18" + db "3.6.0-dev.19" endm