Browse Source

SCSI Driver Config Improvements

SCSI Driver config now allows up to 4 combinations of target device/lun.
pull/654/head v3.6.0-dev.53
Wayne Warthen 1 week ago
parent
commit
a34aceb114
No known key found for this signature in database GPG Key ID: 8B34ED29C07EEB0A
  1. 13
      Source/HBIOS/cfg_MASTER.asm
  2. 13
      Source/HBIOS/cfg_SZ180.asm
  3. 13
      Source/HBIOS/cfg_SZ80.asm
  4. 334
      Source/HBIOS/scsi.asm
  5. 2
      Source/ver.inc
  6. 2
      Source/ver.lib

13
Source/HBIOS/cfg_MASTER.asm

@ -500,10 +500,15 @@ ESPSD1DUAL .EQU TRUE ; ESPSD 1: DUAL INTERFACE BOARD (DUAL SD)
; ;
SCSIENABLE .EQU FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM) SCSIENABLE .EQU FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
SCSITRACE .EQU 1 ; SCSI: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SCSITRACE .EQU 1 ; SCSI: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
SCSICNT .EQU 2 ; SCSI: NUMBER OF TARGET DEVICES (1-2)
SCSI_TID .EQU 0 ; SCSI: TARGET DEVICE ID (0-6)
SCSI0_LUN .EQU 0 ; SCSI 0: TARGET LUN
SCSI1_LUN .EQU 1 ; SCSI 1: TARGET LUN
SCSICNT .EQU 1 ; SCSI: NUMBER OF TARGET DEVICES (1-4)
SCSI0_TGT .EQU 0 ; SCSI 0: TARGET DEVICE ID (0-6)
SCSI0_LUN .EQU 0 ; SCSI 0: TARGET LUN (0-7)
SCSI1_TGT .EQU 1 ; SCSI 1: TARGET DEVICE ID (0-6)
SCSI1_LUN .EQU 0 ; SCSI 1: TARGET LUN (0-7)
SCSI2_TGT .EQU 2 ; SCSI 2: TARGET DEVICE ID (0-6)
SCSI2_LUN .EQU 0 ; SCSI 2: TARGET LUN (0-7)
SCSI3_TGT .EQU 3 ; SCSI 3: TARGET DEVICE ID (0-6)
SCSI3_LUN .EQU 0 ; SCSI 3: TARGET LUN (0-7)
; ;
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD

13
Source/HBIOS/cfg_SZ180.asm

@ -385,10 +385,15 @@ ESPSD1DUAL .SET TRUE ; ESPSD 1: DUAL INTERFACE BOARD (DUAL SD)
; ;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM) SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
SCSITRACE .SET 1 ; SCSI: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SCSITRACE .SET 1 ; SCSI: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
SCSICNT .SET 2 ; SCSI: NUMBER OF TARGET DEVICES (1-2)
SCSI_TID .SET 0 ; SCSI: TARGET DEVICE ID (0-6)
SCSI0_LUN .SET 0 ; SCSI 0: TARGET LUN
SCSI1_LUN .SET 1 ; SCSI 1: TARGET LUN
SCSICNT .SET 1 ; SCSI: NUMBER OF TARGET DEVICES (1-4)
SCSI0_TGT .SET 0 ; SCSI 0: TARGET DEVICE ID (0-6)
SCSI0_LUN .SET 0 ; SCSI 0: TARGET LUN (0-7)
SCSI1_TGT .SET 1 ; SCSI 1: TARGET DEVICE ID (0-6)
SCSI1_LUN .SET 0 ; SCSI 1: TARGET LUN (0-7)
SCSI2_TGT .SET 2 ; SCSI 2: TARGET DEVICE ID (0-6)
SCSI2_LUN .SET 0 ; SCSI 2: TARGET LUN (0-7)
SCSI3_TGT .SET 3 ; SCSI 3: TARGET DEVICE ID (0-6)
SCSI3_LUN .SET 0 ; SCSI 3: TARGET LUN (0-7)
; ;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)

13
Source/HBIOS/cfg_SZ80.asm

