diff --git a/Source/HBIOS/cfg_MASTER.asm b/Source/HBIOS/cfg_MASTER.asm index 22f7d83e..6cb1a1bc 100644 --- a/Source/HBIOS/cfg_MASTER.asm +++ b/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) 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 PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD diff --git a/Source/HBIOS/cfg_SZ180.asm b/Source/HBIOS/cfg_SZ180.asm index cd855b4e..1d19701b 100644 --- a/Source/HBIOS/cfg_SZ180.asm +++ b/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) 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_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) diff --git a/Source/HBIOS/cfg_SZ80.asm b/Source/HBIOS/cfg_SZ80.asm index 70be3f69..e98bb756 100644 --- a/Source/HBIOS/cfg_SZ80.asm +++ b/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) 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_ZP .SET FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) diff --git a/Source/HBIOS/scsi.asm b/Source/HBIOS/scsi.asm index 69e3f3de..4d58aa4d 100644 --- a/Source/HBIOS/scsi.asm +++ b/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_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 -; - 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 + 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 ; +; +; 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 diff --git a/Source/ver.inc b/Source/ver.inc index d54f1bac..9ce1fc2f 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 6 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.6.0-dev.52" +#DEFINE BIOSVER "3.6.0-dev.53" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 390eb9d2..096978e6 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 6 rup equ 0 rtp equ 0 biosver macro - db "3.6.0-dev.52" + db "3.6.0-dev.53" endm