Browse Source

Finalize SCSI Driver

- Added check for LUN existence
- Added CAPACITY query and capture results
- Added INQUIRY query and print results
pull/640/head v3.6.0-dev.45
Wayne Warthen 2 months ago
parent
commit
9a5f156a0f
No known key found for this signature in database GPG Key ID: 8B34ED29C07EEB0A
  1. 1
      Doc/ChangeLog.txt
  2. 4
      Source/HBIOS/cfg_MASTER.asm
  3. 4
      Source/HBIOS/cfg_SZ180.asm
  4. 4
      Source/HBIOS/cfg_SZ80.asm
  5. 310
      Source/HBIOS/scsi.asm
  6. 2
      Source/ver.inc
  7. 2
      Source/ver.lib

1
Doc/ChangeLog.txt

@ -36,6 +36,7 @@ Version 3.6
- P?D: Generate compressed ROM for EaZyZ80 512
- DDW: Added support for the 'N8PC' platform. Includes support for the M6242 RTC chip
- JMD: Added VGMINFO application
- WBW: Created SCSI Driver derived from code from Jay Cotton
Version 3.5.1
-------------

4
Source/HBIOS/cfg_MASTER.asm

@ -499,8 +499,8 @@ 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 ; SCSI0: TARGET LUN
SCSI1_LUN .EQU 1 ; SCSI1: TARGET LUN
SCSI0_LUN .EQU 0 ; SCSI 0: TARGET LUN
SCSI1_LUN .EQU 1 ; SCSI 1: TARGET LUN
;
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

4
Source/HBIOS/cfg_SZ180.asm

@ -385,8 +385,8 @@ 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 ; SCSI0: TARGET LUN
SCSI1_LUN .SET 1 ; SCSI1: TARGET LUN
SCSI0_LUN .SET 0 ; SCSI 0: TARGET LUN
SCSI1_LUN .SET 1 ; SCSI 1: TARGET LUN
;
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)

4
Source/HBIOS/cfg_SZ80.asm

@ -374,8 +374,8 @@ 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 ; SCSI0: TARGET LUN
SCSI1_LUN .SET 1 ; SCSI1: TARGET LUN
SCSI0_LUN .SET 0 ; SCSI 0: TARGET LUN
SCSI1_LUN .SET 1 ; SCSI 1: TARGET LUN
;
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)

310
Source/HBIOS/scsi.asm

