mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-12-28 16:31:01 +00:00
381 lines
13 KiB
Plaintext
381 lines
13 KiB
Plaintext
|
;
|
|||
|
; 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
|