|
|
|
@ -244,6 +244,19 @@ SD_INIT: |
|
|
|
LD (HL),A |
|
|
|
INC HL |
|
|
|
LD (HL),A |
|
|
|
; |
|
|
|
LD B,SD_UNITCNT |
|
|
|
LD C,0 |
|
|
|
SD_INIT1: |
|
|
|
PUSH BC |
|
|
|
CALL SD_SELUNIT |
|
|
|
CALL SD_INITCARD |
|
|
|
CALL SD_PRT |
|
|
|
CALL Z,SD_PRTINFO |
|
|
|
POP BC |
|
|
|
INC C |
|
|
|
DJNZ SD_INIT1 |
|
|
|
; |
|
|
|
RET |
|
|
|
; |
|
|
|
SD_STATUS: |
|
|
|
@ -472,7 +485,7 @@ SD_PUT1: |
|
|
|
LD A,(SD_OPRVAL) ; LOAD CURRENT OPR VALUE |
|
|
|
OUT (SD_OPRREG),A ; LEAVE WITH CLOCK LOW |
|
|
|
#ENDIF |
|
|
|
RET ; let it do the rest |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
; RECEIVE ONE BYTE |
|
|
|
; |
|
|
|
@ -545,6 +558,7 @@ SD_DONE: |
|
|
|
; SD_GETDATA |
|
|
|
; |
|
|
|
SD_GETDATA: |
|
|
|
PUSH HL ; SAVE DESTINATION ADDRESS |
|
|
|
PUSH BC ; SAVE LENGTH TO RECEIVE |
|
|
|
LD DE,$7FFF ; LOOP MAX (TIMEOUT) |
|
|
|
SD_GETDATA1: |
|
|
|
@ -557,9 +571,9 @@ SD_GETDATA1: |
|
|
|
SD_GETDATA2: |
|
|
|
LD (SD_TOK),A |
|
|
|
POP DE ; RESTORE LENGTH TO RECEIVE |
|
|
|
POP HL ; RECOVER DEST ADDRESS |
|
|
|
CP $FE ; PACKET START? |
|
|
|
JR NZ,SD_GETDATA4 ; NOPE, ABORT, A HAS ERROR CODE |
|
|
|
LD HL,(DIOBUF) ; RECEIVE BUFFER |
|
|
|
SD_GETDATA3: |
|
|
|
CALL SD_GET ; GET NEXT BYTE |
|
|
|
LD (HL),A ; SAVE IT |
|
|
|
@ -577,13 +591,14 @@ SD_GETDATA4: |
|
|
|
; SD_PUTDATA |
|
|
|
; |
|
|
|
SD_PUTDATA: |
|
|
|
PUSH HL ; SAVE SOURCE ADDRESS |
|
|
|
PUSH BC ; SAVE LENGTH TO SEND |
|
|
|
|
|
|
|
LD A,$FE ; PACKET START |
|
|
|
CALL SD_PUT ; SEND IT |
|
|
|
|
|
|
|
POP DE ; RESTORE LENGTH TO SEND |
|
|
|
LD HL,(DIOBUF) ; RECEIVE BUFFER |
|
|
|
POP DE ; RECOVER LENGTH TO SEND |
|
|
|
POP HL ; RECOVER SOURCE ADDRESS |
|
|
|
SD_PUTDATA1: |
|
|
|
LD A,(HL) ; GET NEXT BYTE TO SEND |
|
|
|
CALL SD_PUT ; SEND IF |
|
|
|
@ -654,30 +669,23 @@ SD_EXEC: |
|
|
|
LD HL,SD_CMDBUF |
|
|
|
LD E,6 ; COMMANDS ARE 6 BYTES |
|
|
|
SD_EXEC1: |
|
|
|
#IF (SDMODE == SDMODE_CSIO) |
|
|
|
CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING |
|
|
|
IN A,(SD_OPRREG) |
|
|
|
OR SD_CS ; SET CS |
|
|
|
OUT (SD_OPRREG),A |
|
|
|
#ENDIF |
|
|
|
#IF (SDMODE == SDMODE_UART) |
|
|
|
IN A,(SIO_MCR) |
|
|
|
AND ~SD_CS ; ASSERT = LO = 0 |
|
|
|
OUT (SIO_MCR),A |
|
|
|
#ENDIF |
|
|
|
LD A,(HL) |
|
|
|
CALL SD_PUT |
|
|
|
INC HL |
|
|
|
DEC E |
|
|
|
JR NZ,SD_EXEC1 |
|
|
|
LD DE,$100 ; LOOP MAX (TIMEOUT) |
|
|
|
;LD DE,$8000 ; *DEBUG* |
|
|
|
SD_EXEC2: |
|
|
|
CALL SD_GET |
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
OR A ; SET FLAGS |
|
|
|
JP P,SD_EXEC3 ; IF HIGH BIT IS 0, WE HAVE RESULT |
|
|
|
DEC DE |
|
|
|
BIT 7,D |
|
|
|
JR Z,SD_EXEC2 |
|
|
|
;LD (SD_RC),A ; *DEBUG* |
|
|
|
;CALL SD_PRTTRN ; *DEBUG* |
|
|
|
JP SD_ERRCMDTO |
|
|
|
SD_EXEC3: |
|
|
|
LD (SD_RC),A |
|
|
|
@ -851,42 +859,153 @@ SD_INITCARD21: |
|
|
|
|
|
|
|
XOR A ; A = 0 (STATUS = OK) |
|
|
|
LD HL,(SD_STATPTR) ; LOAD STATUS ADDRESS |
|
|
|
LD (HL),A ; SAVE IT |
|
|
|
LD (HL),A ; SAVE IT |
|
|
|
RET ; RETURN WITH A=0, AND Z SET |
|
|
|
;; |
|
|
|
;; GET AND PRINT CSD, CID |
|
|
|
;; |
|
|
|
;SD_CARDINFO: |
|
|
|
; LD A,SD_CMD9 ; SEND_CSD |
|
|
|
; CALL SD_EXECCMD0 |
|
|
|
; CALL SD_DONE |
|
|
|
; JP NZ,SD_ERRCMD ; ABORT IF PROBLEM |
|
|
|
; LD BC,16 ; 16 BYTES OF CSD |
|
|
|
; CALL SD_GETDATA |
|
|
|
; CALL SD_DONE |
|
|
|
; |
|
|
|
; LD DE,SDSTR_CSD |
|
|
|
; CALL WRITESTR |
|
|
|
; LD DE,SECBUF |
|
|
|
; LD A,16 |
|
|
|
; CALL PRTHEXBUF |
|
|
|
; |
|
|
|
; LD A,SD_CMD10 ; SEND_CID |
|
|
|
; CALL SD_EXECCMD0 |
|
|
|
; CALL SD_DONE |
|
|
|
; JP NZ,SD_ERRCMD ; ABORT IF PROBLEM |
|
|
|
; LD BC,16 ; 16 BYTES OF CID |
|
|
|
; CALL SD_GETDATA |
|
|
|
; CALL SD_DONE |
|
|
|
; |
|
|
|
; LD DE,SDSTR_CID |
|
|
|
; CALL WRITESTR |
|
|
|
; LD DE,SECBUF |
|
|
|
; LD A,16 |
|
|
|
; CALL PRTHEXBUF |
|
|
|
; |
|
|
|
; RET |
|
|
|
|
|
|
|
; |
|
|
|
; GET AND PRINT CSD, CID |
|
|
|
; |
|
|
|
SD_PRTINFO: |
|
|
|
CALL SD_PRTPREFIX |
|
|
|
|
|
|
|
; PRINT CARD TYPE |
|
|
|
PRTS(" TYPE=$") |
|
|
|
LD HL,(SD_TYPEPTR) |
|
|
|
LD A,(HL) |
|
|
|
LD DE,SDSTR_TYPEMMC |
|
|
|
CP SD_TYPEMMC |
|
|
|
JR Z,SD_PRTINFO1 |
|
|
|
LD DE,SDSTR_TYPESDSC |
|
|
|
CP SD_TYPESDSC |
|
|
|
JR Z,SD_PRTINFO1 |
|
|
|
LD DE,SDSTR_TYPESDHC |
|
|
|
CP SD_TYPESDHC |
|
|
|
JR Z,SD_PRTINFO1 |
|
|
|
LD DE,SDSTR_TYPEUNK |
|
|
|
SD_PRTINFO1: |
|
|
|
CALL WRITESTR |
|
|
|
|
|
|
|
LD A,SD_CMD10 ; SEND_CID |
|
|
|
CALL SD_EXECCMD0 |
|
|
|
CALL NZ,SD_DONE |
|
|
|
JP NZ,SD_ERRCMD ; ABORT IF PROBLEM |
|
|
|
LD BC,16 ; 16 BYTES OF CID |
|
|
|
LD HL,SD_BUF |
|
|
|
CALL SD_GETDATA |
|
|
|
CALL SD_DONE |
|
|
|
|
|
|
|
#IF (SDTRACE >= 2) |
|
|
|
CALL SD_PRTPREFIX |
|
|
|
LD DE,SDSTR_CID |
|
|
|
CALL WRITESTR |
|
|
|
LD DE,SD_BUF |
|
|
|
LD A,16 |
|
|
|
CALL PRTHEXBUF |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
; PRINT PRODUCT NAME |
|
|
|
PRTS(" NAME=$") |
|
|
|
LD B,5 |
|
|
|
LD HL,SD_BUF + 3 |
|
|
|
SD_PRTINFO2: |
|
|
|
LD A,(HL) |
|
|
|
CALL COUT |
|
|
|
INC HL |
|
|
|
DJNZ SD_PRTINFO2 |
|
|
|
|
|
|
|
LD A,SD_CMD9 ; SEND_CSD |
|
|
|
CALL SD_EXECCMD0 |
|
|
|
CALL NZ,SD_DONE |
|
|
|
JP NZ,SD_ERRCMD ; ABORT IF PROBLEM |
|
|
|
LD BC,16 ; 16 BYTES OF CSD |
|
|
|
LD HL,SD_BUF |
|
|
|
CALL SD_GETDATA |
|
|
|
CALL SD_DONE |
|
|
|
|
|
|
|
#IF (SDTRACE >= 2) |
|
|
|
CALL SD_PRTPREFIX |
|
|
|
LD DE,SDSTR_CSD |
|
|
|
CALL WRITESTR |
|
|
|
LD DE,SD_BUF |
|
|
|
LD A,16 |
|
|
|
CALL PRTHEXBUF |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
; PRINT SIZE |
|
|
|
PRTS(" SIZE=$") ; PREFIX |
|
|
|
PUSH IX ; SAVE IX |
|
|
|
LD IX,SD_BUF ; POINT IX TO BUFFER |
|
|
|
; |
|
|
|
LD HL,(SD_TYPEPTR) ; POINT TO CARD TYPE |
|
|
|
LD A,(HL) ; GET CARD TYPE |
|
|
|
CP SD_TYPESDSC ; CSD V1? |
|
|
|
JR Z,SD_PRTINFO3 ; HANDLE V1 |
|
|
|
CP SD_TYPESDHC ; CSD V2? |
|
|
|
JR Z,SD_PRTINFO4 ; HANDLE V2 |
|
|
|
JR SD_PRTINFO6 ; UNK, CAN'T HANDLE |
|
|
|
|
|
|
|
SD_PRTINFO3: ; PRINT SIZE FOR V1 CARD |
|
|
|
LD A,(IX+6) ; GET C_SIZE MSB |
|
|
|
AND %00000011 ; MASK OFF TOP 6 BITS (NOT PART OF C_SIZE) |
|
|
|
LD C,A ; MSB -> C |
|
|
|
LD D,(IX+7) ; D |
|
|
|
LD E,(IX+8) ; LSB -> E |
|
|
|
LD B,6 ; RIGHT SHIFT WHOLE THING BY 6 BITS |
|
|
|
SD_PRTINFO3A: |
|
|
|
SRA C ; SHIFT MSB |
|
|
|
RR D ; SHIFT NEXT BYTE |
|
|
|
RR E ; SHIFT LSB |
|
|
|
DJNZ SD_PRTINFO3A ; LOOP TILL DONE |
|
|
|
PUSH DE ; DE = C_SIZE |
|
|
|
LD A,(IX+9) ; GET C_SIZE_MULT MSB |
|
|
|
LD B,(IX+10) ; GET C_SIZE_MULT LSB |
|
|
|
SLA B ; SHIFT LEFT MSB |
|
|
|
RLA ; SHIFT LEFT LSB |
|
|
|
AND %00000111 ; ISOLATE RELEVANT BITS |
|
|
|
LD C,A ; C := C_SIZE_MULT |
|
|
|
LD A,(IX+5) ; GET READ_BL_LEN |
|
|
|
AND %00001111 ; ISLOATE RELEVANT BITS |
|
|
|
LD B,A ; B := READ_BL_LEN |
|
|
|
LD A,18 ; ASSUME RIGHT SHIFT OF 18 |
|
|
|
SUB B ; REDUCE BY READ_BL_LEN BITS |
|
|
|
SUB C ; REDUCE BY C_SIZE_MULT BITS |
|
|
|
LD B,A ; PUT IN LOOP COUNTER |
|
|
|
POP HL ; RECOVER C_SIZE |
|
|
|
JR Z,SD_PRTINFO5 ; HANDLE ZERO BIT SHIFT CASE |
|
|
|
SD_PRTINFO3B: |
|
|
|
SRA H ; SHIFT MSB |
|
|
|
RR L ; SHIFT LSB |
|
|
|
DJNZ SD_PRTINFO3B ; LOOP TILL DONE |
|
|
|
JR SD_PRTINFO5 ; GO TO PRINT ROUTINE |
|
|
|
; |
|
|
|
SD_PRTINFO4: ; PRINT SIZE FOR V2 CARD |
|
|
|
LD A,(IX + 7) ; GET C_SIZE MSB TO A |
|
|
|
AND %00111111 ; ISOLATE RELEVANT BITS |
|
|
|
LD H,(IX + 8) ; GET NEXT BYTE TO H |
|
|
|
LD L,(IX + 9) ; GET C_SIZE LSB TO L |
|
|
|
SRA A ; RIGHT SHIFT MSB BY ONE |
|
|
|
RR H ; RIGHT SHIFT NEXT BYTE BY ONE |
|
|
|
RR L ; RIGHT SHIFT LSB BY ONE |
|
|
|
JR SD_PRTINFO5 |
|
|
|
; |
|
|
|
SD_PRTINFO5: ; COMMON CODE TO PRINT RESULTANT SIZE (IN HL) |
|
|
|
CALL PRTDEC ; PRINT SIZE IN DECIMAL |
|
|
|
JR SD_PRTINFO7 ; FINISH UP |
|
|
|
; |
|
|
|
SD_PRTINFO6: ; UNKNOWN CARD TYPE |
|
|
|
PRTC('?') ; UNKNOWN SIZE |
|
|
|
; |
|
|
|
SD_PRTINFO7: |
|
|
|
PRTS("MB$") ; PRINT SIZE SUFFIX |
|
|
|
POP IX ; RESTORE IX |
|
|
|
; |
|
|
|
CALL SD_CHKWP ; WRITE PROTECTED? |
|
|
|
JR Z,SD_PRTINFO8 ; NOPE, BYPASS |
|
|
|
CALL PC_SPACE ; SEPARATOR |
|
|
|
PRTX(SDSTR_STWRTPROT) ; TELL THE USER |
|
|
|
; |
|
|
|
SD_PRTINFO8: |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
; CHECK THE SD CARD, ATTEMPT TO REINITIALIZE IF NEEDED |
|
|
|
; |
|
|
|
@ -906,8 +1025,10 @@ SD_RDSEC: |
|
|
|
LD A,SD_CMD17 ; READ_SINGLE_BLOCK |
|
|
|
CALL SD_EXECCMDP ; EXEC CMD WITH BLOCK ADDRESS AS PARM |
|
|
|
CALL NZ,SD_DONE ; TRANSACTION DONE IF ERROR OCCURRED |
|
|
|
JP NZ,SD_ERRCMD ; ABORT ON ERROR |
|
|
|
RET M ; ABORT ON PROCESSING ERROR |
|
|
|
JP NZ,SD_ERRCMD ; FAIL IF NON-ZERO RC |
|
|
|
|
|
|
|
LD HL,(DIOBUF) |
|
|
|
LD BC,512 ; LENGTH TO READ |
|
|
|
CALL SD_GETDATA ; GET THE BLOCK |
|
|
|
CALL SD_DONE |
|
|
|
@ -925,8 +1046,10 @@ SD_WRSEC: |
|
|
|
LD A,SD_CMD24 ; WRITE_BLOCK |
|
|
|
CALL SD_EXECCMDP ; EXEC CMD WITH BLOCK ADDRESS AS PARM |
|
|
|
CALL NZ,SD_DONE ; TRANSACTION DONE IF ERROR OCCURRED |
|
|
|
JP NZ,SD_ERRCMD ; ABORT ON ERROR |
|
|
|
RET M ; ABORT ON PROCESSING ERROR |
|
|
|
JP NZ,SD_ERRCMD ; FAIL IF NON-ZERO RC |
|
|
|
|
|
|
|
LD HL,(DIOBUF) ; SETUP DATA SOURCE ADDRESS |
|
|
|
LD BC,512 ; LENGTH TO WRITE |
|
|
|
CALL SD_PUTDATA ; PUT THE BLOCK |
|
|
|
CALL SD_DONE |
|
|
|
@ -1166,6 +1289,8 @@ SDSTR_PREFIX .TEXT "SD$" |
|
|
|
SDSTR_ARROW .TEXT " -> $" |
|
|
|
SDSTR_RC .TEXT "RC=$" |
|
|
|
SDSTR_TOK .TEXT "TOK=$" |
|
|
|
SDSTR_CSD .TEXT " CSD=$" |
|
|
|
SDSTR_CID .TEXT " CID=$" |
|
|
|
SDSTR_STOK .TEXT "OK$" |
|
|
|
SDSTR_SDTYPE .TEXT "SD CARD TYPE: $" |
|
|
|
; |
|
|
|
@ -1180,6 +1305,10 @@ SDSTR_STCRCERR .TEXT "CRC ERROR$" |
|
|
|
SDSTR_STNOMEDIA .TEXT "NO MEDIA$" |
|
|
|
SDSTR_STWRTPROT .TEXT "WRITE PROTECTED$" |
|
|
|
SDSTR_STUNK .TEXT "UNKNOWN$" |
|
|
|
SDSTR_TYPEUNK .TEXT "UNK$" |
|
|
|
SDSTR_TYPEMMC .TEXT "MMC$" |
|
|
|
SDSTR_TYPESDSC .TEXT "SDSC$" |
|
|
|
SDSTR_TYPESDHC .TEXT "SDHC/XC$" |
|
|
|
; |
|
|
|
;================================================================================================== |
|
|
|
; SD DISK DRIVER - DATA |
|
|
|
@ -1195,6 +1324,8 @@ SD_TOK .DB 0 ; TOKEN FROM DATA XFR |
|
|
|
SD_OPRVAL .DB 0 ; CURRENT OPR REG VALUE |
|
|
|
SD_LCNT .DB 0 ; LOOP COUNTER |
|
|
|
; |
|
|
|
SD_BUF .FILL 16,0 ; WORK BUFFER |
|
|
|
; |
|
|
|
SD_CMDBUF: ; START OF STD CMD BUF |
|
|
|
SD_CMD .DB 0 |
|
|
|
SD_CMDP0 .DB 0 |
|
|
|
|