|
|
@ -17,13 +17,6 @@ |
|
|
; on CH376) resolved the issue for some devices, so that has been |
|
|
; on CH376) resolved the issue for some devices, so that has been |
|
|
; added to the RESET routine when using CH376. |
|
|
; added to the RESET routine when using CH376. |
|
|
; |
|
|
; |
|
|
; - The CH37x can get in an inconsistent state. The RESET_ALL command |
|
|
|
|
|
; will clear this, but the RESET_ALL command is very problematic on |
|
|
|
|
|
; the CH376. On the CH376, the hardware reset takes a very long |
|
|
|
|
|
; time (much longer than the documentation suggests). It seems to |
|
|
|
|
|
; work fine on the CH375, but since you don't know what chip you |
|
|
|
|
|
; are dealing with at that point, I have given up on using it. |
|
|
|
|
|
; |
|
|
|
|
|
; TODO: |
|
|
; TODO: |
|
|
; - Implement auto-recovery on error status. |
|
|
; - Implement auto-recovery on error status. |
|
|
; |
|
|
; |
|
|
@ -45,8 +38,12 @@ CHTYP_376 .EQU 2 ; CH376 |
|
|
CH_CMD_VER .EQU $01 ; GET IC VER |
|
|
CH_CMD_VER .EQU $01 ; GET IC VER |
|
|
CH_CMD_RESET .EQU $05 ; FULL CH37X RESET |
|
|
CH_CMD_RESET .EQU $05 ; FULL CH37X RESET |
|
|
CH_CMD_EXIST .EQU $06 ; CHECK EXISTS |
|
|
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_PKTSEC .EQU $0B ; SET PACKETS PER SECTOR |
|
|
|
|
|
CH_CMD_SETRETRY .EQU $0B ; SET RETRIES |
|
|
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_ABRTNAK .EQU $17 ; ABORT DEVICE NAK RETRIES |
|
|
CH_CMD_STAT .EQU $22 ; GET STATUS |
|
|
CH_CMD_STAT .EQU $22 ; GET STATUS |
|
|
CH_CMD_RD6 .EQU $27 ; READ USB DATA (375 & 376) |
|
|
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) |
|
|
@ -56,6 +53,7 @@ CH_CMD_DSKMNT .EQU $31 ; DISK MOUNT |
|
|
CH_CMD_DSKCAP .EQU $3E ; DISK CAPACITY |
|
|
CH_CMD_DSKCAP .EQU $3E ; DISK CAPACITY |
|
|
CH_CMD_AUTOSET .EQU $4D ; USB AUTO SETUP |
|
|
CH_CMD_AUTOSET .EQU $4D ; USB AUTO SETUP |
|
|
CH_CMD_DSKINIT .EQU $51 ; DISK INIT |
|
|
CH_CMD_DSKINIT .EQU $51 ; DISK INIT |
|
|
|
|
|
CH_CMD_DSKRES .EQU $52 ; DISK RESET |
|
|
CH_CMD_DSKSIZ .EQU $53 ; DISK SIZE |
|
|
CH_CMD_DSKSIZ .EQU $53 ; DISK SIZE |
|
|
CH_CMD_DSKRD .EQU $54 ; DISK READ |
|
|
CH_CMD_DSKRD .EQU $54 ; DISK READ |
|
|
CH_CMD_DSKRDGO .EQU $55 ; CONTINUE DISK READ |
|
|
CH_CMD_DSKRDGO .EQU $55 ; CONTINUE DISK READ |
|
|
@ -132,7 +130,7 @@ CH_INIT2: |
|
|
CALL PRTHEXBYTE ; DISPLAY IT |
|
|
CALL PRTHEXBYTE ; DISPLAY 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 |
|
|
JR Z,CH_INIT3 ; GO AHEAD IF CHIP FOUND |
|
|
JR Z,CH_INIT3 ; GO AHEAD IF CHIP FOUND |
|
|
LD DE,CH_STR_NOHW ; NOT PRESENT |
|
|
LD DE,CH_STR_NOHW ; NOT PRESENT |
|
|
@ -226,18 +224,18 @@ CH_WR: |
|
|
; SMALL DELAY REQUIRED AT STRATEGIC LOCATIONS |
|
|
; SMALL DELAY REQUIRED AT STRATEGIC LOCATIONS |
|
|
; |
|
|
; |
|
|
CH_NAP: |
|
|
CH_NAP: |
|
|
;CALL DELAY ; *DEBUG* |
|
|
|
|
|
;CALL DELAY ; *DEBUG* |
|
|
|
|
|
;CALL DELAY ; *DEBUG* |
|
|
|
|
|
JP DELAY |
|
|
JP DELAY |
|
|
; |
|
|
; |
|
|
; POLL WAITING FOR INTERRUPT |
|
|
; POLL WAITING FOR INTERRUPT |
|
|
; |
|
|
; |
|
|
CH_POLL: |
|
|
CH_POLL: |
|
|
|
|
|
PUSH BC ; SAVE BC |
|
|
PUSH HL ; SAVE HL |
|
|
PUSH HL ; SAVE HL |
|
|
CALL CH_NAP ; SMALL DELAY |
|
|
CALL CH_NAP ; SMALL DELAY |
|
|
LD HL,$8000 ; POLL LOOP COUNTER |
|
|
|
|
|
LD HL,0 ; *DEBUG* |
|
|
|
|
|
|
|
|
LD A,(CB_CPUMHZ) ; USE CPU SPEED AS CPU |
|
|
|
|
|
LD B,A ; ... SPEED COMP COUNTER |
|
|
|
|
|
CH_POLL0: |
|
|
|
|
|
LD HL,$8000 ; PRIMARY LOOP COUNTER |
|
|
CH_POLL1: |
|
|
CH_POLL1: |
|
|
CALL CH_STAT ; GET INT STATUS |
|
|
CALL CH_STAT ; GET INT STATUS |
|
|
BIT 7,A ; CHECK BIT |
|
|
BIT 7,A ; CHECK BIT |
|
|
@ -245,9 +243,10 @@ CH_POLL1: |
|
|
DEC HL ; DECREMENT COUNTER |
|
|
DEC HL ; DECREMENT COUNTER |
|
|
LD A,H ; CHECK |
|
|
LD A,H ; CHECK |
|
|
OR L ; ... LOOP COUNTER |
|
|
OR L ; ... LOOP COUNTER |
|
|
JR NZ,CH_POLL1 ; LOOP AS NEEDED |
|
|
|
|
|
;CALL PC_ASTERISK ; *DEBUG* |
|
|
|
|
|
|
|
|
JR NZ,CH_POLL1 ; INNER LOOP AS NEEDED |
|
|
|
|
|
DJNZ CH_POLL0 ; OUTER LOOP AS NEEDED |
|
|
POP HL ; RESTORE HL |
|
|
POP HL ; RESTORE HL |
|
|
|
|
|
POP BC ; RESTORE BC |
|
|
OR $FF ; FLAG TIMEOUT |
|
|
OR $FF ; FLAG TIMEOUT |
|
|
RET ; AND RETURN |
|
|
RET ; AND RETURN |
|
|
CH_POLL2: |
|
|
CH_POLL2: |
|
|
@ -255,7 +254,15 @@ CH_POLL2: |
|
|
CALL CH_CMD ; SEND IT |
|
|
CALL CH_CMD ; SEND IT |
|
|
CALL CH_NAP ; SMALL DELAY |
|
|
CALL CH_NAP ; SMALL DELAY |
|
|
CALL CH_RD ; GET RESULT |
|
|
CALL CH_RD ; GET RESULT |
|
|
|
|
|
;PUSH AF ; *DEBUG* |
|
|
|
|
|
;LD A,B ; *DEBUG* |
|
|
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
|
|
;CALL PC_LBKT ; *DEBUG* |
|
|
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
|
|
;CALL PC_RBKT ; *DEBUG* |
|
|
|
|
|
;POP AF ; *DEBUG* |
|
|
POP HL ; RESTORE HL |
|
|
POP HL ; RESTORE HL |
|
|
|
|
|
POP BC ; RESTORE BC |
|
|
RET ; AND RETURN |
|
|
RET ; AND RETURN |
|
|
; |
|
|
; |
|
|
; SEND READ USB DATA COMMAND |
|
|
; SEND READ USB DATA COMMAND |
|
|
@ -294,17 +301,12 @@ CH_CMD_WR1: |
|
|
; |
|
|
; |
|
|
; PERFORM A FULL HARDWARE RESET ON CH37X |
|
|
; PERFORM A FULL HARDWARE RESET ON CH37X |
|
|
; |
|
|
; |
|
|
; WARNING: CH376 CAN TAKE A VERY LONG TIME TO PROCESS THIS |
|
|
|
|
|
; COMMAND. PROBABLY DON'T WANT TO USE THIS. |
|
|
|
|
|
; |
|
|
|
|
|
CH_RESET: |
|
|
CH_RESET: |
|
|
;PRTS("\r\nHW RESET:$") ; *DEBUG* |
|
|
;PRTS("\r\nHW RESET:$") ; *DEBUG* |
|
|
PUSH DE |
|
|
PUSH DE |
|
|
LD A,CH_CMD_RESET |
|
|
LD A,CH_CMD_RESET |
|
|
CALL CH_CMD |
|
|
CALL CH_CMD |
|
|
; DOC SAYS 40MS, BUT I FOUND THAT TO BE INSUFFICIENT |
|
|
|
|
|
;LD DE,2500 ; 16US * 2500 = 40MS |
|
|
|
|
|
LD DE,10000 ; 16US * 10000 = 160MS |
|
|
|
|
|
|
|
|
LD DE,2500 ; 16US * 2500 = 40MS |
|
|
CALL VDELAY |
|
|
CALL VDELAY |
|
|
;CALL CH_RD ; *DEBUG* |
|
|
;CALL CH_RD ; *DEBUG* |
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
@ -658,20 +660,33 @@ CHUSB_RESET: |
|
|
; INITIALIZE DISK |
|
|
; INITIALIZE DISK |
|
|
LD B,24 ; TRY A FEW TIMES |
|
|
LD B,24 ; TRY A FEW TIMES |
|
|
CHUSB_RESET1: |
|
|
CHUSB_RESET1: |
|
|
|
|
|
;PRTS("\n\rDSKINIT:$") ; *DEBUG* |
|
|
LD A,CH_CMD_DSKINIT ; DISK INIT COMMAND |
|
|
LD A,CH_CMD_DSKINIT ; DISK INIT COMMAND |
|
|
CALL CH_CMD ; SEND IT |
|
|
CALL CH_CMD ; SEND IT |
|
|
LD DE,10000 ; 10000 * 16 = 160MS ??? |
|
|
|
|
|
|
|
|
LD DE,10000 ; 10000 * 16 = 160US ??? |
|
|
|
|
|
LD DE,20000 ; 10000 * 16 = 160US ??? |
|
|
|
|
|
LD DE,12500 ; 1250 * 16 = 200US ??? |
|
|
CALL VDELAY ; DELAY |
|
|
CALL VDELAY ; DELAY |
|
|
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 $14 ; SUCCESS? |
|
|
CP $14 ; SUCCESS? |
|
|
JR Z,CHUSB_RESET2 ; IF SO, MOVE ON |
|
|
|
|
|
|
|
|
JR Z,CHUSB_RESET2 ; IF SO, CONTINUE |
|
|
|
|
|
;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_RESET2: |
|
|
CHUSB_RESET2: |
|
|
; USE OF CH376 DISK_MOUNT COMMAND SEEMS TO IMPROVE |
|
|
; USE OF CH376 DISK_MOUNT COMMAND SEEMS TO IMPROVE |
|
|
@ -680,95 +695,13 @@ CHUSB_RESET2: |
|
|
CP CHTYP_376 ; IS CH376? |
|
|
CP CHTYP_376 ; IS CH376? |
|
|
CALL Z,CHUSB_DSKMNT ; IF SO, ISSUE MOUNT |
|
|
CALL Z,CHUSB_DSKMNT ; IF SO, ISSUE MOUNT |
|
|
;CALL CHUSB_AUTOSET ; *DEBUG* |
|
|
;CALL CHUSB_AUTOSET ; *DEBUG* |
|
|
; |
|
|
|
|
|
; GET AND STORE DISK CAPACITY |
|
|
|
|
|
;JP CHUSB_RESET2D ; *DEBUG* |
|
|
|
|
|
;LD A,(IY+CH_TYPE) ; GET DEVICE TYPE |
|
|
|
|
|
;CP CHTYP_375 |
|
|
|
|
|
;JR CHUSB_RESET2A |
|
|
|
|
|
;CP CHTYP_376 |
|
|
|
|
|
;JR CHUSB_RESET2B |
|
|
|
|
|
;JP CHUSB_CMDERR |
|
|
|
|
|
; |
|
|
|
|
|
CHUSB_RESET2A: |
|
|
|
|
|
; CH375 DISK SIZE |
|
|
|
|
|
LD A,CH_CMD_DSKSIZ ; DISK SIZE COMMAND |
|
|
|
|
|
CALL CH_CMD ; SEND IT |
|
|
|
|
|
CALL CH_POLL ; WAIT FOR RESULT |
|
|
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
|
|
CP $14 ; SUCCESS? |
|
|
|
|
|
;JP NZ,CHUSB_CMDERR ; HANDLE CMD ERROR |
|
|
|
|
|
JR NZ,CHUSB_RESET2D ; FAKE THE CAPACITY |
|
|
|
|
|
CALL CH_CMD_RD ; SEND READ USB DATA CMD |
|
|
|
|
|
CALL CH_RD ; GET RD DATA LEN |
|
|
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
|
|
CP $08 ; MAKE SURE IT IS 8 |
|
|
|
|
|
JP NZ,CHUSB_CMDERR ; HANDLE CMD ERROR |
|
|
|
|
|
LD A,CHUSB_MEDCAP ; MEDIA CAPACITY OFFSET |
|
|
|
|
|
CALL LDHLIYA ; HL := IY + A, REG A TRASHED |
|
|
|
|
|
PUSH HL ; SAVE ADDRESS |
|
|
|
|
|
CALL CH_RD |
|
|
|
|
|
LD D,A |
|
|
|
|
|
CALL CH_RD |
|
|
|
|
|
LD E,A |
|
|
|
|
|
CALL CH_RD |
|
|
|
|
|
LD H,A |
|
|
|
|
|
CALL CH_RD |
|
|
|
|
|
LD L,A |
|
|
|
|
|
CALL CH_RD |
|
|
|
|
|
CALL CH_RD |
|
|
|
|
|
CALL CH_RD |
|
|
|
|
|
CALL CH_RD |
|
|
|
|
|
POP BC ; RECOVER ADDRESS TO BC |
|
|
|
|
|
CALL ST32 ; STORE IT |
|
|
|
|
|
CALL CH_FLUSH ; DISCARD REMAINING CHARS |
|
|
|
|
|
JR CHUSB_RESET3 ; CONTINUE |
|
|
|
|
|
; |
|
|
|
|
|
CHUSB_RESET2B: |
|
|
|
|
|
; CH376 DISK CAPACITY |
|
|
|
|
|
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,CHUSB_CMDERR ; HANDLE CMD ERROR |
|
|
|
|
|
JR NZ,CHUSB_RESET2D ; FAKE THE CAPACITY |
|
|
|
|
|
CALL CH_CMD_RD ; SEND USB READ DATA |
|
|
|
|
|
CALL CH_RD ; GET RD DATA LEN |
|
|
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
|
|
CP $04 ; MAKE SURE IT IS 8 |
|
|
|
|
|
JP NZ,CHUSB_CMDERR ; HANDLE CMD ERROR |
|
|
|
|
|
LD A,CHUSB_MEDCAP ; MEDIA CAPACITY OFFSET |
|
|
|
|
|
CALL LDHLIYA ; HL := IY + A, REG A TRASHED |
|
|
|
|
|
CALL CH_RD |
|
|
|
|
|
LD B,4 ; 4 BYTES |
|
|
|
|
|
CHUSB_RESET2C: |
|
|
|
|
|
LD (HL),A |
|
|
|
|
|
INC HL |
|
|
|
|
|
CALL CH_RD |
|
|
|
|
|
DJNZ CHUSB_RESET2C |
|
|
|
|
|
JR CHUSB_RESET3 ; CONTINUE |
|
|
|
|
|
; |
|
|
|
|
|
CHUSB_RESET2D: |
|
|
|
|
|
; OLDER USB STICKS SEEM TO FAIL (PRIMARILY ON CH375). |
|
|
|
|
|
; FAILURE TO GET A DISK CAPACITY SHOULD NOT PREVENT THE |
|
|
|
|
|
; USE OF THE DISK. SO, WE PUNT, AND JUST PLUG IN 1GB. |
|
|
|
|
|
LD A,CHUSB_MEDCAP ; MEDIA CAPACITY OFFSET |
|
|
|
|
|
CALL LDHLIYA ; HL := IY + A, REG A TRASHED |
|
|
|
|
|
PUSH HL ; SAVE POINTER |
|
|
|
|
|
LD DE,$0020 ; 1GB IS $20000 SECTORS |
|
|
|
|
|
LD HL,$0000 |
|
|
|
|
|
POP BC ; RECOVER POINTER |
|
|
|
|
|
CALL ST32 ; SAVE FAKE CAPACITY |
|
|
|
|
|
; FALL THRU |
|
|
|
|
|
; |
|
|
|
|
|
CHUSB_RESET3: |
|
|
|
|
|
|
|
|
;CALL CHUSB_TSTCON ; *DEBUG* |
|
|
|
|
|
;CALL CHUSB_MAXLUN ; *DEBUG* |
|
|
;CALL CHUSB_DSKRDY ; *DEBUG* |
|
|
;CALL CHUSB_DSKRDY ; *DEBUG* |
|
|
;CALL CHUSB_DSKINQ ; *DEBUG* |
|
|
;CALL CHUSB_DSKINQ ; *DEBUG* |
|
|
|
|
|
;; |
|
|
|
|
|
CALL CHUSB_DSKSIZ ; GET AND RECORD DISK SIZE |
|
|
|
|
|
RET NZ ; ABORT ON ERROR |
|
|
; |
|
|
; |
|
|
; SET STATUS AND RETURN |
|
|
; SET STATUS AND RETURN |
|
|
XOR A ; CLEAR STATUS |
|
|
XOR A ; CLEAR STATUS |
|
|
@ -847,12 +780,11 @@ CHUSB_GEOM: |
|
|
; CH37X HELPER ROUTINES |
|
|
; CH37X HELPER ROUTINES |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
; PERFORM DISK INQUIRY |
|
|
|
|
|
; BASICALLY THE SCSI INQUIRY COMMAND |
|
|
|
|
|
|
|
|
; PERFORM DISK MOUNT |
|
|
; |
|
|
; |
|
|
CHUSB_DSKINQ: |
|
|
|
|
|
;PRTS("\n\rINQUIRY:$") ; *DEBUG* |
|
|
|
|
|
LD A,CH_CMD_DSKINQ ; DISK QUERY |
|
|
|
|
|
|
|
|
CHUSB_DSKMNT: |
|
|
|
|
|
;PRTS("\n\rMOUNT:$") ; *DEBUG* |
|
|
|
|
|
LD A,CH_CMD_DSKMNT ; DISK QUERY |
|
|
CALL CH_CMD ; DO IT |
|
|
CALL CH_CMD ; DO IT |
|
|
CALL CH_POLL ; WAIT FOR RESPONSE |
|
|
CALL CH_POLL ; WAIT FOR RESPONSE |
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
@ -863,11 +795,11 @@ CHUSB_DSKINQ: |
|
|
CALL CH_RD ; GET LENGTH |
|
|
CALL CH_RD ; GET LENGTH |
|
|
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 |
|
|
DSKINQ1: |
|
|
|
|
|
|
|
|
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 DSKINQ1 ; LOOP FOR ALL DATA |
|
|
|
|
|
|
|
|
DJNZ DSKMNT1 ; LOOP FOR ALL DATA |
|
|
; |
|
|
; |
|
|
;LD DE,HB_WRKBUF ; *DEBUG* |
|
|
;LD DE,HB_WRKBUF ; *DEBUG* |
|
|
;CALL DUMP_BUFFER ; *DEBUG* |
|
|
;CALL DUMP_BUFFER ; *DEBUG* |
|
|
@ -875,19 +807,59 @@ DSKINQ1: |
|
|
;CALL CHUSB_PRTPREFIX ; PRINT DEVICE PREFIX |
|
|
;CALL CHUSB_PRTPREFIX ; PRINT DEVICE PREFIX |
|
|
;LD HL,HB_WRKBUF + 8 |
|
|
;LD HL,HB_WRKBUF + 8 |
|
|
;LD B,28 |
|
|
;LD B,28 |
|
|
DSKINQ2: |
|
|
|
|
|
|
|
|
DSKMNT2: |
|
|
;LD A,(HL) |
|
|
;LD A,(HL) |
|
|
;INC HL |
|
|
;INC HL |
|
|
;CALL COUT |
|
|
;CALL COUT |
|
|
;DJNZ DSKINQ2 |
|
|
|
|
|
|
|
|
;DJNZ DSKMNT2 |
|
|
; |
|
|
; |
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
; PERFORM DISK MOUNT |
|
|
|
|
|
|
|
|
; PERFORM DISK SIZE |
|
|
; |
|
|
; |
|
|
CHUSB_DSKMNT: |
|
|
|
|
|
;PRTS("\n\rMOUNT:$") ; *DEBUG* |
|
|
|
|
|
LD A,CH_CMD_DSKMNT ; DISK QUERY |
|
|
|
|
|
|
|
|
CHUSB_DSKSIZ: |
|
|
|
|
|
;PRTS("\n\rDSKSIZ:$") ; *DEBUG* |
|
|
|
|
|
LD A,CH_CMD_DSKSIZ ; DISK SIZE COMMAND |
|
|
|
|
|
CALL CH_CMD ; SEND IT |
|
|
|
|
|
CALL CH_POLL ; WAIT FOR RESULT |
|
|
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
|
|
CP $14 ; SUCCESS? |
|
|
|
|
|
JP NZ,CHUSB_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 $08 ; MAKE SURE IT IS 8 |
|
|
|
|
|
JP NZ,CHUSB_CMDERR ; HANDLE CMD ERROR |
|
|
|
|
|
LD A,CHUSB_MEDCAP ; MEDIA CAPACITY OFFSET |
|
|
|
|
|
CALL LDHLIYA ; HL := IY + A, REG A TRASHED |
|
|
|
|
|
PUSH HL ; SAVE ADDRESS |
|
|
|
|
|
CALL CH_RD |
|
|
|
|
|
LD D,A |
|
|
|
|
|
CALL CH_RD |
|
|
|
|
|
LD E,A |
|
|
|
|
|
CALL CH_RD |
|
|
|
|
|
LD H,A |
|
|
|
|
|
CALL CH_RD |
|
|
|
|
|
LD L,A |
|
|
|
|
|
CALL CH_RD |
|
|
|
|
|
CALL CH_RD |
|
|
|
|
|
CALL CH_RD |
|
|
|
|
|
CALL CH_RD |
|
|
|
|
|
POP BC ; RECOVER ADDRESS TO BC |
|
|
|
|
|
CALL ST32 ; STORE IT |
|
|
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
|
|
RET ; AND DONE |
|
|
|
|
|
; |
|
|
|
|
|
#IF FALSE |
|
|
|
|
|
; |
|
|
|
|
|
; PERFORM DISK INQUIRY |
|
|
|
|
|
; BASICALLY THE SCSI INQUIRY COMMAND |
|
|
|
|
|
; |
|
|
|
|
|
CHUSB_DSKINQ: |
|
|
|
|
|
;PRTS("\n\rINQUIRY:$") ; *DEBUG* |
|
|
|
|
|
LD A,CH_CMD_DSKINQ ; DISK QUERY |
|
|
CALL CH_CMD ; DO IT |
|
|
CALL CH_CMD ; DO IT |
|
|
CALL CH_POLL ; WAIT FOR RESPONSE |
|
|
CALL CH_POLL ; WAIT FOR RESPONSE |
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
@ -898,11 +870,11 @@ CHUSB_DSKMNT: |
|
|
CALL CH_RD ; GET LENGTH |
|
|
CALL CH_RD ; GET LENGTH |
|
|
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: |
|
|
|
|
|
|
|
|
DSKINQ1: |
|
|
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 DSKINQ1 ; LOOP FOR ALL DATA |
|
|
; |
|
|
; |
|
|
;LD DE,HB_WRKBUF ; *DEBUG* |
|
|
;LD DE,HB_WRKBUF ; *DEBUG* |
|
|
;CALL DUMP_BUFFER ; *DEBUG* |
|
|
;CALL DUMP_BUFFER ; *DEBUG* |
|
|
@ -910,23 +882,56 @@ DSKMNT1: |
|
|
;CALL CHUSB_PRTPREFIX ; PRINT DEVICE PREFIX |
|
|
;CALL CHUSB_PRTPREFIX ; PRINT DEVICE PREFIX |
|
|
;LD HL,HB_WRKBUF + 8 |
|
|
;LD HL,HB_WRKBUF + 8 |
|
|
;LD B,28 |
|
|
;LD B,28 |
|
|
DSKMNT2: |
|
|
|
|
|
|
|
|
DSKINQ2: |
|
|
;LD A,(HL) |
|
|
;LD A,(HL) |
|
|
;INC HL |
|
|
;INC HL |
|
|
;CALL COUT |
|
|
;CALL COUT |
|
|
;DJNZ DSKMNT2 |
|
|
|
|
|
|
|
|
;DJNZ DSKINQ2 |
|
|
|
|
|
; |
|
|
|
|
|
RET |
|
|
|
|
|
; |
|
|
|
|
|
; PERFORM SET RETRIES |
|
|
|
|
|
; |
|
|
|
|
|
CHUSB_SETRETRY: |
|
|
|
|
|
;PRTS("\n\rSETRETRY:$") ; *DEBUG* |
|
|
|
|
|
LD A,CH_CMD_SETRETRY ; DISK READY |
|
|
|
|
|
CALL CH_CMD ; DO IT |
|
|
|
|
|
CALL CH_NAP |
|
|
|
|
|
LD A,$25 ; CONSTANT |
|
|
|
|
|
CALL CH_WR ; SEND IT |
|
|
|
|
|
CALL CH_NAP |
|
|
|
|
|
LD A,$BF ; MAX |
|
|
|
|
|
CALL CH_WR |
|
|
|
|
|
CALL CH_NAP |
|
|
|
|
|
CALL CH_RD ; GET RESULT |
|
|
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
|
|
; |
|
|
|
|
|
RET |
|
|
|
|
|
; |
|
|
|
|
|
; PERFORM DISK RESET |
|
|
|
|
|
; |
|
|
|
|
|
CHUSB_DSKRES: |
|
|
|
|
|
;PRTS("\n\rDSKRES:$") ; *DEBUG* |
|
|
|
|
|
LD A,CH_CMD_DSKRES ; DISK READY |
|
|
|
|
|
CALL CH_CMD ; DO IT |
|
|
|
|
|
CALL CH_POLL ; WAIT FOR RESPONSE |
|
|
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
; |
|
|
; |
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
; PERFORM DISK READY |
|
|
; PERFORM DISK READY |
|
|
; |
|
|
; |
|
|
CHUSB_DSKRDY: |
|
|
CHUSB_DSKRDY: |
|
|
;PRTS("\n\rREADY:$") ; *DEBUG* |
|
|
|
|
|
|
|
|
;PRTS("\n\rDSKRDY:$") ; *DEBUG* |
|
|
LD A,CH_CMD_DSKRDY ; DISK READY |
|
|
LD A,CH_CMD_DSKRDY ; DISK READY |
|
|
CALL CH_CMD ; DO IT |
|
|
CALL CH_CMD ; DO IT |
|
|
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 $14 ; *DEBUG* |
|
|
|
|
|
JR NZ,CHUSB_DSKRDY ; *DEBUG* |
|
|
; |
|
|
; |
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
@ -936,12 +941,44 @@ CHUSB_AUTOSET: |
|
|
;PRTS("\n\rAUTOSET:$") ; *DEBUG* |
|
|
;PRTS("\n\rAUTOSET:$") ; *DEBUG* |
|
|
LD A,CH_CMD_AUTOSET ; AUTOMATIC SETUP FOR USB |
|
|
LD A,CH_CMD_AUTOSET ; AUTOMATIC SETUP FOR USB |
|
|
CALL CH_CMD ; DO IT |
|
|
CALL CH_CMD ; DO IT |
|
|
|
|
|
CALL LDELAY ; *DEBUG* |
|
|
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* |
|
|
; |
|
|
; |
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
|
|
|
; PERFORM TEST CONNECT |
|
|
|
|
|
; |
|
|
|
|
|
CHUSB_TSTCON: |
|
|
|
|
|
;PRTS("\n\rTSTCON:$") ; *DEBUG* |
|
|
|
|
|
LD A,CH_CMD_TSTCON ; TEST USB DEVICE CONNECT |
|
|
|
|
|
CALL CH_CMD ; DO IT |
|
|
|
|
|
CALL CH_NAP ; WAIT A BIT |
|
|
|
|
|
CALL CH_RD ; GET RESPONSE |
|
|
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
|
|
; |
|
|
|
|
|
RET |
|
|
|
|
|
; |
|
|
|
|
|
; PERFORM GET MAX LUN |
|
|
|
|
|
; |
|
|
|
|
|
CHUSB_MAXLUN: |
|
|
|
|
|
;PRTS("\n\rMAXLUN:$") ; *DEBUG* |
|
|
|
|
|
LD A,CH_CMD_MAXLUN ; TEST USB DEVICE CONNECT |
|
|
|
|
|
CALL CH_CMD ; DO IT |
|
|
|
|
|
CALL CH_NAP ; WAIT A BIT |
|
|
|
|
|
LD A,$38 ; CONSTANT |
|
|
|
|
|
CALL CH_WR ; SEND IT |
|
|
|
|
|
CALL CH_NAP |
|
|
|
|
|
CALL CH_RD ; GET RESPONSE |
|
|
|
|
|
;CALL PC_SPACE ; *DEBUG* |
|
|
|
|
|
;CALL PRTHEXBYTE ; *DEBUG* |
|
|
|
|
|
; |
|
|
|
|
|
RET |
|
|
|
|
|
; |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
; |
|
|
; ERROR HANDLERS |
|
|
; ERROR HANDLERS |
|
|
; |
|
|
; |
|
|
; |
|
|
; |
|
|
|