|
|
|
@ -1,5 +1,4 @@ |
|
|
|
; |
|
|
|
; |
|
|
|
;================================================================================================== |
|
|
|
; CH375/376 USB/SD DRIVER |
|
|
|
;================================================================================================== |
|
|
|
@ -19,7 +18,7 @@ |
|
|
|
; added to the RESET routine when using CH376. |
|
|
|
; |
|
|
|
; TODO: |
|
|
|
; - Implement auto-recovery on error status. |
|
|
|
; - Implement auto-recovery on error status? |
|
|
|
; - !!! Move CH_MODE to config variable !!! |
|
|
|
; |
|
|
|
; 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_PKTSEC .EQU $0B ; SET PACKETS PER SECTOR |
|
|
|
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_TSTCON .EQU $16 ; TEST CONNECT |
|
|
|
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_WR5 .EQU $2B ; WRITE USB DATA (375) |
|
|
|
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_DSKMNT .EQU $31 ; DISK MOUNT |
|
|
|
CH_CMD_FOPEN .EQU $32 ; FILE OPEN (376) |
|
|
|
@ -143,6 +144,8 @@ CH_INIT2: |
|
|
|
LD A,(IY+CH_IOBASE) ; GET IO BASE ADDRES |
|
|
|
CALL PRTHEXBYTE ; DISPLAY IT |
|
|
|
; |
|
|
|
XOR A ; UNKNOWN MODE |
|
|
|
LD (CH_MODE),A ; SAVE IT |
|
|
|
;CALL CH_FLUSH ; FLUSH DEVICE OUTPUT QUEUE |
|
|
|
CALL CH_RESET ; FULL CH37X RESET |
|
|
|
CALL CH_DETECT ; DETECT CHIP PRESENCE |
|
|
|
@ -363,46 +366,45 @@ CH_GETVER: |
|
|
|
; |
|
|
|
; SET MODE TO VALUE IN A |
|
|
|
; 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: |
|
|
|
PUSH BC |
|
|
|
PUSH DE |
|
|
|
PUSH HL |
|
|
|
|
|
|
|
PUSH BC ; SAVE BC |
|
|
|
PUSH DE ; SAVE DE |
|
|
|
PUSH HL ; SAVE HL |
|
|
|
;PRTS("\r\nSETMODE:$") ; *DEBUG* |
|
|
|
|
|
|
|
|
|
|
|
LD L,A ; SAVE REQUESTED MODE |
|
|
|
LD A,(CH_MODE) ; GET CURRENT MODE |
|
|
|
|
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
|
|
|
|
CP L ; COMPARE |
|
|
|
JR Z,CH_SETMODE_Z ; IF EQUAL, DONE |
|
|
|
; |
|
|
|
; NEED TO CHANGE MODES |
|
|
|
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 |
|
|
|
JR CH_SETMODE_Z ; BAIL OUT |
|
|
|
; |
|
|
|
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: |
|
|
|
CALL CHSD_RESET |
|
|
|
JR CH_SETMODE_Z |
|
|
|
CALL CHSD_RESET ; FULL SD STACK RESET |
|
|
|
JR CH_SETMODE_Z ; MOVE ON |
|
|
|
; |
|
|
|
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 PRTHEXBYTE ; *DEBUG* |
|
|
|
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 |
|
|
|
JP Z,CHUSB_NOMEDIA ; HANDLE IT |
|
|
|
CALL CH_NAP ; SMALL DELAY |
|
|
|
DJNZ CHUSB_RESET1 ; LOOP AS NEEDED |
|
|
|
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: |
|
|
|
; USE OF CH376 DISK_MOUNT COMMAND SEEMS TO IMPROVE |
|
|
|
; COMPATIBILITY WITH SOME OLDER USB THUMBDRIVES. |
|
|
|
LD A,(IY+CH_TYPE) ; CH37X TYPE? |
|
|
|
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_TSTCON ; *DEBUG* |
|
|
|
;CALL CHUSB_MAXLUN ; *DEBUG* |
|
|
|
@ -862,28 +863,34 @@ CHUSB_DSKMNT: |
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
CP $14 ; SUCCESS? |
|
|
|
RET NZ ; ABORT IF NOT |
|
|
|
; |
|
|
|
#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 |
|
|
|
DSKMNT1: |
|
|
|
CHUSB_DSKMNT1: |
|
|
|
CALL CH_RD ; GET A BYTE |
|
|
|
LD (HL),A ; SAVE IT |
|
|
|
INC HL ; BUMP BUF PTR |
|
|
|
DJNZ DSKMNT1 ; LOOP FOR ALL DATA |
|
|
|
DJNZ CHUSB_DSKMNT1 ; LOOP FOR ALL DATA |
|
|
|
; |
|
|
|
;LD DE,HB_WRKBUF ; *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 |
|
|
|
; |
|
|
|
; PERFORM DISK SIZE |
|
|
|
@ -1161,6 +1168,8 @@ CHUSB_STR_STUNK .TEXT "UNKNOWN ERROR$" |
|
|
|
; CH375/376 SD CARD SUB-DRIVER |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
#DEFINE CHSD_IMGFILE "DISK.IMG" |
|
|
|
; |
|
|
|
CHSD_FASTIO .EQU TRUE ; USE INIR/OTIR? |
|
|
|
; |
|
|
|
; CHUSB DEVICE STATUS |
|
|
|
@ -1315,9 +1324,9 @@ CHSD_READ1: |
|
|
|
CALL CH_RD ; GET DATA LENGTH |
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
|
|
|
|
; |
|
|
|
#IF (CHSD_FASTIO) |
|
|
|
LD B,A |
|
|
|
LD B,A ; BYTE COUNT TO READ |
|
|
|
LD C,(IY+CH_IOBASE) ; BASE PORT |
|
|
|
INIR ; DO IT FAST |
|
|
|
#ELSE |
|
|
|
@ -1357,54 +1366,55 @@ CHSD_WRITE: |
|
|
|
CALL CH_SETMODE ; DO IT |
|
|
|
JP NZ,CHSD_CMDERR ; HANDLE ERROR |
|
|
|
; |
|
|
|
JP CHSD_IOERR |
|
|
|
|
|
|
|
CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR |
|
|
|
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: |
|
|
|
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* |
|
|
|
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) |
|
|
|
; 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 |
|
|
|
OTIR ; DO IT FAST |
|
|
|
POP BC ; RESTORE LOOP CONTROL |
|
|
|
#ELSE |
|
|
|
; BYTE WRITE LOOP |
|
|
|
PUSH BC ; SAVE LOOP CONTROL |
|
|
|
LD B,64 ; WRITE 64 BYTES |
|
|
|
LD B,A ; SAVE IT |
|
|
|
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 |
|
|
|
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 |
|
|
|
; |
|
|
|
; 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 |
|
|
|
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 |
|
|
|
PUSH HL ; SAVE HL |
|
|
|
@ -1469,30 +1479,6 @@ CHSD_STATUS: |
|
|
|
; |
|
|
|
CHSD_RESET: |
|
|
|
;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 |
|
|
|
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 (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 |
|
|
|
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 |
|
|
|
LD DE,CHSD_FNAME |
|
|
|
CALL CHSD_FOPEN |
|
|
|
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 |
|
|
|
XOR A ; CLEAR STATUS |
|
|
|
@ -1658,72 +1592,39 @@ CHSD_DSKMNT: |
|
|
|
CALL CH_POLL ; WAIT FOR RESPONSE |
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
CP $82 ; NO DISK? |
|
|
|
JP Z,CHSD_NOMEDIA ; HANDLE NO MEDIA ERROR |
|
|
|
CP $14 ; SUCCESS? |
|
|
|
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 |
|
|
|
; |
|
|
|
@ -1754,10 +1655,48 @@ CHSD_FOPEN: |
|
|
|
CALL CH_POLL ; WAIT FOR RESULT |
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
CP $42 ; MISSING FILE? |
|
|
|
JP Z,CHSD_NOFILE ; HANDLE ERROR |
|
|
|
CP $14 ; SUCCESS? |
|
|
|
JP NZ,CHSD_NOFILE ; HANDLE ERROR |
|
|
|
JP NZ,CHSD_IOERR ; HANDLE ERROR |
|
|
|
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 |
|
|
|
; |
|
|
|
; |
|
|
|
@ -1853,7 +1792,7 @@ CHSD_PRTPREFIX: |
|
|
|
CHSD_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT |
|
|
|
CHSD_DSKBUF .DW 0 |
|
|
|
; |
|
|
|
CHSD_FNAME .DB "/DISK.IMG",0 |
|
|
|
CHSD_FNAME .DB "/", CHSD_IMGFILE, 0 |
|
|
|
; |
|
|
|
CHSD_STR_ST_MAP: |
|
|
|
.DW CHSD_STR_STOK |
|
|
|
@ -1870,5 +1809,7 @@ CHSD_STR_STCMDERR .TEXT "COMMAND ERROR$" |
|
|
|
CHSD_STR_STIOERR .TEXT "IO ERROR$" |
|
|
|
CHSD_STR_STTO .TEXT "TIMEOUT$" |
|
|
|
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$" |
|
|
|
|