|
|
@ -6,20 +6,47 @@ |
|
|
; PARALLEL PORT INTERFACE FOR SCSI DISK DEVICES USING A PARALLEL PORT |
|
|
; PARALLEL PORT INTERFACE FOR SCSI DISK DEVICES USING A PARALLEL PORT |
|
|
; ADAPTER. PRIMARILY TARGETS PARALLEL PORT IOMEGA ZIP DRIVES. |
|
|
; ADAPTER. PRIMARILY TARGETS PARALLEL PORT IOMEGA ZIP DRIVES. |
|
|
; |
|
|
; |
|
|
; CURRENTLY CODED SPECIFICALLY FOR RCBUS MG014 PARALLEL PORT HARDWARE. |
|
|
|
|
|
; INTENDED TO CO-EXIST WITH LPT DRIVER. |
|
|
; INTENDED TO CO-EXIST WITH LPT DRIVER. |
|
|
; |
|
|
; |
|
|
; CREATED BY WAYNE WARTHEN FOR ROMWBW HBIOS. |
|
|
; CREATED BY WAYNE WARTHEN FOR ROMWBW HBIOS. |
|
|
; MUCH OF THE CODE IS DERIVED FROM FUZIX (ALAN COX). |
|
|
; MUCH OF THE CODE IS DERIVED FROM FUZIX (ALAN COX). |
|
|
; |
|
|
; |
|
|
; 5/23/2023 WBW - INITIAL RELEASE |
|
|
; 5/23/2023 WBW - INITIAL RELEASE |
|
|
; 5/26/3023 WBW - CLEAN UP, LED ACTIVITY |
|
|
|
|
|
|
|
|
; 5/26/2023 WBW - CLEAN UP, LED ACTIVITY |
|
|
|
|
|
; 5/27/2023 WBW - ADDED SPP MODE |
|
|
; |
|
|
; |
|
|
;============================================================================= |
|
|
;============================================================================= |
|
|
; |
|
|
; |
|
|
; MG014 STYLE INTERFACE (USED BY RCBUS MG014 MODULE): |
|
|
|
|
|
|
|
|
; IBM PC STANDARD PARALLEL PORT (SPP): |
|
|
|
|
|
; - NHYODYNE PRINT MODULE |
|
|
; |
|
|
; |
|
|
; PORT 0 (INPUT/OUTPUT): |
|
|
|
|
|
|
|
|
; PORT 0 (OUTPUT): |
|
|
|
|
|
; |
|
|
|
|
|
; D7 D6 D5 D4 D3 D2 D1 D0 |
|
|
|
|
|
; +-------+-------+-------+-------+-------+-------+-------+-------+ |
|
|
|
|
|
; | PD7 | PD6 | PD5 | PD4 | PD3 | PD2 | PD1 | PD0 | |
|
|
|
|
|
; +-------+-------+-------+-------+-------+-------+-------+-------+ |
|
|
|
|
|
; |
|
|
|
|
|
; PORT 1 (INPUT): |
|
|
|
|
|
; |
|
|
|
|
|
; D7 D6 D5 D4 D3 D2 D1 D0 |
|
|
|
|
|
; +-------+-------+-------+-------+-------+-------+-------+-------+ |
|
|
|
|
|
; | /BUSY | /ACK | POUT | SEL | /ERR | 0 | 0 | 0 | |
|
|
|
|
|
; +-------+-------+-------+-------+-------+-------+-------+-------+ |
|
|
|
|
|
; |
|
|
|
|
|
; PORT 2 (OUTPUT): |
|
|
|
|
|
; |
|
|
|
|
|
; D7 D6 D5 D4 D3 D2 D1 D0 |
|
|
|
|
|
; +-------+-------+-------+-------+-------+-------+-------+-------+ |
|
|
|
|
|
; | STAT1 | STAT0 | ENBL | PINT | SEL | RES | LF | STB | |
|
|
|
|
|
; +-------+-------+-------+-------+-------+-------+-------+-------+ |
|
|
|
|
|
; |
|
|
|
|
|
;============================================================================= |
|
|
|
|
|
; |
|
|
|
|
|
; MG014 STYLE INTERFACE: |
|
|
|
|
|
; - RCBUS MG014 MODULE |
|
|
|
|
|
; |
|
|
|
|
|
; PORT 0 (OUTPUT): |
|
|
; |
|
|
; |
|
|
; D7 D6 D5 D4 D3 D2 D1 D0 |
|
|
; D7 D6 D5 D4 D3 D2 D1 D0 |
|
|
; +-------+-------+-------+-------+-------+-------+-------+-------+ |
|
|
; +-------+-------+-------+-------+-------+-------+-------+-------+ |
|
|
@ -33,7 +60,7 @@ |
|
|
; | | | | /ERR | SEL | POUT | BUSY | /ACK | |
|
|
; | | | | /ERR | SEL | POUT | BUSY | /ACK | |
|
|
; +-------+-------+-------+-------+-------+-------+-------+-------+ |
|
|
; +-------+-------+-------+-------+-------+-------+-------+-------+ |
|
|
; |
|
|
; |
|
|
; PORT 2 (INPUT/OUTPUT): |
|
|
|
|
|
|
|
|
; PORT 2 (OUTPUT): |
|
|
; |
|
|
; |
|
|
; D7 D6 D5 D4 D3 D2 D1 D0 |
|
|
; D7 D6 D5 D4 D3 D2 D1 D0 |
|
|
; +-------+-------+-------+-------+-------+-------+-------+-------+ |
|
|
; +-------+-------+-------+-------+-------+-------+-------+-------+ |
|
|
@ -44,8 +71,6 @@ |
|
|
; |
|
|
; |
|
|
; TODO: |
|
|
; TODO: |
|
|
; |
|
|
; |
|
|
; - CLEAN UP WAIT LOOP STUFF |
|
|
|
|
|
; |
|
|
|
|
|
; - OPTIMIZE READ/WRITE LOOPS |
|
|
; - OPTIMIZE READ/WRITE LOOPS |
|
|
; |
|
|
; |
|
|
; NOTES: |
|
|
; NOTES: |
|
|
@ -86,12 +111,11 @@ IMM_TGT .EQU 6 |
|
|
; IMM DEVICE STATUS |
|
|
; IMM DEVICE STATUS |
|
|
; |
|
|
; |
|
|
IMM_STOK .EQU 0 |
|
|
IMM_STOK .EQU 0 |
|
|
IMM_STINVUNIT .EQU -1 |
|
|
|
|
|
IMM_STNOMEDIA .EQU -2 |
|
|
|
|
|
IMM_STCMDERR .EQU -3 |
|
|
|
|
|
IMM_STIOERR .EQU -4 |
|
|
|
|
|
IMM_STTO .EQU -5 |
|
|
|
|
|
IMM_STNOTSUP .EQU -6 |
|
|
|
|
|
|
|
|
IMM_STNOMEDIA .EQU -1 |
|
|
|
|
|
IMM_STCMDERR .EQU -2 |
|
|
|
|
|
IMM_STIOERR .EQU -3 |
|
|
|
|
|
IMM_STTO .EQU -4 |
|
|
|
|
|
IMM_STNOTSUP .EQU -5 |
|
|
; |
|
|
; |
|
|
; IMM DEVICE CONFIGURATION |
|
|
; IMM DEVICE CONFIGURATION |
|
|
; |
|
|
; |
|
|
@ -130,15 +154,13 @@ IMM_INIT2: |
|
|
; |
|
|
; |
|
|
PRTS(" MODE=$") ; LABEL FOR MODE |
|
|
PRTS(" MODE=$") ; LABEL FOR MODE |
|
|
LD A,(IY+IMM_MODE) ; GET MODE BITS |
|
|
LD A,(IY+IMM_MODE) ; GET MODE BITS |
|
|
LD DE,IMM_STR_MODE_NONE ; MODE LABEL |
|
|
|
|
|
CP IMMMODE_NONE ; TEST FOR MODE |
|
|
|
|
|
JR Z,IMM_INIT3 ; IF SO, DISPLAY IT |
|
|
|
|
|
LD DE,IMM_STR_MODE_MG014 ; MODE LABEL |
|
|
|
|
|
CP IMMMODE_MG014 ; TEST FOR MODE |
|
|
|
|
|
JR Z,IMM_INIT3 ; IF SO, DISPLAY IT |
|
|
|
|
|
LD DE,IMM_STR_MODE_UNK ; MODE LABEL |
|
|
|
|
|
IMM_INIT3: |
|
|
|
|
|
CALL WRITESTR ; DISPLAY MODE |
|
|
|
|
|
|
|
|
LD HL,IMM_STR_MODE_MAP |
|
|
|
|
|
ADD A,A |
|
|
|
|
|
CALL ADDHLA |
|
|
|
|
|
LD E,(HL) |
|
|
|
|
|
INC HL |
|
|
|
|
|
LD D,(HL) |
|
|
|
|
|
CALL WRITESTR |
|
|
; |
|
|
; |
|
|
; CHECK FOR HARDWARE PRESENCE |
|
|
; CHECK FOR HARDWARE PRESENCE |
|
|
CALL IMM_DETECT ; PROBE FOR INTERFACE |
|
|
CALL IMM_DETECT ; PROBE FOR INTERFACE |
|
|
@ -162,17 +184,13 @@ IMM_INIT4: |
|
|
CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE |
|
|
CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE |
|
|
; |
|
|
; |
|
|
CALL IMM_RESET ; RESET/INIT THE INTERFACE |
|
|
CALL IMM_RESET ; RESET/INIT THE INTERFACE |
|
|
|
|
|
#IF (IMMTRACE == 0) |
|
|
|
|
|
CALL IMM_PRTSTAT |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
JR NZ,IMM_INIT6 |
|
|
; |
|
|
; |
|
|
; START PRINTING DEVICE INFO |
|
|
; START PRINTING DEVICE INFO |
|
|
CALL IMM_PRTPREFIX ; PRINT DEVICE PREFIX |
|
|
CALL IMM_PRTPREFIX ; PRINT DEVICE PREFIX |
|
|
; |
|
|
|
|
|
; CHECK FOR BAD STATUS |
|
|
|
|
|
LD A,(IY+IMM_STAT) ; GET STATUS |
|
|
|
|
|
OR A ; SET FLAGS |
|
|
|
|
|
JP Z,IMM_INIT5 ; CONTINUE |
|
|
|
|
|
CALL PC_SPACE ; FORMATTING |
|
|
|
|
|
CALL IMM_PRTSTATSTR ; PRINT STATUS STRING |
|
|
|
|
|
JR IMM_INIT6 ; LOOP TILL DONE |
|
|
|
|
|
; |
|
|
; |
|
|
IMM_INIT5: |
|
|
IMM_INIT5: |
|
|
; PRINT STORAGE CAPACITY (BLOCK COUNT) |
|
|
; PRINT STORAGE CAPACITY (BLOCK COUNT) |
|
|
@ -308,7 +326,7 @@ IMM_IO: |
|
|
CALL LDHLIYA ; HL := IY + A, REG A TRASHED |
|
|
CALL LDHLIYA ; HL := IY + A, REG A TRASHED |
|
|
CALL INC32HL ; INCREMENT THE VALUE |
|
|
CALL INC32HL ; INCREMENT THE VALUE |
|
|
; INCREMENT DMA |
|
|
; INCREMENT DMA |
|
|
LD HL,IDE_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR |
|
|
|
|
|
|
|
|
LD HL,IMM_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR |
|
|
INC (HL) ; BUMP DMA BY |
|
|
INC (HL) ; BUMP DMA BY |
|
|
INC (HL) ; ... 512 BYTES |
|
|
INC (HL) ; ... 512 BYTES |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
@ -423,7 +441,10 @@ IMM_WRITECTRL: |
|
|
; BELOW TRANSLATES FROM IBM -> MG014. IT ALSO INVERTS THE |
|
|
; BELOW TRANSLATES FROM IBM -> MG014. IT ALSO INVERTS THE |
|
|
; MG014 LED SIMPLY TO MAKE IT EASY TO KEEP LED ON DURING |
|
|
; MG014 LED SIMPLY TO MAKE IT EASY TO KEEP LED ON DURING |
|
|
; ALL ACTIVITY. |
|
|
; ALL ACTIVITY. |
|
|
|
|
|
; |
|
|
|
|
|
#IF (IMMMODE == IMMMODE_MG014 |
|
|
XOR $0B | $80 ; HIGH BIT IS MG014 LED |
|
|
XOR $0B | $80 ; HIGH BIT IS MG014 LED |
|
|
|
|
|
#ENDIF |
|
|
LD C,(IY+IMM_IOBASE) ; GET BASE IO ADDRESS |
|
|
LD C,(IY+IMM_IOBASE) ; GET BASE IO ADDRESS |
|
|
INC C ; BUMP TO CONTROL PORT |
|
|
INC C ; BUMP TO CONTROL PORT |
|
|
INC C |
|
|
INC C |
|
|
@ -434,7 +455,7 @@ IMM_WRITECTRL: |
|
|
; READ THE PARALLEL PORT INPUT LINES (STATUS) AND MAP SIGNALS FROM |
|
|
; READ THE PARALLEL PORT INPUT LINES (STATUS) AND MAP SIGNALS FROM |
|
|
; MG014 TO IBM STANDARD. NOTE POLARITY CHANGE REQUIRED FOR BUSY. |
|
|
; MG014 TO IBM STANDARD. NOTE POLARITY CHANGE REQUIRED FOR BUSY. |
|
|
; |
|
|
; |
|
|
; MG014 IBM PC |
|
|
|
|
|
|
|
|
; MG014 IBM PC (SPP) |
|
|
; -------- -------- |
|
|
; -------- -------- |
|
|
; 0: /ACK 6: /ACK |
|
|
; 0: /ACK 6: /ACK |
|
|
; 1: BUSY 7: /BUSY |
|
|
; 1: BUSY 7: /BUSY |
|
|
@ -446,39 +467,35 @@ IMM_READSTATUS: |
|
|
LD C,(IY+IMM_IOBASE) ; IOBASE TO C |
|
|
LD C,(IY+IMM_IOBASE) ; IOBASE TO C |
|
|
INC C ; BUMP TO STATUS PORT |
|
|
INC C ; BUMP TO STATUS PORT |
|
|
IN A,(C) ; READ IT |
|
|
IN A,(C) ; READ IT |
|
|
LD C,0 ; INIT RESULT |
|
|
|
|
|
; |
|
|
; |
|
|
; SHUFFLE BITS |
|
|
|
|
|
|
|
|
#IF (IMMMODE == IMMMODE_MG014) |
|
|
|
|
|
; |
|
|
|
|
|
; SHUFFLE BITS ON MG014 |
|
|
|
|
|
LD C,0 ; INIT RESULT |
|
|
BIT 0,A ; 0: /ACK |
|
|
BIT 0,A ; 0: /ACK |
|
|
JR Z,IMM_READSTATUS1 |
|
|
JR Z,IMM_READSTATUS1 |
|
|
SET 6,C ; 6: /ACK |
|
|
SET 6,C ; 6: /ACK |
|
|
; |
|
|
|
|
|
IMM_READSTATUS1: |
|
|
IMM_READSTATUS1: |
|
|
; |
|
|
|
|
|
BIT 1,A ; 1: BUSY |
|
|
BIT 1,A ; 1: BUSY |
|
|
JR NZ,IMM_READSTATUS2 ; POLARITY CHANGE! |
|
|
JR NZ,IMM_READSTATUS2 ; POLARITY CHANGE! |
|
|
SET 7,C ; 7: /BUSY |
|
|
SET 7,C ; 7: /BUSY |
|
|
; |
|
|
|
|
|
IMM_READSTATUS2: |
|
|
IMM_READSTATUS2: |
|
|
; |
|
|
|
|
|
BIT 2,A ; 2: POUT |
|
|
BIT 2,A ; 2: POUT |
|
|
JR Z,IMM_READSTATUS3 |
|
|
JR Z,IMM_READSTATUS3 |
|
|
SET 5,C ; 5: POUT |
|
|
SET 5,C ; 5: POUT |
|
|
; |
|
|
|
|
|
IMM_READSTATUS3: |
|
|
IMM_READSTATUS3: |
|
|
; |
|
|
|
|
|
BIT 3,A ; 3: SEL |
|
|
BIT 3,A ; 3: SEL |
|
|
JR Z,IMM_READSTATUS4 |
|
|
JR Z,IMM_READSTATUS4 |
|
|
SET 4,C ; 4: SEL |
|
|
SET 4,C ; 4: SEL |
|
|
; |
|
|
|
|
|
IMM_READSTATUS4: |
|
|
IMM_READSTATUS4: |
|
|
; |
|
|
|
|
|
BIT 4,A ; 4: /ERR |
|
|
BIT 4,A ; 4: /ERR |
|
|
JR Z,IMM_READSTATUS5 |
|
|
JR Z,IMM_READSTATUS5 |
|
|
SET 3,C ; 3: /ERR |
|
|
SET 3,C ; 3: /ERR |
|
|
; |
|
|
|
|
|
IMM_READSTATUS5: |
|
|
IMM_READSTATUS5: |
|
|
LD A,C ; RESULT TO A |
|
|
LD A,C ; RESULT TO A |
|
|
|
|
|
; |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
; |
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
; SIGNAL SEQUENCE TO CONNECT/DISCONNECT |
|
|
; SIGNAL SEQUENCE TO CONNECT/DISCONNECT |
|
|
@ -486,39 +503,28 @@ IMM_READSTATUS5: |
|
|
; |
|
|
; |
|
|
IMM_CPP: |
|
|
IMM_CPP: |
|
|
PUSH AF |
|
|
PUSH AF |
|
|
LD A,$0C |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$AA |
|
|
|
|
|
CALL IMM_WRITEDATA |
|
|
|
|
|
LD A,$55 |
|
|
|
|
|
CALL IMM_WRITEDATA |
|
|
|
|
|
LD A,$00 |
|
|
|
|
|
CALL IMM_WRITEDATA |
|
|
|
|
|
LD A,$FF |
|
|
|
|
|
CALL IMM_WRITEDATA |
|
|
|
|
|
|
|
|
LD A,$0C \ CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$AA \ CALL IMM_WRITEDATA |
|
|
|
|
|
LD A,$55 \ CALL IMM_WRITEDATA |
|
|
|
|
|
LD A,$00 \ CALL IMM_WRITEDATA |
|
|
|
|
|
LD A,$FF \ CALL IMM_WRITEDATA |
|
|
CALL IMM_READSTATUS |
|
|
CALL IMM_READSTATUS |
|
|
AND $B8 |
|
|
AND $B8 |
|
|
LD (IMM_S1),A |
|
|
LD (IMM_S1),A |
|
|
LD A,$87 |
|
|
|
|
|
CALL IMM_WRITEDATA |
|
|
|
|
|
|
|
|
LD A,$87 \ CALL IMM_WRITEDATA |
|
|
CALL IMM_READSTATUS |
|
|
CALL IMM_READSTATUS |
|
|
AND $B8 |
|
|
AND $B8 |
|
|
LD (IMM_S2),A |
|
|
LD (IMM_S2),A |
|
|
LD A,$78 |
|
|
|
|
|
CALL IMM_WRITEDATA |
|
|
|
|
|
|
|
|
LD A,$78 \ CALL IMM_WRITEDATA |
|
|
CALL IMM_READSTATUS |
|
|
CALL IMM_READSTATUS |
|
|
AND $38 |
|
|
AND $38 |
|
|
LD (IMM_S3),A |
|
|
LD (IMM_S3),A |
|
|
POP AF |
|
|
POP AF |
|
|
CALL IMM_WRITEDATA |
|
|
CALL IMM_WRITEDATA |
|
|
LD A,$0C |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$0D |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$0C |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$FF |
|
|
|
|
|
CALL IMM_WRITEDATA |
|
|
|
|
|
|
|
|
LD A,$0C \ CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$0D \ CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$0C \ CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$FF \ CALL IMM_WRITEDATA |
|
|
; |
|
|
; |
|
|
; CONNECT: S1=$B8 S2=$18 S3=$30 |
|
|
; CONNECT: S1=$B8 S2=$18 S3=$30 |
|
|
; DISCONNECT: S1=$B8 S2=$18 S3=$38 |
|
|
; DISCONNECT: S1=$B8 S2=$18 S3=$38 |
|
|
@ -561,30 +567,23 @@ IMM_DISCONNECT: |
|
|
CALL IMM_CPP |
|
|
CALL IMM_CPP |
|
|
; |
|
|
; |
|
|
; TURNS OFF MG014 LED |
|
|
; TURNS OFF MG014 LED |
|
|
LD A,$8C |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$8C \ CALL IMM_WRITECTRL |
|
|
; |
|
|
; |
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
; INITIATE A SCSI BUS RESET. |
|
|
; INITIATE A SCSI BUS RESET. |
|
|
; |
|
|
; |
|
|
IMM_RESETPULSE: |
|
|
IMM_RESETPULSE: |
|
|
LD A,$04 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$40 |
|
|
|
|
|
CALL IMM_WRITEDATA |
|
|
|
|
|
|
|
|
LD A,$04 \ CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$40 \ CALL IMM_WRITEDATA |
|
|
CALL DELAY ; 16 US, IDEALLY, 1 US |
|
|
CALL DELAY ; 16 US, IDEALLY, 1 US |
|
|
LD A,$0C |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$0D |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$0C \ CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$0D \ CALL IMM_WRITECTRL |
|
|
CALL DELAY ; 48 US, IDEALLY, 50 US |
|
|
CALL DELAY ; 48 US, IDEALLY, 50 US |
|
|
CALL DELAY |
|
|
CALL DELAY |
|
|
CALL DELAY |
|
|
CALL DELAY |
|
|
LD A,$0C |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$04 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$0C \ CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$04 \ CALL IMM_WRITECTRL |
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
; SCSI SELECT PROCESS |
|
|
; SCSI SELECT PROCESS |
|
|
@ -593,8 +592,7 @@ IMM_SELECT: |
|
|
#IF (IMMTRACE >= 3) |
|
|
#IF (IMMTRACE >= 3) |
|
|
PRTS("\r\nSELECT: $") |
|
|
PRTS("\r\nSELECT: $") |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
LD A,$0C |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$0C \ CALL IMM_WRITECTRL |
|
|
; |
|
|
; |
|
|
LD HL,500 ; TIMEOUT COUNTER |
|
|
LD HL,500 ; TIMEOUT COUNTER |
|
|
; |
|
|
; |
|
|
@ -609,14 +607,12 @@ IMM_SELECT1: |
|
|
JR IMM_SELECT1 |
|
|
JR IMM_SELECT1 |
|
|
; |
|
|
; |
|
|
IMM_SELECT2: |
|
|
IMM_SELECT2: |
|
|
LD A,$04 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$04 \ CALL IMM_WRITECTRL |
|
|
; PLACE HOST AND TARGET BIT ON DATA BUS |
|
|
; PLACE HOST AND TARGET BIT ON DATA BUS |
|
|
LD A,$80 | (1 << IMM_TGT) |
|
|
LD A,$80 | (1 << IMM_TGT) |
|
|
CALL IMM_WRITEDATA |
|
|
CALL IMM_WRITEDATA |
|
|
CALL DELAY ; CONFIRM DELAY TIME? |
|
|
CALL DELAY ; CONFIRM DELAY TIME? |
|
|
LD A,$0C |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$0C \ CALL IMM_WRITECTRL |
|
|
; |
|
|
; |
|
|
#IF (IMMTRACE >= 3) |
|
|
#IF (IMMTRACE >= 3) |
|
|
CALL IMM_READSTATUS |
|
|
CALL IMM_READSTATUS |
|
|
@ -624,8 +620,7 @@ IMM_SELECT2: |
|
|
CALL PRTHEXBYTE |
|
|
CALL PRTHEXBYTE |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
LD A,$0D |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$0D \ CALL IMM_WRITECTRL |
|
|
; |
|
|
; |
|
|
#IF (IMMTRACE >= 3) |
|
|
#IF (IMMTRACE >= 3) |
|
|
CALL IMM_READSTATUS |
|
|
CALL IMM_READSTATUS |
|
|
@ -650,8 +645,7 @@ IMM_SELECT3: |
|
|
JR IMM_SELECT3 |
|
|
JR IMM_SELECT3 |
|
|
; |
|
|
; |
|
|
IMM_SELECT4: |
|
|
IMM_SELECT4: |
|
|
LD A,$0C |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$0C \ CALL IMM_WRITECTRL |
|
|
; |
|
|
; |
|
|
XOR A |
|
|
XOR A |
|
|
RET |
|
|
RET |
|
|
@ -681,8 +675,7 @@ IMM_SENDCMD: |
|
|
; |
|
|
; |
|
|
INC HL ; BACK TO FIRST CMD BYTE |
|
|
INC HL ; BACK TO FIRST CMD BYTE |
|
|
IMM_SENDCMD1: |
|
|
IMM_SENDCMD1: |
|
|
LD A,$04 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$04 \ CALL IMM_WRITECTRL |
|
|
LD A,(HL) ; LOAD CMD BYTE |
|
|
LD A,(HL) ; LOAD CMD BYTE |
|
|
; |
|
|
; |
|
|
#IF (IMMTRACE >= 3) |
|
|
#IF (IMMTRACE >= 3) |
|
|
@ -694,8 +687,7 @@ IMM_SENDCMD1: |
|
|
INC HL ; BUMP TO NEXT BYTE |
|
|
INC HL ; BUMP TO NEXT BYTE |
|
|
DEC B ; DEC LOOP COUNTER |
|
|
DEC B ; DEC LOOP COUNTER |
|
|
LD A,$05 |
|
|
LD A,$05 |
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,(HL) ; LOAD CMD BYTE |
|
|
|
|
|
|
|
|
CALL IMM_WRITECTRL \ LD A,(HL) ; LOAD CMD BYTE |
|
|
; |
|
|
; |
|
|
#IF (IMMTRACE >= 3) |
|
|
#IF (IMMTRACE >= 3) |
|
|
CALL PC_SPACE |
|
|
CALL PC_SPACE |
|
|
@ -704,13 +696,11 @@ IMM_SENDCMD1: |
|
|
; |
|
|
; |
|
|
CALL IMM_WRITEDATA ; PUT IT ON THE BUS |
|
|
CALL IMM_WRITEDATA ; PUT IT ON THE BUS |
|
|
INC HL ; BUMP TO NEXT BYTE |
|
|
INC HL ; BUMP TO NEXT BYTE |
|
|
LD A,$00 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$00 \ CALL IMM_WRITECTRL |
|
|
DJNZ IMM_SENDCMD1 ; LOOP TILL DONE |
|
|
DJNZ IMM_SENDCMD1 ; LOOP TILL DONE |
|
|
; |
|
|
; |
|
|
IMM_SENDCMD2: |
|
|
IMM_SENDCMD2: |
|
|
LD A,$04 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$04 \ CALL IMM_WRITECTRL |
|
|
; |
|
|
; |
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
@ -728,13 +718,11 @@ IMM_WAITLOOP: |
|
|
; |
|
|
; |
|
|
IMM_WAIT: |
|
|
IMM_WAIT: |
|
|
LD HL,500 ; GOOD VALUE??? |
|
|
LD HL,500 ; GOOD VALUE??? |
|
|
LD A,$0C |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$0C \ CALL IMM_WRITECTRL |
|
|
CALL IMM_WAITLOOP |
|
|
CALL IMM_WAITLOOP |
|
|
JP Z,IMM_CMD_TIMEOUT ; HANDLE TIMEOUT |
|
|
JP Z,IMM_CMD_TIMEOUT ; HANDLE TIMEOUT |
|
|
PUSH AF |
|
|
PUSH AF |
|
|
LD A,$04 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$04 \ CALL IMM_WRITECTRL |
|
|
POP AF |
|
|
POP AF |
|
|
AND $B8 |
|
|
AND $B8 |
|
|
RET ; RETURN W/ RESULT IN A |
|
|
RET ; RETURN W/ RESULT IN A |
|
|
@ -743,8 +731,7 @@ IMM_WAIT: |
|
|
; |
|
|
; |
|
|
IMM_LONGWAIT: |
|
|
IMM_LONGWAIT: |
|
|
LD B,3 ; VALUE??? |
|
|
LD B,3 ; VALUE??? |
|
|
LD A,$0C |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$0C \ CALL IMM_WRITECTRL |
|
|
IMM_LONGWAIT1: |
|
|
IMM_LONGWAIT1: |
|
|
LD HL,0 |
|
|
LD HL,0 |
|
|
CALL IMM_WAITLOOP |
|
|
CALL IMM_WAITLOOP |
|
|
@ -754,8 +741,7 @@ IMM_LONGWAIT1: |
|
|
; |
|
|
; |
|
|
IMM_LONGWAIT2: |
|
|
IMM_LONGWAIT2: |
|
|
PUSH AF |
|
|
PUSH AF |
|
|
LD A,$04 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$04 \ CALL IMM_WRITECTRL |
|
|
; |
|
|
; |
|
|
#IF 0 |
|
|
#IF 0 |
|
|
CALL PC_GT |
|
|
CALL PC_GT |
|
|
@ -775,24 +761,19 @@ IMM_NEGOTIATE: |
|
|
#IF (IMMTRACE >= 3) |
|
|
#IF (IMMTRACE >= 3) |
|
|
PRTS("\r\nNEGO: $") |
|
|
PRTS("\r\nNEGO: $") |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
LD A,$04 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$04 \ CALL IMM_WRITECTRL |
|
|
CALL DELAY ; 16 US, IDEALLY 5 US |
|
|
CALL DELAY ; 16 US, IDEALLY 5 US |
|
|
LD A,$00 |
|
|
|
|
|
CALL IMM_WRITEDATA |
|
|
|
|
|
|
|
|
LD A,$00 \ CALL IMM_WRITEDATA |
|
|
LD DE,7 ; 112 US, IDEALLY 100 US |
|
|
LD DE,7 ; 112 US, IDEALLY 100 US |
|
|
CALL VDELAY |
|
|
CALL VDELAY |
|
|
LD A,$06 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$06 \ CALL IMM_WRITECTRL |
|
|
CALL DELAY ; 16 US, IDEALLY 5 US |
|
|
CALL DELAY ; 16 US, IDEALLY 5 US |
|
|
CALL IMM_READSTATUS |
|
|
CALL IMM_READSTATUS |
|
|
PUSH AF ; SAVE RESULT |
|
|
PUSH AF ; SAVE RESULT |
|
|
CALL DELAY ; 16 US, IDEALLY 5 US |
|
|
CALL DELAY ; 16 US, IDEALLY 5 US |
|
|
LD A,$07 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$07 \ CALL IMM_WRITECTRL |
|
|
CALL DELAY ; 16 US, IDEALLY 5 US |
|
|
CALL DELAY ; 16 US, IDEALLY 5 US |
|
|
LD A,$06 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$06 \ CALL IMM_WRITECTRL |
|
|
; |
|
|
; |
|
|
POP AF |
|
|
POP AF |
|
|
; |
|
|
; |
|
|
@ -818,8 +799,7 @@ IMM_NEGOTIATE: |
|
|
; |
|
|
; |
|
|
IMM_GETBYTE: |
|
|
IMM_GETBYTE: |
|
|
CALL IMM_WAIT |
|
|
CALL IMM_WAIT |
|
|
LD A,$06 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$06 \ CALL IMM_WRITECTRL |
|
|
CALL IMM_READSTATUS |
|
|
CALL IMM_READSTATUS |
|
|
AND $F0 |
|
|
AND $F0 |
|
|
RRCA |
|
|
RRCA |
|
|
@ -827,15 +807,13 @@ IMM_GETBYTE: |
|
|
RRCA |
|
|
RRCA |
|
|
RRCA |
|
|
RRCA |
|
|
PUSH AF |
|
|
PUSH AF |
|
|
LD A,$05 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$05 \ CALL IMM_WRITECTRL |
|
|
CALL IMM_READSTATUS |
|
|
CALL IMM_READSTATUS |
|
|
AND $F0 |
|
|
AND $F0 |
|
|
POP HL |
|
|
POP HL |
|
|
OR H |
|
|
OR H |
|
|
PUSH AF |
|
|
PUSH AF |
|
|
LD A,$04 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$04 \ CALL IMM_WRITECTRL |
|
|
POP AF |
|
|
POP AF |
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
@ -866,10 +844,8 @@ IMM_GETDATA1: |
|
|
POP HL ; RESTORE BYTE COUNTER |
|
|
POP HL ; RESTORE BYTE COUNTER |
|
|
CP $98 ; CHECK FOR READ PHASE |
|
|
CP $98 ; CHECK FOR READ PHASE |
|
|
JR NZ,IMM_GETDATA2 ; IF NOT, ASSUME WE ARE DONE |
|
|
JR NZ,IMM_GETDATA2 ; IF NOT, ASSUME WE ARE DONE |
|
|
LD A,$04 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$06 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$04 \ CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$06 \ CALL IMM_WRITECTRL |
|
|
CALL IMM_READSTATUS ; GET FIRST NIBBLE |
|
|
CALL IMM_READSTATUS ; GET FIRST NIBBLE |
|
|
AND $F0 ; ISOLATE BITS |
|
|
AND $F0 ; ISOLATE BITS |
|
|
RRCA ; AND SHIFT TO LOW NIBBLE |
|
|
RRCA ; AND SHIFT TO LOW NIBBLE |
|
|
@ -877,8 +853,7 @@ IMM_GETDATA1: |
|
|
RRCA |
|
|
RRCA |
|
|
RRCA |
|
|
RRCA |
|
|
PUSH AF ; SAVE WORKING VALUE |
|
|
PUSH AF ; SAVE WORKING VALUE |
|
|
LD A,$05 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$05 \ CALL IMM_WRITECTRL |
|
|
CALL IMM_READSTATUS ; GET SECOND NIBBLE |
|
|
CALL IMM_READSTATUS ; GET SECOND NIBBLE |
|
|
AND $F0 ; ISOLATE BITS |
|
|
AND $F0 ; ISOLATE BITS |
|
|
POP BC ; RECOVER LOW NIBBLE |
|
|
POP BC ; RECOVER LOW NIBBLE |
|
|
@ -886,10 +861,8 @@ IMM_GETDATA1: |
|
|
LD (DE),A ; AND SAVE THE FULL BYTE VALUE |
|
|
LD (DE),A ; AND SAVE THE FULL BYTE VALUE |
|
|
INC DE ; NEXT BUFFER POS |
|
|
INC DE ; NEXT BUFFER POS |
|
|
INC HL ; INCREMENT BYTES COUNTER |
|
|
INC HL ; INCREMENT BYTES COUNTER |
|
|
LD A,$04 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$0C |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$04 \ CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$0C \ CALL IMM_WRITECTRL |
|
|
JR IMM_GETDATA1 ; LOOP TILL DONE |
|
|
JR IMM_GETDATA1 ; LOOP TILL DONE |
|
|
; |
|
|
; |
|
|
IMM_GETDATA2: |
|
|
IMM_GETDATA2: |
|
|
@ -911,11 +884,9 @@ IMM_GETDATALEN: |
|
|
PRTS(" BYTES$") |
|
|
PRTS(" BYTES$") |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
LD A,$04 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$04 \ CALL IMM_WRITECTRL |
|
|
IMM_GETDATALEN1: |
|
|
IMM_GETDATALEN1: |
|
|
LD A,$06 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$06 \ CALL IMM_WRITECTRL |
|
|
CALL IMM_READSTATUS ; GET FIRST NIBBLE |
|
|
CALL IMM_READSTATUS ; GET FIRST NIBBLE |
|
|
AND $F0 ; ISOLATE BITS |
|
|
AND $F0 ; ISOLATE BITS |
|
|
RRCA ; MOVE TO LOW NIBBLE |
|
|
RRCA ; MOVE TO LOW NIBBLE |
|
|
@ -923,8 +894,7 @@ IMM_GETDATALEN1: |
|
|
RRCA |
|
|
RRCA |
|
|
RRCA |
|
|
RRCA |
|
|
PUSH AF ; SAVE WORKING VALUE |
|
|
PUSH AF ; SAVE WORKING VALUE |
|
|
LD A,$05 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$05 \ CALL IMM_WRITECTRL |
|
|
CALL IMM_READSTATUS ; GET SECOND NIBBLE |
|
|
CALL IMM_READSTATUS ; GET SECOND NIBBLE |
|
|
AND $F0 ; ISOLATE BITS |
|
|
AND $F0 ; ISOLATE BITS |
|
|
POP BC ; RECOVER FIRST NIBBLE |
|
|
POP BC ; RECOVER FIRST NIBBLE |
|
|
@ -932,13 +902,11 @@ IMM_GETDATALEN1: |
|
|
LD (DE),A ; SAVE FINAL BYTE VALUE |
|
|
LD (DE),A ; SAVE FINAL BYTE VALUE |
|
|
INC DE ; NEXT BUFFER POS |
|
|
INC DE ; NEXT BUFFER POS |
|
|
DEC HL ; DEC LOOP COUNTER |
|
|
DEC HL ; DEC LOOP COUNTER |
|
|
LD A,$04 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$04 \ CALL IMM_WRITECTRL |
|
|
LD A,H ; CHECK LOOP COUNTER |
|
|
LD A,H ; CHECK LOOP COUNTER |
|
|
OR L |
|
|
OR L |
|
|
JR NZ,IMM_GETDATALEN1 ; LOOP IF NOT DONE |
|
|
JR NZ,IMM_GETDATALEN1 ; LOOP IF NOT DONE |
|
|
LD A,$0C |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$0C \ CALL IMM_WRITECTRL |
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
; PUT A CHUNK OF DATA TO THE SCSI BUS. THIS IS SPECIFICALLY FOR |
|
|
; PUT A CHUNK OF DATA TO THE SCSI BUS. THIS IS SPECIFICALLY FOR |
|
|
@ -967,25 +935,21 @@ IMM_PUTDATA1: |
|
|
POP HL ; RESTORE BYTE COUNTER |
|
|
POP HL ; RESTORE BYTE COUNTER |
|
|
CP $88 ; CHECK FOR WRITE PHASE |
|
|
CP $88 ; CHECK FOR WRITE PHASE |
|
|
JR NZ,IMM_PUTDATA2 ; IF NOT, ASSUME WE ARE DONE |
|
|
JR NZ,IMM_PUTDATA2 ; IF NOT, ASSUME WE ARE DONE |
|
|
LD A,$04 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$04 \ CALL IMM_WRITECTRL |
|
|
LD A,(DE) ; GET NEXT BYTE TO WRITE (FIRST OF PAIR) |
|
|
LD A,(DE) ; GET NEXT BYTE TO WRITE (FIRST OF PAIR) |
|
|
CALL IMM_WRITEDATA ; PUT ON BUS |
|
|
CALL IMM_WRITEDATA ; PUT ON BUS |
|
|
INC DE ; BUMP TO NEXT BUF POS |
|
|
INC DE ; BUMP TO NEXT BUF POS |
|
|
INC HL ; INCREMENT COUNTER |
|
|
INC HL ; INCREMENT COUNTER |
|
|
LD A,$05 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$05 \ CALL IMM_WRITECTRL |
|
|
LD A,(DE) ; GET NEXT BYTE TO WRITE (SECOND OF PAIR) |
|
|
LD A,(DE) ; GET NEXT BYTE TO WRITE (SECOND OF PAIR) |
|
|
CALL IMM_WRITEDATA ; PUT ON BUS |
|
|
CALL IMM_WRITEDATA ; PUT ON BUS |
|
|
INC DE ; BUMP TO NEXT BUF POS |
|
|
INC DE ; BUMP TO NEXT BUF POS |
|
|
INC HL ; INCREMENT COUNTER |
|
|
INC HL ; INCREMENT COUNTER |
|
|
LD A,$00 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$00 \ CALL IMM_WRITECTRL |
|
|
JR IMM_PUTDATA1 ; LOOP TILL DONE |
|
|
JR IMM_PUTDATA1 ; LOOP TILL DONE |
|
|
; |
|
|
; |
|
|
IMM_PUTDATA2: |
|
|
IMM_PUTDATA2: |
|
|
LD A,$04 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$04 \ CALL IMM_WRITECTRL |
|
|
; |
|
|
; |
|
|
#IF (IMMTRACE >= 3) |
|
|
#IF (IMMTRACE >= 3) |
|
|
CALL PC_SPACE |
|
|
CALL PC_SPACE |
|
|
@ -1004,26 +968,22 @@ IMM_PUTDATALEN: |
|
|
PRTS(" BYTES$") |
|
|
PRTS(" BYTES$") |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
LD A,$04 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$04 \ CALL IMM_WRITECTRL |
|
|
IMM_PUTDATALEN1: |
|
|
IMM_PUTDATALEN1: |
|
|
LD A,(DE) ; GET NEXT BYTE (FIRST OF PAIR) |
|
|
LD A,(DE) ; GET NEXT BYTE (FIRST OF PAIR) |
|
|
CALL IMM_WRITEDATA ; PUT ON BUS |
|
|
CALL IMM_WRITEDATA ; PUT ON BUS |
|
|
INC DE ; INCREMENT BUF POS |
|
|
INC DE ; INCREMENT BUF POS |
|
|
DEC HL ; DEC LOOP COUNTER |
|
|
DEC HL ; DEC LOOP COUNTER |
|
|
LD A,$05 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$05 \ CALL IMM_WRITECTRL |
|
|
LD A,(DE) ; GET NEXT BYTE (SECOND OF PAIR) |
|
|
LD A,(DE) ; GET NEXT BYTE (SECOND OF PAIR) |
|
|
CALL IMM_WRITEDATA ; PUT ON BUS |
|
|
CALL IMM_WRITEDATA ; PUT ON BUS |
|
|
INC DE ; INCREMENT BUF POS |
|
|
INC DE ; INCREMENT BUF POS |
|
|
DEC HL ; DEC LOOP COUNTER |
|
|
DEC HL ; DEC LOOP COUNTER |
|
|
LD A,$00 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$00 \ CALL IMM_WRITECTRL |
|
|
LD A,H ; CHECK LOOP COUNTER |
|
|
LD A,H ; CHECK LOOP COUNTER |
|
|
OR L |
|
|
OR L |
|
|
JR NZ,IMM_PUTDATALEN1 ; LOOP TILL DONE |
|
|
JR NZ,IMM_PUTDATALEN1 ; LOOP TILL DONE |
|
|
LD A,$04 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$04 \ CALL IMM_WRITECTRL |
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
; READ SCSI COMMAND STATUS |
|
|
; READ SCSI COMMAND STATUS |
|
|
@ -1058,14 +1018,10 @@ IMM_GETSTATUS: |
|
|
; TERMINATE A BULD READ OPERATION |
|
|
; TERMINATE A BULD READ OPERATION |
|
|
; |
|
|
; |
|
|
IMM_ENDREAD: |
|
|
IMM_ENDREAD: |
|
|
LD A,$04 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$0C |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$0E |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$04 |
|
|
|
|
|
CALL IMM_WRITECTRL |
|
|
|
|
|
|
|
|
LD A,$04 \ CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$0C \ CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$0E \ CALL IMM_WRITECTRL |
|
|
|
|
|
LD A,$04 \ CALL IMM_WRITECTRL |
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
; THIS IS THE MAIN SCSI ENGINE. BASICALLY, IT SELECTS THE DEVICE |
|
|
; THIS IS THE MAIN SCSI ENGINE. BASICALLY, IT SELECTS THE DEVICE |
|
|
@ -1275,7 +1231,7 @@ IMM_INITDEV3: |
|
|
LD BC,0 ; READ WHATEVER IS SENT |
|
|
LD BC,0 ; READ WHATEVER IS SENT |
|
|
LD HL,IMM_CMD_RDCAP ; POINT TO READ CAPACITY CMD |
|
|
LD HL,IMM_CMD_RDCAP ; POINT TO READ CAPACITY CMD |
|
|
CALL IMM_RUNCMD ; RUN THE SCSI ENGINE |
|
|
CALL IMM_RUNCMD ; RUN THE SCSI ENGINE |
|
|
CALL Z,IMM_CHKCMD ; CHECK AND RECORD AND ERRORS |
|
|
|
|
|
|
|
|
CALL Z,IMM_CHKCMD ; CHECK AND RECORD ANY ERRORS |
|
|
RET NZ ; BAIL ON ON ERROR |
|
|
RET NZ ; BAIL ON ON ERROR |
|
|
; |
|
|
; |
|
|
#IF (IMMTRACE >= 3) |
|
|
#IF (IMMTRACE >= 3) |
|
|
@ -1306,56 +1262,6 @@ IMM_INITDEV3: |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
XOR A ; SIGNAL SUCCESS |
|
|
LD (IY+IMM_STAT),A ; RECORD IT |
|
|
LD (IY+IMM_STAT),A ; RECORD IT |
|
|
RET |
|
|
RET |
|
|
;;;; |
|
|
|
|
|
;;;; *** DEBUG *** |
|
|
|
|
|
;;;; |
|
|
|
|
|
;;; LD DE,HB_WRKBUF |
|
|
|
|
|
;;; LD BC,512 |
|
|
|
|
|
;;; LD HL,IMM_CMD_READ |
|
|
|
|
|
;;; CALL IMM_RUNCMD |
|
|
|
|
|
;;; CALL Z,IMM_CHKCMD |
|
|
|
|
|
;;; LD DE,HB_WRKBUF |
|
|
|
|
|
;;; CALL Z,DUMP_BUFFER |
|
|
|
|
|
;;;; |
|
|
|
|
|
;;; LD DE,HB_WRKBUF |
|
|
|
|
|
;;; LD BC,512 |
|
|
|
|
|
;;; LD HL,IMM_CMD_READ |
|
|
|
|
|
;;; CALL IMM_RUNCMD |
|
|
|
|
|
;;; CALL Z,IMM_CHKCMD |
|
|
|
|
|
;;; LD DE,HB_WRKBUF |
|
|
|
|
|
;;; CALL Z,DUMP_BUFFER |
|
|
|
|
|
;;;; |
|
|
|
|
|
;;; LD DE,HB_WRKBUF |
|
|
|
|
|
;;; LD BC,0 |
|
|
|
|
|
;;; LD HL,IMM_CMD_INQ |
|
|
|
|
|
;;; CALL IMM_RUNCMD |
|
|
|
|
|
;;; CALL Z,IMM_CHKCMD |
|
|
|
|
|
;;; LD DE,HB_WRKBUF |
|
|
|
|
|
;;; CALL Z,DUMP_BUFFER |
|
|
|
|
|
;;;; |
|
|
|
|
|
;;; LD DE,HB_WRKBUF |
|
|
|
|
|
;;; LD BC,512 |
|
|
|
|
|
;;; LD HL,IMM_CMD_WRITE |
|
|
|
|
|
;;; CALL IMM_RUNCMD |
|
|
|
|
|
;;; CALL Z,IMM_CHKCMD |
|
|
|
|
|
;;;; |
|
|
|
|
|
;;; LD DE,HB_WRKBUF |
|
|
|
|
|
;;; LD BC,512 |
|
|
|
|
|
;;; LD HL,IMM_CMD_READ2 |
|
|
|
|
|
;;; CALL IMM_RUNCMD |
|
|
|
|
|
;;; CALL Z,IMM_CHKCMD |
|
|
|
|
|
;;; LD DE,HB_WRKBUF |
|
|
|
|
|
;;; CALL Z,DUMP_BUFFER |
|
|
|
|
|
;;;; |
|
|
|
|
|
;;; RET |
|
|
|
|
|
;;;; |
|
|
|
|
|
;;;IMM_CMD .DB $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; TEMPLATE |
|
|
|
|
|
;;;IMM_CMD_READ .DB $08, $00, $00, $00, $01, $00 ; READ SECTOR $0000 |
|
|
|
|
|
;;;IMM_CMD_INQ .DB $12, $00, $00, $00, $FF, $00 ; INQUIRY |
|
|
|
|
|
;;;IMM_CMD_TEST .DB $00, $00, $00, $00, $00, $00 ; TEST UNIT READY |
|
|
|
|
|
;;;IMM_CMD_START .DB $1B, $00, $00, $00, $01, $00 ; START UNIT |
|
|
|
|
|
;;;IMM_CMD_WRITE .DB $0A, $00, $F0, $00, $01, $00 ; READ SECTOR $F000 |
|
|
|
|
|
;;;IMM_CMD_READ2 .DB $08, $00, $F0, $00, $01, $00 ; READ SECTOR $F000 |
|
|
|
|
|
; |
|
|
; |
|
|
;============================================================================= |
|
|
;============================================================================= |
|
|
; ERROR HANDLING AND DIAGNOSTICS |
|
|
; ERROR HANDLING AND DIAGNOSTICS |
|
|
@ -1363,10 +1269,6 @@ IMM_INITDEV3: |
|
|
; |
|
|
; |
|
|
; ERROR HANDLERS |
|
|
; ERROR HANDLERS |
|
|
; |
|
|
; |
|
|
IMM_INVUNIT: |
|
|
|
|
|
LD A,IMM_STINVUNIT |
|
|
|
|
|
JR IMM_ERR2 ; SPECIAL CASE FOR INVALID UNIT |
|
|
|
|
|
; |
|
|
|
|
|
IMM_NOMEDIA: |
|
|
IMM_NOMEDIA: |
|
|
LD A,IMM_STNOMEDIA |
|
|
LD A,IMM_STNOMEDIA |
|
|
JR IMM_ERR |
|
|
JR IMM_ERR |
|
|
@ -1391,7 +1293,7 @@ IMM_ERR: |
|
|
LD (IY+IMM_STAT),A ; SAVE NEW STATUS |
|
|
LD (IY+IMM_STAT),A ; SAVE NEW STATUS |
|
|
; |
|
|
; |
|
|
IMM_ERR2: |
|
|
IMM_ERR2: |
|
|
#IF (IMMTRACE >= 2) |
|
|
|
|
|
|
|
|
#IF (IMMTRACE >= 1) |
|
|
CALL IMM_PRTSTAT |
|
|
CALL IMM_PRTSTAT |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
OR A ; SET FLAGS |
|
|
OR A ; SET FLAGS |
|
|
@ -1410,14 +1312,7 @@ IMM_PRTSTAT: |
|
|
PUSH DE |
|
|
PUSH DE |
|
|
PUSH HL |
|
|
PUSH HL |
|
|
LD A,(IY+IMM_STAT) |
|
|
LD A,(IY+IMM_STAT) |
|
|
CP IMM_STINVUNIT |
|
|
|
|
|
JR Z,IMM_PRTSTAT2 ; INVALID UNIT IS SPECIAL CASE |
|
|
|
|
|
CALL IMM_PRTPREFIX ; PRINT UNIT PREFIX |
|
|
CALL IMM_PRTPREFIX ; PRINT UNIT PREFIX |
|
|
JR IMM_PRTSTAT3 |
|
|
|
|
|
IMM_PRTSTAT2: |
|
|
|
|
|
CALL NEWLINE |
|
|
|
|
|
PRTS("IMM:$") ; NO UNIT NUM IN PREFIX FOR INVALID UNIT |
|
|
|
|
|
IMM_PRTSTAT3: |
|
|
|
|
|
CALL PC_SPACE ; FORMATTING |
|
|
CALL PC_SPACE ; FORMATTING |
|
|
CALL IMM_PRTSTATSTR |
|
|
CALL IMM_PRTSTATSTR |
|
|
POP HL |
|
|
POP HL |
|
|
@ -1430,46 +1325,29 @@ IMM_PRTSTAT3: |
|
|
IMM_PRTSTATSTR: |
|
|
IMM_PRTSTATSTR: |
|
|
PUSH AF |
|
|
PUSH AF |
|
|
PUSH DE |
|
|
PUSH DE |
|
|
|
|
|
PUSH HL |
|
|
LD A,(IY+IMM_STAT) |
|
|
LD A,(IY+IMM_STAT) |
|
|
OR A |
|
|
|
|
|
LD DE,IMM_STR_STOK |
|
|
|
|
|
JR Z,IMM_PRTSTATSTR1 |
|
|
|
|
|
INC A |
|
|
|
|
|
LD DE,IMM_STR_STINVUNIT |
|
|
|
|
|
JR Z,IMM_PRTSTATSTR1 |
|
|
|
|
|
INC A |
|
|
|
|
|
LD DE,IMM_STR_STNOMEDIA |
|
|
|
|
|
JR Z,IMM_PRTSTATSTR1 |
|
|
|
|
|
INC A |
|
|
|
|
|
LD DE,IMM_STR_STCMDERR |
|
|
|
|
|
JR Z,IMM_PRTSTATSTR1 |
|
|
|
|
|
INC A |
|
|
|
|
|
LD DE,IMM_STR_STIOERR |
|
|
|
|
|
JR Z,IMM_PRTSTATSTR1 |
|
|
|
|
|
INC A |
|
|
|
|
|
LD DE,IMM_STR_STTO |
|
|
|
|
|
JR Z,IMM_PRTSTATSTR1 |
|
|
|
|
|
INC A |
|
|
|
|
|
LD DE,IMM_STR_STNOTSUP |
|
|
|
|
|
JR Z,IMM_PRTSTATSTR1 |
|
|
|
|
|
LD DE,IMM_STR_STUNK |
|
|
|
|
|
IMM_PRTSTATSTR1: |
|
|
|
|
|
|
|
|
NEG |
|
|
|
|
|
LD HL,IMM_STR_ST_MAP |
|
|
|
|
|
ADD A,A |
|
|
|
|
|
CALL ADDHLA |
|
|
|
|
|
LD E,(HL) |
|
|
|
|
|
INC HL |
|
|
|
|
|
LD D,(HL) |
|
|
CALL WRITESTR |
|
|
CALL WRITESTR |
|
|
|
|
|
POP HL |
|
|
POP DE |
|
|
POP DE |
|
|
POP AF |
|
|
POP AF |
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
; PRINT DIAGNONSTIC PREFIX |
|
|
|
|
|
|
|
|
; PRINT DEVICE/UNIT PREFIX |
|
|
; |
|
|
; |
|
|
IMM_PRTPREFIX: |
|
|
IMM_PRTPREFIX: |
|
|
PUSH AF |
|
|
PUSH AF |
|
|
CALL NEWLINE |
|
|
CALL NEWLINE |
|
|
PRTS("IMM$") |
|
|
PRTS("IMM$") |
|
|
LD A,(IY+IMM_DEV) ; GET CURRENT DEVICE NUM |
|
|
LD A,(IY+IMM_DEV) ; GET CURRENT DEVICE NUM |
|
|
CP $FE ; NOT YET ASSIGNED? |
|
|
|
|
|
JR Z,IMM_PRTPREFIX1 ; SKIP DEV NUM IF SO |
|
|
|
|
|
CALL PRTDECB |
|
|
CALL PRTDECB |
|
|
IMM_PRTPREFIX1: |
|
|
|
|
|
CALL PC_COLON |
|
|
CALL PC_COLON |
|
|
POP AF |
|
|
POP AF |
|
|
RET |
|
|
RET |
|
|
@ -1478,20 +1356,32 @@ IMM_PRTPREFIX1: |
|
|
; STRING DATA |
|
|
; STRING DATA |
|
|
;============================================================================= |
|
|
;============================================================================= |
|
|
; |
|
|
; |
|
|
IMM_STR_STOK .TEXT "OK$" |
|
|
|
|
|
IMM_STR_STINVUNIT .TEXT "INVALID UNIT$" |
|
|
|
|
|
IMM_STR_STNOMEDIA .TEXT "NO MEDIA$" |
|
|
|
|
|
IMM_STR_STCMDERR .TEXT "COMMAND ERROR$" |
|
|
|
|
|
IMM_STR_STIOERR .TEXT "IO ERROR$" |
|
|
|
|
|
IMM_STR_STTO .TEXT "TIMEOUT$" |
|
|
|
|
|
IMM_STR_STNOTSUP .TEXT "NOT SUPPORTED$" |
|
|
|
|
|
IMM_STR_STUNK .TEXT "UNKNOWN ERROR$" |
|
|
|
|
|
; |
|
|
|
|
|
IMM_STR_NOHW .TEXT "NOT PRESENT$" |
|
|
|
|
|
|
|
|
IMM_STR_ST_MAP: |
|
|
|
|
|
.DW IMM_STR_ST_OK |
|
|
|
|
|
.DW IMM_STR_ST_NOMEDIA |
|
|
|
|
|
.DW IMM_STR_ST_CMDERR |
|
|
|
|
|
.DW IMM_STR_ST_IOERR |
|
|
|
|
|
.DW IMM_STR_ST_TO |
|
|
|
|
|
.DW IMM_STR_ST_NOTSUP |
|
|
|
|
|
; |
|
|
|
|
|
IMM_STR_ST_OK .TEXT "OK$" |
|
|
|
|
|
IMM_STR_ST_NOMEDIA .TEXT "NO MEDIA$" |
|
|
|
|
|
IMM_STR_ST_CMDERR .TEXT "COMMAND ERROR$" |
|
|
|
|
|
IMM_STR_ST_IOERR .TEXT "IO ERROR$" |
|
|
|
|
|
IMM_STR_ST_TO .TEXT "TIMEOUT$" |
|
|
|
|
|
IMM_STR_ST_NOTSUP .TEXT "NOT SUPPORTED$" |
|
|
|
|
|
IMM_STR_ST_UNK .TEXT "UNKNOWN ERROR$" |
|
|
|
|
|
; |
|
|
|
|
|
IMM_STR_MODE_MAP: |
|
|
|
|
|
.DW IMM_STR_MODE_NONE |
|
|
|
|
|
.DW IMM_STR_MODE_SPP |
|
|
|
|
|
.DW IMM_STR_MODE_MG014 |
|
|
; |
|
|
; |
|
|
IMM_STR_MODE_NONE .TEXT "NONE$" |
|
|
IMM_STR_MODE_NONE .TEXT "NONE$" |
|
|
|
|
|
IMM_STR_MODE_SPP .TEXT "SPP$" |
|
|
IMM_STR_MODE_MG014 .TEXT "MG014$" |
|
|
IMM_STR_MODE_MG014 .TEXT "MG014$" |
|
|
IMM_STR_MODE_UNK .TEXT "???$" |
|
|
|
|
|
|
|
|
; |
|
|
|
|
|
IMM_STR_NOHW .TEXT "NOT PRESENT$" |
|
|
; |
|
|
; |
|
|
;============================================================================= |
|
|
;============================================================================= |
|
|
; DATA STORAGE |
|
|
; DATA STORAGE |
|
|
@ -1503,13 +1393,6 @@ IMM_DSKBUF .DW 0 ; WORKING DISK BUFFER POINTER |
|
|
IMM_XFRLEN .DW 0 ; WORKING TRANSFER LENGTH |
|
|
IMM_XFRLEN .DW 0 ; WORKING TRANSFER LENGTH |
|
|
IMM_CMDSTAT .DB 0, 0 ; CMD RESULT STATUS |
|
|
IMM_CMDSTAT .DB 0, 0 ; CMD RESULT STATUS |
|
|
; |
|
|
; |
|
|
IMM_TYPE_MAP: |
|
|
|
|
|
.DW IMM_STR_NONE |
|
|
|
|
|
.DW IMM_STR_MG014 |
|
|
|
|
|
; |
|
|
|
|
|
IMM_STR_NONE .DB "<NOT PRESENT>$" |
|
|
|
|
|
IMM_STR_MG014 .DB "MG014$" |
|
|
|
|
|
; |
|
|
|
|
|
; SCSI COMMAND TEMPLATES (LENGTH PREFIXED) |
|
|
; SCSI COMMAND TEMPLATES (LENGTH PREFIXED) |
|
|
; |
|
|
; |
|
|
.DB 6 |
|
|
.DB 6 |
|
|
@ -1527,7 +1410,7 @@ IMM_CFG: |
|
|
; |
|
|
; |
|
|
IMM0_CFG: ; DEVICE 0 |
|
|
IMM0_CFG: ; DEVICE 0 |
|
|
.DB 0 ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) |
|
|
.DB 0 ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) |
|
|
.DB IMM0MODE ; DRIVER DEVICE MODE |
|
|
|
|
|
|
|
|
.DB IMMMODE ; DRIVER DEVICE MODE |
|
|
.DB 0 ; DEVICE STATUS |
|
|
.DB 0 ; DEVICE STATUS |
|
|
.DB IMM0BASE ; IO BASE ADDRESS |
|
|
.DB IMM0BASE ; IO BASE ADDRESS |
|
|
.DW 0,0 ; DEVICE CAPACITY |
|
|
.DW 0,0 ; DEVICE CAPACITY |
|
|
@ -1538,7 +1421,7 @@ IMM0_CFG: ; DEVICE 0 |
|
|
; |
|
|
; |
|
|
IMM1_CFG: ; DEVICE 1 |
|
|
IMM1_CFG: ; DEVICE 1 |
|
|
.DB 0 ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) |
|
|
.DB 0 ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) |
|
|
.DB IMM1MODE ; DRIVER DEVICE MODE |
|
|
|
|
|
|
|
|
.DB IMMMODE ; DRIVER DEVICE MODE |
|
|
.DB 0 ; DEVICE STATUS |
|
|
.DB 0 ; DEVICE STATUS |
|
|
.DB IMM1BASE ; IO BASE ADDRESS |
|
|
.DB IMM1BASE ; IO BASE ADDRESS |
|
|
.DW 0,0 ; DEVICE CAPACITY |
|
|
.DW 0,0 ; DEVICE CAPACITY |
|
|
|