|
|
|
@ -10,10 +10,13 @@ |
|
|
|
; |
|
|
|
; CREATED BY WAYNE WARTHEN FOR ROMWBW HBIOS. |
|
|
|
; MUCH OF THE CODE IS DERIVED FROM LINUX AND FUZIX (ALAN COX). |
|
|
|
; - https://github.com/EtchedPixels/FUZIX |
|
|
|
; - https://github.com/torvalds/linux |
|
|
|
; |
|
|
|
; 5/23/2023 WBW - INITIAL RELEASE |
|
|
|
; 5/26/2023 WBW - CLEAN UP, LED ACTIVITY |
|
|
|
; 5/27/2023 WBW - ADDED SPP MODE |
|
|
|
; 05/23/2023 WBW - INITIAL RELEASE |
|
|
|
; 05/26/2023 WBW - CLEAN UP, LED ACTIVITY |
|
|
|
; 05/27/2023 WBW - ADDED SPP MODE |
|
|
|
; 06/06/2023 WBW - OPTIMIZE BLOCK READ AND WRITE |
|
|
|
; |
|
|
|
;============================================================================= |
|
|
|
; |
|
|
|
@ -71,8 +74,6 @@ |
|
|
|
; |
|
|
|
; TODO: |
|
|
|
; |
|
|
|
; - OPTIMIZE READ/WRITE LOOPS |
|
|
|
; |
|
|
|
; NOTES: |
|
|
|
; |
|
|
|
; - THIS DRIVER IS FOR THE ZIP DRIVE IMM INTERFACE. IT WILL SIMPLY |
|
|
|
@ -135,6 +136,12 @@ IMM_LBA .EQU 8 ; OFFSET OF LBA (DWORD) |
|
|
|
#DEFINE IMM_WCTL(VAL) LD A,VAL \ CALL IMM_WRITECTRL |
|
|
|
#DEFINE IMM_WDATA(VAL) LD A,VAL \ CALL IMM_WRITEDATA |
|
|
|
; |
|
|
|
; INCLUDE MG014 NIBBLE MAP FOR MG014 MODE |
|
|
|
; |
|
|
|
#IF (IMMMODE == IMMMODE_MG014) |
|
|
|
#DEFINE MG014_MAP |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
;============================================================================= |
|
|
|
; INITIALIZATION ENTRY POINT |
|
|
|
;============================================================================= |
|
|
|
@ -227,6 +234,8 @@ IMM_DETECT: |
|
|
|
#IF (IMMTRACE >= 3) |
|
|
|
PRTS("\r\nDETECT:$") |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (IMMMODE == IMMMODE_MG014) |
|
|
|
; INITIALIZE 8255 |
|
|
|
LD A,(IY+IMM_IOBASE) ; BASE PORT |
|
|
|
ADD A,IMM_IOSETUP ; BUMP TO SETUP PORT |
|
|
|
@ -234,6 +243,7 @@ IMM_DETECT: |
|
|
|
LD A,$82 ; CONFIG A OUT, B IN, C OUT |
|
|
|
OUT (C),A ; DO IT |
|
|
|
CALL DELAY ; BRIEF DELAY FOR GOOD MEASURE |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; ATTEMPT TO ESTABLISH A CONNECTION TO THE IMM DEVICE AND |
|
|
|
; ISSUE A SCSI BUS RESET. WE DON'T KNOW IF DEVICE IS THERE |
|
|
|
@ -349,7 +359,7 @@ IMM_IO: |
|
|
|
; |
|
|
|
; DO SCSI IO |
|
|
|
LD DE,(IMM_DSKBUF) ; DISK BUFFER TO DE |
|
|
|
LD BC,512 ; ONE SECTOR, 512 BYTES |
|
|
|
LD A,1 ; BLOCK I/O, ONE SECTOR |
|
|
|
LD HL,IMM_CMD_RW ; POINT TO READ/WRITE CMD TEMPLATE |
|
|
|
CALL IMM_RUNCMD ; RUN THE SCSI ENGINE |
|
|
|
CALL Z,IMM_CHKCMD ; IF EXIT OK, CHECK SCSI RESULTS |
|
|
|
@ -631,8 +641,7 @@ IMM_SELECT: |
|
|
|
#ENDIF |
|
|
|
IMM_WCTL($0C) |
|
|
|
; |
|
|
|
LD HL,500 ; TIMEOUT COUNTER |
|
|
|
; |
|
|
|
LD B,0 ; TIMEOUT COUNTER |
|
|
|
IMM_SELECT1: |
|
|
|
CALL IMM_READSTATUS |
|
|
|
#IF (IMMTRACE >= 3) |
|
|
|
@ -641,11 +650,8 @@ IMM_SELECT1: |
|
|
|
#ENDIF |
|
|
|
AND $08 |
|
|
|
JR Z,IMM_SELECT2 ; IF CLEAR, MOVE ON |
|
|
|
DEC HL |
|
|
|
LD A,H |
|
|
|
OR L |
|
|
|
JP Z,IMM_CMD_TIMEOUT ; TIMEOUT |
|
|
|
JR IMM_SELECT1 |
|
|
|
DJNZ IMM_SELECT1 |
|
|
|
JP IMM_CMD_TIMEOUT ; TIMEOUT |
|
|
|
; |
|
|
|
IMM_SELECT2: |
|
|
|
IMM_WCTL($04) |
|
|
|
@ -655,8 +661,7 @@ IMM_SELECT2: |
|
|
|
IMM_WCTL($0C) |
|
|
|
IMM_WCTL($0D) |
|
|
|
; |
|
|
|
LD HL,500 ; TIMEOUT COUNTER |
|
|
|
; |
|
|
|
LD B,0 ; TIMEOUT COUNTER |
|
|
|
IMM_SELECT3: |
|
|
|
CALL IMM_READSTATUS |
|
|
|
#IF (IMMTRACE >= 3) |
|
|
|
@ -665,11 +670,8 @@ IMM_SELECT3: |
|
|
|
#ENDIF |
|
|
|
AND $08 |
|
|
|
JR NZ,IMM_SELECT4 ; IF SET, MOVE ON |
|
|
|
DEC HL |
|
|
|
LD A,H |
|
|
|
OR L |
|
|
|
JP Z,IMM_CMD_TIMEOUT ; TIMEOUT |
|
|
|
JR IMM_SELECT3 |
|
|
|
DJNZ IMM_SELECT3 |
|
|
|
JP IMM_CMD_TIMEOUT ; TIMEOUT |
|
|
|
; |
|
|
|
IMM_SELECT4: |
|
|
|
IMM_WCTL($0C) |
|
|
|
@ -845,21 +847,20 @@ IMM_GETBYTE: |
|
|
|
RET |
|
|
|
; |
|
|
|
; GET A CHUNK OF DATA FROM SCSI BUS. THIS IS SPECIFICALLY FOR |
|
|
|
; READ PHASE. IF A LENGTH IS SPECIFIED (NON-ZERO HL), THEN THE |
|
|
|
; DATA IS BURST READ. IF NO LENGTH SPECIFIED, DATA IS READ AS |
|
|
|
; LONG AS SCSI DEVICE WANTS TO CONTINUE SENDING (NO OVERRUN |
|
|
|
; READ PHASE. IF TRANSFER MODE IS NON-ZERO, THEN A BLOCK (512 BYTES) |
|
|
|
; OF DATA WILL BE READ. OTHERWISE, DATA IS WRITTEN AS |
|
|
|
; LONG AS SCSI DEVICE WANTS TO CONTINUE RECEIVING (NO OVERRUN |
|
|
|
; CHECK IN THIS CASE). |
|
|
|
; |
|
|
|
; THIS IS A NIBBLE READ. |
|
|
|
; |
|
|
|
; DE=BUFFER |
|
|
|
; HL=LENGTH (0 FOR VARIABLE) |
|
|
|
; A=TRANSFER MODE (0=VARIABLE, 1=BLOCK) |
|
|
|
; |
|
|
|
IMM_GETDATA: |
|
|
|
; BRANCH TO CORRECT ROUTINE |
|
|
|
LD A,H |
|
|
|
OR L ; IF ZERO |
|
|
|
JR NZ,IMM_GETDATALEN ; DO BURST READ |
|
|
|
OR A |
|
|
|
JR NZ,IMM_GETBLOCK ; DO BLOCK READ |
|
|
|
; |
|
|
|
#IF (IMMTRACE >= 3) |
|
|
|
PRTS("\r\nGETDATA:$") |
|
|
|
@ -871,7 +872,6 @@ IMM_GETDATA1: |
|
|
|
POP HL ; RESTORE BYTE COUNTER |
|
|
|
CP $98 ; CHECK FOR READ PHASE |
|
|
|
JR NZ,IMM_GETDATA2 ; IF NOT, ASSUME WE ARE DONE |
|
|
|
IMM_WCTL($04) |
|
|
|
IMM_WCTL($06) |
|
|
|
CALL IMM_READSTATUS ; GET FIRST NIBBLE |
|
|
|
AND $F0 ; ISOLATE BITS |
|
|
|
@ -888,8 +888,7 @@ IMM_GETDATA1: |
|
|
|
LD (DE),A ; AND SAVE THE FULL BYTE VALUE |
|
|
|
INC DE ; NEXT BUFFER POS |
|
|
|
INC HL ; INCREMENT BYTES COUNTER |
|
|
|
IMM_WCTL($04) |
|
|
|
IMM_WCTL($0C) |
|
|
|
;IMM_WCTL($04) |
|
|
|
JR IMM_GETDATA1 ; LOOP TILL DONE |
|
|
|
; |
|
|
|
IMM_GETDATA2: |
|
|
|
@ -900,57 +899,111 @@ IMM_GETDATA2: |
|
|
|
PRTS(" BYTES$") |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
IMM_WCTL($0C) |
|
|
|
RET |
|
|
|
; |
|
|
|
IMM_GETDATALEN: |
|
|
|
IMM_GETBLOCK: |
|
|
|
; |
|
|
|
#IF (IMMTRACE >= 3) |
|
|
|
PRTS("\r\nGETDLEN:$") |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXWORDHL |
|
|
|
PRTS(" BYTES$") |
|
|
|
PRTS("\r\nGETBLK:$") |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
IMM_WCTL($04) |
|
|
|
IMM_GETDATALEN1: |
|
|
|
IMM_WCTL($06) |
|
|
|
CALL IMM_READSTATUS ; GET FIRST NIBBLE |
|
|
|
AND $F0 ; ISOLATE BITS |
|
|
|
RRCA ; MOVE TO LOW NIBBLE |
|
|
|
RRCA |
|
|
|
RRCA |
|
|
|
RRCA |
|
|
|
PUSH AF ; SAVE WORKING VALUE |
|
|
|
IMM_WCTL($05) |
|
|
|
CALL IMM_READSTATUS ; GET SECOND NIBBLE |
|
|
|
AND $F0 ; ISOLATE BITS |
|
|
|
POP BC ; RECOVER FIRST NIBBLE |
|
|
|
OR B ; COMBINE |
|
|
|
LD (DE),A ; SAVE FINAL BYTE VALUE |
|
|
|
INC DE ; NEXT BUFFER POS |
|
|
|
DEC HL ; DEC LOOP COUNTER |
|
|
|
IMM_WCTL($04) |
|
|
|
LD A,H ; CHECK LOOP COUNTER |
|
|
|
OR L |
|
|
|
JR NZ,IMM_GETDATALEN1 ; LOOP IF NOT DONE |
|
|
|
LD B,0 ; LOOP COUNTER |
|
|
|
EXX ; SWITCH TO ALT REGS |
|
|
|
EX AF,AF' ; SWITCH TO ALT AF |
|
|
|
; SAVE ALT REGS |
|
|
|
PUSH AF |
|
|
|
PUSH BC |
|
|
|
PUSH DE |
|
|
|
PUSH HL |
|
|
|
; C: PORT C |
|
|
|
LD A,(IY+IMM_IOBASE) ; BASE PORT |
|
|
|
INC A ; STATUS PORT |
|
|
|
LD (IMM_GETBLOCK_A),A ; FILL IN |
|
|
|
LD (IMM_GETBLOCK_B),A ; ... DYNAMIC BITS OF CODE |
|
|
|
INC A ; CONTROL PORT |
|
|
|
LD C,A ; ... TO C |
|
|
|
; DE: CLOCK VALUES |
|
|
|
#IF (IMMMODE == IMMMODE_MG014) |
|
|
|
LD D,$06 ^ ($0B | $80) |
|
|
|
LD E,$05 ^ ($0B | $80) |
|
|
|
#ENDIF |
|
|
|
#IF (IMMMODE == IMMMODE_SPP) |
|
|
|
LD D,$06 |
|
|
|
LD E,$05 |
|
|
|
#ENDIF |
|
|
|
; HL: STATMAP |
|
|
|
LD H,MG014_STATMAPLO >> 8 |
|
|
|
EXX ; SWITCH TO PRI REGS |
|
|
|
EX AF,AF' ; SWITCH TO PRI AF |
|
|
|
CALL IMM_GETBLOCK1 ; LOOP TWICE |
|
|
|
CALL IMM_GETBLOCK1 ; ... FOR 512 BYTES |
|
|
|
; RESTORE ALT REGS |
|
|
|
EXX ; SWITCH TO ALT REGS |
|
|
|
EX AF,AF' ; SWITCH TO ALT AF |
|
|
|
POP HL |
|
|
|
POP DE |
|
|
|
POP BC |
|
|
|
POP AF |
|
|
|
EXX ; SWITCH TO PRI REGS |
|
|
|
EX AF,AF' ; SWITCH TO PRI AF |
|
|
|
IMM_WCTL($0C) |
|
|
|
RET |
|
|
|
; |
|
|
|
IMM_GETBLOCK1: |
|
|
|
EXX ; ALT REGS |
|
|
|
OUT (C),D ; SEND FIRST CLOCK |
|
|
|
IMM_GETBLOCK_A .EQU $+1 |
|
|
|
IN A,($FF) ; GET LOW NIBBLE |
|
|
|
#IF (IMMMODE == IMMMODE_MG014) |
|
|
|
AND $0F ; RELEVANT BITS ONLY |
|
|
|
ADD A,MG014_STATMAPLO & $FF ; LOW BYTE OF MAP PTR |
|
|
|
LD L,A ; PUT IN L |
|
|
|
LD A,(HL) ; LOOKUP LOW NIBBLE VALUE |
|
|
|
EX AF,AF' ; ALT AF, SAVE NIBBLE |
|
|
|
#ENDIF |
|
|
|
#IF (IMMMODE == IMMMODE_SPP) |
|
|
|
AND $F0 ; RELEVANT BITS ONLY |
|
|
|
RLCA ; MOVE TO LOW NIBBLE |
|
|
|
RLCA ; MOVE TO LOW NIBBLE |
|
|
|
RLCA ; MOVE TO LOW NIBBLE |
|
|
|
RLCA ; MOVE TO LOW NIBBLE |
|
|
|
LD L,A ; SAVE NIBBLE IN L |
|
|
|
#ENDIF |
|
|
|
OUT (C),E ; SEND SECOND CLOCK |
|
|
|
IMM_GETBLOCK_B .EQU $+1 |
|
|
|
IN A,($FF) ; GET HIGH NIBBLE |
|
|
|
#IF (IMMMODE == IMMMODE_MG014) |
|
|
|
AND $0F ; RELEVANT BITS ONLY |
|
|
|
ADD A,MG014_STATMAPHI & $FF ; HIGH BYTE OF MAP PTR |
|
|
|
LD L,A ; PUT IN L |
|
|
|
EX AF,AF' ; PRI AF, RECOVER LOW NIBBLE VALUE |
|
|
|
OR (HL) ; COMBINE WITH HIGH NIB VALUE |
|
|
|
#ENDIF |
|
|
|
#IF (IMMMODE == IMMMODE_SPP) |
|
|
|
AND $F0 ; RELEVANT BITS ONLY |
|
|
|
OR L ; COMBINE WITH HIGH NIB VALUE |
|
|
|
#ENDIF |
|
|
|
EXX ; SWITCH TO PRI REGS |
|
|
|
LD (DE),A ; SAVE BYTE |
|
|
|
INC DE ; BUMP BUF PTR |
|
|
|
DJNZ IMM_GETBLOCK1 ; LOOP |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
; PUT A CHUNK OF DATA TO THE SCSI BUS. THIS IS SPECIFICALLY FOR |
|
|
|
; WRITE PHASE. IF A LENGTH IS SPECIFIED (NON-ZERO HL), THEN THE |
|
|
|
; DATA IS BURST WRITTEN. IF NO LENGTH SPECIFIED, DATA IS WRITTEN AS |
|
|
|
; WRITE PHASE. IF TRANSFER MODE IS NON-ZERO, THEN A BLOCK (512 BYTES) |
|
|
|
; OF DATA WILL BE WRITTEN. OTHERWISE, DATA IS WRITTEN AS |
|
|
|
; LONG AS SCSI DEVICE WANTS TO CONTINUE RECEIVING (NO OVERRUN |
|
|
|
; CHECK IN THIS CASE). |
|
|
|
; |
|
|
|
; READS ARE DONE AS BYTE PAIRS. EACH LOOP READS 2 BYTES. |
|
|
|
; |
|
|
|
; DE=BUFFER |
|
|
|
; HL=LENGTH (0 FOR VARIABLE) |
|
|
|
; A=TRANSFER MODE (0=VARIABLE, 1=BLOCK) |
|
|
|
; |
|
|
|
IMM_PUTDATA: |
|
|
|
LD A,H |
|
|
|
OR L |
|
|
|
JR NZ,IMM_PUTDATALEN |
|
|
|
; BRANCH TO CORRECT ROUTINE |
|
|
|
OR A |
|
|
|
JR NZ,IMM_PUTBLOCK ; DO BLOCK WRITE |
|
|
|
; |
|
|
|
#IF (IMMTRACE >= 3) |
|
|
|
PRTS("\r\nPUTDATA:$") |
|
|
|
@ -962,7 +1015,7 @@ IMM_PUTDATA1: |
|
|
|
POP HL ; RESTORE BYTE COUNTER |
|
|
|
CP $88 ; CHECK FOR WRITE PHASE |
|
|
|
JR NZ,IMM_PUTDATA2 ; IF NOT, ASSUME WE ARE DONE |
|
|
|
IMM_WCTL($04) |
|
|
|
;IMM_WCTL($04) |
|
|
|
LD A,(DE) ; GET NEXT BYTE TO WRITE (FIRST OF PAIR) |
|
|
|
CALL IMM_WRITEDATA ; PUT ON BUS |
|
|
|
INC DE ; BUMP TO NEXT BUF POS |
|
|
|
@ -986,33 +1039,47 @@ IMM_PUTDATA2: |
|
|
|
; |
|
|
|
RET |
|
|
|
; |
|
|
|
IMM_PUTDATALEN: |
|
|
|
IMM_PUTBLOCK: |
|
|
|
; |
|
|
|
#IF (IMMTRACE >= 3) |
|
|
|
PRTS("\r\nPUTDLEN:$") |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTHEXWORDHL |
|
|
|
PRTS(" BYTES$") |
|
|
|
PRTS("\r\nPUTBLK:$") |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
IMM_WCTL($04) |
|
|
|
IMM_PUTDATALEN1: |
|
|
|
LD A,(DE) ; GET NEXT BYTE (FIRST OF PAIR) |
|
|
|
CALL IMM_WRITEDATA ; PUT ON BUS |
|
|
|
INC DE ; INCREMENT BUF POS |
|
|
|
DEC HL ; DEC LOOP COUNTER |
|
|
|
IMM_WCTL($05) |
|
|
|
LD A,(DE) ; GET NEXT BYTE (SECOND OF PAIR) |
|
|
|
CALL IMM_WRITEDATA ; PUT ON BUS |
|
|
|
INC DE ; INCREMENT BUF POS |
|
|
|
DEC HL ; DEC LOOP COUNTER |
|
|
|
IMM_WCTL($00) |
|
|
|
LD A,H ; CHECK LOOP COUNTER |
|
|
|
OR L |
|
|
|
JR NZ,IMM_PUTDATALEN1 ; LOOP TILL DONE |
|
|
|
LD B,0 ; LOOP COUNTER |
|
|
|
LD A,(IY+IMM_IOBASE) ; GET BASE IO ADR |
|
|
|
LD (IMM_PUTBLOCK_A),A ; FILL IN |
|
|
|
LD (IMM_PUTBLOCK_B),A ; ... DYNAMIC BITS OF CODE |
|
|
|
INC A ; STATUS PORT |
|
|
|
INC A ; CONTROL PORT |
|
|
|
LD C,A ; ... TO C |
|
|
|
; HL: CLOCK VALUES |
|
|
|
#IF (IMMMODE == IMMMODE_MG014) |
|
|
|
LD H,$05 ^ ($0B | $80) |
|
|
|
LD L,$00 ^ ($0B | $80) |
|
|
|
#ENDIF |
|
|
|
#IF (IMMMODE == IMMMODE_SPP) |
|
|
|
LD H,$05 |
|
|
|
LD L,$00 |
|
|
|
#ENDIF |
|
|
|
CALL IMM_PUTBLOCK1 ; ONE LOOP CUZ BYTE PAIRS |
|
|
|
IMM_WCTL($04) |
|
|
|
RET |
|
|
|
; |
|
|
|
IMM_PUTBLOCK1: |
|
|
|
LD A,(DE) ; GET NEXT BYTE |
|
|
|
IMM_PUTBLOCK_A .EQU $+1 |
|
|
|
OUT ($FF),A ; PUT ON BUS |
|
|
|
INC DE ; INCREMENT BUF POS |
|
|
|
OUT (C),H ; FIRST CLOCK |
|
|
|
LD A,(DE) ; GET NEXT BYTE |
|
|
|
IMM_PUTBLOCK_B .EQU $+1 |
|
|
|
OUT ($FF),A ; PUT ON BUS |
|
|
|
INC DE ; INCREMENT BUF POS |
|
|
|
OUT (C),L ; SECOND CLOCK |
|
|
|
DJNZ IMM_PUTBLOCK1 ; LOOP |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
; READ SCSI COMMAND STATUS |
|
|
|
; |
|
|
|
IMM_GETSTATUS: |
|
|
|
@ -1056,7 +1123,7 @@ IMM_ENDREAD: |
|
|
|
; |
|
|
|
; HL: COMMAND BUFFER |
|
|
|
; DE: TRANSFER BUFFER |
|
|
|
; BC: TRANSFER LENGTH (0=VARIABLE) |
|
|
|
; A: TRANSFER MODE (0=VARIABLE, 1=BLOCK) |
|
|
|
; |
|
|
|
IMM_RUNCMD: |
|
|
|
; THERE ARE MANY PLACES NESTED WITHIN THE ROUTINES THAT |
|
|
|
@ -1065,7 +1132,7 @@ IMM_RUNCMD: |
|
|
|
; SEE IMM_CMD_ERR BELOW. |
|
|
|
LD (IMM_CMDSTK),SP ; FOR ERROR ABORTS |
|
|
|
LD (IMM_DSKBUF),DE ; SAVE BUF PTR |
|
|
|
LD (IMM_XFRLEN),BC ; SAVE XFER LEN |
|
|
|
LD (IMM_XFRMODE),A ; SAVE XFER LEN |
|
|
|
PUSH HL |
|
|
|
CALL IMM_CONNECT ; PARALLEL PORT BUS CONNECT |
|
|
|
CALL IMM_SELECT ; SELECT TARGET DEVICE |
|
|
|
@ -1096,7 +1163,7 @@ IMM_RUNCMD_PHASE: |
|
|
|
; |
|
|
|
IMM_RUNCMD_WRITE: |
|
|
|
LD DE,(IMM_DSKBUF) ; XFER BUFFER |
|
|
|
LD HL,(IMM_XFRLEN) ; XFER LENGTH |
|
|
|
LD A,(IMM_XFRMODE) ; XFER MODE |
|
|
|
CALL IMM_PUTDATA ; SEND DATA NOW |
|
|
|
JR IMM_RUNCMD_PHASE ; BACK TO DISPATCH |
|
|
|
; |
|
|
|
@ -1105,7 +1172,7 @@ IMM_RUNCMD_READ: |
|
|
|
CALL IMM_WAIT ; WAIT TILL READY |
|
|
|
; CHECK FOR STATUS $98??? |
|
|
|
LD DE,(IMM_DSKBUF) ; XFER BUFFER |
|
|
|
LD HL,(IMM_XFRLEN) ; XFER LENGTH |
|
|
|
LD A,(IMM_XFRMODE) ; XFER MODE |
|
|
|
CALL IMM_GETDATA ; GET THE DATA NOW |
|
|
|
CALL IMM_ENDREAD ; TERMINATE THE READ |
|
|
|
JR IMM_RUNCMD_PHASE ; BACK TO DISPATCH |
|
|
|
@ -1162,7 +1229,7 @@ IMM_CHKCMD: |
|
|
|
IMM_CHKCMD1: |
|
|
|
; USE REQUEST SENSE CMD TO GET ERROR DETAILS |
|
|
|
LD DE,HB_WRKBUF ; PUT DATA IN WORK BUF |
|
|
|
LD BC,0 ; VARIABLE LENGTH REQUEST |
|
|
|
LD A,0 ; VARIABLE LENGTH REQUEST |
|
|
|
LD HL,IMM_CMD_SENSE ; REQUEST SENSE CMD |
|
|
|
CALL IMM_RUNCMD ; DO IT |
|
|
|
JP NZ,IMM_IOERR ; BAIL IF ERROR IN CMD |
|
|
|
@ -1199,6 +1266,8 @@ IMM_CHKERR: |
|
|
|
; (RE)INITIALIZE DEVICE |
|
|
|
; |
|
|
|
IMM_INITDEV: |
|
|
|
; |
|
|
|
#IF (IMMMODE == IMMMODE_MG014) |
|
|
|
; INITIALIZE 8255 |
|
|
|
LD A,(IY+IMM_IOBASE) ; BASE PORT |
|
|
|
ADD A,IMM_IOSETUP ; BUMP TO SETUP PORT |
|
|
|
@ -1206,6 +1275,7 @@ IMM_INITDEV: |
|
|
|
LD A,$82 ; CONFIG A OUT, B IN, C OUT |
|
|
|
OUT (C),A ; DO IT |
|
|
|
CALL DELAY ; SHORT DELAY FOR BUS SETTLE |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
CALL IMM_DISCONNECT ; DISCONNECT FIRST JUST IN CASE |
|
|
|
CALL IMM_CONNECT ; NOW CONNECT TO BUS |
|
|
|
@ -1227,7 +1297,7 @@ IMM_INITDEV1: |
|
|
|
; |
|
|
|
; REQUEST SENSE COMMAND |
|
|
|
LD DE,HB_WRKBUF ; BUFFER FOR SENSE DATA |
|
|
|
LD BC,0 ; READ WHATEVER IS SENT |
|
|
|
LD A,0 ; READ WHATEVER IS SENT |
|
|
|
LD HL,IMM_CMD_SENSE ; POINT TO CMD BUFFER |
|
|
|
CALL IMM_RUNCMD ; RUN THE SCSI ENGINE |
|
|
|
JR NZ,IMM_INITDEV2 ; CMD PROC ERROR |
|
|
|
@ -1257,7 +1327,7 @@ IMM_INITDEV2: |
|
|
|
IMM_INITDEV3: |
|
|
|
; READ & RECORD DEVICE CAPACITY |
|
|
|
LD DE,HB_WRKBUF ; BUFFER TO CAPACITY RESPONSE |
|
|
|
LD BC,0 ; READ WHATEVER IS SENT |
|
|
|
LD A,0 ; READ WHATEVER IS SENT |
|
|
|
LD HL,IMM_CMD_RDCAP ; POINT TO READ CAPACITY CMD |
|
|
|
CALL IMM_RUNCMD ; RUN THE SCSI ENGINE |
|
|
|
CALL Z,IMM_CHKCMD ; CHECK AND RECORD ANY ERRORS |
|
|
|
@ -1420,7 +1490,7 @@ IMM_STR_NOHW .TEXT "NOT PRESENT$" |
|
|
|
IMM_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT |
|
|
|
IMM_CMDSTK .DW 0 ; STACK PTR FOR CMD ABORTING |
|
|
|
IMM_DSKBUF .DW 0 ; WORKING DISK BUFFER POINTER |
|
|
|
IMM_XFRLEN .DW 0 ; WORKING TRANSFER LENGTH |
|
|
|
IMM_XFRMODE .DB 0 ; 0=VARIABLE, 1=BLOCK (512 BYTES) |
|
|
|
IMM_CMDSTAT .DB 0, 0 ; CMD RESULT STATUS |
|
|
|
; |
|
|
|
; SCSI COMMAND TEMPLATES (LENGTH PREFIXED) |
|
|
|
|