mirror of
https://github.com/elliotnunn/sys7.1-doc-wip.git
synced 2024-12-13 11:29:15 +00:00
408 lines
14 KiB
Plaintext
408 lines
14 KiB
Plaintext
|
;________________________________________________________________________
|
|||
|
;
|
|||
|
; File: XPT.h
|
|||
|
;
|
|||
|
; Contains: header stuff for XPT
|
|||
|
;
|
|||
|
; Entry points:
|
|||
|
;
|
|||
|
; Written by: Paul Wolf
|
|||
|
;
|
|||
|
; Copyright: © 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 “include once” 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 ;{
|
|||
|
;
|
|||
|
; ——— OLD (& NEW emulation of old) ———
|
|||
|
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
|
|||
|
;
|
|||
|
; ——— NEW ———
|
|||
|
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
|
|||
|
|
|||
|
; ——— OLD ———
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
; ——— NEW ———
|
|||
|
xptGlobals DS.L 1 ; 1b4- pointer to Cousin Itt's XPT globals
|
|||
|
|
|||
|
; ——— OLD ———
|
|||
|
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
|
|||
|
; ——— NEW and OLD ———
|
|||
|
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
|