|
|
|
@ -160,21 +160,21 @@ SD_TRDR .EQU Z180_TRDR |
|
|
|
; |
|
|
|
; SD CARD COMMANDS |
|
|
|
; |
|
|
|
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_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 CARD APPLICATION COMMANDS (PRECEDED BY APP_CMD COMMAND) |
|
|
|
; |
|
|
|
SD_ACSD_SEND_OP_COND .EQU $40 + 41 ; $69, ACMD41 -> R1 |
|
|
|
SD_ACSD_SEND_SCR .EQU $40 + 51 ; $73, ACMD51 -> R1 |
|
|
|
SD_ACMD_SEND_OP_COND .EQU $40 + 41 ; $69, ACMD41 -> R1 |
|
|
|
SD_ACMD_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_CSD_SEND_CID ; SEND_CID |
|
|
|
LD A,SD_CMD_SEND_CID ; SEND_CID |
|
|
|
CALL SD_INITCMD ; SETUP COMMAND BUFFER |
|
|
|
CALL SD_EXECCMD ; RUN COMMAND |
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
|
@ -412,7 +412,6 @@ SD_DISPATCH: |
|
|
|
CP SD_UNITCNT |
|
|
|
CALL NC,PANIC ; PANIC IF TOO HIGH |
|
|
|
LD (SD_UNIT),A ; SAVE IT |
|
|
|
;CALL SD_SELUNIT ; SELECT DESIRED UNIT |
|
|
|
; |
|
|
|
; DISPATCH ACCORDING TO DISK SUB-FUNCTION |
|
|
|
LD A,B ; GET REQUESTED FUNCTION |
|
|
|
@ -431,20 +430,17 @@ SD_DISPATCH: |
|
|
|
DEC A |
|
|
|
JP Z,SD_FORMAT ; SUB-FUNC 6: FORMAT TRACK |
|
|
|
DEC A |
|
|
|
JP Z,SD_SENSE ; SUB-FUNC 7: SENSE MEDIA |
|
|
|
JP Z,SD_MEDIA ; SUB-FUNC 7: MEDIA REPORT |
|
|
|
DEC A |
|
|
|
JP Z,SD_CAP ; SUB-FUNC 8: GET DISK CAPACITY |
|
|
|
JP Z,SD_DEFMED ; SUB-FUNC 8: DEFINE MEDIA |
|
|
|
DEC A |
|
|
|
JP Z,SD_GEOM ; SUB-FUNC 9: GET DISK GEOMETRY |
|
|
|
JP Z,SD_CAP ; SUB-FUNC 9: REPORT CAPACITY |
|
|
|
DEC A |
|
|
|
JP Z,SD_GETPAR ; SUB-FUNC 10: GET DISK PARAMETERS |
|
|
|
DEC A |
|
|
|
JP Z,SD_SETPAR ; SUB-FUNC 11: SET DISK PARAMETERS |
|
|
|
JP Z,SD_GEOM ; SUB-FUNC 10: REPORT GEOMETRY |
|
|
|
; |
|
|
|
SD_VERIFY: |
|
|
|
SD_FORMAT: |
|
|
|
SD_GETPAR: |
|
|
|
SD_SETPAR: |
|
|
|
SD_DEFMED: |
|
|
|
CALL PANIC ; INVALID SUB-FUNCTION |
|
|
|
; |
|
|
|
; |
|
|
|
@ -457,7 +453,7 @@ SD_READ: |
|
|
|
#ENDIF |
|
|
|
CALL SD_SELUNIT |
|
|
|
; READ A SECTOR |
|
|
|
LD C,SD_CSD_READ_SNGL_BLK ; SET READ_SINGLE_BLOCK COMMAND |
|
|
|
LD C,SD_CMD_READ_SNGL_BLK ; SET READ_SINGLE_BLOCK COMMAND |
|
|
|
JP SD_SECTIO ; DO SECTOR I/O |
|
|
|
; |
|
|
|
; |
|
|
|
@ -472,7 +468,7 @@ SD_WRITE: |
|
|
|
CALL SD_CHKWP ; CHECK FOR WRITE PROTECT |
|
|
|
JP NZ,SD_WRTPROT ; HANDLE IT IF SO |
|
|
|
; WRITE A SECTOR |
|
|
|
LD C,SD_CSD_WRITE_BLOCK ; SET WRITE_BLOCK COMMAND |
|
|
|
LD C,SD_CMD_WRITE_BLOCK ; SET WRITE_BLOCK COMMAND |
|
|
|
JP SD_SECTIO ; DO SECTOR I/O |
|
|
|
; |
|
|
|
SD_STATUS: |
|
|
|
@ -485,33 +481,62 @@ SD_STATUS: |
|
|
|
; |
|
|
|
; |
|
|
|
SD_RESET: |
|
|
|
XOR A ; ALWAYS OK |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
SD_SENSE: |
|
|
|
CALL SD_SELUNIT ; SET CUR UNIT |
|
|
|
; RE-INITIALIZE THE SD CARD TO ACCOMMODATE HOT SWAPPING |
|
|
|
CALL SD_INITCARD ; RE-INIT SELECTED UNIT |
|
|
|
#IF (SDTRACE == 1) |
|
|
|
CALL SD_PRTERR ; PRINT ANY ERRORS |
|
|
|
#ENDIF |
|
|
|
OR A ; SET RESULT FLAGS |
|
|
|
RET |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
SD_MEDIA: |
|
|
|
LD A,E ; GET FLAGS |
|
|
|
OR A ; SET FLAGS |
|
|
|
JR Z,SD_MEDIA2 ; JUST REPORT CURRENT STATUS AND MEDIA |
|
|
|
; |
|
|
|
IDE_DPTR(SD_STAT) ; POINT TO UNIT STATUS |
|
|
|
LD A,(HL) ; GET STATUS |
|
|
|
OR A ; SET FLAGS |
|
|
|
JR NZ,SD_MEDIA1 ; ERROR ACTIVE, TO RIGHT TO RESET |
|
|
|
; |
|
|
|
; USE SEND_CSD TO CHECK CARD |
|
|
|
CALL SD_SELUNIT ; SET CUR UNIT |
|
|
|
LD A,SD_CMD_SEND_CSD ; SEND_CSD |
|
|
|
CALL SD_EXECCMD ; EXECUTE COMMAND |
|
|
|
JR NZ,SD_MEDIA1 ; ERROR, NEED RESET |
|
|
|
LD BC,16 ; 16 BYTES OF CSD |
|
|
|
LD HL,SD_BUF ; PUT IN OUR PRIVATE BUFFER |
|
|
|
CALL SD_GETDATA ; GET THE DATA |
|
|
|
CALL SD_DONE ; CLOSE THE TRANSACTION |
|
|
|
JR Z,SD_MEDIA2 ; IF SUCCESS, BYPASS RESET |
|
|
|
; |
|
|
|
SD_MEDIA1: |
|
|
|
CALL SD_RESET ; RESET CARD |
|
|
|
; |
|
|
|
SD_MEDIA2: |
|
|
|
SD_DPTR(SD_STAT) ; HL := ADR OF STATUS, AF TRASHED |
|
|
|
LD A,(HL) ; GET STATUS OF SELECTED UNIT |
|
|
|
OR A ; SET FLAGS |
|
|
|
LD D,0 ; NO MEDIA CHANGE DETECTED |
|
|
|
LD E,MID_HD ; ASSUME WE ARE OK |
|
|
|
RET Z ; RETURN IF GOOD INIT |
|
|
|
LD E,MID_NONE ; SIGNAL NO MEDA |
|
|
|
LD E,MID_NONE ; SIGNAL NO MEDIA |
|
|
|
RET ; AND RETURN |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
SD_SEEK: |
|
|
|
BIT 7,D ; CHECK FOR LBA FLAG |
|
|
|
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA |
|
|
|
RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA) |
|
|
|
LD BC,HSTLBA ; POINT TO LBA STORAGE |
|
|
|
CALL ST32 ; SAVE LBA ADDRESS |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET ; AND RETURN |
|
|
|
BIT 7,D ; CHECK FOR LBA FLAG |
|
|
|
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA |
|
|
|
RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA) |
|
|
|
LD BC,HSTLBA ; POINT TO LBA STORAGE |
|
|
|
CALL ST32 ; SAVE LBA ADDRESS |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET ; AND RETURN |
|
|
|
; |
|
|
|
; |
|
|
|
; |
|
|
|
@ -572,7 +597,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_CSD_SEND_IF_COND ; SEND_IF_COND |
|
|
|
LD A,SD_CMD_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 |
|
|
|
@ -597,7 +622,7 @@ SD_INITCARD3: |
|
|
|
OR A ; SET FLAGS |
|
|
|
RET NZ ; ABORT IF ANY OTHER ERROR |
|
|
|
; SEND APP_OP_COND |
|
|
|
LD A,SD_ACSD_SEND_OP_COND ; SD_APP_OP_COND |
|
|
|
LD A,SD_ACMD_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 |
|
|
|
@ -623,7 +648,7 @@ SD_INITCARD3B: |
|
|
|
LD DE,300 ; 16US * 300 = ~5MS |
|
|
|
CALL VDELAY ; CPU SPEED NORMALIZED DELAY |
|
|
|
; SEND OP_COND COMMAND |
|
|
|
LD A,SD_CSD_SEND_OP_COND ; SD_OP_COND |
|
|
|
LD A,SD_CMD_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 |
|
|
|
@ -645,7 +670,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_CSD_READ_OCR ; READ_OCR |
|
|
|
LD A,SD_CMD_READ_OCR ; READ_OCR |
|
|
|
CALL SD_INITCMD ; SETUP COMMAND BUFFER |
|
|
|
CALL SD_EXECCMD ; EXECUTE COMMAND |
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
|
@ -661,7 +686,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_ACSD_SEND_SCR ; APP CMD SEND_SCR |
|
|
|
LD A,SD_ACMD_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) |
|
|
|
@ -703,7 +728,7 @@ SD_INITCARD5: |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
; SET OUR DESIRED BLOCK LENGTH (512 BYTES) |
|
|
|
LD A,SD_CSD_SET_BLOCKLEN ; SET_BLOCKLEN |
|
|
|
LD A,SD_CMD_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 |
|
|
|
@ -722,7 +747,7 @@ SD_INITCARD5: |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; ISSUE SEND_CSD (TO DERIVE CARD CAPACITY) |
|
|
|
LD A,SD_CSD_SEND_CSD ; SEND_CSD |
|
|
|
LD A,SD_CMD_SEND_CSD ; SEND_CSD |
|
|
|
CALL SD_INITCMD ; SETUP COMMAND BUFFER |
|
|
|
CALL SD_EXECCMD ; EXECUTE COMMAND |
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
|
@ -852,9 +877,9 @@ SD_SECTIO: |
|
|
|
LD HL,(SD_DSKBUF) |
|
|
|
LD BC,512 ; LENGTH TO READ |
|
|
|
LD A,(SD_CMD) ; GET THE COMMAND |
|
|
|
CP SD_CSD_READ_SNGL_BLK ; READ_SINGLE_BLOCK? |
|
|
|
CP SD_CMD_READ_SNGL_BLK ; READ_SINGLE_BLOCK? |
|
|
|
JR Z,SD_SECTIO1 ; HANDLE READ |
|
|
|
CP SD_CSD_WRITE_BLOCK ; WRITE_BLOCK? |
|
|
|
CP SD_CMD_WRITE_BLOCK ; WRITE_BLOCK? |
|
|
|
JR Z,SD_SECTIO2 ; HANDLE WRITE |
|
|
|
CALL PANIC ; PANIC ON ANYTHING ELSE |
|
|
|
SD_SECTIO1: |
|
|
|
@ -941,7 +966,7 @@ SD_GOIDLE1: |
|
|
|
;CALL VDELAY ; CPU SPEED NORMALIZED DELAY |
|
|
|
|
|
|
|
; PUT CARD IN IDLE STATE |
|
|
|
LD A,SD_CSD_GO_IDLE_STATE ; CMD0 = ENTER IDLE STATE |
|
|
|
LD A,SD_CMD_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 |
|
|
|
@ -971,7 +996,7 @@ SD_INITCMD1: |
|
|
|
; EXECUTE APP COMMAND |
|
|
|
; |
|
|
|
SD_EXECACMD: |
|
|
|
LD A,SD_CSD_APP_CMD ; APP_CMD, AN APP CMD IS NEXT |
|
|
|
LD A,SD_CMD_APP_CMD ; APP_CMD, AN APP CMD IS NEXT |
|
|
|
CALL SD_INITCMD ; SETUP COMMAND BUFFER |
|
|
|
JR SD_EXECCMDND ; EXEC COMMAND W/ NO DATA RETURNED |
|
|
|
; |
|
|
|
@ -1203,15 +1228,11 @@ SD_OPRMSK .EQU (SD_CS | SD_CLK | SD_DI) |
|
|
|
; UNIT IS SPECIFIED IN A |
|
|
|
; |
|
|
|
SD_SELUNIT: |
|
|
|
LD HL,SD_UNIT ; POINT TO PREVIOUSLY SELECTED UNIT |
|
|
|
CP (HL) ; SAME? |
|
|
|
RET Z ; IF SO, NOTHING MORE TO DO |
|
|
|
LD A,(SD_UNIT) |
|
|
|
; |
|
|
|
CP SD_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?) |
|
|
|
JP NC,SD_INVUNIT ; HANDLE INVALID UNIT |
|
|
|
; |
|
|
|
; NEW UNIT SELECTED, IMPLEMENT IT |
|
|
|
;LD (SD_UNIT),A ; SAVE CURRENT UNIT NUMBER |
|
|
|
#IF (SDMODE == SDMODE_DSD) |
|
|
|
; SELECT REQUESTED UNIT |
|
|
|
OUT (SD_SELREG),A ; ACTUALLY SELECT THE CARD |
|
|
|
|