Browse Source

Reintegrate wbw -> trunk

pull/3/head
wayne 13 years ago
parent
commit
a11f38fdbd
  1. 4
      ReadMe.txt
  2. 233
      Source/sd.asm
  3. 4
      Source/ver.inc

4
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

233
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

4
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

Loading…
Cancel
Save