|
|
|
|
@@ -26,9 +26,9 @@ SCSI_SR_CSD .EQU SCSIBASE ; CURRENT SCSI DATA
|
|
|
|
|
SCSI_SR_ICR .EQU SCSIBASE + $01 ; INITIATOR COMMAND
|
|
|
|
|
SCSI_SR_MR .EQU SCSIBASE + $02 ; MODE
|
|
|
|
|
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_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
|
|
|
|
|
;
|
|
|
|
|
; 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_SER .EQU SCSIBASE + $04 ; SELECT ENABLE
|
|
|
|
|
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
|
|
|
|
|
;
|
|
|
|
|
@@ -58,10 +58,14 @@ SCSI_SM_PHM .EQU $08 ; PHASE MATCH BIT
|
|
|
|
|
;
|
|
|
|
|
SCSI_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (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
|
|
|
|
|
@@ -80,8 +84,6 @@ SCSI_INITPHASE:
|
|
|
|
|
JP Z,SCSI_INIT ; DO INIT
|
|
|
|
|
RET ; DONE
|
|
|
|
|
;
|
|
|
|
|
SCSI_CFGSIZ .EQU 12 ; SIZE OF CFG TBL ENTRIES
|
|
|
|
|
;
|
|
|
|
|
SCSI_CFGTBL:
|
|
|
|
|
;
|
|
|
|
|
#IF (SCSICNT >= 1)
|
|
|
|
|
@@ -89,6 +91,8 @@ SCSI_CFGTBL:
|
|
|
|
|
SCSI0_CFG:
|
|
|
|
|
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY)
|
|
|
|
|
.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 SCSI_STNOTRDY ; DEVICE STATUS
|
|
|
|
|
.DW $0000,$0010 ; DEVICE CAPACITY (BLOCKS)
|
|
|
|
|
@@ -96,8 +100,8 @@ SCSI0_CFG:
|
|
|
|
|
;
|
|
|
|
|
DEVECHO "SCSI: IO="
|
|
|
|
|
DEVECHO SCSIBASE
|
|
|
|
|
DEVECHO ", TGT ID="
|
|
|
|
|
DEVECHO SCSI_TID
|
|
|
|
|
DEVECHO ", TGT="
|
|
|
|
|
DEVECHO SCSI0_TGT
|
|
|
|
|
DEVECHO ", LUN="
|
|
|
|
|
DEVECHO SCSI0_LUN
|
|
|
|
|
DEVECHO "\n"
|
|
|
|
|
@@ -106,6 +110,8 @@ SCSI0_CFG:
|
|
|
|
|
#IF (SCSICNT >= 2)
|
|
|
|
|
.DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY)
|
|
|
|
|
.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 SCSI_STNOTRDY ; DEVICE STATUS
|
|
|
|
|
.DW $0000,$0010 ; DEVICE CAPACITY (BLOCKS)
|
|
|
|
|
@@ -113,13 +119,51 @@ SCSI0_CFG:
|
|
|
|
|
;
|
|
|
|
|
DEVECHO "SCSI: IO="
|
|
|
|
|
DEVECHO SCSIBASE
|
|
|
|
|
DEVECHO ", TGT ID="
|
|
|
|
|
DEVECHO SCSI_TID
|
|
|
|
|
DEVECHO ", TGT="
|
|
|
|
|
DEVECHO SCSI1_TGT
|
|
|
|
|
DEVECHO ", LUN="
|
|
|
|
|
DEVECHO SCSI1_LUN
|
|
|
|
|
DEVECHO "\n"
|
|
|
|
|
#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)
|
|
|
|
|
.ECHO "*** INVALID SCSI CONFIG TABLE ***\n"
|
|
|
|
|
#ENDIF
|
|
|
|
|
@@ -145,10 +189,6 @@ SCSI_INIT:
|
|
|
|
|
RET ; AND BAIL OUT
|
|
|
|
|
;
|
|
|
|
|
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
|
|
|
|
|
LD (SCSI_DEVNUM),A ; INIT DEV UNIT NUM FOR DYNAMIC ASSIGNMENT
|
|
|
|
|
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 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
|
|
|
|
|
LD A,(IY+SCSI_LUN) ; LOAD LUN
|
|
|
|
|
@@ -529,6 +573,8 @@ SCSI_CAPACITY:
|
|
|
|
|
SCSI_GO:
|
|
|
|
|
PUSH IX ; PRESERVE IX
|
|
|
|
|
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
|
|
|
|
|
POP IX ; RESTORE IX
|
|
|
|
|
AND %00111110 ; IGNORE RESERVED BITS OF STATUS
|
|
|
|
|
@@ -536,246 +582,248 @@ SCSI_GO:
|
|
|
|
|
RET ; DONE
|
|
|
|
|
;
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
|
|
|
;DO SCSI TRANSACTION
|
|
|
|
|
; DO SCSI TRANSACTION
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
|
|
|
;
|
|
|
|
|
SCSI_GO1:
|
|
|
|
|
LD A,$FF ;PRESET ERROR STATUS
|
|
|
|
|
LD L,(IX+4) ;POINT TO STATUS ADDRESS
|
|
|
|
|
LD H,(IX+5) ;POINT TO STATUS ADDRESS
|
|
|
|
|
LD (HL),A ;SET ERROR
|
|
|
|
|
LD A,$FF ; PRESET ERROR STATUS
|
|
|
|
|
LD L,(IX+4) ; POINT TO STATUS ADDRESS
|
|
|
|
|
LD H,(IX+5) ; POINT TO STATUS ADDRESS
|
|
|
|
|
LD (HL),A ; SET ERROR
|
|
|
|
|
;
|
|
|
|
|
XOR A ;
|
|
|
|
|
OUT (SCSI_SR_MR),A ;RESET CONTROL REG
|
|
|
|
|
OUT (SCSI_SR_TCR),A ;CLEAR COMMAND REG.
|
|
|
|
|
OUT (SCSI_SR_ICR),A ;
|
|
|
|
|
LD A,(IX) ;GET TID
|
|
|
|
|
BIT 7,A ; TURN ON MY ID
|
|
|
|
|
OUT (SCSI_SR_ODR),A ;SET TARGET ID
|
|
|
|
|
LD A,$01 ;DRIVE BUS
|
|
|
|
|
OUT (SCSI_SR_ICR),A ;
|
|
|
|
|
LD A,$05 ;SET SEL AND DRIVE BUS
|
|
|
|
|
OUT (SCSI_SR_ICR),A ;
|
|
|
|
|
XOR A ;
|
|
|
|
|
OUT (SCSI_SR_MR),A ; RESET CONTROL REG
|
|
|
|
|
OUT (SCSI_SR_TCR),A ; CLEAR COMMAND REG.
|
|
|
|
|
OUT (SCSI_SR_ICR),A ;
|
|
|
|
|
LD A,(IX) ; GET TID
|
|
|
|
|
BIT 7,A ; TURN ON MY ID
|
|
|
|
|
OUT (SCSI_SR_ODR),A ; SET TARGET ID
|
|
|
|
|
LD A,$01 ; DRIVE BUS
|
|
|
|
|
OUT (SCSI_SR_ICR),A ;
|
|
|
|
|
LD A,$05 ; SET SEL AND DRIVE BUS
|
|
|
|
|
OUT (SCSI_SR_ICR),A ;
|
|
|
|
|
;
|
|
|
|
|
;WAIT FOR SCSI BUSY
|
|
|
|
|
LD BC,0 ;INIT TIMEOUT
|
|
|
|
|
; WAIT FOR SCSI BUSY
|
|
|
|
|
LD BC,0 ; INIT TIMEOUT
|
|
|
|
|
S_SWT:
|
|
|
|
|
IN A,(SCSI_SR_CSBS) ;GET BUS STATUS
|
|
|
|
|
AND SCSI_SM_BSY ;MASK TO BUSY BIT
|
|
|
|
|
JR NZ,S_BSYA ;JMP IF BUSY ACTIVE
|
|
|
|
|
NOP ;KILL A LITTLE TIME
|
|
|
|
|
IN A,(SCSI_SR_CSBS) ; GET BUS STATUS
|
|
|
|
|
AND SCSI_SM_BSY ; MASK TO BUSY BIT
|
|
|
|
|
JR NZ,S_BSYA ; JMP IF BUSY ACTIVE
|
|
|
|
|
NOP ; KILL A LITTLE TIME
|
|
|
|
|
NOP
|
|
|
|
|
NOP
|
|
|
|
|
NOP
|
|
|
|
|
DEC BC ;DEC TIMEOUT
|
|
|
|
|
LD A,B ;TEST TIMEOUT=0
|
|
|
|
|
DEC BC ; DEC TIMEOUT
|
|
|
|
|
LD A,B ; TEST TIMEOUT=0
|
|
|
|
|
OR C
|
|
|
|
|
JR NZ,S_SWT ;JMP IF NO TIMEOUT
|
|
|
|
|
XOR A ;CLEAR A
|
|
|
|
|
OUT (SCSI_SR_ICR),A ;CLEAR SEL AND DATA
|
|
|
|
|
JR S_EXIT ;ERROR EXIT
|
|
|
|
|
JR NZ,S_SWT ; JMP IF NO TIMEOUT
|
|
|
|
|
XOR A ; CLEAR A
|
|
|
|
|
OUT (SCSI_SR_ICR),A ; CLEAR SEL AND DATA
|
|
|
|
|
JR S_EXIT ; ERROR EXIT
|
|
|
|
|
;
|
|
|
|
|
;BUSY IS ACTIVE
|
|
|
|
|
S_BSYA:
|
|
|
|
|
XOR A ;CLEAR A
|
|
|
|
|
OUT (SCSI_SR_ICR),A ;CLEAR SEL AND DATA
|
|
|
|
|
|
|
|
|
|
XOR A ; CLEAR A
|
|
|
|
|
OUT (SCSI_SR_ICR),A ; CLEAR SEL AND DATA
|
|
|
|
|
;
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
|
|
|
;
|
|
|
|
|
;TARGET IS SELECTED SO TEST BSY AND REQ
|
|
|
|
|
;THEN DECODE REQUESTED PHASE
|
|
|
|
|
; TARGET IS SELECTED SO TEST BSY AND REQ
|
|
|
|
|
; THEN DECODE REQUESTED PHASE
|
|
|
|
|
;
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
|
|
|
PHASE:
|
|
|
|
|
XOR A
|
|
|
|
|
OUT (SCSI_SR_ICR),A ;RESET INITIATOR
|
|
|
|
|
OUT (SCSI_SR_ICR),A ; RESET INITIATOR
|
|
|
|
|
;
|
|
|
|
|
S_WTREQ:
|
|
|
|
|
IN A,(SCSI_SR_CSBS) ;GET BUS STATUS
|
|
|
|
|
LD B,A ;SAVE COPY
|
|
|
|
|
AND SCSI_SM_BSY ;MASK TO BUSY BIT
|
|
|
|
|
JR NZ,S_WTRQ1 ;STILL BUSY SO CONT.
|
|
|
|
|
|
|
|
|
|
IN A,(SCSI_SR_CSBS) ; GET BUS STATUS
|
|
|
|
|
LD B,A ; SAVE COPY
|
|
|
|
|
AND SCSI_SM_BSY ; MASK TO BUSY BIT
|
|
|
|
|
JR NZ,S_WTRQ1 ; STILL BUSY SO CONT.
|
|
|
|
|
;
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
|
|
|
;BUSY LOST SO EXIT
|
|
|
|
|
; BUSY LOST SO EXIT
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
|
|
|
S_EXIT:
|
|
|
|
|
LD L,(IX+4) ;GET STATUS POINTER
|
|
|
|
|
LD H,(IX+5) ;GET STATUS POINTER
|
|
|
|
|
LD L,(IX+4) ; GET STATUS POINTER
|
|
|
|
|
LD H,(IX+5) ; GET STATUS POINTER
|
|
|
|
|
LD A,(HL)
|
|
|
|
|
RET ;BUSY LOST? WERE DONE
|
|
|
|
|
RET ; BUSY LOST? WERE DONE
|
|
|
|
|
;
|
|
|
|
|
S_WTRQ1:
|
|
|
|
|
LD A,B ;RECOVER STATUS
|
|
|
|
|
AND SCSI_SM_REQ ;REQUEST ACTIVE?
|
|
|
|
|
JR Z,S_WTREQ ;LOOP TILL REQUEST
|
|
|
|
|
LD A,B ; RECOVER STATUS
|
|
|
|
|
AND SCSI_SM_REQ ; REQUEST ACTIVE?
|
|
|
|
|
JR Z,S_WTREQ ; LOOP TILL REQUEST
|
|
|
|
|
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
|
|
|
;REQUEST IS ACTIVE SO SET 5380 TO REQUESTED PHASE
|
|
|
|
|
; REQUEST IS ACTIVE SO SET 5380 TO REQUESTED PHASE
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
|
|
|
LD A,B ;RECOVER BUS STATUS
|
|
|
|
|
RR A ;SHIFT STATUS TO PHASE BITS
|
|
|
|
|
LD A,B ; RECOVER BUS STATUS
|
|
|
|
|
RR A ; SHIFT STATUS TO PHASE BITS
|
|
|
|
|
RR A
|
|
|
|
|
AND $07 ;MASK TO PHASE BITS
|
|
|
|
|
OUT (SCSI_SR_TCR),A ;SET PHASE
|
|
|
|
|
AND $07 ; MASK TO PHASE BITS
|
|
|
|
|
OUT (SCSI_SR_TCR),A ; SET PHASE
|
|
|
|
|
;
|
|
|
|
|
;JUMP TO PHASE HANDLER
|
|
|
|
|
; JUMP TO PHASE HANDLER
|
|
|
|
|
;
|
|
|
|
|
LD A,B ;RECOVER BUS STATUS
|
|
|
|
|
LD A,B ; RECOVER BUS STATUS
|
|
|
|
|
RR A
|
|
|
|
|
AND $0E ;MASK TO PHASE BITS
|
|
|
|
|
LD E,A ;
|
|
|
|
|
AND $0E ; MASK TO PHASE BITS
|
|
|
|
|
LD E,A ;
|
|
|
|
|
LD D,0
|
|
|
|
|
LD HL,PHTABL ;POINT TO TABLE
|
|
|
|
|
ADD HL,DE ;OFFSET INTO TABLE
|
|
|
|
|
LD E,(HL) ;GET EXECUTION ADDRESS
|
|
|
|
|
LD HL,PHTABL ; POINT TO TABLE
|
|
|
|
|
ADD HL,DE ; OFFSET INTO TABLE
|
|
|
|
|
LD E,(HL) ; GET EXECUTION ADDRESS
|
|
|
|
|
INC HL
|
|
|
|
|
LD D,(HL)
|
|
|
|
|
PUSH DE
|
|
|
|
|
RET ;EXECUTE PHASE
|
|
|
|
|
|
|
|
|
|
RET ; EXECUTE PHASE
|
|
|
|
|
;
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
|
|
|
;PHASE TABLE
|
|
|
|
|
; PHASE TABLE
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
|
|
|
;
|
|
|
|
|
PHTABL:
|
|
|
|
|
.WORD PHASE0 ;DATA OUT
|
|
|
|
|
.WORD PHASE1 ;DATA IN
|
|
|
|
|
.WORD PHASE2 ;CMD OUT
|
|
|
|
|
.WORD PHASE3 ;STATUS IN
|
|
|
|
|
.WORD S_EXIT ;UNUSED
|
|
|
|
|
.WORD S_EXIT ;UNUSED
|
|
|
|
|
.WORD PHASE6 ;MESSAGE OUT
|
|
|
|
|
.WORD PHASE7 ;MESSAGE IN
|
|
|
|
|
|
|
|
|
|
.WORD PHASE0 ; DATA OUT
|
|
|
|
|
.WORD PHASE1 ; DATA IN
|
|
|
|
|
.WORD PHASE2 ; CMD OUT
|
|
|
|
|
.WORD PHASE3 ; STATUS IN
|
|
|
|
|
.WORD S_EXIT ; UNUSED
|
|
|
|
|
.WORD S_EXIT ; UNUSED
|
|
|
|
|
.WORD PHASE6 ; MESSAGE OUT
|
|
|
|
|
.WORD PHASE7 ; MESSAGE IN
|
|
|
|
|
;
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
|
|
|
;PHASE HANDLERS
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
|
|
|
;
|
|
|
|
|
;DATA OUT
|
|
|
|
|
; DATA OUT
|
|
|
|
|
PHASE0:
|
|
|
|
|
LD L,(IX+6) ;GET POINTER
|
|
|
|
|
LD L,(IX+6) ; GET POINTER
|
|
|
|
|
LD H,(IX+7)
|
|
|
|
|
JP S_WRIT ;WRITE BYTES
|
|
|
|
|
JP S_WRIT ; WRITE BYTES
|
|
|
|
|
;
|
|
|
|
|
;DATA IN
|
|
|
|
|
; DATA IN
|
|
|
|
|
PHASE1:
|
|
|
|
|
LD L,(IX+8) ;GET POINTER
|
|
|
|
|
LD L,(IX+8) ; GET POINTER
|
|
|
|
|
LD H,(IX+9)
|
|
|
|
|
JP S_READ ;READ BYTES
|
|
|
|
|
JP S_READ ; READ BYTES
|
|
|
|
|
;
|
|
|
|
|
;CMD OUT
|
|
|
|
|
; CMD OUT
|
|
|
|
|
PHASE2:
|
|
|
|
|
LD L,(IX+2)
|
|
|
|
|
LD H,(IX+3)
|
|
|
|
|
JP S_WRIT
|
|
|
|
|
;
|
|
|
|
|
;STATUS IN
|
|
|
|
|
; STATUS IN
|
|
|
|
|
PHASE3:
|
|
|
|
|
LD L,(IX+4)
|
|
|
|
|
LD H,(IX+5)
|
|
|
|
|
JP S_READ
|
|
|
|
|
;
|
|
|
|
|
;MSG OUT
|
|
|
|
|
; MSG OUT
|
|
|
|
|
PHASE6:
|
|
|
|
|
LD L,(IX+10)
|
|
|
|
|
LD H,(IX+11)
|
|
|
|
|
JP S_WRIT
|
|
|
|
|
;
|
|
|
|
|
;MSG IN
|
|
|
|
|
; MSG IN
|
|
|
|
|
PHASE7:
|
|
|
|
|
LD L,(IX+12)
|
|
|
|
|
LD H,(IX+13)
|
|
|
|
|
JP S_READ
|
|
|
|
|
;
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
|
|
|
;SCSI WRITE ROUTINE (SEND BYTES TO TARGET)
|
|
|
|
|
;BUS PHASE ALREADY SET. RETURN ON PHASE MISMATCH
|
|
|
|
|
; SCSI WRITE ROUTINE (SEND BYTES TO TARGET)
|
|
|
|
|
; BUS PHASE ALREADY SET. RETURN ON PHASE MISMATCH
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
|
|
|
S_WRIT:
|
|
|
|
|
LD A,1 ;DRIVE SCSI DATA BUS
|
|
|
|
|
LD A,1 ; DRIVE SCSI DATA BUS
|
|
|
|
|
OUT (SCSI_SR_ICR),A
|
|
|
|
|
;
|
|
|
|
|
;WAIT FOR REQ WHILE CHECKING BUSY
|
|
|
|
|
; WAIT FOR REQ WHILE CHECKING BUSY
|
|
|
|
|
;
|
|
|
|
|
S_WWREQ:
|
|
|
|
|
IN A,(SCSI_SR_CSBS) ;GET CURRENT BUS STAT
|
|
|
|
|
LD B,A ;SAVE IT
|
|
|
|
|
AND SCSI_SM_REQ ;REQUEST ACTIVE?
|
|
|
|
|
JR NZ,S_WNXT ;
|
|
|
|
|
IN A,(SCSI_SR_CSBS) ; GET CURRENT BUS STAT
|
|
|
|
|
LD B,A ; SAVE IT
|
|
|
|
|
AND SCSI_SM_REQ ; REQUEST ACTIVE?
|
|
|
|
|
JR NZ,S_WNXT ;
|
|
|
|
|
;
|
|
|
|
|
LD A,B ;RECOVER CURRENT BUS STAT
|
|
|
|
|
AND SCSI_SM_BSY ;STILL BUSY?
|
|
|
|
|
JP NZ,S_WWREQ ;LOOP IF STILL BUSY
|
|
|
|
|
JP PHASE ;
|
|
|
|
|
LD A,B ; RECOVER CURRENT BUS STAT
|
|
|
|
|
AND SCSI_SM_BSY ; STILL BUSY?
|
|
|
|
|
JP NZ,S_WWREQ ; LOOP IF STILL BUSY
|
|
|
|
|
JP PHASE ;
|
|
|
|
|
;
|
|
|
|
|
;REQUEST ACTIVE SO CHECK PHASE
|
|
|
|
|
; REQUEST ACTIVE SO CHECK PHASE
|
|
|
|
|
;
|
|
|
|
|
S_WNXT:
|
|
|
|
|
IN A,(SCSI_SR_BSR) ;GET STATUS
|
|
|
|
|
AND SCSI_SM_PHM ;MASK TO PHASE MATCH
|
|
|
|
|
JP Z,PHASE ;JMP IF PHASE MISMATCH
|
|
|
|
|
IN A,(SCSI_SR_BSR) ; GET STATUS
|
|
|
|
|
AND SCSI_SM_PHM ; MASK TO PHASE MATCH
|
|
|
|
|
JP Z,PHASE ; JMP IF PHASE MISMATCH
|
|
|
|
|
;
|
|
|
|
|
;REQUEST ACTIVE AND PHASE MATCH SO SEND DATA
|
|
|
|
|
; REQUEST ACTIVE AND PHASE MATCH SO SEND DATA
|
|
|
|
|
;
|
|
|
|
|
LD A,(HL) ;GET BYTE
|
|
|
|
|
OUT (SCSI_SR_ODR),A ;SEND DATA
|
|
|
|
|
LD A,$11 ;ACK + DRIVE BUS
|
|
|
|
|
OUT (SCSI_SR_ICR),A ;SET ACK,DRIVE SCSI BUS
|
|
|
|
|
INC HL ;ADVANCE BUF POINTER
|
|
|
|
|
LD A,(HL) ; GET BYTE
|
|
|
|
|
OUT (SCSI_SR_ODR),A ; SEND DATA
|
|
|
|
|
LD A,$11 ; ACK + DRIVE BUS
|
|
|
|
|
OUT (SCSI_SR_ICR),A ; SET ACK,DRIVE SCSI BUS
|
|
|
|
|
INC HL ; ADVANCE BUF POINTER
|
|
|
|
|
;
|
|
|
|
|
;WAIT FOR REQUEST TO DROP
|
|
|
|
|
; WAIT FOR REQUEST TO DROP
|
|
|
|
|
;
|
|
|
|
|
S_WNREQ:
|
|
|
|
|
IN A,(SCSI_SR_CSBS) ;GET CURRENT STATUS
|
|
|
|
|
IN A,(SCSI_SR_CSBS) ; GET CURRENT STATUS
|
|
|
|
|
AND SCSI_SM_REQ
|
|
|
|
|
JR NZ,S_WNREQ ;LOOP TILL REQ DROPS
|
|
|
|
|
JR NZ,S_WNREQ ; LOOP TILL REQ DROPS
|
|
|
|
|
;
|
|
|
|
|
LD A,$1 ;DROP ACK,ASSERT DATA
|
|
|
|
|
OUT (SCSI_SR_ICR),A ;DROP ACK
|
|
|
|
|
JP S_WWREQ ;LOOP FOR NEXT BYTE/PHASE
|
|
|
|
|
LD A,$1 ; DROP ACK,ASSERT DATA
|
|
|
|
|
OUT (SCSI_SR_ICR),A ; DROP ACK
|
|
|
|
|
JP S_WWREQ ; LOOP FOR NEXT BYTE/PHASE
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
|
|
|
;SCSI READ ROUTINE (GET BYTES FROM TARGET)
|
|
|
|
|
;BUS PHASE ALREADY SET. RETURN ON PHASE MISMATCH
|
|
|
|
|
; SCSI READ ROUTINE (GET BYTES FROM TARGET)
|
|
|
|
|
; BUS PHASE ALREADY SET. RETURN ON PHASE MISMATCH
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
|
|
|
;
|
|
|
|
|
S_READ:
|
|
|
|
|
;
|
|
|
|
|
;WAIT FOR REQ WHILE CHECKING BUSY
|
|
|
|
|
; WAIT FOR REQ WHILE CHECKING BUSY
|
|
|
|
|
;
|
|
|
|
|
S_RWREQ:
|
|
|
|
|
IN A,(SCSI_SR_CSBS) ;GET CURRENT BUS STAT
|
|
|
|
|
LD B,A ;SAVE IT
|
|
|
|
|
AND SCSI_SM_REQ ;REQUEST ACTIVE?
|
|
|
|
|
JR NZ,S_RNXT ;
|
|
|
|
|
IN A,(SCSI_SR_CSBS) ; GET CURRENT BUS STAT
|
|
|
|
|
LD B,A ; SAVE IT
|
|
|
|
|
AND SCSI_SM_REQ ; REQUEST ACTIVE?
|
|
|
|
|
JR NZ,S_RNXT ;
|
|
|
|
|
;
|
|
|
|
|
LD A,B ;RECOVER CURRENT BUS STAT
|
|
|
|
|
AND SCSI_SM_BSY ;STILL BUSY?
|
|
|
|
|
JP NZ,S_RWREQ ;LOOP IF STIL BUSY
|
|
|
|
|
JP PHASE ;
|
|
|
|
|
LD A,B ; RECOVER CURRENT BUS STAT
|
|
|
|
|
AND SCSI_SM_BSY ; STILL BUSY?
|
|
|
|
|
JP NZ,S_RWREQ ; LOOP IF STIL BUSY
|
|
|
|
|
JP PHASE ;
|
|
|
|
|
;
|
|
|
|
|
; REQUEST ACTIVE SO CHECK PHASE
|
|
|
|
|
;
|
|
|
|
|
;REQUEST ACTIVE SO CHECK PHASE
|
|
|
|
|
S_RNXT:
|
|
|
|
|
IN A,(SCSI_SR_BSR) ;GET STATUS
|
|
|
|
|
AND SCSI_SM_PHM ;MASK TO PHASE MATCH
|
|
|
|
|
JP Z,PHASE ;JMP IF PHASE MISMATCH
|
|
|
|
|
|
|
|
|
|
;REQUEST ACTIVE AND PHASE MATCH SO GET DATA
|
|
|
|
|
IN A,(SCSI_SR_BSR) ; GET STATUS
|
|
|
|
|
AND SCSI_SM_PHM ; MASK TO PHASE MATCH
|
|
|
|
|
JP Z,PHASE ; JMP IF PHASE MISMATCH
|
|
|
|
|
;
|
|
|
|
|
IN A, (SCSI_SR_CSD) ;GET DATA
|
|
|
|
|
LD (HL),A ;SAVE DATA
|
|
|
|
|
; REQUEST ACTIVE AND PHASE MATCH SO GET DATA
|
|
|
|
|
;
|
|
|
|
|
IN A, (SCSI_SR_CSD) ; GET DATA
|
|
|
|
|
LD (HL),A ; SAVE DATA
|
|
|
|
|
LD A,$10
|
|
|
|
|
OUT (SCSI_SR_ICR),A ;SET ACK
|
|
|
|
|
INC HL ;ADVANCE BUF POINTER
|
|
|
|
|
OUT (SCSI_SR_ICR),A ; SET ACK
|
|
|
|
|
INC HL ; ADVANCE BUF POINTER
|
|
|
|
|
;
|
|
|
|
|
;WAIT FOR REQUEST TO DROP
|
|
|
|
|
;
|
|
|
|
|
S_RNREQ:
|
|
|
|
|
IN A,(SCSI_SR_CSBS) ;GET CURRENT STATUS
|
|
|
|
|
IN A,(SCSI_SR_CSBS) ; GET CURRENT STATUS
|
|
|
|
|
AND SCSI_SM_REQ
|
|
|
|
|
JR NZ,S_RNREQ ;LOOP TILL REQ DROPS
|
|
|
|
|
JR NZ,S_RNREQ ; LOOP TILL REQ DROPS
|
|
|
|
|
XOR A
|
|
|
|
|
OUT (SCSI_SR_ICR),A ;DROP ACK
|
|
|
|
|
JP S_READ ;LOOP FOR NEXT BYTE/PHASE
|
|
|
|
|
|
|
|
|
|
OUT (SCSI_SR_ICR),A ; DROP ACK
|
|
|
|
|
JP S_READ ; LOOP FOR NEXT BYTE/PHASE
|
|
|
|
|
;
|
|
|
|
|
;=============================================================================
|
|
|
|
|
; 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
|
|
|
|
|
;DONT MESS WITH THIS EITHER
|
|
|
|
|
SCSI_S_IOT:
|
|
|
|
|
SCSI_CUR_TID .DB 1 << SCSI_TID ; TARGET
|
|
|
|
|
SCSI_CUR_TID .DB 0 ; TARGET (FILLED DYNAMICALLY)
|
|
|
|
|
.DB 0 ; UNUSED
|
|
|
|
|
SCSI_CUR_CDB .DW SCSI_S_CDB ; CDB POINTER
|
|
|
|
|
.DW SCSI_S_STAT ; STATUS POINTER
|
|
|
|
|
|