mac-rom/Interfaces/AIncludes/SCSI.a

381 lines
13 KiB
Plaintext
Raw Normal View History

;
; File: SCSI.a
;
; Copyright: <09> 1990-1992 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <9> 7/1/92 DCL This file is the replacement for the now obsolete SCSIEqu.a.
; Changed the 'including' name to match the new file name.
; <8> 11/27/91 MH Add include of traps.a for _SCSIDispatch trap definition
; <7> 11/27/91 MH Remove unsupported NewSCSI trap macros and selectors
; <6> 1/30/91 gbm sab, #38: Change the <20>already including this file<6C> variable to
; all uppercase (for security reasons)
; <5> 11/12/90 JL Added scsiInstall equate
;
; To Do:
;
; Version: 3.19
; Created: Friday, October 20, 1989 at 9:50:00 PM
;
;
; Equates for SCSI boot, mgr routines
; SCSI Traps
;
; 1.5 jwk 07/15/1989 NEEDED FOR AURORA - Added BusDevRst bit, and changed error codes to SysErr range
; 1.4 jwk 06/29/1989 NEEDED FOR AURORA - Renamed HeadOfQ bit to Immed bit (more accurate)
; 1.3 jwk 06/13/1989 Reorganized source to be Universal-ROM friendly
; 1.2 jwk 02/26/1989 Padded PB for longword alignment
; 1.1 jwk 02/26/1989 Adding equates for async SCSI Mgr trap
; 1.0 CCH 11/ 9/1988 Adding to EASE.
; END EASE MODIFICATION HISTORY
;<3B>1.1 CCH 9/14/1988 Updated EASE with the current rev of this file.
;________________________________________________________________________________
IF &TYPE('__INCLUDINGSCSI__') = 'UNDEFINED' THEN
__INCLUDINGSCSI__ SET 1
IF &TYPE('__INCLUDINGTRAPS__') = 'UNDEFINED' THEN
INCLUDE 'Traps.a'
ENDIF
; misc SCSI driver equates
scMacID EQU $80 ; SCSI ID for Macintosh Plus (bit 7)
SCSIDrvrs EQU $B2E ; (word) bitmap for loaded SCSI drivers
; SCSI error codes
scCommErr EQU 2 ; communications error (operation timeout)
scArbNBErr EQU 3 ; arbitration timeout waiting for not BSY
scBadparmsErr EQU 4 ; bad parameter or TIB opcode
scPhaseErr EQU 5 ; SCSI bus not in correct phase for attempted operation
scCompareErr EQU 6 ; data compare error
scMgrBusyErr EQU 7 ; SCSI Manager busy with another operation
; when SCSIGet was called
scSequenceErr EQU 8 ; attempted operation is out of sequence;
; e.g., calling SCSISelect before doing
; SCSIGet. Incorrectly written drivers
; can cause this error.
scBusTOErr EQU 9 ; CPU bus timeout when attempting read or
; write in pseudo-DMA mode -- indicates
; that the data wasn't ready within the
; 'bus timeout' period. (Mac SE & Mac II only)
scComplPhaseErr EQU 10 ; SCSI bus wasn't in Status phase when
; SCSIComplete was called -- the SCSI
; Manager may have had to throw away data
; (or write 'filler' bytes) in order to
; reach the Status phase. Indicates that
; the driver didn't handle SCSI bus phase
; changes correctly.
; misc SCSI driver equates
scDefaultID EQU 7 ; default CPU SCSI id
;---------------------------------------------------
;
; the information pertaining to the read/write
; command block interpreter.
;
; SCSI command block equates.
;
scOpcode EQU 0 ; offsets into command "line" for data xfer
scParam1 EQU 2
scParam2 EQU 6
scSize EQU 10 ; size of a command line
scInc EQU 1 ; xfer with address increment
scNoInc EQU 2 ; xfer without address increment
scAdd EQU 3 ; add count to address
scMove EQU 4 ; MOVE data from addr1 to addr2
scLoop EQU 5 ; decrement loop counter and branch
scNop EQU 6 ; do very little
scStop EQU 7 ; then stop doing even that
scComp EQU 8 ; compare bytes with address increment
;
; The layout of block 0 of a bootable SCSI device.
;
sbSigWord EQU $4552 ; block 0 validator
sbSig EQU 0 ; signature word
sbBlkSize EQU 2 ; block size of device
sbBlkCount EQU 4 ; # blocks on device
sbDevType EQU 8 ; device type code
sbDevID EQU 10
sbData EQU 12 ; start of data section
sbDrvCount EQU 16 ; # drivers following
sbDrvrs EQU 18 ; start of driver descriptors
; Driver descriptors
ddBlock EQU 0 ; physical block of driver
ddSize EQU 4 ; block count of driver
ddType EQU 6 ; Processor type of driver
ddLen EQU 8
sbMac EQU 1 ; Macintosh driver type
;
; Partition Descriptors
;
pdSigWord EQU $5453 ; block 1 validator
pmSig EQU 0 ; unique value for map entry blk
pmSigPad EQU 2 ; currently unused
pmMapBlkCnt EQU 4 ; # of blks in partition map
pmPyPartStart EQU 8 ; first physical block of partition
pmPartBlkCnt EQU 12 ; number of blocks in partition
pmPartName EQU 16 ; ASCII partition name
pmParType EQU 48 ; ASCII partition type
pmLgDataStart EQU 80 ; log. # of partition's 1st data blk
pmDataCnt EQU 84 ; # of blks in partition's data area
pmPartStatus EQU 88 ; bit field for partition status
pmLgBootStart EQU 92 ; logical blk of partition's boot code
pmBootSize EQU 96 ; number of bytes in boot code
pmBootAddr EQU 100 ; memory load address of boot code
pmBootAddr2 EQU 104 ; currently unused
pmBootEntry EQU 108 ; entry point of boot code
pmBootEntry2 EQU 112 ; currently unused
pmBootCksum EQU 116 ; checksum of boot code
pmProcessor EQU 120 ; ASCII for the processor type
pmPad EQU 124 ; 512 bytes long, currently unused
hfsID EQU 'TFS1' ; The HFS filesystem ID
;Routine Selectors
scsiReset EQU 0
scsiGet EQU 1
scsiSelect EQU 2
scsiCmd EQU 3
scsiComplete EQU 4
scsiRead EQU 5
scsiWrite EQU 6
scsiInstall EQU 7
scsiRBlind EQU 8
scsiWBlind EQU 9
scsiStat EQU 10
scsiSelAtn EQU 11
scsiMsgIn EQU 12
scsiMsgOut EQU 13
numSelectors EQU 14
MACRO
_SCSIReset
MOVE #scsiReset,-(sp)
_SCSIDispatch
ENDM
MACRO
_SCSIGet
MOVE #scsiGet,-(sp)
_SCSIDispatch
ENDM
MACRO
_SCSISelect
MOVE #scsiSelect,-(sp)
_SCSIDispatch
ENDM
MACRO
_SCSICmd
MOVE #scsiCmd,-(sp)
_SCSIDispatch
ENDM
MACRO
_SCSIComplete
MOVE #scsiComplete,-(sp)
_SCSIDispatch
ENDM
MACRO
_SCSIRead
MOVE #scsiRead,-(sp)
_SCSIDispatch
ENDM
MACRO
_SCSIWrite
MOVE #scsiWrite,-(sp)
_SCSIDispatch
ENDM
MACRO
_SCSIInstall
MOVE #scsiInstall,-(sp)
_SCSIDispatch
ENDM
MACRO
_SCSIRBlind
MOVE #scsiRBlind,-(sp)
_SCSIDispatch
ENDM
MACRO
_SCSIWBlind
MOVE #scsiWBlind,-(sp)
_SCSIDispatch
ENDM
MACRO
_SCSIStat
MOVE #scsiStat,-(sp)
_SCSIDispatch
ENDM
MACRO
_scsiSelAtn
MOVE #scsiSelAtn,-(sp)
_SCSIDispatch
ENDM
MACRO
_SCSIMsgIn
MOVE #scsiMsgIn,-(sp)
_SCSIDispatch
ENDM
MACRO
_SCSIMsgOut
MOVE #scsiMsgOut,-(sp)
_SCSIDispatch
ENDM
;
; New SCSI Manager
;
; SCSI request parameter block
;
scsiPB RECORD 0, INCREMENT
scsiQLink DS.L 1 ; --- link to next request block
scsiPrivate DS.L 1 ; --- SCSI Mgr private storage
scsiVersion DS.W 1 ; --> version of the parameter block
scsiBus DS.W 1 ; --> SCSI bus number
scsiReqID DS.B 1 ; --> SCSI ID
scsiReqLUN DS.B 1 ; --> logical unit number
scsiResult DS.W 1 ; <-- return code from SCSI Manager
scsiCompletion DS.L 1 ; --> address of completion routine
scsiUsrData DS.L 1 ; --> pointer to user's storage
scsiReqTO DS.L 1 ; --> in ms
scsiUsrFlags DS.W 1 ; --> user's operation flag bits
scsiSelTO DS.W 1 ; --> in ms
scsiMgrFlags DS.L 1 ; --> SCSI operation flags
scsiLinkCmd DS.L 1 ; --> ptr to next linked command
scsiSnsBuf DS.L 1 ; --> sense buffer pointer
scsiSnsLen DS.B 1 ; --> length of sense buffer ( at least 4 bytes )
scsiSnsXfer DS.B 1 ; <-- actual sense bytes transferred
scsiStatus DS.B 1 ; --> SCSI status byte
scsiCmdLen DS.B 1 ; --> length of the command buffer
scsiCmdBuf DS.L 1 ; --> command buffer pointer
scsiDCInstr DS.L 1 ; --> ptr to array of data-chaining instructions
scsiDataLen DS.L 1 ; --> requested data transfer length
scsiDataXfer DS.L 1 ; <-- actual data bytes transferred
scsiPBSize EQU *-scsiPB ; size of SCSI request parameter block
ENDR
;
; flags
;
; SCSI Mgr flags:
;
scsiFParity EQU $00000001 ; Enable parity checking
scsiFNoDisc EQU $00000002 ; Disconnection not allowed for this request
scsiFWrite EQU $00000004 ; output data to the SCSI bus
scsiFFast EQU $00000008 ; Transfer data in the "fast" mode
scsiFPhysical EQU $00000010 ; physical addresses are used (enables DMA)
scsiFAsync EQU $00000020 ; asynchronous request
scsiFBusDevRst EQU $00000040 ; attempt to send a Bus Device Reset message
scsiFImmed EQU $00000080 ; Immediate ("page fault") service requested
; SCSI Mgr bits:
scsiBParity EQU 0 ; enable parity checking
scsiBNoDisc EQU 1 ; disconnection not allowed for this request
scsiBWrite EQU 2 ; output data to the SCSI bus
scsiBFast EQU 3 ; transfer data in the "fast" mode
scsiBPhysical EQU 4 ; physical addresses are used (enables DMA)
scsiBAsync EQU 5 ; asynchronous request
scsiBBusDevRst EQU 6 ; attempt to send a Bus Device Reset message
scsiBImmed EQU 7 ; Immediate ("page fault") service requested
;
; Data-chaining related equates
;
dcLoop EQU -1 ; loop opcode (dcLoop,count,offset,store)
dcStop EQU 0 ; stop opcode (dcStop,-----,------,-----)
; ; move opcode ( addr ,count,offset,store)
dcInstr RECORD 0, INCREMENT
dcAddr DS.L 1 ; buffer start address (0,-1,other)
dcCount DS.L 1 ; generic count
dcOffset DS.L 1 ; generic "offset"
dcStore DS.L 1 ; used to create "Saved Data Pointer"
dcSize EQU *-dcInstr ; size of one data-chaining instruction
ENDR
;
; Status byte equates
;
statusInitial EQU $FF ; initial "invalid" status byte value
statusByteCode EQU $9E ; mask to clear vendor-unique bits in status byte
statusRsrvBit EQU 7 ; reserved bit in status byte (must be zero for autosense)
statusGood EQU $00 ; status byte values with VU and reserved bits masked
statusChkCond EQU $02
statusCondMetGood EQU $04
statusBusy EQU $08
statusIntGood EQU $10
statusIntCMGood EQU $14
statusRsrvConflict EQU $18
;
; error codes on the original call
;
scsiBadPBErr EQU -470 ; invalid field(s) in the parameter block
;
; error codes in the "scsiResult" field
;
scsiOverrunErr EQU -471 ; attempted to transfer too many bytes
scsiTransferErr EQU -472 ; write flag conflicts with data transfer phase
scsiBusTOErr EQU -473 ; bus error during transfer
scsiSelectTOErr EQU -474 ; scsiSelTO exceeded (selection failed)
scsiTimeOutErr EQU -475 ; scsiReqTO exceeded
scsiBusResetErr EQU -476 ; the bus was reset, so your request was aborted
scsiBadStatus EQU -477 ; non-zero (not "Good") status returned
scsiNoStatusErr EQU -478 ; device did not go through a status phase
scsiLinkFailErr EQU -479 ; linked command never executed
scsiUnimpVctErr EQU -489 ; unimplemented routine was called
;
; "in progress" codes in the "scsiResult" field
;
scsiEnqueued EQU $0001 ; enqueued, waiting to start
scsiArbitrated EQU $0002 ; arbitration in progress, or attempted
scsiSelection EQU $0003 ; selection in progress, or target selected
scsiDisc EQU $0004 ; disconnected
scsiDataOut EQU $0010 ; Data Out phase
scsiDataIn EQU $0011 ; Data In phase
scsiCommand EQU $0012 ; Command phase
scsiStatus EQU $0013 ; Status phase
scsiIllegal1 EQU $0014 ; Unknown (illegal) phase
scsiIllegal2 EQU $0015 ; Unknown (illegal) phase
scsiMessageOut EQU $0016 ; Message Out phase
scsiMessageIn EQU $0017 ; Message In phase
;
; SCSIBusInfo information selectors
;
scsiIntfLvl EQU 0 ; SCSI Mgr interface level (1-n)
scsiBusTO EQU 1 ; byte-to-byte time limit (in us, 0=no timeout)
scsiBusDMA EQU 2 ; bus has a dedicated DMA channel (1=has DMA)
ENDIF ; ...already included