|
|
|
@ -160,21 +160,21 @@ SD_TRDR .EQU Z180_TRDR |
|
|
|
; |
|
|
|
; SD CARD COMMANDS |
|
|
|
; |
|
|
|
SD_CMD_GO_IDLE_STATE .EQU $40 + 0 ; $40, CMD0 -> R1 |
|
|
|
SD_CMD_SEND_OP_COND .EQU $40 + 1 ; $41, CMD1 -> R1 |
|
|
|
SD_CMD_SEND_IF_COND .EQU $40 + 8 ; $48, CMD8 -> R7 |
|
|
|
SD_CMD_SEND_CSD .EQU $40 + 9 ; $49, CMD9 -> R1 |
|
|
|
SD_CMD_SEND_CID .EQU $40 + 10 ; $4A, CMD10 -> R1 |
|
|
|
SD_CMD_SET_BLOCKLEN .EQU $40 + 16 ; $50, CMD16 -> R1 |
|
|
|
SD_CMD_READ_SNGL_BLK .EQU $40 + 17 ; $51, CMD17 -> R1 |
|
|
|
SD_CMD_WRITE_BLOCK .EQU $40 + 24 ; $58, CMD24 -> R1 |
|
|
|
SD_CMD_APP_CMD .EQU $40 + 55 ; $77, CMD55 -> R1 |
|
|
|
SD_CMD_READ_OCR .EQU $40 + 58 ; $7A, CMD58 -> R3 |
|
|
|
SD_CSD_GO_IDLE_STATE .EQU $40 + 0 ; $40, CMD0 -> R1 |
|
|
|
SD_CSD_SEND_OP_COND .EQU $40 + 1 ; $41, CMD1 -> R1 |
|
|
|
SD_CSD_SEND_IF_COND .EQU $40 + 8 ; $48, CMD8 -> R7 |
|
|
|
SD_CSD_SEND_CSD .EQU $40 + 9 ; $49, CMD9 -> R1 |
|
|
|
SD_CSD_SEND_CID .EQU $40 + 10 ; $4A, CMD10 -> R1 |
|
|
|
SD_CSD_SET_BLOCKLEN .EQU $40 + 16 ; $50, CMD16 -> R1 |
|
|
|
SD_CSD_READ_SNGL_BLK .EQU $40 + 17 ; $51, CMD17 -> R1 |
|
|
|
SD_CSD_WRITE_BLOCK .EQU $40 + 24 ; $58, CMD24 -> R1 |
|
|
|
SD_CSD_APP_CMD .EQU $40 + 55 ; $77, CMD55 -> R1 |
|
|
|
SD_CSD_READ_OCR .EQU $40 + 58 ; $7A, CMD58 -> R3 |
|
|
|
; |
|
|
|
; SD CARD APPLICATION COMMANDS (PRECEDED BY APP_CMD COMMAND) |
|
|
|
; |
|
|
|
SD_ACMD_SEND_OP_COND .EQU $40 + 41 ; $69, ACMD41 -> R1 |
|
|
|
SD_ACMD_SEND_SCR .EQU $40 + 51 ; $73, ACMD51 -> R1 |
|
|
|
SD_ACSD_SEND_OP_COND .EQU $40 + 41 ; $69, ACMD41 -> R1 |
|
|
|
SD_ACSD_SEND_SCR .EQU $40 + 51 ; $73, ACMD51 -> R1 |
|
|
|
; |
|
|
|
; SD CARD TYPE |
|
|
|
; |
|
|
|
@ -353,7 +353,7 @@ SD_INITUNIT1: |
|
|
|
CALL WRITESTR |
|
|
|
|
|
|
|
; GET CID (WHICH CONTAINS PRODUCT NAME) |
|
|
|
LD A,SD_CMD_SEND_CID ; SEND_CID |
|
|
|
LD A,SD_CSD_SEND_CID ; SEND_CID |
|
|
|
CALL SD_INITCMD ; SETUP COMMAND BUFFER |
|
|
|
CALL SD_EXECCMD ; RUN COMMAND |
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
|
@ -415,26 +415,37 @@ SD_DISPATCH: |
|
|
|
;CALL SD_SELUNIT ; SELECT DESIRED UNIT |
|
|
|
; |
|
|
|
; DISPATCH ACCORDING TO DISK SUB-FUNCTION |
|
|
|
LD A,B ; GET REQUESTED FUNCTION |
|
|
|
AND $0F ; ISOLATE SUB-FUNCTION |
|
|
|
JP Z,SD_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW |
|
|
|
DEC A |
|
|
|
JP Z,SD_READ ; SUB-FUNC 1: READ |
|
|
|
DEC A |
|
|
|
JP Z,SD_WRITE ; SUB-FUNC 2: WRITE |
|
|
|
DEC A |
|
|
|
JP Z,SD_STATUS ; SUB-FUNC 3: STATUS |
|
|
|
DEC A |
|
|
|
JP Z,SD_RESET ; SUB-FUNC 4: RESET |
|
|
|
DEC A |
|
|
|
JP Z,SD_CAP ; SUB-FUNC 5: GET CAPACITY |
|
|
|
DEC A |
|
|
|
JP Z,SD_GEOM ; SUB-FUNC 6: GET GEOMETRY |
|
|
|
DEC A |
|
|
|
JP Z,SD_GETPAR ; SUB-FUNC 7: GET PARAMETERS |
|
|
|
DEC A |
|
|
|
JP Z,SD_SETPAR ; SUB-FUNC 8: SET PARAMETERS |
|
|
|
CALL PANIC ; INVALID SUB-FUNCTION |
|
|
|
LD A,B ; GET REQUESTED FUNCTION |
|
|
|
AND $0F ; ISOLATE SUB-FUNCTION |
|
|
|
JP Z,SD_STATUS ; SUB-FUNC 0: STATUS |
|
|
|
DEC A |
|
|
|
JP Z,SD_RESET ; SUB-FUNC 1: RESET |
|
|
|
DEC A |
|
|
|
JP Z,SD_SEEK ; SUB-FUNC 2: SEEK |
|
|
|
DEC A |
|
|
|
JP Z,SD_READ ; SUB-FUNC 3: READ SECTORS |
|
|
|
DEC A |
|
|
|
JP Z,SD_WRITE ; SUB-FUNC 4: WRITE SECTORS |
|
|
|
DEC A |
|
|
|
JP Z,SD_VERIFY ; SUB-FUNC 5: VERIFY SECTORS |
|
|
|
DEC A |
|
|
|
JP Z,SD_FORMAT ; SUB-FUNC 6: FORMAT TRACK |
|
|
|
DEC A |
|
|
|
JP Z,SD_SENSE ; SUB-FUNC 7: SENSE MEDIA |
|
|
|
DEC A |
|
|
|
JP Z,SD_CAP ; SUB-FUNC 8: GET DISK CAPACITY |
|
|
|
DEC A |
|
|
|
JP Z,SD_GEOM ; SUB-FUNC 9: GET DISK GEOMETRY |
|
|
|
DEC A |
|
|
|
JP Z,SD_GETPAR ; SUB-FUNC 10: GET DISK PARAMETERS |
|
|
|
DEC A |
|
|
|
JP Z,SD_SETPAR ; SUB-FUNC 11: SET DISK PARAMETERS |
|
|
|
; |
|
|
|
SD_VERIFY: |
|
|
|
SD_FORMAT: |
|
|
|
SD_GETPAR: |
|
|
|
SD_SETPAR: |
|
|
|
CALL PANIC ; INVALID SUB-FUNCTION |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
@ -446,7 +457,7 @@ SD_READ: |
|
|
|
#ENDIF |
|
|
|
CALL SD_SELUNIT |
|
|
|
; READ A SECTOR |
|
|
|
LD C,SD_CMD_READ_SNGL_BLK ; SET READ_SINGLE_BLOCK COMMAND |
|
|
|
LD C,SD_CSD_READ_SNGL_BLK ; SET READ_SINGLE_BLOCK COMMAND |
|
|
|
JP SD_SECTIO ; DO SECTOR I/O |
|
|
|
; |
|
|
|
; |
|
|
|
@ -461,7 +472,7 @@ SD_WRITE: |
|
|
|
CALL SD_CHKWP ; CHECK FOR WRITE PROTECT |
|
|
|
JP NZ,SD_WRTPROT ; HANDLE IT IF SO |
|
|
|
; WRITE A SECTOR |
|
|
|
LD C,SD_CMD_WRITE_BLOCK ; SET WRITE_BLOCK COMMAND |
|
|
|
LD C,SD_CSD_WRITE_BLOCK ; SET WRITE_BLOCK COMMAND |
|
|
|
JP SD_SECTIO ; DO SECTOR I/O |
|
|
|
; |
|
|
|
SD_STATUS: |
|
|
|
@ -479,7 +490,7 @@ SD_RESET: |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
SD_GETPAR: |
|
|
|
SD_SENSE: |
|
|
|
CALL SD_SELUNIT ; SET CUR UNIT |
|
|
|
; RE-INITIALIZE THE SD CARD TO ACCOMMODATE HOT SWAPPING |
|
|
|
CALL SD_INITCARD ; RE-INIT SELECTED UNIT |
|
|
|
@ -493,13 +504,6 @@ SD_GETPAR: |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
SD_SETPAR: |
|
|
|
; NOT IMPLEMENTED |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
SD_SEEK: |
|
|
|
BIT 7,D ; CHECK FOR LBA FLAG |
|
|
|
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA |
|
|
|
@ -568,7 +572,7 @@ SD_INITCARD2: |
|
|
|
; |
|
|
|
; CMD8 IS REQUIRED FOR V2 CARDS. FAILURE HERE IS OK AND |
|
|
|
; JUST MEANS THAT IT IS A V1 CARD |
|
|
|
LD A,SD_CMD_SEND_IF_COND ; SEND_IF_COND |
|
|
|
LD A,SD_CSD_SEND_IF_COND ; SEND_IF_COND |
|
|
|
CALL SD_INITCMD ; SETUP COMMAND BUFFER |
|
|
|
LD HL,SD_CMDP2 ; POINT TO 3RD PARM BYTE |
|
|
|
LD (HL),1 ; VHS=1, 2.7-3.6V |
|
|
|
@ -593,7 +597,7 @@ SD_INITCARD3: |
|
|
|
OR A ; SET FLAGS |
|
|
|
RET NZ ; ABORT IF ANY OTHER ERROR |
|
|
|
; SEND APP_OP_COND |
|
|
|
LD A,SD_ACMD_SEND_OP_COND ; SD_APP_OP_COND |
|
|
|
LD A,SD_ACSD_SEND_OP_COND ; SD_APP_OP_COND |
|
|
|
CALL SD_INITCMD ; SETUP COMMAND BUFFER |
|
|
|
LD A,$40 ; P0 = $40 INDICATES WE SUPPORT V2 CARDS |
|
|
|
LD (SD_CMDP0),A ; SET COMMAND PARM 0 |
|
|
|
@ -619,7 +623,7 @@ SD_INITCARD3B: |
|
|
|
LD DE,300 ; 16US * 300 = ~5MS |
|
|
|
CALL VDELAY ; CPU SPEED NORMALIZED DELAY |
|
|
|
; SEND OP_COND COMMAND |
|
|
|
LD A,SD_CMD_SEND_OP_COND ; SD_OP_COND |
|
|
|
LD A,SD_CSD_SEND_OP_COND ; SD_OP_COND |
|
|
|
CALL SD_INITCMD ; SETUP COMMAND BUFFER |
|
|
|
CALL SD_EXECCMDND ; EXEC COMMAND WITH NO DATA |
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
|
@ -641,7 +645,7 @@ SD_INITCARD3C: |
|
|
|
SD_INITCARD4: |
|
|
|
; CMD58 RETURNS THE 32 BIT OCR REGISTER (R3), WE WANT TO CHECK |
|
|
|
; BIT 30, IF SET THIS IS SDHC/XC CARD |
|
|
|
LD A,SD_CMD_READ_OCR ; READ_OCR |
|
|
|
LD A,SD_CSD_READ_OCR ; READ_OCR |
|
|
|
CALL SD_INITCMD ; SETUP COMMAND BUFFER |
|
|
|
CALL SD_EXECCMD ; EXECUTE COMMAND |
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
|
@ -657,7 +661,7 @@ SD_INITCARD4A: |
|
|
|
; SD_SPEC3 (BIT 47) IS SET IF CARD IS SDXC OR GREATER |
|
|
|
CALL SD_EXECACMD ; SEND APP COMMAND INTRODUCER |
|
|
|
RET NZ ; ABORT ON ERROR (THIS SHOULD ALWAYS WORK) |
|
|
|
LD A,SD_ACMD_SEND_SCR ; APP CMD SEND_SCR |
|
|
|
LD A,SD_ACSD_SEND_SCR ; APP CMD SEND_SCR |
|
|
|
CALL SD_INITCMD ; SETUP COMMAND BUFFER |
|
|
|
CALL SD_EXECCMD ; EXECUTE COMMAND |
|
|
|
RET NZ ; ABORT ON ERROR (THIS SHOULD ALWAYS WORK) |
|
|
|
@ -699,7 +703,7 @@ SD_INITCARD5: |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
; SET OUR DESIRED BLOCK LENGTH (512 BYTES) |
|
|
|
LD A,SD_CMD_SET_BLOCKLEN ; SET_BLOCKLEN |
|
|
|
LD A,SD_CSD_SET_BLOCKLEN ; SET_BLOCKLEN |
|
|
|
CALL SD_INITCMD ; SETUP COMMAND BUFFER |
|
|
|
LD DE,512 ; 512 BYTE BLOCK LENGTH |
|
|
|
LD HL,SD_CMDP2 ; PUT VALUE INTO PARMS |
|
|
|
@ -718,7 +722,7 @@ SD_INITCARD5: |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; ISSUE SEND_CSD (TO DERIVE CARD CAPACITY) |
|
|
|
LD A,SD_CMD_SEND_CSD ; SEND_CSD |
|
|
|
LD A,SD_CSD_SEND_CSD ; SEND_CSD |
|
|
|
CALL SD_INITCMD ; SETUP COMMAND BUFFER |
|
|
|
CALL SD_EXECCMD ; EXECUTE COMMAND |
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
|
@ -848,9 +852,9 @@ SD_SECTIO: |
|
|
|
LD HL,(SD_DSKBUF) |
|
|
|
LD BC,512 ; LENGTH TO READ |
|
|
|
LD A,(SD_CMD) ; GET THE COMMAND |
|
|
|
CP SD_CMD_READ_SNGL_BLK ; READ_SINGLE_BLOCK? |
|
|
|
CP SD_CSD_READ_SNGL_BLK ; READ_SINGLE_BLOCK? |
|
|
|
JR Z,SD_SECTIO1 ; HANDLE READ |
|
|
|
CP SD_CMD_WRITE_BLOCK ; WRITE_BLOCK? |
|
|
|
CP SD_CSD_WRITE_BLOCK ; WRITE_BLOCK? |
|
|
|
JR Z,SD_SECTIO2 ; HANDLE WRITE |
|
|
|
CALL PANIC ; PANIC ON ANYTHING ELSE |
|
|
|
SD_SECTIO1: |
|
|
|
@ -937,7 +941,7 @@ SD_GOIDLE1: |
|
|
|
;CALL VDELAY ; CPU SPEED NORMALIZED DELAY |
|
|
|
|
|
|
|
; PUT CARD IN IDLE STATE |
|
|
|
LD A,SD_CMD_GO_IDLE_STATE ; CMD0 = ENTER IDLE STATE |
|
|
|
LD A,SD_CSD_GO_IDLE_STATE ; CMD0 = ENTER IDLE STATE |
|
|
|
CALL SD_INITCMD ; INIT COMMAND BUFFER |
|
|
|
LD A,$95 ; CRC FOR GO_IDLE_STATE COMMAND IS $95 |
|
|
|
LD (SD_CMDCRC),A ; SET CRC |
|
|
|
@ -967,7 +971,7 @@ SD_INITCMD1: |
|
|
|
; EXECUTE APP COMMAND |
|
|
|
; |
|
|
|
SD_EXECACMD: |
|
|
|
LD A,SD_CMD_APP_CMD ; APP_CMD, AN APP CMD IS NEXT |
|
|
|
LD A,SD_CSD_APP_CMD ; APP_CMD, AN APP CMD IS NEXT |
|
|
|
CALL SD_INITCMD ; SETUP COMMAND BUFFER |
|
|
|
JR SD_EXECCMDND ; EXEC COMMAND W/ NO DATA RETURNED |
|
|
|
; |
|
|
|
@ -1281,6 +1285,8 @@ SD_WAITRX: |
|
|
|
JR NZ,SD_WAITRX |
|
|
|
RET |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; SEND ONE BYTE |
|
|
|
; |
|
|
|
SD_PUT: |
|
|
|
@ -1354,9 +1360,9 @@ SD_GET1: |
|
|
|
LD A,C ; GET BYTE RECEIVED INTO A |
|
|
|
#IF (SDMODE == SDMODE_UART) |
|
|
|
XOR $FF ; DO IS INVERTED ON UART |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
RET |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
;============================================================================= |
|
|
|
; ERROR HANDLING AND DIAGNOSTICS |
|
|
|
@ -1643,7 +1649,7 @@ SD_DPTRIMP: |
|
|
|
; MSB<-->LSB MIRROR BITS IN A, RESULT IN C |
|
|
|
; |
|
|
|
MIRROR: |
|
|
|
#IF (SDCSIOFAST) ; SLOW SPEED, LEAST CODE SPACE |
|
|
|
#IF (SDCSIOFAST) ; SLOW SPEED, LEAST CODE SPACE |
|
|
|
LD BC,MIRTAB ; 256 BYTE MIRROR TABLE |
|
|
|
ADD A,C ; ADD OFFSET |
|
|
|
LD C,A |
|
|
|
@ -1653,14 +1659,13 @@ MIRROR2: |
|
|
|
LD A,(BC) ; GET RESULT |
|
|
|
LD C,A ; RETURN RESULT IN C |
|
|
|
RET |
|
|
|
#ELSE ; FASTEST BUT USES MOST CODE SPACE |
|
|
|
#ELSE ; FASTEST BUT USES MOST CODE SPACE |
|
|
|
LD B,8 ; BIT COUNTER |
|
|
|
MIRROR1: |
|
|
|
RLA ; ROTATE BIT 7 INTO CARRY |
|
|
|
RR C ; ROTATE CARRY INTO RESULT |
|
|
|
DJNZ MIRROR1 ; DO ALL 8 BITS |
|
|
|
RET |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; LOOKUP TABLE TO MIRROR BITS IN A BYTE |
|
|
|
|