@ -7,12 +7,8 @@
; DERIVED FROM CODE PROVIDED BY JAY COTTON.
;
; TODO:
; - IMPLEMENT INQUIRY COMMAND AND DISPLAY DATA AT INIT
; - IMPLEMENT CAPACITY COMMAND
; - DO SOMETHING IN INITDEV TO CONFIRM LUN EXISTS
;
; NOTES:
; - CAPACITY IS CURRENTLY HARD-CODED TO 200000 BLOCKS (1GB OF DATA)
;
SCSIBASE .EQU $40
;
@ -78,11 +74,13 @@ SCSI0_CFG:
.DB SCSIBASE ; IO BASE ADDRESS
.DB SCSI0_LUN ; SCSI TARGET LUN
.DB SCSI_STNOTRDY ; DEVICE STATUS
.DW $0000,$0020 ; DEVICE CAPACITY (BLOCKS)
.DW $0000,$0010 ; DEVICE CAPACITY (BLOCKS)
.DW 0,0 ; CURRENT LBA
;
DEVECHO "SCSI: IO="
DEVECHO SCSIBASE
DEVECHO ", TGT ID="
DEVECHO SCSI_TID
DEVECHO ", LUN="
DEVECHO SCSI0_LUN
DEVECHO "\n"
@ -93,17 +91,19 @@ SCSI0_CFG:
.DB SCSIBASE ; IO BASE ADDRESS
.DB SCSI1_LUN ; SCSI TARGET LUN
.DB SCSI_STNOTRDY ; DEVICE STATUS
.DW $0000,$0020 ; DEVICE CAPACITY (BLOCKS)
.DW $0000,$0010 ; DEVICE CAPACITY (BLOCKS)
.DW 0,0 ; CURRENT LBA
;
DEVECHO "SCSI: IO="
DEVECHO SCSIBASE
DEVECHO ", TGT ID="
DEVECHO SCSI_TID
DEVECHO ", LUN="
DEVECHO SCSI1_LUN
DEVECHO "\n"
#ENDIF
;
#IF ($ - SCSI_CFGTBL) != (SCSICNT * 2 * SCSI_CFGSIZ)
#IF ($ - SCSI_CFGTBL) != (SCSICNT * SCSI_CFGSIZ)
.ECHO "*** INVALID SCSI CONFIG TABLE ***\n"
#ENDIF
;
@ -128,6 +128,10 @@ 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
@ -163,10 +167,7 @@ SCSI_INIT3:
CALL PRTDEC8 ; DISPLAY IT
;
CALL SCSI_INITDEV ; INITIALIZE DEVICE
#IF (SCSITRACE < 2)
JP NZ,SCSI_PRTSTAT
#ENDIF
RET NZ
JP NZ,SCSI_PRTSTATSTR ; IF ERROR, EXIT VIA PRINT
;
; PRINT STORAGE CAPACITY (BLOCK COUNT)
PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL
@ -182,6 +183,19 @@ SCSI_INIT3:
CALL PRTDEC32 ; PRINT DWORD IN DECIMAL
PRTS("MB$") ; PRINT SUFFIX
;
; PRINT INQUIRY DATA (STILL IN HB_WRKBUF FROM INITDEV)
CALL PC_SPACE ; FORMATTING
CALL PC_LBKT ; FORMATTING
LD HL,HB_WRKBUF+8 ; START OF ASCII DATA
LD B,28 ; VENDOR, PRODUCT, AND REVISTION FIELDS
SCSI_INIT4:
LD A,(HL) ; LOAD NEXT CHAR
CALL COUT ; PRINT IT
INC HL ; BUMP BUFFER POINTER
DJNZ SCSI_INIT4 ; LOOP AS NEEDED
CALL PC_RBKT ; FORMATTING
;
SCSI_INIT5:
XOR A ; SUCCESS
RET
;
@ -216,57 +230,15 @@ SCSI_DEFMED:
;
SCSI_READ:
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR
LD A,$08 ; SETUP READ COMMAND
JR SCSI_IO ; DO THE IO
LD A,SCSI_CMD_READ ; SETUP READ COMMAND
JP SCSI_IO ; DO THE IO
;
;
;
SCSI_WRITE:
CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR
LD A,$0A ; SETUP WRITE COMMAND
JR SCSI_IO ; DO THE IO
;
;
;
SCSI_IO:
LD (SCSI_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
; SETUP SCSI COMMAND
LD (SCSI_S_CDB),A ; SET SCSI COMMAND
; SETUP DISK BUFFER POINTERS
LD (SCSI_BUF_OUT),HL ; INPUT BUFFER
LD (SCSI_BUF_IN),HL ; OUTPUT BUFFER
; SETUP LUN/LBA
LD A,(IY+SCSI_LUN) ; PUT LUN IN ACCUM
RRCA ; MOVE TO TOP 3 BITS
RRCA ; ...
RRCA ; ...
OR (IY+SCSI_LBA+2) ; MERGE WITH TOP OF LBA
LD (SCSI_CUR_LUN),A ; PUT IN CDB
LD A,(IY+SCSI_LBA+1) ; LBA MID
LD (SCSI_CUR_LBN),A ; PUT IN CDB
LD A,(IY+SCSI_LBA+0) ; LBA MID
LD (SCSI_CUR_LBN+1),A ; PUT IN CDB
PUSH IX ; SAVE IX
LD IX,SCSI_S_IOT ; SET POINTER
CALL SCSI_GO ; DO THE SCSI TRANSACTION
POP IX ; RESTORE IX
JR NZ,SCSI_IO1 ; IF ERROR, SKIP INCREMENT
; INCREMENT LBA
LD A,SCSI_LBA ; LBA OFFSET
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
CALL INC32HL ; INCREMENT THE VALUE
; INCREMENT DMA
LD HL,SCSI_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR
INC (HL) ; BUMP DMA BY
INC (HL) ; ... 512 BYTES
XOR A ; SIGNAL SUCCESS
SCSI_IO1:
LD HL,(SCSI_DSKBUF) ; CURRENT DMA TO HL
OR A ; SET FLAGS
RET Z ; DONE IF NO ERROR
LD A,ERR_IO ; SIGNAL IO ERROR
OR A ; SET FLAGS
RET ; AND DONE
LD A,SCSI_CMD_WRITE ; SETUP WRITE COMMAND
JP SCSI_IO ; DO THE IO
;
;
;
@ -357,24 +329,174 @@ SCSI_GEOM:
; ON RETURN, ZF SET INDICATES HARDWARE FOUND
;
SCSI_DETECT:
LD C,SCSIBASE+3
LD A,$05
OUT (SCSIBASE+3),A
IN A,(SCSIBASE+3)
OUT (C),A
NOP
IN A,(C)
CP $05
RET NZ
LD A,$0A
OUT (SCSIBASE+3),A
IN A,(SCSIBASE+3)
OUT (C),A
NOP
IN A,(C)
CP $0A
RET
;
; INITIALIZE DEVICE
;
SCSI_INITDEV:
; INQUIRY COMMAND TO DETERMINE IF DEVICE EXISTS
LD HL,HB_WRKBUF ; BUFFER FOR INQUIRY DATA
CALL SCSI_INQUIRY ; RUN THE COMMAND
JP NZ,SCSI_NOMEDIA ; CONVERT FAILURE TO NO MEDIA
;
; GET DEVICE CAPACITY
CALL SCSI_CAPACITY
RET NZ
;
XOR A
LD (IY+SCSI_STAT),A
RET
;
;
;
SCSI_IO:
LD (SCSI_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
; SETUP SCSI COMMAND
LD (SCSI_S_CDB),A ; SET SCSI COMMAND
; SETUP DISK BUFFER POINTERS
LD (SCSI_BUF_OUT),HL ; INPUT BUFFER
LD (SCSI_BUF_IN),HL ; OUTPUT BUFFER
; SETUP CDB
LD HL,SCSI_S_CDB ; SET HL TO R/W CBD
LD (SCSI_CUR_CDB),HL ; SAVE IN IOT
; SETUP LUN/LBA
LD A,(IY+SCSI_LUN) ; PUT LUN IN ACCUM
RRCA ; MOVE TO TOP 3 BITS
RRCA ; ...
RRCA ; ...
LD B,A ; SAVE IN B
LD A,(IY+SCSI_LBA+2) ; GET MSB OF LBA
AND %00011111 ; CLEAR LUN BITS
OR B ; MERGE WITH LUN
LD (SCSI_CUR_LUN),A ; PUT IN CDB
LD A,(IY+SCSI_LBA+1) ; LBA MID
LD (SCSI_CUR_LBN),A ; PUT IN CDB
LD A,(IY+SCSI_LBA+0) ; LBA MID
LD (SCSI_CUR_LBN+1),A ; PUT IN CDB
; DO THE SCSI TRANSACTION
PUSH IX ; SAVE IX
LD IX,SCSI_S_IOT ; SET POINTER
CALL SCSI_GO ; DO THE SCSI TRANSACTION
POP IX ; RESTORE IX
AND %00111110 ; IGNORE RESERVED BITS OF STATUS
CALL NZ,SCSI_IOERR ; DIAGNOSE/RECORD ERRORS
JR NZ,SCSI_IO1 ; IF ERROR, SKIP INCREMENT
; INCREMENT LBA
LD A,SCSI_LBA ; LBA OFFSET
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
CALL INC32HL ; INCREMENT THE VALUE
; INCREMENT DMA
LD HL,SCSI_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR
INC (HL) ; BUMP DMA BY
INC (HL) ; ... 512 BYTES
XOR A ; SIGNAL SUCCESS
SCSI_IO1:
LD HL,(SCSI_DSKBUF) ; CURRENT DMA TO HL
OR A ; SET FLAGS
RET Z ; DONE IF NO ERROR
LD A,ERR_IO ; SIGNAL IO ERROR
OR A ; SET FLAGS
RET ; AND DONE
;
; CHECK FOR DEVICE EXISTENCE
;
SCSI_TSTRDY:
XOR A ; SIGNAL SUCCESS
RET
;
; ISSUE SCSI INQUIRY COMMAND
; ON INPUT, HL POINTS TO OUTPUT DATA BUFFER
;
SCSI_INQUIRY:
; SETUP BUFFER POINTERS
LD (SCSI_BUF_OUT),HL ; INPUT BUFFER
LD (SCSI_BUF_IN),HL ; OUTPUT BUFFER
; SETUP INQUIRY CDB
LD HL,SCSI_S_INQ ; SET HL TO INQ CBD
LD (SCSI_CUR_CDB),HL ; SAVE IN IOT
; SETUP LUN
LD A,(IY+SCSI_LUN) ; PUT LUN IN ACCUM
RRCA ; MOVE TO TOP 3 BITS
RRCA ; ...
RRCA ; ...
LD (SCSI_INQ_LUN),A ; PUT IN INQ CDB
; DO THE SCSI TRANSACTION
PUSH IX ; SAVE IX
LD IX,SCSI_S_IOT ; SET POINTER
CALL SCSI_GO ; DO THE SCSI TRANSACTION
POP IX ; RESTORE IX
AND %00111110 ; IGNORE RESERVED BITS OF STATUS
JP NZ,SCSI_IOERR ; HANDLE ERROR
RET ; DONE
;
; ISSUE SCSI CAPACITY COMMAND AND CAPTURE
; RESULTS AS DEVICE CAPACITY
;
SCSI_CAPACITY:
; SETUP BUFFER POINTERS
LD HL,SCSI_CAP_BUF
LD (SCSI_BUF_OUT),HL ; INPUT BUFFER
LD (SCSI_BUF_IN),HL ; OUTPUT BUFFER
; SETUP READ CAPACITY CDB
LD HL,SCSI_S_CAP ; SET HL TO CAP CBD
LD (SCSI_CUR_CDB),HL ; SAVE IN IOT
; SETUP LUN
LD A,(IY+SCSI_LUN) ; PUT LUN IN ACCUM
RRCA ; MOVE TO TOP 3 BITS
RRCA ; ...
RRCA ; ...
LD (SCSI_CAP_LUN),A ; PUT IN INQ CDB
; DO THE SCSI TRANSACTION
PUSH IX ; SAVE IX
LD IX,SCSI_S_IOT ; SET POINTER
CALL SCSI_GO ; DO THE SCSI TRANSACTION
POP IX ; RESTORE IX
AND %00111110 ; IGNORE RESERVED BITS OF STATUS
JP NZ,SCSI_IOERR ; HANDLE ERROR
;
; RETURNED LBA IS BIG ENDIAN. CONVERT TO A STANDARD 32-BIT
; INTEGER IN DE:HL
LD HL,SCSI_CAP_BUF ; HL POINTS TO START OF BUF
LD D,(HL) ; MSB
INC HL ; NEXT BYTE
LD E,(HL)
PUSH DE ; SAVE HIGH WORD
INC HL
LD D,(HL)
INC HL
LD E,(HL) ; LSB
POP HL ; RECOVER HIGH WORD
EX DE,HL ; AND SWAP
;
; RETURNED CAPACITY IS THE *LAST* LBA. WE WANT THE NUMBER OF
; BLOCKS AVAILABLE, SO WE NEED TO INCREMENT THE RETURNED VALUE.
CALL INC32
;
; COPY CAPACITY TO DEVICE CONFIG DATA FIELD
PUSH HL ; SAVE HL
LD A,SCSI_MEDCAP ; OFFSET OF MEDIA CAPACITY FIELD
CALL LDHLIYA ; HL POINTS TO MEDIA CAPACITY FIELD
PUSH HL ; MOVE HL
POP BC ; ... TO BC
POP HL ; RECOVER HL
CALL ST32 ; SAVE CAP TO CFG BLOCK
;
XOR A
RET ; DONE
;
;=============================================================================
; COMMAND PROCESSING
;=============================================================================
@ -699,7 +821,6 @@ SCSI_PRTSTAT2:
CALL NEWLINE
PRTS("SCSI:$") ; NO UNIT NUM IN PREFIX FOR INVALID UNIT
SCSI_PRTSTAT3:
CALL PC_SPACE ; FORMATTING
CALL SCSI_PRTSTATSTR
POP HL
POP DE
@ -729,6 +850,7 @@ SCSI_PRTSTATSTR:
JR Z,SCSI_PRTSTATSTR1
LD DE,SCSI_STR_STUNK
SCSI_PRTSTATSTR1:
CALL PC_SPACE ; FORMATTING
CALL WRITESTR
POP DE
POP AF
@ -769,40 +891,50 @@ SCSI_DSKBUF .DW 0 ; ACTIVE DISK BUFFER
;
;----------------------------------------------------------------
;SCSI COMMAND DESCRIPTOR FOR READ/WRITE
;DO NOT USE THIS FOR DIRECT SCSI I/O
;YOU WILL MESS UP BLOCK/DEBLOCK
;
SCSI_S_CDB:
.DB 8 ; COMMAND
SCSI_CUR_LUN:
.DB 0 << 5 ; LUN/LBA HI
SCSI_CUR_LBN:
.DB 0 ; LBA MID
.DB SCSI_CMD_READ ; COMMAND
SCSI_CUR_LUN .DB 0 << 5 ; LUN/LBA HI
SCSI_CUR_LBN .DB 0 ; LBA MID
.DB 0 ; LBA LOW
.DB 1 ; COUNT
.DB 0 ; FLAGS
.DB 0 ; CONTROL
;
;----------------------------------------------------------------
;SCSI I/O ADDRESS TABLE FOR READ/WRITE
;DONT MESS WITH THIS EITHER
SCSI_S_IOT:
SCSI_CUR_TID .DB 1 << SCSI_TID ;TARGET
.DB 0 ;UNUSED
.DW SCSI_S_CDB ;CDB POINTER
.DW SCSI_S_STAT ;STATUS POINTER
SCSI_BUF_OUT .DW HB_WRKBUF ;DATA OUT POINTER
SCSI_BUF_IN .DW HB_WRKBUF ;DATA IN POINTER
.DW SCSI_S_MSG ;MSG OUT POINTER
.DW SCSI_S_MSG ;MSG IN POINTER
;SCSI COMMAND DESCRIPTOR FOR INQUIRY
;
;----------------------------------------------------------------
;THIS IS THE END OF INITIALIZED DATA
;EVERYTHING FOLLOWING MUST HAVE MEMORY SPACE AVAILABLE
;BUT IS NOT PART OF THE BOOT IMAGE
;----------------------------------------------------------------
SCSI_S_INQ:
.DB SCSI_CMD_INQ ; COMMAND
SCSI_INQ_LUN .DB 0 << 5 ; LUN (TOP 3 BITS)
.DB 0 ; PAGE CODE (UNUSED)
.DB 0 ; RESERVED
.DB $FF ; ALLOCATION LENGTH
.DB 0 ; CONTROL
;
; UNINITIALIZED DATA AREA
;----------------------------------------------------------------
;SCSI COMMAND DESCRIPTOR FOR READ CAPACITY
;
SCSI_S_STAT .DW 0 ;SCSI ENDING STATUS
SCSI_S_MSG .DW 0 ;SCSI MESSAGE
SCSI_S_CAP:
.DB SCSI_CMD_RDCAP ; COMMAND
SCSI_CAP_LUN .DB 0 << 5 ; LUN (TOP 3 BITS)
.FILL 4,0 ; LBA (UNUSED)
.FILL 3,0 ; RESERVED
.DB 0 ; CONTROL
;
;----------------------------------------------------------------
;SCSI I/O ADDRESS TABLE FOR READ/WRITE
;DONT MESS WITH THIS EITHER
SCSI_S_IOT:
SCSI_CUR_TID .DB 1 << SCSI_TID ; TARGET
.DB 0 ; UNUSED
SCSI_CUR_CDB .DW SCSI_S_CDB ; CDB POINTER
.DW SCSI_S_STAT ; STATUS POINTER
SCSI_BUF_OUT .DW HB_WRKBUF ; DATA OUT POINTER
SCSI_BUF_IN .DW HB_WRKBUF ; DATA IN POINTER
.DW SCSI_S_MSG ; MSG OUT POINTER
.DW SCSI_S_MSG ; MSG IN POINTER
;
SCSI_S_STAT .DW 0 ; SCSI ENDING STATUS
SCSI_S_MSG .DW 0 ; SCSI MESSAGE
;
SCSI_CAP_BUF .FILL 8,0 ; SCSI CAPACITY DATA BUFFER

2
Source/ver.inc

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

2
Source/ver.lib

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

Loading…
Cancel
Save