Browse Source

Completed CH37x Driver

The ch.asm driver now supports SD Card operations (only possible for CH376).
patch v3.4.0-dev.21
Wayne Warthen 2 years ago
parent
commit
5dc724785b
  1. 387
      Source/HBIOS/ch.asm
  2. 2
      Source/ver.inc
  3. 2
      Source/ver.lib

387
Source/HBIOS/ch.asm

@ -1,5 +1,4 @@
; ;
;
;================================================================================================== ;==================================================================================================
; CH375/376 USB/SD DRIVER ; CH375/376 USB/SD DRIVER
;================================================================================================== ;==================================================================================================
@ -19,7 +18,7 @@
; added to the RESET routine when using CH376. ; added to the RESET routine when using CH376.
; ;
; TODO: ; TODO:
; - Implement auto-recovery on error status.
; - Implement auto-recovery on error status?
; - !!! Move CH_MODE to config variable !!! ; - !!! Move CH_MODE to config variable !!!
; ;
; PORT OFFSETS FROM BASE PORT ; PORT OFFSETS FROM BASE PORT
@ -47,6 +46,7 @@ CH_CMD_EXIST .EQU $06 ; CHECK EXISTS
CH_CMD_MAXLUN .EQU $0A ; GET MAX LUN NUMBER CH_CMD_MAXLUN .EQU $0A ; GET MAX LUN NUMBER
CH_CMD_PKTSEC .EQU $0B ; SET PACKETS PER SECTOR CH_CMD_PKTSEC .EQU $0B ; SET PACKETS PER SECTOR
CH_CMD_SETRETRY .EQU $0B ; SET RETRIES CH_CMD_SETRETRY .EQU $0B ; SET RETRIES
CH_CMD_FILESIZE .EQU $0C ; GET FILE SIZE (376)
CH_CMD_MODE .EQU $15 ; SET USB MODE CH_CMD_MODE .EQU $15 ; SET USB MODE
CH_CMD_TSTCON .EQU $16 ; TEST CONNECT CH_CMD_TSTCON .EQU $16 ; TEST CONNECT
CH_CMD_ABRTNAK .EQU $17 ; ABORT DEVICE NAK RETRIES CH_CMD_ABRTNAK .EQU $17 ; ABORT DEVICE NAK RETRIES
@ -55,6 +55,7 @@ CH_CMD_RD6 .EQU $27 ; READ USB DATA (375 & 376)
CH_CMD_RD5 .EQU $28 ; READ USB DATA (375) CH_CMD_RD5 .EQU $28 ; READ USB DATA (375)
CH_CMD_WR5 .EQU $2B ; WRITE USB DATA (375) CH_CMD_WR5 .EQU $2B ; WRITE USB DATA (375)
CH_CMD_WR6 .EQU $2C ; WRITE USB DATA (376) CH_CMD_WR6 .EQU $2C ; WRITE USB DATA (376)
CH_CMD_WRREQDAT .EQU $2D ; WRITE REQUESTED DATA (376)
CH_CMD_SET_FN .EQU $2F ; SET FILENAME (376) CH_CMD_SET_FN .EQU $2F ; SET FILENAME (376)
CH_CMD_DSKMNT .EQU $31 ; DISK MOUNT CH_CMD_DSKMNT .EQU $31 ; DISK MOUNT
CH_CMD_FOPEN .EQU $32 ; FILE OPEN (376) CH_CMD_FOPEN .EQU $32 ; FILE OPEN (376)
@ -143,6 +144,8 @@ CH_INIT2:
LD A,(IY+CH_IOBASE) ; GET IO BASE ADDRES LD A,(IY+CH_IOBASE) ; GET IO BASE ADDRES
CALL PRTHEXBYTE ; DISPLAY IT CALL PRTHEXBYTE ; DISPLAY IT
; ;
XOR A ; UNKNOWN MODE
LD (CH_MODE),A ; SAVE IT
;CALL CH_FLUSH ; FLUSH DEVICE OUTPUT QUEUE ;CALL CH_FLUSH ; FLUSH DEVICE OUTPUT QUEUE
CALL CH_RESET ; FULL CH37X RESET CALL CH_RESET ; FULL CH37X RESET
CALL CH_DETECT ; DETECT CHIP PRESENCE CALL CH_DETECT ; DETECT CHIP PRESENCE
@ -363,46 +366,45 @@ CH_GETVER:
; ;
; SET MODE TO VALUE IN A ; SET MODE TO VALUE IN A
; AVOID CHANGING MODES IF CURRENT MODE = NEW MODE ; AVOID CHANGING MODES IF CURRENT MODE = NEW MODE
; THE CH376 DOES NOT SEEM TO MAINTAIN SEPARATE OPERATING CONTEXTS FOR
; THE USB AND SD DEVICES. IF BOTH ARE IN OPERATION, THEN A MODE
; SWITCH REQUIRES A COMPLETE REINITIALIZATION OF THE REQUESTED
; DEVICE.
; ;
CH_SETMODE: CH_SETMODE:
PUSH BC
PUSH DE
PUSH HL
PUSH BC ; SAVE BC
PUSH DE ; SAVE DE
PUSH HL ; SAVE HL
;PRTS("\r\nSETMODE:$") ; *DEBUG* ;PRTS("\r\nSETMODE:$") ; *DEBUG*
LD L,A ; SAVE REQUESTED MODE LD L,A ; SAVE REQUESTED MODE
LD A,(CH_MODE) ; GET CURRENT MODE LD A,(CH_MODE) ; GET CURRENT MODE
;CALL PC_SPACE ; *DEBUG* ;CALL PC_SPACE ; *DEBUG*
;CALL PRTHEXBYTE ; *DEBUG* ;CALL PRTHEXBYTE ; *DEBUG*
CP L ; COMPARE CP L ; COMPARE
JR Z,CH_SETMODE_Z ; IF EQUAL, DONE JR Z,CH_SETMODE_Z ; IF EQUAL, DONE
; ;
; NEED TO CHANGE MODES ; NEED TO CHANGE MODES
LD A,L ; GET REQUESTED MODE LD A,L ; GET REQUESTED MODE
CP CH_MODE_USB
JR Z,CH_SETMODE_USB
CP CH_MODE_SD
JR Z,CH_SETMODE_SD
CP CH_MODE_USB ; USB?
JR Z,CH_SETMODE_USB ; IF SO, DO IT
CP CH_MODE_SD ; SD?
JR Z,CH_SETMODE_SD ; IF SO, DO IT
OR $FF ; SIGNAL ERROR OR $FF ; SIGNAL ERROR
JR CH_SETMODE_Z ; BAIL OUT JR CH_SETMODE_Z ; BAIL OUT
; ;
CH_SETMODE_USB: CH_SETMODE_USB:
CALL CHUSB_RESET
JR CH_SETMODE_Z
CALL CHUSB_RESET ; FULL USB STACK RESET
JR CH_SETMODE_Z ; MOVE ON
; ;
CH_SETMODE_SD: CH_SETMODE_SD:
CALL CHSD_RESET
JR CH_SETMODE_Z
CALL CHSD_RESET ; FULL SD STACK RESET
JR CH_SETMODE_Z ; MOVE ON
; ;
CH_SETMODE_Z: CH_SETMODE_Z:
POP HL
POP DE
POP BC
RET
POP HL ; RECOVER HL
POP DE ; RECOVER DE
POP BC ; RECOVER BC
RET ; DONE
; ;
; ;
; ;
@ -742,29 +744,28 @@ CHUSB_RESET1:
;CALL PC_SPACE ; *DEBUG* ;CALL PC_SPACE ; *DEBUG*
;CALL PRTHEXBYTE ; *DEBUG* ;CALL PRTHEXBYTE ; *DEBUG*
CP $14 ; SUCCESS? CP $14 ; SUCCESS?
JR Z,CHUSB_RESET2 ; IF SO, CONTINUE
;JR Z,CHUSB_RESET1A ; IF SO, CHECK READY
JR Z,CHUSB_RESET1A ; IF SO, CHECK READY
CP $16 ; NO MEDIA CP $16 ; NO MEDIA
JP Z,CHUSB_NOMEDIA ; HANDLE IT JP Z,CHUSB_NOMEDIA ; HANDLE IT
CALL CH_NAP ; SMALL DELAY CALL CH_NAP ; SMALL DELAY
DJNZ CHUSB_RESET1 ; LOOP AS NEEDED DJNZ CHUSB_RESET1 ; LOOP AS NEEDED
JP CHUSB_TO ; HANDLE TIMEOUT JP CHUSB_TO ; HANDLE TIMEOUT
;;;;
;;;CHUSB_RESET1A:
;;; CALL CHUSB_DSKRES ; DISK RESET
;;; CP $14 ; GOOD?
;;; JR Z,CHUSB_RESET2
;;; CALL CHUSB_DSKRDY ; CHECK IF DISK READY
;;; CP $14 ; GOOD?
;;; JR Z,CHUSB_RESET2 ; IF SO, MOVE ON
;;; DJNZ CHUSB_RESET1 ; KEEP TRYING
;
CHUSB_RESET1A:
;CALL CHUSB_DSKRES ; DISK RESET
;CP $14 ; GOOD?
;JR Z,CHUSB_RESET2
;CALL CHUSB_DSKRDY ; CHECK IF DISK READY
;CP $14 ; GOOD?
;JR Z,CHUSB_RESET2 ; IF SO, MOVE ON
;DJNZ CHUSB_RESET1 ; KEEP TRYING
; ;
CHUSB_RESET2: CHUSB_RESET2:
; USE OF CH376 DISK_MOUNT COMMAND SEEMS TO IMPROVE ; USE OF CH376 DISK_MOUNT COMMAND SEEMS TO IMPROVE
; COMPATIBILITY WITH SOME OLDER USB THUMBDRIVES. ; COMPATIBILITY WITH SOME OLDER USB THUMBDRIVES.
LD A,(IY+CH_TYPE) ; CH37X TYPE? LD A,(IY+CH_TYPE) ; CH37X TYPE?
CP CHTYP_376 ; IS CH376? CP CHTYP_376 ; IS CH376?
CALL Z,CHUSB_DSKMNT ; IF SO, ISSUE MOUNT
CALL Z,CHUSB_DSKMNT ; IF SO, TRY MOUNT, IGNORE ERRS
;CALL CHUSB_AUTOSET ; *DEBUG* ;CALL CHUSB_AUTOSET ; *DEBUG*
;CALL CHUSB_TSTCON ; *DEBUG* ;CALL CHUSB_TSTCON ; *DEBUG*
;CALL CHUSB_MAXLUN ; *DEBUG* ;CALL CHUSB_MAXLUN ; *DEBUG*
@ -862,28 +863,34 @@ CHUSB_DSKMNT:
;CALL PRTHEXBYTE ; *DEBUG* ;CALL PRTHEXBYTE ; *DEBUG*
CP $14 ; SUCCESS? CP $14 ; SUCCESS?
RET NZ ; ABORT IF NOT RET NZ ; ABORT IF NOT
;
#IF FALSE
CALL CH_CMD_RD ; SEND READ COMMAND CALL CH_CMD_RD ; SEND READ COMMAND
CALL CH_RD ; GET LENGTH CALL CH_RD ; GET LENGTH
;CALL PC_SPACE ; *DEBUG*
;CALL PRTHEXBYTE ; *DEBUG*
LD B,A ; LOOP COUNTER LD B,A ; LOOP COUNTER
LD HL,HB_WRKBUF ; USE WORK BUFFER FOR DATA LD HL,HB_WRKBUF ; USE WORK BUFFER FOR DATA
DSKMNT1:
CHUSB_DSKMNT1:
CALL CH_RD ; GET A BYTE CALL CH_RD ; GET A BYTE
LD (HL),A ; SAVE IT LD (HL),A ; SAVE IT
INC HL ; BUMP BUF PTR INC HL ; BUMP BUF PTR
DJNZ DSKMNT1 ; LOOP FOR ALL DATA
DJNZ CHUSB_DSKMNT1 ; LOOP FOR ALL DATA
; ;
;LD DE,HB_WRKBUF ; *DEBUG* ;LD DE,HB_WRKBUF ; *DEBUG*
;CALL DUMP_BUFFER ; *DEBUG* ;CALL DUMP_BUFFER ; *DEBUG*
; ;
;CALL CHUSB_PRTPREFIX ; PRINT DEVICE PREFIX
;LD HL,HB_WRKBUF + 8
;LD B,28
DSKMNT2:
;LD A,(HL)
;INC HL
;CALL COUT
;DJNZ DSKMNT2
CALL CHUSB_PRTPREFIX ; PRINT DEVICE PREFIX
LD HL,HB_WRKBUF + 8
LD B,28
CHUSB_DSKMNT2:
LD A,(HL)
INC HL
CALL COUT
DJNZ CHUSB_DSKMNT2
#ENDIF
; ;
XOR A
RET RET
; ;
; PERFORM DISK SIZE ; PERFORM DISK SIZE
@ -1161,6 +1168,8 @@ CHUSB_STR_STUNK .TEXT "UNKNOWN ERROR$"
; CH375/376 SD CARD SUB-DRIVER ; CH375/376 SD CARD SUB-DRIVER
;================================================================================================== ;==================================================================================================
; ;
#DEFINE CHSD_IMGFILE "DISK.IMG"
;
CHSD_FASTIO .EQU TRUE ; USE INIR/OTIR? CHSD_FASTIO .EQU TRUE ; USE INIR/OTIR?
; ;
; CHUSB DEVICE STATUS ; CHUSB DEVICE STATUS
@ -1315,9 +1324,9 @@ CHSD_READ1:
CALL CH_RD ; GET DATA LENGTH CALL CH_RD ; GET DATA LENGTH
;CALL PC_SPACE ; *DEBUG* ;CALL PC_SPACE ; *DEBUG*
;CALL PRTHEXBYTE ; *DEBUG* ;CALL PRTHEXBYTE ; *DEBUG*
;
#IF (CHSD_FASTIO) #IF (CHSD_FASTIO)
LD B,A
LD B,A ; BYTE COUNT TO READ
LD C,(IY+CH_IOBASE) ; BASE PORT LD C,(IY+CH_IOBASE) ; BASE PORT
INIR ; DO IT FAST INIR ; DO IT FAST
#ELSE #ELSE
@ -1357,54 +1366,55 @@ CHSD_WRITE:
CALL CH_SETMODE ; DO IT CALL CH_SETMODE ; DO IT
JP NZ,CHSD_CMDERR ; HANDLE ERROR JP NZ,CHSD_CMDERR ; HANDLE ERROR
; ;
JP CHSD_IOERR
CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR
LD (CHSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS LD (CHSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
LD A,CH_CMD_DSKWR ; DISK READ COMMAND
CALL CHSD_RWSTART ; SEND CMD AND LBA
CALL CHSD_RWSTART ; SET LBA OFFSET'
RET NZ
; ;
; WRITE THE SECTOR IN 64 BYTE CHUNKS
LD B,8 ; 8 CHUNKS OF 64 FOR 512 BYTE SECTOR
LD HL,(CHSD_DSKBUF) ; GET DISK BUF ADR
;PRTS("\n\rWRITE:$") ; *DEBUG*
LD A,CH_CMD_BYTEWR ; BYTE WRITE
CALL CH_CMD ; SEND COMMAND
LD A,0 ; LSB
CALL CH_WR ; SEND IT
LD A,2 ; MSB
CALL CH_WR ; SEND IT
CALL CH_POLL ; GET RESULT
;CALL PC_SPACE ; *DEBUG*
;CALL PRTHEXBYTE ; *DEBUG*
CP $1E ; DATA READY TO GO?
JP NZ,CHSD_IOERR ; HANDLE I/O ERROR
;
LD HL,(CHSD_DSKBUF)
CHSD_WRITE1: CHSD_WRITE1:
CALL CH_POLL ; WAIT FOR DATA READY
CP $1E ; DATA READY TO WRITE
;CALL PC_GT ; *DEBUG*
LD A,CH_CMD_WRREQDAT ; WRITE REQUESTED DATA CMD
CALL CH_CMD ; SEND IT
CALL CH_RD ; GET DATA LENGTH
;CALL PC_SPACE ; *DEBUG*
;CALL PRTHEXBYTE ; *DEBUG* ;CALL PRTHEXBYTE ; *DEBUG*
JP NZ,CHSD_IOERR ; HANDLE IO ERROR
CALL CH_CMD_WR ; SEND WRITE USB DATA CMD
LD A,64 ; 64 BYTE CHUNK
CALL CH_WR ; SEND DATA BLOCK LENGTH
; ;
#IF (CHSD_FASTIO) #IF (CHSD_FASTIO)
; WRITE 64 BYTE CHUNK
PUSH BC ; SAVE LOOP CONTROL
LD B,64 ; WRITE 64 BYTES
LD B,A ; BYTE COUNT TO WRITE
LD C,(IY+CH_IOBASE) ; BASE PORT LD C,(IY+CH_IOBASE) ; BASE PORT
OTIR ; DO IT FAST OTIR ; DO IT FAST
POP BC ; RESTORE LOOP CONTROL
#ELSE #ELSE
; BYTE WRITE LOOP
PUSH BC ; SAVE LOOP CONTROL
LD B,64 ; WRITE 64 BYTES
LD B,A ; SAVE IT
CHSD_WRITE2: CHSD_WRITE2:
LD A,(HL) ; GET NEXT BYTE
CALL CH_WR ; WRITE DATA BYTE
LD (HL),A ; SAVE IN BUFFER
INC HL ; INC BUF PTR INC HL ; INC BUF PTR
CALL CH_WR ; WRITE NEXT BYTE
DJNZ CHSD_WRITE2 ; LOOP AS NEEDED
POP BC ; RESTORE LOOP CONTROL
DJNZ CHSD_WRITE2 ; LOOP TILL DONE W/ ALL BYTES
#ENDIF #ENDIF
; ;
; PREPARE FOR NEXT CHUNK
LD A,CH_CMD_DSKWRGO ; CONTINUE DISK READ
LD A,CH_CMD_BYTEWRGO ; BYTE WRITE GO COMMAND
CALL CH_CMD ; SEND IT CALL CH_CMD ; SEND IT
DJNZ CHSD_WRITE1 ; LOOP TILL DONE
;
; FINAL CHECK FOR COMPLETION & SUCCESS
CALL CH_POLL ; WAIT FOR COMPLETION
CP $14 ; SUCCESS?
JP NZ,CHSD_IOERR ; IF NOT, HANDLE ERROR
CALL CH_NAP
CALL CH_POLL ; GET RESULT
;CALL PC_SPACE ; *DEBUG*
;CALL PRTHEXBYTE ; *DEBUG*
CP $1E ; MORE?
JR Z,CHSD_WRITE1 ; IF SO, SEND MORE
CP $14 ; GOOD FINISH?
JP NZ,CHSD_IOERR ; HANDLE ERROR
; ;
; INCREMENT LBA ; INCREMENT LBA
PUSH HL ; SAVE HL PUSH HL ; SAVE HL
@ -1469,30 +1479,6 @@ CHSD_STATUS:
; ;
CHSD_RESET: CHSD_RESET:
;PRTS("\n\rRES SD:$") ; *DEBUG* ;PRTS("\n\rRES SD:$") ; *DEBUG*
;CALL CH_FLUSH ; DISCARD ANY GARBAGE
;CALL CH_RESET ; FULL CH37X RESET
;;;;
;;; ; RESET THE BUS
;;; LD A,CH_CMD_MODE ; SET MODE COMMAND
;;; CALL CH_CMD ; SEND IT
;;; LD A,7 ; RESET BUS
;;; CALL CH_WR ; SEND IT
;;; CALL CH_NAP ; SMALL WAIT
;;; CALL CH_RD ; GET RESULT
;;; CALL PC_SPACE ; *DEBUG*
;;; CALL PRTHEXBYTE ; *DEBUG*
;;; CALL CH_NAP ; SMALL WAIT
;;;;
;;; ; ACTIVATE USB MODE
;;; LD A,CH_CMD_MODE ; SET MODE COMMAND
;;; CALL CH_CMD ; SEND IT
;;; LD A,6 ; USB ENABLED, SEND SOF
;;; CALL CH_WR ; SEND IT
;;; CALL CH_NAP ; SMALL WAIT
;;; CALL CH_RD ; GET RESULT
;;; ;CALL PC_SPACE ; *DEBUG*
;;; ;CALL PRTHEXBYTE ; *DEBUG*
;;; CALL CH_NAP ; SMALL WAIT
; ;
; ACTIVATE SD MODE ; ACTIVATE SD MODE
LD A,CH_CMD_MODE ; SET MODE COMMAND LD A,CH_CMD_MODE ; SET MODE COMMAND
@ -1507,70 +1493,18 @@ CHSD_RESET:
; ;
LD A,CH_MODE_SD ; WE ARE NOW IN SD MODE LD A,CH_MODE_SD ; WE ARE NOW IN SD MODE
LD (CH_MODE),A ; SAVE IT LD (CH_MODE),A ; SAVE IT
;;;;
;;; ; INITIALIZE DISK
;;; LD B,24 ; TRY A FEW TIMES
;;;CHSD_RESET1:
;;; PRTS("\n\rDSKINIT:$") ; *DEBUG*
;;; LD A,CH_CMD_DSKINIT ; DISK INIT COMMAND
;;; CALL CH_CMD ; SEND IT
;;; LD DE,10000 ; 10000 * 16 = 160US ???
;;; LD DE,20000 ; 10000 * 16 = 160US ???
;;; LD DE,12500 ; 1250 * 16 = 200US ???
;;; CALL VDELAY ; DELAY
;;; CALL CH_POLL ; WAIT FOR RESULT
;;; CALL PC_SPACE ; *DEBUG*
;;; CALL PRTHEXBYTE ; *DEBUG*
;;; CP $14 ; SUCCESS?
;;; JR Z,CHSD_RESET2 ; IF SO, CONTINUE
;;; ;JR Z,CHSD_RESET1A ; IF SO, CHECK READY
;;; CP $16 ; NO MEDIA
;;; JP Z,CHSD_NOMEDIA ; HANDLE IT
;;; CALL CH_NAP ; SMALL DELAY
;;; DJNZ CHSD_RESET1 ; LOOP AS NEEDED
;;; JP CHSD_TO ; HANDLE TIMEOUT
;;;;;;;
;;;;;;CHSD_RESET1A:
;;;;;; CALL CHSD_DSKRES ; DISK RESET
;;;;;; CP $14 ; GOOD?
;;;;;; JR Z,CHSD_RESET2
;;;;;; CALL CHSD_DSKRDY ; CHECK IF DISK READY
;;;;;; CP $14 ; GOOD?
;;;;;; JR Z,CHSD_RESET2 ; IF SO, MOVE ON
;;;;;; DJNZ CHSD_RESET1 ; KEEP TRYING
;
CHSD_RESET2:
;
CALL CHSD_DSKMNT ; MOUNT DISK CALL CHSD_DSKMNT ; MOUNT DISK
RET NZ RET NZ
;
;CALL CHSD_AUTOSET ; *DEBUG*
;CALL CHSD_TSTCON ; *DEBUG*
;CALL CHSD_MAXLUN ; *DEBUG*
;CALL CHSD_DSKRDY ; *DEBUG*
;CALL CHSD_DSKINQ ; *DEBUG*
;;
CALL CHSD_DSKCAP ; GET AND RECORD DISK CAPACITY
RET NZ ; ABORT ON ERROR
; ;
; OPEN DISK IMAGE FILE ; OPEN DISK IMAGE FILE
LD DE,CHSD_FNAME LD DE,CHSD_FNAME
CALL CHSD_FOPEN CALL CHSD_FOPEN
RET NZ RET NZ
;;;;
;;; ; *DEBUG*
;;; LD HL,HB_WRKBUF
;;; LD E,1
;;; CALL CHSD_READ
;;;;
;;;;
;;; LD DE,HB_WRKBUF ; *DEBUG*
;;; CALL DUMP_BUFFER ; *DEBUG*
;
; GET FILESIZE
CALL CHSD_FILESIZE
RET NZ
; ;
; SET STATUS AND RETURN ; SET STATUS AND RETURN
XOR A ; CLEAR STATUS XOR A ; CLEAR STATUS
@ -1658,72 +1592,39 @@ CHSD_DSKMNT:
CALL CH_POLL ; WAIT FOR RESPONSE CALL CH_POLL ; WAIT FOR RESPONSE
;CALL PC_SPACE ; *DEBUG* ;CALL PC_SPACE ; *DEBUG*
;CALL PRTHEXBYTE ; *DEBUG* ;CALL PRTHEXBYTE ; *DEBUG*
CP $82 ; NO DISK?
JP Z,CHSD_NOMEDIA ; HANDLE NO MEDIA ERROR
CP $14 ; SUCCESS? CP $14 ; SUCCESS?
JP NZ,CHSD_CMDERR ; HANDLE ERROR JP NZ,CHSD_CMDERR ; HANDLE ERROR
; ;
; CALL CH_CMD_RD ; SEND READ COMMAND
; CALL CH_RD ; GET LENGTH
; ;CALL PC_SPACE ; *DEBUG*
; ;CALL PRTHEXBYTE ; *DEBUG*
; LD B,A ; LOOP COUNTER
; LD HL,HB_WRKBUF ; USE WORK BUFFER FOR DATA
;CHSD_DSKMNT1:
; CALL CH_RD ; GET A BYTE
; CALL PC_SPACE
; CALL PRTHEXBYTE
; LD (HL),A ; SAVE IT
; INC HL ; BUMP BUF PTR
; DJNZ CHSD_DSKMNT1 ; LOOP FOR ALL DATA
;;
; ;LD DE,HB_WRKBUF ; *DEBUG*
; ;CALL DUMP_BUFFER ; *DEBUG*
;;
; CALL CHSD_PRTPREFIX ; PRINT DEVICE PREFIX
; PRTS(" \"$")
; LD HL,HB_WRKBUF + 8
; LD B,28
;CHSD_DSKMNT2:
; LD A,(HL)
; INC HL
; CALL COUT
; DJNZ CHSD_DSKMNT2
; PRTS("\"$")
#IF FALSE
CALL CH_CMD_RD ; SEND READ COMMAND
CALL CH_RD ; GET LENGTH
;CALL PC_SPACE ; *DEBUG*
;CALL PRTHEXBYTE ; *DEBUG*
LD B,A ; LOOP COUNTER
LD HL,HB_WRKBUF ; USE WORK BUFFER FOR DATA
CHSD_DSKMNT1:
CALL CH_RD ; GET A BYTE
LD (HL),A ; SAVE IT
INC HL ; BUMP BUF PTR
DJNZ CHSD_DSKMNT1 ; LOOP FOR ALL DATA
; ;
XOR A
RET
;LD DE,HB_WRKBUF ; *DEBUG*
;CALL DUMP_BUFFER ; *DEBUG*
; ;
; PERFORM DISK CAPACITY
CALL CHSD_PRTPREFIX ; PRINT DEVICE PREFIX
LD HL,HB_WRKBUF + 8
LD B,28
CHSD_DSKMNT2:
LD A,(HL)
INC HL
CALL COUT
DJNZ CHSD_DSKMNT2
#ENDIF
; ;
CHSD_DSKCAP:
;PRTS("\n\rDSKCAP:$") ; *DEBUG*
LD A,CH_CMD_DSKCAP ; DISK CAPACITY COMMAND
CALL CH_CMD ; SEND IT
CALL CH_POLL ; WAIT FOR RESULT
;CALL PC_SPACE ; *DEBUG*
;CALL PRTHEXBYTE ; *DEBUG*
CP $14 ; SUCCESS?
JP NZ,CHSD_CMDERR ; HANDLE CMD ERROR
CALL CH_CMD_RD ; SEND READ USB DATA CMD
CALL CH_RD ; GET RD DATA LEN
;CALL PC_SPACE ; *DEBUG*
;CALL PRTHEXBYTE ; *DEBUG*
CP $04 ; MAKE SURE IT IS 8
JP NZ,CHSD_CMDERR ; HANDLE CMD ERROR
LD A,CHSD_MEDCAP ; MEDIA CAPACITY OFFSET
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
PUSH HL ; SAVE ADDRESS
CALL CH_RD
LD L,A
CALL CH_RD
LD H,A
CALL CH_RD
LD E,A
CALL CH_RD
LD D,A
POP BC ; RECOVER ADDRESS TO BC
CALL ST32 ; STORE IT
XOR A ; SIGNAL SUCCESS
RET ; AND DONE
XOR A
RET
; ;
; SET FILE NAME ; SET FILE NAME
; ;
@ -1754,10 +1655,48 @@ CHSD_FOPEN:
CALL CH_POLL ; WAIT FOR RESULT CALL CH_POLL ; WAIT FOR RESULT
;CALL PC_SPACE ; *DEBUG* ;CALL PC_SPACE ; *DEBUG*
;CALL PRTHEXBYTE ; *DEBUG* ;CALL PRTHEXBYTE ; *DEBUG*
CP $42 ; MISSING FILE?
JP Z,CHSD_NOFILE ; HANDLE ERROR
CP $14 ; SUCCESS? CP $14 ; SUCCESS?
JP NZ,CHSD_NOFILE ; HANDLE ERROR
JP NZ,CHSD_IOERR ; HANDLE ERROR
RET ; RETURN WITH ZF SET APPROPRIATELY RET ; RETURN WITH ZF SET APPROPRIATELY
; ;
; GET FILE SIZE
;
CHSD_FILESIZE:
;PRTS("\n\rFSIZE:$")
LD A,CH_CMD_FILESIZE ; FILE SIZE COMMAND
CALL CH_CMD ; SEND IT
LD A,$68 ; REQUIRED CMD PARAMETER
CALL CH_WR ; SEND IT
CALL CH_NAP
LD A,CHSD_MEDCAP ; MEDIA CAPACITY OFFSET
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
PUSH HL ; SAVE ADDRESS
CALL CH_RD
LD L,A
CALL CH_RD
LD H,A
CALL CH_RD
LD E,A
CALL CH_RD
LD D,A
;CALL PC_SPACE ; *DEBUG*
;CALL PRTHEX32 ; *DEBUG*
LD B,9 ; ROTATE 9 BITS FOR DIV 512
CHSD_FILESIZE1:
SRL D
RR E
RR H
RR L
DJNZ CHSD_FILESIZE1 ; LOOP TILL DONE
POP BC ; RECOVER ADDRESS TO BC
;CALL PC_SPACE ; *DEBUG*
;CALL PRTHEX32 ; *DEBUG*
CALL ST32 ; STORE IT
XOR A ; SIGNAL SUCCESS
RET ; AND DONE
;
; ERROR HANDLERS ; ERROR HANDLERS
; ;
; ;
@ -1853,7 +1792,7 @@ CHSD_PRTPREFIX:
CHSD_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT CHSD_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT
CHSD_DSKBUF .DW 0 CHSD_DSKBUF .DW 0
; ;
CHSD_FNAME .DB "/DISK.IMG",0
CHSD_FNAME .DB "/", CHSD_IMGFILE, 0
; ;
CHSD_STR_ST_MAP: CHSD_STR_ST_MAP:
.DW CHSD_STR_STOK .DW CHSD_STR_STOK
@ -1870,5 +1809,7 @@ CHSD_STR_STCMDERR .TEXT "COMMAND ERROR$"
CHSD_STR_STIOERR .TEXT "IO ERROR$" CHSD_STR_STIOERR .TEXT "IO ERROR$"
CHSD_STR_STTO .TEXT "TIMEOUT$" CHSD_STR_STTO .TEXT "TIMEOUT$"
CHSD_STR_STNOTSUP .TEXT "NOT SUPPORTED$" CHSD_STR_STNOTSUP .TEXT "NOT SUPPORTED$"
CHSD_STR_STNOFILE .TEXT "MISSING DISK IMAGE FILE$"
CHSD_STR_STNOFILE .TEXT "MISSING "
.TEXT CHSD_IMGFILE
.TEXT " FILE$"
CHSD_STR_STUNK .TEXT "UNKNOWN ERROR$" CHSD_STR_STUNK .TEXT "UNKNOWN ERROR$"

2
Source/ver.inc

@ -2,7 +2,7 @@
#DEFINE RMN 4 #DEFINE RMN 4
#DEFINE RUP 0 #DEFINE RUP 0
#DEFINE RTP 0 #DEFINE RTP 0
#DEFINE BIOSVER "3.4.0-dev.20"
#DEFINE BIOSVER "3.4.0-dev.21"
#define rmj RMJ #define rmj RMJ
#define rmn RMN #define rmn RMN
#define rup RUP #define rup RUP

2
Source/ver.lib

@ -3,5 +3,5 @@ rmn equ 4
rup equ 0 rup equ 0
rtp equ 0 rtp equ 0
biosver macro biosver macro
db "3.4.0-dev.20"
db "3.4.0-dev.21"
endm endm

Loading…
Cancel
Save