mirror of
https://github.com/elliotnunn/sys7.1-doc-wip.git
synced 2024-12-12 04:29:09 +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
|