|
|
@ -26,9 +26,9 @@ SCSI_SR_CSD .EQU SCSIBASE ; CURRENT SCSI DATA |
|
|
SCSI_SR_ICR .EQU SCSIBASE + $01 ; INITIATOR COMMAND |
|
|
SCSI_SR_ICR .EQU SCSIBASE + $01 ; INITIATOR COMMAND |
|
|
SCSI_SR_MR .EQU SCSIBASE + $02 ; MODE |
|
|
SCSI_SR_MR .EQU SCSIBASE + $02 ; MODE |
|
|
SCSI_SR_TCR .EQU SCSIBASE + $03 ; TARGET COMMAND |
|
|
SCSI_SR_TCR .EQU SCSIBASE + $03 ; TARGET COMMAND |
|
|
SCSI_SR_CSBS .EQU SCSIBASE + $04 ; CURRENT SCSI BUS STAT. |
|
|
|
|
|
|
|
|
SCSI_SR_CSBS .EQU SCSIBASE + $04 ; CURRENT SCSI BUS STAT |
|
|
SCSI_SR_BSR .EQU SCSIBASE + $05 ; BUS STATUS |
|
|
SCSI_SR_BSR .EQU SCSIBASE + $05 ; BUS STATUS |
|
|
SCSI_SR_IDR .EQU SCSIBASE + $06 ; INITIATOR DMA RECV. |
|
|
|
|
|
|
|
|
SCSI_SR_IDR .EQU SCSIBASE + $06 ; INITIATOR DMA RECV |
|
|
SCSI_SR_RPI .EQU SCSIBASE + $07 ; RESET PARITY/IRQ |
|
|
SCSI_SR_RPI .EQU SCSIBASE + $07 ; RESET PARITY/IRQ |
|
|
; |
|
|
; |
|
|
; NCR 5380 OUTPUT ONLY REGISTERS |
|
|
; NCR 5380 OUTPUT ONLY REGISTERS |
|
|
@ -36,8 +36,8 @@ SCSI_SR_RPI .EQU SCSIBASE + $07 ; RESET PARITY/IRQ |
|
|
SCSI_SR_ODR .EQU SCSIBASE ; OUTPUT DATA |
|
|
SCSI_SR_ODR .EQU SCSIBASE ; OUTPUT DATA |
|
|
SCSI_SR_SER .EQU SCSIBASE + $04 ; SELECT ENABLE |
|
|
SCSI_SR_SER .EQU SCSIBASE + $04 ; SELECT ENABLE |
|
|
SCSI_SR_SDS .EQU SCSIBASE + $05 ; START DMA SEND |
|
|
SCSI_SR_SDS .EQU SCSIBASE + $05 ; START DMA SEND |
|
|
SCSI_SR_SDTR .EQU SCSIBASE + $06 ; START TARGET DMA RECV. |
|
|
|
|
|
SCSI_SR_SDIR .EQU SCSIBASE + $07 ; START INITIATOR DMA RECV. |
|
|
|
|
|
|
|
|
SCSI_SR_SDTR .EQU SCSIBASE + $06 ; START TARGET DMA RECV |
|
|
|
|
|
SCSI_SR_SDIR .EQU SCSIBASE + $07 ; START INITIATOR DMA RECV |
|
|
; |
|
|
; |
|
|
; SCSI CURRENT BUS STATUS BIT MASKS |
|
|
; SCSI CURRENT BUS STATUS BIT MASKS |
|
|
; |
|
|
; |
|
|
@ -58,10 +58,14 @@ SCSI_SM_PHM .EQU $08 ; PHASE MATCH BIT |
|
|
; |
|
|
; |
|
|
SCSI_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) |
|
|
SCSI_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) |
|
|
SCSI_IOBASE .EQU 1 ; IO BASE ADDRESS (BYTE) |
|
|
SCSI_IOBASE .EQU 1 ; IO BASE ADDRESS (BYTE) |
|
|
SCSI_LUN .EQU 2 ; TARGET LUN |
|
|
|
|
|
SCSI_STAT .EQU 3 ; LAST STATUS (BYTE) |
|
|
|
|
|
SCSI_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD) |
|
|
|
|
|
SCSI_LBA .EQU 8 ; OFFSET OF LBA (DWORD) |
|
|
|
|
|
|
|
|
SCSI_TGT .EQU 2 ; TARGET DEVICE ID |
|
|
|
|
|
SCSI_TID .EQU 3 ; TARGET DEVICE BIT PATTERN |
|
|
|
|
|
SCSI_LUN .EQU 4 ; TARGET LUN |
|
|
|
|
|
SCSI_STAT .EQU 5 ; LAST STATUS (BYTE) |
|
|
|
|
|
SCSI_MEDCAP .EQU 6 ; MEDIA CAPACITY (DWORD) |
|
|
|
|
|
SCSI_LBA .EQU 10 ; OFFSET OF LBA (DWORD) |
|
|
|
|
|
; |
|
|
|
|
|
SCSI_CFGSIZ .EQU 14 ; SIZE OF CFG TBL ENTRIES |
|
|
; |
|
|
; |
|
|
;-------------------------------------------------------------------------------------------------- |
|
|
;-------------------------------------------------------------------------------------------------- |
|
|
; HBIOS MODULE HEADER |
|
|
; HBIOS MODULE HEADER |
|
|
@ -80,8 +84,6 @@ SCSI_INITPHASE: |
|
|
JP Z,SCSI_INIT ; DO INIT |
|
|
JP Z,SCSI_INIT ; DO INIT |
|
|
RET ; DONE |
|
|
RET ; DONE |
|
|
; |
|
|
; |
|
|
SCSI_CFGSIZ .EQU 12 ; SIZE OF CFG TBL ENTRIES |
|
|
|
|
|
; |
|
|
|
|
|
SCSI_CFGTBL: |
|
|
SCSI_CFGTBL: |
|
|
; |
|
|
; |
|
|
#IF (SCSICNT >= 1) |
|
|
#IF (SCSICNT >= 1) |
|
|
@ -89,6 +91,8 @@ SCSI_CFGTBL: |
|
|
SCSI0_CFG: |
|
|
SCSI0_CFG: |
|
|
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) |
|
|
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) |
|
|
.DB SCSIBASE ; IO BASE ADDRESS |
|
|
.DB SCSIBASE ; IO BASE ADDRESS |
|
|
|
|
|
.DB SCSI0_TGT ; TARGT DEVICE ID |
|
|
|
|
|
.DB 1 << SCSI0_TGT ; TARGET DEVICE BIT PATTERN |
|
|
.DB SCSI0_LUN ; SCSI TARGET LUN |
|
|
.DB SCSI0_LUN ; SCSI TARGET LUN |
|
|
.DB SCSI_STNOTRDY ; DEVICE STATUS |
|
|
.DB SCSI_STNOTRDY ; DEVICE STATUS |
|
|
.DW $0000,$0010 ; DEVICE CAPACITY (BLOCKS) |
|
|
.DW $0000,$0010 ; DEVICE CAPACITY (BLOCKS) |
|
|
@ -96,8 +100,8 @@ SCSI0_CFG: |
|
|
; |
|
|
; |
|
|
DEVECHO "SCSI: IO=" |
|
|
DEVECHO "SCSI: IO=" |
|
|
DEVECHO SCSIBASE |
|
|
DEVECHO SCSIBASE |
|
|
DEVECHO ", TGT ID=" |
|
|
|
|
|
DEVECHO SCSI_TID |
|
|
|
|
|
|
|
|
DEVECHO ", TGT=" |
|
|
|
|
|
DEVECHO SCSI0_TGT |
|
|
DEVECHO ", LUN=" |
|
|
DEVECHO ", LUN=" |
|
|
DEVECHO SCSI0_LUN |
|
|
DEVECHO SCSI0_LUN |
|
|
DEVECHO "\n" |
|
|
DEVECHO "\n" |
|
|
@ -106,6 +110,8 @@ SCSI0_CFG: |
|
|
#IF (SCSICNT >= 2) |
|
|
#IF (SCSICNT >= 2) |
|
|
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) |
|
|
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) |
|
|
.DB SCSIBASE ; IO BASE ADDRESS |
|
|
.DB SCSIBASE ; IO BASE ADDRESS |
|
|
|
|
|
.DB SCSI1_TGT ; TARGT DEVICE ID |
|
|
|
|
|
.DB 1 << SCSI1_TGT ; TARGET DEVICE BIT PATTERN |
|
|
.DB SCSI1_LUN ; SCSI TARGET LUN |
|
|
.DB SCSI1_LUN ; SCSI TARGET LUN |
|
|
.DB SCSI_STNOTRDY ; DEVICE STATUS |
|
|
.DB SCSI_STNOTRDY ; DEVICE STATUS |
|
|
.DW $0000,$0010 ; DEVICE CAPACITY (BLOCKS) |
|
|
.DW $0000,$0010 ; DEVICE CAPACITY (BLOCKS) |
|
|
@ -113,13 +119,51 @@ SCSI0_CFG: |
|
|
; |
|
|
; |
|
|
DEVECHO "SCSI: IO=" |
|
|
DEVECHO "SCSI: IO=" |
|
|
DEVECHO SCSIBASE |
|
|
DEVECHO SCSIBASE |
|
|
DEVECHO ", TGT ID=" |
|
|
|
|
|
DEVECHO SCSI_TID |
|
|
|
|
|
|
|
|
DEVECHO ", TGT=" |
|
|
|
|
|
DEVECHO SCSI1_TGT |
|
|
DEVECHO ", LUN=" |
|
|
DEVECHO ", LUN=" |
|
|
DEVECHO SCSI1_LUN |
|
|
DEVECHO SCSI1_LUN |
|
|
DEVECHO "\n" |
|
|
DEVECHO "\n" |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
|
|
|
#IF (SCSICNT >= 3) |
|
|
|
|
|
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) |
|
|
|
|
|
.DB SCSIBASE ; IO BASE ADDRESS |
|
|
|
|
|
.DB SCSI2_TGT ; TARGT DEVICE ID |
|
|
|
|
|
.DB 1 << SCSI2_TGT ; TARGET DEVICE BIT PATTERN |
|
|
|
|
|
.DB SCSI2_LUN ; SCSI TARGET LUN |
|
|
|
|
|
.DB SCSI_STNOTRDY ; DEVICE STATUS |
|
|
|
|
|
.DW $0000,$0010 ; DEVICE CAPACITY (BLOCKS) |
|
|
|
|
|
.DW 0,0 ; CURRENT LBA |
|
|
|
|
|
; |
|
|
|
|
|
DEVECHO "SCSI: IO=" |
|
|
|
|
|
DEVECHO SCSIBASE |
|
|
|
|
|
DEVECHO ", TGT=" |
|
|
|
|
|
DEVECHO SCSI2_TGT |
|
|
|
|
|
DEVECHO ", LUN=" |
|
|
|
|
|
DEVECHO SCSI2_LUN |
|
|
|
|
|
DEVECHO "\n" |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
; |
|
|
|
|
|
#IF (SCSICNT >= 4) |
|
|
|
|
|
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) |
|
|
|
|
|
.DB SCSIBASE ; IO BASE ADDRESS |
|
|
|
|
|
.DB SCSI3_TGT ; TARGT DEVICE ID |
|
|
|
|
|
.DB 1 << SCSI3_TGT ; TARGET DEVICE BIT PATTERN |
|
|
|
|
|
.DB SCSI3_LUN ; SCSI TARGET LUN |
|
|
|
|
|
.DB SCSI_STNOTRDY ; DEVICE STATUS |
|
|
|
|
|
.DW $0000,$0010 ; DEVICE CAPACITY (BLOCKS) |
|
|
|
|
|
.DW 0,0 ; CURRENT LBA |
|
|
|
|
|
; |
|
|
|
|
|
DEVECHO "SCSI: IO=" |
|
|
|
|
|
DEVECHO SCSIBASE |
|
|
|
|
|
DEVECHO ", TGT=" |
|
|
|
|
|
DEVECHO SCSI3_TGT |
|
|
|
|
|
DEVECHO ", LUN=" |
|
|
|
|
|
DEVECHO SCSI3_LUN |
|
|
|
|
|
DEVECHO "\n" |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
; |
|
|
#IF ($ - SCSI_CFGTBL) != (SCSICNT * SCSI_CFGSIZ) |
|
|
#IF ($ - SCSI_CFGTBL) != (SCSICNT * SCSI_CFGSIZ) |
|
|
.ECHO "*** INVALID SCSI CONFIG TABLE ***\n" |
|
|
.ECHO "*** INVALID SCSI CONFIG TABLE ***\n" |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
@ -145,10 +189,6 @@ SCSI_INIT: |
|
|
RET ; AND BAIL OUT |
|
|
RET ; AND BAIL OUT |
|
|
; |
|
|
; |
|
|
SCSI_INIT1: |
|
|
SCSI_INIT1: |
|
|
PRTS(" TGT_ID=$") ; LABEL FOR IO ADDRESS |
|
|
|
|
|
LD A,SCSI_TID ; GET IO BASE ADDRES |
|
|
|
|
|
CALL PRTDEC8 ; DISPLAY IT |
|
|
|
|
|
; |
|
|
|
|
|
XOR A ; ZERO ACCUM |
|
|
XOR A ; ZERO ACCUM |
|
|
LD (SCSI_DEVNUM),A ; INIT DEV UNIT NUM FOR DYNAMIC ASSIGNMENT |
|
|
LD (SCSI_DEVNUM),A ; INIT DEV UNIT NUM FOR DYNAMIC ASSIGNMENT |
|
|
LD IY,SCSI_CFGTBL ; POINT TO START OF CONFIG TABLE |
|
|
LD IY,SCSI_CFGTBL ; POINT TO START OF CONFIG TABLE |
|
|
@ -178,6 +218,10 @@ SCSI_INIT3: |
|
|
CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE |
|
|
CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE |
|
|
; |
|
|
; |
|
|
CALL SCSI_PRTPREFIX ; TAG FOR ACTIVE DEVICE |
|
|
CALL SCSI_PRTPREFIX ; TAG FOR ACTIVE DEVICE |
|
|
|
|
|
; |
|
|
|
|
|
PRTS(" TGT=$") ; LABEL FOR TARGET DEVICE |
|
|
|
|
|
LD A,(IY+SCSI_TGT) ; GET TARGET DEVICE |
|
|
|
|
|
CALL PRTDEC8 ; DISPLAY IT |
|
|
; |
|
|
; |
|
|
PRTS(" LUN=$") ; LUN LABEL |
|
|
PRTS(" LUN=$") ; LUN LABEL |
|
|
LD A,(IY+SCSI_LUN) ; LOAD LUN |
|
|
LD A,(IY+SCSI_LUN) ; LOAD LUN |
|
|
@ -529,6 +573,8 @@ SCSI_CAPACITY: |
|
|
SCSI_GO: |
|
|
SCSI_GO: |
|
|
PUSH IX ; PRESERVE IX |
|
|
PUSH IX ; PRESERVE IX |
|
|
LD IX,SCSI_S_IOT ; POINT TO IO TABLE |
|
|
LD IX,SCSI_S_IOT ; POINT TO IO TABLE |
|
|
|
|
|
LD A,(IY+SCSI_TID) ; GET TARGET ID |
|
|
|
|
|
LD (IX),A ; PUT IN IOT |
|
|
CALL SCSI_GO1 ; RUN THE TRANSACTION |
|
|
CALL SCSI_GO1 ; RUN THE TRANSACTION |
|
|
POP IX ; RESTORE IX |
|
|
POP IX ; RESTORE IX |
|
|
AND %00111110 ; IGNORE RESERVED BITS OF STATUS |
|
|
AND %00111110 ; IGNORE RESERVED BITS OF STATUS |
|
|
@ -579,7 +625,7 @@ S_SWT: |
|
|
S_BSYA: |
|
|
S_BSYA: |
|
|
XOR A ; CLEAR A |
|
|
XOR A ; CLEAR A |
|
|
OUT (SCSI_SR_ICR),A ; CLEAR SEL AND DATA |
|
|
OUT (SCSI_SR_ICR),A ; CLEAR SEL AND DATA |
|
|
|
|
|
|
|
|
|
|
|
; |
|
|
;------------------------------------------------------------------------------- |
|
|
;------------------------------------------------------------------------------- |
|
|
; |
|
|
; |
|
|
; TARGET IS SELECTED SO TEST BSY AND REQ |
|
|
; TARGET IS SELECTED SO TEST BSY AND REQ |
|
|
@ -595,7 +641,7 @@ S_WTREQ: |
|
|
LD B,A ; SAVE COPY |
|
|
LD B,A ; SAVE COPY |
|
|
AND SCSI_SM_BSY ; MASK TO BUSY BIT |
|
|
AND SCSI_SM_BSY ; MASK TO BUSY BIT |
|
|
JR NZ,S_WTRQ1 ; STILL BUSY SO CONT. |
|
|
JR NZ,S_WTRQ1 ; STILL BUSY SO CONT. |
|
|
|
|
|
|
|
|
|
|
|
; |
|
|
;------------------------------------------------------------------------------- |
|
|
;------------------------------------------------------------------------------- |
|
|
; BUSY LOST SO EXIT |
|
|
; BUSY LOST SO EXIT |
|
|
;------------------------------------------------------------------------------- |
|
|
;------------------------------------------------------------------------------- |
|
|
@ -633,10 +679,11 @@ S_WTRQ1: |
|
|
LD D,(HL) |
|
|
LD D,(HL) |
|
|
PUSH DE |
|
|
PUSH DE |
|
|
RET ; EXECUTE PHASE |
|
|
RET ; EXECUTE PHASE |
|
|
|
|
|
|
|
|
|
|
|
; |
|
|
;------------------------------------------------------------------------------- |
|
|
;------------------------------------------------------------------------------- |
|
|
; PHASE TABLE |
|
|
; PHASE TABLE |
|
|
;------------------------------------------------------------------------------- |
|
|
;------------------------------------------------------------------------------- |
|
|
|
|
|
; |
|
|
PHTABL: |
|
|
PHTABL: |
|
|
.WORD PHASE0 ; DATA OUT |
|
|
.WORD PHASE0 ; DATA OUT |
|
|
.WORD PHASE1 ; DATA IN |
|
|
.WORD PHASE1 ; DATA IN |
|
|
@ -646,7 +693,7 @@ PHTABL: |
|
|
.WORD S_EXIT ; UNUSED |
|
|
.WORD S_EXIT ; UNUSED |
|
|
.WORD PHASE6 ; MESSAGE OUT |
|
|
.WORD PHASE6 ; MESSAGE OUT |
|
|
.WORD PHASE7 ; MESSAGE IN |
|
|
.WORD PHASE7 ; MESSAGE IN |
|
|
|
|
|
|
|
|
|
|
|
; |
|
|
;------------------------------------------------------------------------------- |
|
|
;------------------------------------------------------------------------------- |
|
|
;PHASE HANDLERS |
|
|
;PHASE HANDLERS |
|
|
;------------------------------------------------------------------------------- |
|
|
;------------------------------------------------------------------------------- |
|
|
@ -686,6 +733,7 @@ PHASE7: |
|
|
LD L,(IX+12) |
|
|
LD L,(IX+12) |
|
|
LD H,(IX+13) |
|
|
LD H,(IX+13) |
|
|
JP S_READ |
|
|
JP S_READ |
|
|
|
|
|
; |
|
|
;------------------------------------------------------------------------------- |
|
|
;------------------------------------------------------------------------------- |
|
|
; SCSI WRITE ROUTINE (SEND BYTES TO TARGET) |
|
|
; SCSI WRITE ROUTINE (SEND BYTES TO TARGET) |
|
|
; BUS PHASE ALREADY SET. RETURN ON PHASE MISMATCH |
|
|
; BUS PHASE ALREADY SET. RETURN ON PHASE MISMATCH |
|
|
@ -753,11 +801,12 @@ S_RWREQ: |
|
|
JP PHASE ; |
|
|
JP PHASE ; |
|
|
; |
|
|
; |
|
|
; REQUEST ACTIVE SO CHECK PHASE |
|
|
; REQUEST ACTIVE SO CHECK PHASE |
|
|
|
|
|
; |
|
|
S_RNXT: |
|
|
S_RNXT: |
|
|
IN A,(SCSI_SR_BSR) ; GET STATUS |
|
|
IN A,(SCSI_SR_BSR) ; GET STATUS |
|
|
AND SCSI_SM_PHM ; MASK TO PHASE MATCH |
|
|
AND SCSI_SM_PHM ; MASK TO PHASE MATCH |
|
|
JP Z,PHASE ; JMP IF PHASE MISMATCH |
|
|
JP Z,PHASE ; JMP IF PHASE MISMATCH |
|
|
|
|
|
|
|
|
|
|
|
; |
|
|
; REQUEST ACTIVE AND PHASE MATCH SO GET DATA |
|
|
; REQUEST ACTIVE AND PHASE MATCH SO GET DATA |
|
|
; |
|
|
; |
|
|
IN A, (SCSI_SR_CSD) ; GET DATA |
|
|
IN A, (SCSI_SR_CSD) ; GET DATA |
|
|
@ -775,7 +824,6 @@ S_RNREQ: |
|
|
XOR A |
|
|
XOR A |
|
|
OUT (SCSI_SR_ICR),A ; DROP ACK |
|
|
OUT (SCSI_SR_ICR),A ; DROP ACK |
|
|
JP S_READ ; LOOP FOR NEXT BYTE/PHASE |
|
|
JP S_READ ; LOOP FOR NEXT BYTE/PHASE |
|
|
|
|
|
|
|
|
; |
|
|
; |
|
|
;============================================================================= |
|
|
;============================================================================= |
|
|
; HARDWARE INTERFACE ROUTINES |
|
|
; HARDWARE INTERFACE ROUTINES |
|
|
@ -935,7 +983,7 @@ SCSI_CAP_LUN .DB 0 << 5 ; LUN (TOP 3 BITS) |
|
|
;SCSI I/O ADDRESS TABLE FOR READ/WRITE |
|
|
;SCSI I/O ADDRESS TABLE FOR READ/WRITE |
|
|
;DONT MESS WITH THIS EITHER |
|
|
;DONT MESS WITH THIS EITHER |
|
|
SCSI_S_IOT: |
|
|
SCSI_S_IOT: |
|
|
SCSI_CUR_TID .DB 1 << SCSI_TID ; TARGET |
|
|
|
|
|
|
|
|
SCSI_CUR_TID .DB 0 ; TARGET (FILLED DYNAMICALLY) |
|
|
.DB 0 ; UNUSED |
|
|
.DB 0 ; UNUSED |
|
|
SCSI_CUR_CDB .DW SCSI_S_CDB ; CDB POINTER |
|
|
SCSI_CUR_CDB .DW SCSI_S_CDB ; CDB POINTER |
|
|
.DW SCSI_S_STAT ; STATUS POINTER |
|
|
.DW SCSI_S_STAT ; STATUS POINTER |
|
|
|