@ -374,10 +374,15 @@ ESPSD1DUAL .SET TRUE ; ESPSD 1: DUAL INTERFACE BOARD (DUAL SD)
; ;
SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM) SCSIENABLE .SET FALSE ; SCSI: ENABLE 3580-BASED SCSI INTERFACE (SCSI.ASM)
SCSITRACE .SET 1 ; SCSI: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SCSITRACE .SET 1 ; SCSI: TRACE LEVEL (0=NO,1=ERRORS,2=ALL)
SCSICNT .SET 2 ; SCSI: NUMBER OF TARGET DEVICES (1-2)
SCSI_TID .SET 0 ; SCSI: TARGET DEVICE ID (0-6)
SCSI0_LUN .SET 0 ; SCSI 0: TARGET LUN
SCSI1_LUN .SET 1 ; SCSI 1: TARGET LUN
SCSICNT .SET 1 ; SCSI: NUMBER OF TARGET DEVICES (1-4)
SCSI0_TGT .SET 0 ; SCSI 0: TARGET DEVICE ID (0-6)
SCSI0_LUN .SET 0 ; SCSI 0: TARGET LUN (0-7)
SCSI1_TGT .SET 1 ; SCSI 1: TARGET DEVICE ID (0-6)
SCSI1_LUN .SET 0 ; SCSI 1: TARGET LUN (0-7)
SCSI2_TGT .SET 2 ; SCSI 2: TARGET DEVICE ID (0-6)
SCSI2_LUN .SET 0 ; SCSI 2: TARGET LUN (0-7)
SCSI3_TGT .SET 3 ; SCSI 3: TARGET DEVICE ID (0-6)
SCSI3_LUN .SET 0 ; SCSI 3: TARGET LUN (0-7)
; ;
PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD PIO_4P .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD
PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) PIO_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM)

334
Source/HBIOS/scsi.asm

