mac-rom/OS/SCSIMgr4pt3/XPTEqu.a

408 lines
14 KiB
Plaintext
Raw Normal View History

;________________________________________________________________________
;
; File: XPT.h
;
; Contains: header stuff for XPT
;
; Entry points:
;
; Written by: Paul Wolf
;
; Copyright: <09> 1992-1994 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <SM21> 1/31/94 DCB Added a second version number field for the SCSI Busy patch
; <SM20> 1/25/94 DCB Added space in the C0C globals for our own private deferred task
; queue.
; <SM19> 1/14/94 chp Remove SCSIGlobals equate again. It is defined in SysEqu.a. (See
; <SM15>.) Fix <20>include once<63> SET variable naming conventions.
; <ML3> 1/9/94 pdw Added busyPatchVers field.
; <ML2> 1/5/94 pdw Added SCSIBusy selector and required fields in SCSIGlobals.
; <MC4> 11/5/93 pdw Series of attempts and re-attempts to fix various VM/FileShare
; problems.
; <SM17> 12/19/93 DCB Added SCSIBusy constant
; <SM16> 11/22/93 pdw Rolling in from <MCxx>.
; <SM15> 9/22/93 chp Remove SCSIGlobals equate. It is defined elsewhere.
; <SM14> 10/29/93 DCB <MC> roll-in.
; <MC3> 10/28/93 pdw Got rid of some unused fields. Changed the way Recorder works.
; <SM13> 10/14/93 pdw <MC> roll-in.
; <MC2> 10/12/93 pdw Added support for Synchronous data transfers, rewrote State
; Machine, message handling etc.
; <SM12> 9/9/93 pdw Lots of little changes. Name changes, temporary cache_bug
; stuff.
; <SM11> 7/17/93 pdw Moved jvSelected to HALg.
; <SM10> 7/8/93 pdw Added locations for counting interrupts (not used) and other
; comment changes.
; <SM9> 6/29/93 pdw Massive checkins: Change asynchronicity mechanism to CallMachine
; stack switching mechanism. Adding support for Cold Fusion.
; Rearranging HW/SW Init code. Some code optimizations. Changed
; Record_Event trigger to use a couple of values in SCSIGlobals.
; <SM8> 5/29/93 PW Adding comment about globals stolen.
; <SM7> 5/25/93 DCB Update from Ludwig (the three items below this one)
; <LW7> 5/21/93 mal Changing GetXPTg to use simple indirection instead of [] stuff.
; <LW6> 5/20/93 DCB Adding two fields to the XPT globals to support turning off
; deferred completion routines from inside debuggers.
; <LW5> 5/20/93 PW Added SCSIGlobalsRec from SCSIPriv and into these, I added jump
; vector for target mode.
; <SM6> 5/5/93 PW Converted names to meanies-friendly names. Updated with latest
; from Ludwig stuff.
; <SM5> 4/8/93 DCB Added a copy of the C0C SCSI Globals which have been modified
; for use by the new SCSI Manager.
; <SM4> 1/31/93 PW Update from the latest of Ludwig. Also changes required for PDM
; (will update Ludwig with these as needed myself).
; <LW3> 1/27/93 PW Changed bogus to syncUnsafeCount.
; <LW2> 12/18/92 PW Added syncReqEnabled counter (bogus field right now).
; <SM3> 11/20/92 PW Removed Includes. Made MaxBuses 16. Removed XPTgs not used in
; asm files.
; <SM2> 10/30/92 DCB Misc equates to support multiple ISR routines.
;========================================================================
STRING ASIS
IF &TYPE('__INCLUDINGXPTEQU__') = 'UNDEFINED' THEN
__INCLUDINGXPTEQU__ SET 1
IF &TYPE('__INCLUDINGACAM__') = 'UNDEFINED' THEN
INCLUDE 'ACAM.a'
ENDIF
;******** Old Call Enumerators ********
OldSCSICalls RECORD 0, INCREMENT
kSCSIReset ds.b 1 ; 0
kSCSIGet ds.b 1
kSCSISelect ds.b 1
kSCSICmd ds.b 1
kSCSIComplete ds.b 1 ; 4
kSCSIRead ds.b 1
kSCSIWrite ds.b 1
kSCSIunused ds.b 1
kSCSIRBlind ds.b 1 ; 8
kSCSIWBlind ds.b 1
kSCSIStat ds.b 1
kSCSISelAtn ds.b 1
kSCSIMsgIn ds.b 1 ; C
kSCSIMsgOut ds.b 1
kSCSIBusy ds.b 1
kNumOldSCSICalls ds.b 1 ; F (15)
ENDR
;******** Old Call States ********
OldCallStates RECORD 0, INCREMENT
kNotConnected ds.b 1 ; 0
kGotGet ds.b 1
kSelectInProgress ds.b 1
kConnected ds.b 1
kNumOldCallStates ds.b 1
ENDR
;***** Max number of buses supported *****
kMaxBuses EQU 16
;******** QHdr ********
QHdr RECORD 0, INCREMENT
qFlags ds.w 1
qHead ds.l 1
qTail ds.l 1
ENDR
;******** BusInfo ********
BusInfo RECORD 0, INCREMENT
initInfo ds SIMinitInfo
ENDR
;******** RefInfo ********
RefInfo RECORD 0, INCREMENT
DrvrCnt ds.l 1
RefInfo ds.l 1 ;!!!
ENDR
;******** DrvrList ********
DrvrList RECORD 0, INCREMENT
DevID ds.l 1
DRefNum ds.w 1
unused ds.w 1
ENDR
;******** DevInfo ********
DevInfo RECORD 0, INCREMENT
DevIdent ds DeviceIdent ;
ioPB ds.l 1 ; ptr to ioPB
IdentMsg ds.b 1 ; Boolean
ENDR
;******** BootInfo ********
BootInfo RECORD 0, INCREMENT
startPRAM ds.l 1 ; long word
BusCount ds.w 1 ;
defltDrvrRefNum ds.w 1 ; ref num of driver for default boot device
IDmasks ds.l kMaxBuses
ENDR
;****** XPT Globals *********
; partial list only because only not all is needed from asm
XPTglobals RECORD 0, INCREMENT
BusInfoPtrs ds.l kMaxBuses ;// pointers to BusInfos (handles 99.9965% of cases)
OldSyncWait ds.l 1
numBuses ds.w 1
syncUnsafeCount ds.w 1 ;
flags ds.b 1
unusedC2 ds.b 1
unusedC0 ds.b 1
unusedC1 ds.b 1
debugPatch ds.l 1 ; address of our _DebugUtil Patch
oldIDBusNumber ds.w 8 ; one for each SCSI ID
oldAPIstate ds.w 1 ; OldCallStates
latestOldCallPhase ds.w 1 ; SCSIphase
unusedX ds.w 1 ;
nextInterleave ds.w 1 ;
xptIOptr ds.l 1 ;
xptIOpbSize ds.w 1 ; size of currently allocated SCSI_IO (for old API)
maxIOpbSize ds.w 1 ; size of largest required SCSI_IO (for all SIMs)
Drivers ds.l 1 ; Ptr to DrvrList
BootStorage ds.l 1 ; Ptr to BootInfo
ENDR
;***** For XPTprivateFlags field *******
kbTIB equ 0
;****** For XPTg.flags field ********
kbOldAPIBusy equ 0
kbInOldCall equ 1
;******** SCSIStat word bit equates ********
kmStatATN equ $0200
kmStatACK equ $0100
kmStatRST equ $0080
kmStatBSY equ $0040
kmStatREQ equ $0020
kmStatMSG equ $0010
kmStatC_D equ $0008
kmStatI_O equ $0004
kmStatSEL equ $0002
kmStatDBP equ $0001
;******** Old SCSI Manager globals ********
;
; we're kind of living off some of the C0C^ globals here
;
SCSIGlobalsRec RECORD 0, INCREMENT ;{
;
; <20><><EFBFBD><EFBFBD>OLD (& NEW emulation of old) <20><><EFBFBD>
jvReset DS.L 1 ; SCSIReset vector
jvGet DS.L 1 ; SCSIGet vector
jvSelect DS.L 1 ; SCSISelect vector
jvCmd DS.L 1 ; SCSICmd vector
jvComplete DS.L 1 ; SCSIComplete vector
jvRead DS.L 1 ; SCSIRead vector
jvWrite DS.L 1 ; SCSIWrite vector
jvInstall DS.L 1 ; SCSI installation vector (for debugging purposes)
jvRBlind DS.L 1 ; SCSIRBlind vector
jvWBlind DS.L 1 ; SCSIWBlind vector
jvStat DS.L 1 ; SCSIStat vector
jvSelAtn DS.L 1 ; SCSISelAtn vector
jvSMsgIn DS.L 1 ; SCSIMsgIn vector
jvSMsgOut DS.L 1 ; SCSIMsgOut vector
firstPrivate DS.L 1 ; ptr to SCSI Mgr private storage record circularly linked list
nextPrivate DS.L 1 ; ptr to next available SCSI Mgr private storage record
base5380 DS.L 1 ; SCSI read base address
pdma5380 DS.L 1 ; SCSI pseudo-DMA read base addr
hhsk5380 DS.L 1 ; SCSI hardware-handshaked read base addr
wrOffset DS.W 1 ; write offset relative to "base5380"
scsiQFlags DS.W 1 ; flags for SCSI request queue
scsiQHead DS.L 1 ; ptr to head of SCSI request queue
scsiQTail DS.L 1 ; ptr to tail of SCSI request queue
activeReq DS.L 1 ; ptr to currently active SCSI request
timeout DS.L 1 ; next timeout should occur at this time
G_ID DS.B 1 ; initiator's SCSI ID mask
G_State DS.B 1 ; SCSI Mgr state (free/busy)
G_Async DS.W 1 ; unused - $62
G_Reserved0 DS.L 1 ; box number in high byte. HW flags in low bytes <v1.1>
G_Reserved1 DS.L 1 ; used for storing timer value <?> pdw
G_Reserved2 DS.L 1 ; machine-specific storage <v1.1>
;
;** Cool stuff for the new SCSI Manager
; The following variables in SCSIGlobals were stolen by the Async SCSI Manager
;
; <20><><EFBFBD><EFBFBD>NEW <20><><EFBFBD>
unused0 DS.L 1 ; 70:
berr_halg0 DS.L 1 ; 74: Saved HAL globals for internal bus (used by the Bus Error Handler)
berr_halg1 DS.L 1 ; 78: Ditto for external bus. (I know, its a hack but justifiable because
; we are the only ones with xfer routines that cause bus errors.)
jvUnusedXL1 DS.L 1 ; 7c: jv called when we're selected as target
numBEHs DS.B 1 ; 80: Number of Bus Error Handlers installed
inDebugger DS.B 1 ; 81: count of debugger entries+/exits-
unused1 DS.B 2 ; 82:
tempXPTGGlobals DS.L 1 ; 84: Used for "transitioning" from one XPT to another <SM8>
tempXPTGInUse DS.L 1 ; 88: Set to 'xptg' if we have two XPTs active <SM8>
unused2 DS.L 1 ; 8c:
recordBreak0 DS.L 1 ; 90: gets checked for match against all events recorded
recordBreak4 DS.L 1 ; 94:
busyPatch DS.L 1 ; 98: addr of SCSI busy patch
ciBusyPending DS.B 1 ; 9c: Used by the ciSCSIBusy patch to keep track of deferred jvSCSIFreeHook Calls
ciWasBusy DS.B 1 ; 9d: Set if we returned "Busy" to somebody.
busyPatchVers DS.W 1 ; 9e: version of SCSI busy patch installed
recCurrent DS.L 1 ; a0: debugging event recorder - current pointer
recSize DS.L 1 ; a4: debugging event recorder - size of buffer
recStartLog DS.L 1 ; a8: logical start of buffer
recStartPhys DS.L 1 ; ac: physical start of buffer
unusedW1 ds.w 1 ; b0:
completionQHdr ds.w 1 ; b2: high byte = flag indicating deferred task is enqd
completionQHead ds.l 1 ; b4: Q used to call completion routines from our
completionQTail ds.l 1 ; b8: deferred task (XPT.a).
unusedW2 ds.w 1 ;
privDTQueue
privDTQFlags ds.w 1 ; used for the private deferred task manager
privDTQHead ds.l 1 ; ditto
privDTQTail ds.l 1 ; ditto
oldjDisptch ds.l 1 ; the old jDisptch vector we patched out
ci_jDisptchVers ds.l 1 ; version tag for our patch
; <20><><EFBFBD><EFBFBD>OLD <20><><EFBFBD>
jvVFWO DS.L 1 ; virtual fast writes (hhsk)
jvCSO DS.L 1 ; virtual slow compare ("p" bit redefined to mean "compare")
jvUnused3 DS.L 1 ; unused
jvCFO DS.L 1 ; virtual fast compare ("p" bit redefined to mean "compare")
jvUnused4 DS.L 1 ; unused
jvInvalidIn DS.L 1 ; Invalid Message In
jvIdentifyIn DS.L 1 ; Identify Message In
jvCmdComplete DS.L 1 ; Command Complete
jvExtendedMsg DS.L 1 ; Extended Message
jvSaveDataPtr DS.L 1 ; Save Data Pointer
jvRestorePtrs DS.L 1 ; Restore Pointers
jvDisconnect DS.L 1 ; Disconnect
jvMsgRejIn DS.L 1 ; Message Reject In
jvLCCF DS.L 1 ; Linked Command Complete with (or without) flag
sdmStack DS.L 1 ; SCSIDiskMode stack global for DB Lite
base5380_1 DS.L 1 ; SCSI read base address (internal)
pdma5380_1 DS.L 1 ; SCSI pseudo-DMA read base addr (internal)
hhsk5380_1 DS.L 1 ; SCSI hardware-handshaked read base addr (internal)
base5380_2 DS.L 1 ; SCSI read base address (external)
pdma5380_2 DS.L 1 ; SCSI pseudo-DMA read base addr (external)
hhsk5380_2 DS.L 1 ; SCSI hardware-handshaked read base addr (external)
jvIdentifyOut DS.L 1 ; Identify Message Out
jvMsgRejOut DS.L 1 ; Message Reject Out
jvInvalidOut DS.L 1 ; Invalid Message Out
jvKillIO DS.L 1 ; Kill I/O
jvNoOp DS.L 1 ; No Operation
jvBusDevRstOut DS.L 1 ; Bus Device Reset Out <v1.3>
G_SCSIDREQ DS.L 1 ; SCSI DREQ base address
G_TargetID DS.L 1 ; Target ID
G_FakeStat DS.L 1 ; Fake state
G_OldTrapAdrs DS.L 1 ; contains the old SCSIMgr address
G_OldIntHnd DS.L 1 ; contains old intrp level 2 handler
G_IntrpCount DS.L 1 ; counts total # of intrps
G_IntrpStat DS.L 1 ; Status read by Intrp routine
GxState96 DS.L 1 ; Bits to make c96 backwards compatible
BootCfgFlags DS.L 1 ; copy of d2 passed to InitHW_SCSI96 at boot (used by jvInitHW)
G_bitDREQ DS.B 1 ; Bit position at DREQ location
jvUnused32 DS.B 1 ; Future expansion
jvUnused33 DS.W 1 ; Future expansion
jvIntHnd DS.L 1 ; 24-entry jump table -- interrupt handler
jvMessage DS.L 1 ; Send a message to the deferred task
jvClearIRQ DS.L 1 ; Clear the SCSI interrupt (and VIA, if necessary)
jvDisEnable DS.L 1 ; Enable/disable interrupts routine
jvLogError DS.L 1 ; Record error for the PB
jvSCSIDT DS.L 1 ; Deferred Task for all other interrupts
jvFind DS.L 1 ; Find a request to process
jvSetup DS.L 1 ; Setup active request
jvPreflight DS.L 1 ; Preflight the parameter block
jvEnDequeue DS.L 1 ; Enqueue/dequeue a parameter block
jvArb DS.L 1 ; Arbitrate for the SCSI bus
jvSel DS.L 1 ; Select a SCSI device
jvDelay22 DS.L 1 ; Delay 2.2 microseconds
jvClearState DS.L 1 ; Remove the current request
jvTransfer DS.L 1 ; Transfer data using the primitive routines
jvSetTimer DS.L 1 ; Set the timer
jvResetBus DS.L 1 ; Reset SCSI bus and kill all requests
jvClearBus DS.L 1 ; Clear the SCSI bus
jvBusErr DS.L 1 ; Bus error handler
jvDataDMA DS.L 1 ; DMA-related data-chaining interpreter
; <20><><EFBFBD><EFBFBD>NEW <20><><EFBFBD>
xptGlobals DS.L 1 ; 1b4- pointer to Cousin Itt's XPT globals
; <20><><EFBFBD><EFBFBD>OLD <20><><EFBFBD>
blindBusTO DS.L 1 ; 1b8- number of ticks to wait for blind transfer bytes (after 1st byte)
transferType DS.W 1 ; 1bc- Type of data transfer to perform (used in Transfer_96, BusError)
lastINTread DS.B 1 ; 1be- Value of rINT at last valid interrupt read
lastSTAread DS.B 1 ; 1bf- Value of rSTA at last valid interrupt read
; <20><><EFBFBD><EFBFBD>NEW and OLD <20><><EFBFBD>
yeOldeBusErrVct DS.L 1 ; 1c0- temp storage while we insert our buserr handler <T10> pdw
base539x0 DS.L 1 ; SCSI 539x base address, bus0 <T3><T4>
base539x1 DS.L 1 ; SCSI 539x base address, bus1 <T3><T4>
G_SCSIDevMap0 DS.B 1 ; SCSI Device Map for the Internal SCSI Bus
fill1 DS.B 3
G_SCSIDevMap1 DS.B 1 ; SCSI Device Map for the External SCSI Bus <T3>
fill2 DS.B 3
ENDR ;}
maxOpcode EQU 8 ; highest numbered TIB opcode (from PatchIIROM.a)
MACRO
GetXPTg
move.l SCSIGlobals, A5
move.l SCSIGlobalsRec.xptGlobals(A5), A5
ENDM
ENDIF ; already included