|
|
|
@ -235,28 +235,51 @@ IMM_DETECT: |
|
|
|
OUT (C),A ; DO IT |
|
|
|
CALL DELAY ; BRIEF DELAY FOR GOOD MEASURE |
|
|
|
; |
|
|
|
; WE USE THIS SEQUENCE TO DETECT AN ACTUAL IMM DEVICE ON THE |
|
|
|
; PARALLEL PORT. THE VALUES RECORDED IN THE FINAL CALL TO |
|
|
|
; IMM_DISCONNECT ARE USED TO CONFIRM DEVICE PRESENCE. |
|
|
|
; NO ACTUAL SCSI COMMANDS ARE USED. |
|
|
|
; ATTEMPT TO ESTABLISH A CONNECTION TO THE IMM DEVICE AND |
|
|
|
; ISSUE A SCSI BUS RESET. WE DON'T KNOW IF DEVICE IS THERE |
|
|
|
; YET. THIS IS DONE BLIND ASSUMING IT IS THERE. |
|
|
|
CALL IMM_DISCONNECT |
|
|
|
CALL IMM_CONNECT |
|
|
|
CALL IMM_DISCONNECT |
|
|
|
CALL IMM_RESETPULSE ; ISSUE A SCSI BUS RESET |
|
|
|
LD DE,62 ; WAIT A BIT |
|
|
|
CALL VDELAY |
|
|
|
; |
|
|
|
; THE IMM_SN VALUES ARE RECORDED IN THE CPP ROUTINE USED BY |
|
|
|
; IMM_CONNECT/DISCONNECT. |
|
|
|
; EXPECTING S1=$B8, S2=$18, S3=$38 |
|
|
|
LD A,(IMM_S1) |
|
|
|
CP $B8 |
|
|
|
RET NZ |
|
|
|
LD A,(IMM_S2) |
|
|
|
CP $18 |
|
|
|
RET NZ |
|
|
|
LD A,(IMM_S3) |
|
|
|
CP $38 |
|
|
|
RET NZ |
|
|
|
; USE AN ABBREVIATED VERSION OF SELECT PROCESSING TO |
|
|
|
; CHECK IF DEVICE EXISTS. |
|
|
|
IMM_WCTL($0C) |
|
|
|
CALL IMM_READSTATUS |
|
|
|
; |
|
|
|
XOR A |
|
|
|
#IF (IMMTRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; READY FOR SELECT? |
|
|
|
AND $08 |
|
|
|
CP $00 |
|
|
|
JR NZ,IMM_DETECT1 |
|
|
|
; |
|
|
|
IMM_WCTL($04) |
|
|
|
LD A,$80 | (1 << IMM_TGT) |
|
|
|
CALL IMM_WRITEDATA |
|
|
|
IMM_WCTL($0C) |
|
|
|
IMM_WCTL($0D) |
|
|
|
CALL DELAY |
|
|
|
CALL IMM_READSTATUS |
|
|
|
; |
|
|
|
#IF (IMMTRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; DID SELECT SUCCEED? |
|
|
|
AND $08 |
|
|
|
CP $08 |
|
|
|
; |
|
|
|
IMM_DETECT1: |
|
|
|
PUSH AF |
|
|
|
CALL IMM_DISCONNECT |
|
|
|
POP AF |
|
|
|
RET |
|
|
|
; |
|
|
|
;============================================================================= |
|
|
|
@ -305,10 +328,12 @@ IMM_WRITE: |
|
|
|
; |
|
|
|
; |
|
|
|
IMM_IO: |
|
|
|
LD (IMM_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS |
|
|
|
PUSH HL |
|
|
|
CALL IMM_CHKERR ; CHECK FOR ERR STATUS AND RESET IF SO |
|
|
|
POP HL |
|
|
|
JR NZ,IMM_IO3 ; BAIL OUT ON ERROR |
|
|
|
; |
|
|
|
LD (IMM_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS |
|
|
|
; SETUP LBA |
|
|
|
; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN |
|
|
|
LD HL,IMM_CMD_RW+1 ; START OF LBA FIELD IN CDB (MSB) |
|
|
|
@ -610,6 +635,10 @@ IMM_SELECT: |
|
|
|
; |
|
|
|
IMM_SELECT1: |
|
|
|
CALL IMM_READSTATUS |
|
|
|
#IF (IMMTRACE >= 3) |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
AND $08 |
|
|
|
JR Z,IMM_SELECT2 ; IF CLEAR, MOVE ON |
|
|
|
DEC HL |
|
|
|
@ -623,22 +652,8 @@ IMM_SELECT2: |
|
|
|
; PLACE HOST AND TARGET BIT ON DATA BUS |
|
|
|
LD A,$80 | (1 << IMM_TGT) |
|
|
|
CALL IMM_WRITEDATA |
|
|
|
CALL DELAY ; CONFIRM DELAY TIME? |
|
|
|
IMM_WCTL($0C) |
|
|
|
; |
|
|
|
#IF (IMMTRACE >= 3) |
|
|
|
CALL IMM_READSTATUS |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
IMM_WCTL($0D) |
|
|
|
; |
|
|
|
#IF (IMMTRACE >= 3) |
|
|
|
CALL IMM_READSTATUS |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
LD HL,500 ; TIMEOUT COUNTER |
|
|
|
; |
|
|
|
|