@ -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
@ -536,246 +582,248 @@ SCSI_GO:
RET ; DONE RET ; DONE
; ;
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
;DO SCSI TRANSACTION
; DO SCSI TRANSACTION
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
; ;
SCSI_GO1: 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 ; XOR A ;
OUT (SCSI_SR_MR),A ;RESET CONTROL REG
OUT (SCSI_SR_TCR),A ;CLEAR COMMAND REG.
OUT (SCSI_SR_MR),A ; RESET CONTROL REG
OUT (SCSI_SR_TCR),A ; CLEAR COMMAND REG.
OUT (SCSI_SR_ICR),A ; OUT (SCSI_SR_ICR),A ;
LD A,(IX) ;GET TID
LD A,(IX) ; GET TID
BIT 7,A ; TURN ON MY ID BIT 7,A ; TURN ON MY ID
OUT (SCSI_SR_ODR),A ;SET TARGET ID
LD A,$01 ;DRIVE BUS
OUT (SCSI_SR_ODR),A ; SET TARGET ID
LD A,$01 ; DRIVE BUS
OUT (SCSI_SR_ICR),A ; OUT (SCSI_SR_ICR),A ;
LD A,$05 ;SET SEL AND DRIVE BUS
LD A,$05 ; SET SEL AND DRIVE BUS
OUT (SCSI_SR_ICR),A ; 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: 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 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 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 ;BUSY IS ACTIVE
S_BSYA: 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: PHASE:
XOR A XOR A
OUT (SCSI_SR_ICR),A ;RESET INITIATOR
OUT (SCSI_SR_ICR),A ; RESET INITIATOR
; ;
S_WTREQ: 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: 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) LD A,(HL)
RET ;BUSY LOST? WERE DONE
RET ; BUSY LOST? WERE DONE
; ;
S_WTRQ1: 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 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 RR A
AND $0E ;MASK TO PHASE BITS
AND $0E ; MASK TO PHASE BITS
LD E,A ; LD E,A ;
LD D,0 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 INC HL
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 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 ;PHASE HANDLERS
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
; ;
;DATA OUT
; DATA OUT
PHASE0: PHASE0:
LD L,(IX+6) ;GET POINTER
LD L,(IX+6) ; GET POINTER
LD H,(IX+7) LD H,(IX+7)
JP S_WRIT ;WRITE BYTES
JP S_WRIT ; WRITE BYTES
; ;
;DATA IN
; DATA IN
PHASE1: PHASE1:
LD L,(IX+8) ;GET POINTER
LD L,(IX+8) ; GET POINTER
LD H,(IX+9) LD H,(IX+9)
JP S_READ ;READ BYTES
JP S_READ ; READ BYTES
; ;
;CMD OUT
; CMD OUT
PHASE2: PHASE2:
LD L,(IX+2) LD L,(IX+2)
LD H,(IX+3) LD H,(IX+3)
JP S_WRIT JP S_WRIT
; ;
;STATUS IN
; STATUS IN
PHASE3: PHASE3:
LD L,(IX+4) LD L,(IX+4)
LD H,(IX+5) LD H,(IX+5)
JP S_READ JP S_READ
; ;
;MSG OUT
; MSG OUT
PHASE6: PHASE6:
LD L,(IX+10) LD L,(IX+10)
LD H,(IX+11) LD H,(IX+11)
JP S_WRIT JP S_WRIT
; ;
;MSG IN
; MSG IN
PHASE7: 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)
;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: S_WRIT:
LD A,1 ;DRIVE SCSI DATA BUS
LD A,1 ; DRIVE SCSI DATA BUS
OUT (SCSI_SR_ICR),A OUT (SCSI_SR_ICR),A
; ;
;WAIT FOR REQ WHILE CHECKING BUSY
; WAIT FOR REQ WHILE CHECKING BUSY
; ;
S_WWREQ: S_WWREQ:
IN A,(SCSI_SR_CSBS) ;GET CURRENT BUS STAT
LD B,A ;SAVE IT
AND SCSI_SM_REQ ;REQUEST ACTIVE?
IN A,(SCSI_SR_CSBS) ; GET CURRENT BUS STAT
LD B,A ; SAVE IT
AND SCSI_SM_REQ ; REQUEST ACTIVE?
JR NZ,S_WNXT ; 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
LD A,B ; RECOVER CURRENT BUS STAT
AND SCSI_SM_BSY ; STILL BUSY?
JP NZ,S_WWREQ ; LOOP IF STILL BUSY
JP PHASE ; JP PHASE ;
; ;
;REQUEST ACTIVE SO CHECK PHASE
; REQUEST ACTIVE SO CHECK PHASE
; ;
S_WNXT: 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: S_WNREQ:
IN A,(SCSI_SR_CSBS) ;GET CURRENT STATUS
IN A,(SCSI_SR_CSBS) ; GET CURRENT STATUS
AND SCSI_SM_REQ 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: S_READ:
; ;
;WAIT FOR REQ WHILE CHECKING BUSY
; WAIT FOR REQ WHILE CHECKING BUSY
; ;
S_RWREQ: S_RWREQ:
IN A,(SCSI_SR_CSBS) ;GET CURRENT BUS STAT
LD B,A ;SAVE IT
AND SCSI_SM_REQ ;REQUEST ACTIVE?
IN A,(SCSI_SR_CSBS) ; GET CURRENT BUS STAT
LD B,A ; SAVE IT
AND SCSI_SM_REQ ; REQUEST ACTIVE?
JR NZ,S_RNXT ; 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
LD A,B ; RECOVER CURRENT BUS STAT
AND SCSI_SM_BSY ; STILL BUSY?
JP NZ,S_RWREQ ; LOOP IF STIL BUSY
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
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 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 ;WAIT FOR REQUEST TO DROP
; ;
S_RNREQ: S_RNREQ:
IN A,(SCSI_SR_CSBS) ;GET CURRENT STATUS
IN A,(SCSI_SR_CSBS) ; GET CURRENT STATUS
AND SCSI_SM_REQ AND SCSI_SM_REQ
JR NZ,S_RNREQ ;LOOP TILL REQ DROPS
JR NZ,S_RNREQ ; LOOP TILL REQ DROPS
XOR A 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 ; 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

2
Source/ver.inc

@ -2,7 +2,7 @@
#DEFINE RMN 6 #DEFINE RMN 6
#DEFINE RUP 0 #DEFINE RUP 0
#DEFINE RTP 0 #DEFINE RTP 0
#DEFINE BIOSVER "3.6.0-dev.52"
#DEFINE BIOSVER "3.6.0-dev.53"
#define rmj RMJ #define rmj RMJ
#define rmn RMN #define rmn RMN
#define rup RUP #define rup RUP

2
Source/ver.lib

@ -3,5 +3,5 @@ rmn equ 6
rup equ 0 rup equ 0
rtp equ 0 rtp equ 0
biosver macro biosver macro
db "3.6.0-dev.52"
db "3.6.0-dev.53"
endm endm

Loading…
Cancel
Save