From a11f38fdbd6ca6228d001cc0cbfabfe77982f255 Mon Sep 17 00:00:00 2001 From: wayne Date: Sun, 7 Apr 2013 06:17:07 +0000 Subject: [PATCH] Reintegrate wbw -> trunk --- ReadMe.txt | 4 +- Source/sd.asm | 233 ++++++++++++++++++++++++++++++++++++++----------- Source/ver.inc | 4 +- 3 files changed, 186 insertions(+), 55 deletions(-) diff --git a/ReadMe.txt b/ReadMe.txt index 7df04f42..5eaaebc9 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -8,8 +8,8 @@ Builders: Wayne Warthen (wwarthen@gmail.com) Douglas Goodall (douglas_goodall@mac.com) David Giles (vk5dg@internode.on.net) -Updated: 2013-04-02 -Version: 2.5 Beta 2 +Updated: 2013-04-06 +Version: 2.5 Beta 4 This is an adaptation of CP/M-80 2.2 and ZSDOS/ZCPR targeting ROMs for all N8VEM Z80 hardware variations diff --git a/Source/sd.asm b/Source/sd.asm index 2fad9eda..7b9ddfd2 100644 --- a/Source/sd.asm +++ b/Source/sd.asm @@ -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 diff --git a/Source/ver.inc b/Source/ver.inc index 073a86ce..58304b04 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -1,6 +1,6 @@ #DEFINE RMJ 2 #DEFINE RMN 5 #DEFINE RUP 0 -#DEFINE RTP 3 -#DEFINE BIOSVER "2.5 - Beta 3" +#DEFINE RTP 4 +#DEFINE BIOSVER "2.5 - Beta 4" #DEFINE REVISION 412