mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2025-01-01 11:29:27 +00:00
0ba83392d4
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included. The Tools directory, containing mostly junk, is also excluded.
833 lines
35 KiB
Plaintext
833 lines
35 KiB
Plaintext
;----------------------------------------------------------------------------------------------
|
|
; File: SCSIMgrInit.a
|
|
;
|
|
; Written by: Jerry Katzung
|
|
;
|
|
; Copyright: © 1989-1993 by Apple Computer, Inc., all rights reserved.
|
|
;
|
|
; Change History (most recent first):
|
|
;
|
|
; <SM27> 11/22/93 pdw Removed useless old ISR initialization, added stack
|
|
; manipulations around call to SCSIReset.
|
|
; <SM26> 11/10/93 chp Avoid initializing for SCSI96_BIOS as the default case.
|
|
; <SM25> 10/14/93 pdw Fixed up forPDMProto stuff. Take out EVT1 PDM support. Moved
|
|
; initialization of SCSIDrvrs and SCSIPoll to StartSearch.
|
|
; <SM24> 7/20/93 pdw Cleaned up (a little - it still needs a lot more). Added
|
|
; ShouldWeDoAsyncSCSI routine which allows HWInit to figure out
|
|
; whether it should do anything or not. Also used to decide
|
|
; whether to call InitItt. Moved SCSIReset to pt after InitItt.
|
|
; <SM23> 7/17/93 pdw Put idiotic CASE stuff around call to DoWeHaveAMIC3B.
|
|
; <SM22> 7/17/93 pdw Moved ck4AMIC3B routine to SCSIMgr4pt3:HALc96Init.a.
|
|
; <SM21> 7/8/93 pdw Moved code to check for AMIC3(B) into a routine of its own so
|
|
; that I can use it elsewhere.
|
|
; <SM20> 6/29/93 pdw Added check for AMIC3 to see if we can run on bus>50MHz
|
|
; machines.
|
|
; <SM19> 6/8/93 SAM Turning Async SCSI off for Evt1 PDMs.
|
|
; <SM18> 5/26/93 DCB Turning on Async SCSI for Quadras and Wombats.
|
|
; <SM17> 5/5/93 PW Adding check for 50MHz bus on PDM around call to InitItt until
|
|
; the VIAs get more stable.
|
|
; <SM16> 4/23/93 SAM Disabled Itt on PDM evt2 for now.
|
|
; <SM15> 3/29/93 PW Freeing up two PRAM bits that are wasted in the CPU's SCSI ID
|
|
; and internal drive's SCSI ID.
|
|
; <SM14> 2/17/93 CSS Fix check for whether to use SCSIBIOS to include PDM test. We
|
|
; need a better test here. i.e. SCSIBIOSExists or something based
|
|
; on the SCSIBIOS feature not on machine memory controls or other
|
|
; unrelated information.
|
|
; <SM13> 2/12/93 PW Removing COUSIN_ITT checks (instead just using hasAsyncSCSI).
|
|
; <SM12> 2/10/93 CSS Fix bug introduced in last checkin which made all SCSI80 machine
|
|
; break.
|
|
; <SM11> 2/5/93 CSS Added the Horror changes from SCSIMiscPatch.a.
|
|
; Comments from SCSIMiscPatch.a in Horror follow:
|
|
; <H10> 9/25/92 BG Re-did H5-H9 so that they are Politically Correct WRT the
|
|
; overpatched way of life (so that older addresses stay consistent
|
|
; with previous ROMs).
|
|
; <H9> 9/18/92 jab Changed BIOS/Quadra tests to rely on the existence of Orwell.
|
|
; <H8> 9/14/92 jab BSR offset trouble.
|
|
; <H7> 9/14/92 jab Fixed bug that did not allow Quadra SCSI Manager to be
|
|
; initialized correctly.
|
|
; <H6> 9/6/92 jab Added patch for BIOS c96 based SCSI HW initialization.
|
|
; <H5> 6/10/92 BG (actually JAB) Overpatch for correctly setting up DREQ access.
|
|
; <H4> 03/23/92 jmp Overpatched the InitSCSIMgrPatch2 routine so that this file
|
|
; lines up with the TERROR/Zydeco ROM map.
|
|
; <H3> 2/10/92 SWC jab/Added support for multiple c80 SCSI buses on DB Lite.
|
|
; <H2> 12/21/91 jmp (BG,Z14) (for JBlair) Added fix for busy status from drive while
|
|
; spinning up .
|
|
; <SM10> 2/4/93 PW Added check for PDM as one of the machines to have async SCSI
|
|
; enabled on.
|
|
; <SM9> 2/1/93 PW Preparing for enabling Cousin Itt on PDM.
|
|
; <SM8> 12/4/92 fau Changed use of Boxflags for Cyclone machines to use PSCExists
|
|
; flag.
|
|
; <SM7> 11/30/92 PW Added hasAsyncSCSI check around CousinItt initialization. This
|
|
; is to use hasAsyncSCSI as the feature flag and COUSIN_ITT as a
|
|
; temporary debugging build flag.
|
|
; <SM6> 11/9/92 fau Added a check for a Tempest where there was one for a Cyclone.
|
|
; <SM5> 7/28/92 PW Disabled loading of Cousin Itt on Quadras. Don't worry - it'll
|
|
; get in there eventually.
|
|
; <SM4> 7/28/92 PW Added support for SCSIMgr4pt3.
|
|
; <SM3> 6/2/92 kc Roll in Pandora changes. Comments follow: Fix bug in JumpTable
|
|
; init code.
|
|
; <P2> 1/17/92 PDW Jumps to InitMgr_SCSI96, InitHW_SCSI96 changed to
|
|
; InitMgr_SCSI_PSC and InitHW_SCSI_PSC.
|
|
; <13> 5/1/92 JSM Get rid of conditionals: delete code not forROM, this file is
|
|
; only used in ROM builds, so also delete forROM conditionals.
|
|
; This file now has no conditionals.
|
|
; <12> 12/27/91 RB I've got the EXPORT blues...forgot to export a label.
|
|
; <11> 12/27/91 RB Added the Terror changes from SCSIMiscPatch.a
|
|
; <10> 12/26/91 RB SleepQueue definitions are now in SleepQRec record, updated
|
|
; usage of sleep queue fields.
|
|
; <9> 11/16/91 DTY The old style equates got nixed from InternalOnlyEqu.a. Update
|
|
; places that used those equates to use PMgrRec to get the ROM
|
|
; build working again.
|
|
; <8> 9/16/91 JSM Cleanup header.
|
|
; <7> 9/21/90 BG Removed various 040-related kludges.
|
|
; <6> 9/14/90 MSH Add to list of conditionals that include disk spin down support.
|
|
; <5> 6/22/90 CCH Put code in to set SCSI IRQ line to VIA2 CB2 for Eclipse.
|
|
; <4> 5/16/90 MSH Added hasPowerControls to hcmac conditional.
|
|
; <3> 1/18/90 JWK Needed for Zone5 - Initialize variable watchdog timer timeout.
|
|
; <2> 1/11/90 CCH Added include of ÒHardwarePrivateEqu.aÓ.
|
|
; <1.7> 12/10/89 jwk NEEDED FOR F19 - Installs DMA routines for blind transfers.
|
|
; <1.6> 11/2/89 MSH SlpQInstall now available, setupsleeptask modified to use it.
|
|
; <1.5> 9/11/89 jwk NEEDED FOR F19 - Streamlined code, added Bus Device Reset
|
|
; support
|
|
; <1.4> 7/15/89 jwk NEEDED FOR AURORA - Added code review changes, F19 routines
|
|
; <1.3> 6/29/89 jwk NEEDED FOR AURORA - Fixed Tape Drive and Slow Write timing bugs
|
|
; <1.2> 6/26/89 GMR Restore a0 to point to globals after _NewPtr call in
|
|
; InitScsiMgr.
|
|
; <1.1> 6/15/89 GGD Removed VIA2 vPCR initialization when for ROM, since InitVIAs at
|
|
; StartInit time initializes it correctly. Moved the code to the
|
|
; correct place also, since it was setting values for CB2 even
|
|
; when the SCSI interrupt is on CA2.
|
|
; <1.0> 6/13/89 jwk Reorganizing SCSI sources to be Universal-ROM friendly
|
|
;
|
|
;----------------------------------------------------------------------------------------------
|
|
;
|
|
; Old comments are saved for historical purposes in the SCSIMgrOld.a file. <v1.4>
|
|
;
|
|
;----------------------------------------------------------------------------------------------
|
|
|
|
|
|
BLANKS ON
|
|
STRING ASIS
|
|
PRINT OFF
|
|
|
|
LOAD 'StandardEqu.d'
|
|
INCLUDE 'HardwarePrivateEqu.a'
|
|
INCLUDE 'UniversalEqu.a' ; <11> rb
|
|
INCLUDE 'GestaltEqu.a'
|
|
INCLUDE 'SCSI.a'
|
|
INCLUDE 'SCSIPriv.a'
|
|
INCLUDE 'SCSIEqu96.a' ; SCSI96 private equ's <11> rb
|
|
|
|
PRINT ON
|
|
|
|
SCSIInit PROC EXPORT
|
|
|
|
EXPORT InitSCSIMgr, InitSCSIHW ; called by StartInit
|
|
|
|
IMPORT DoRequestIO, DoKillIO, DoBusInfo, AltBusCall
|
|
IMPORT SCSIMgr, DataDMA ;<v1.4>
|
|
IMPORT DoSCSIReset, DoSCSIGet, DoSCSISelect, DoSCSICmd, DoSCSIComplete
|
|
IMPORT DoSCSIStat, DoSCSISelAtn, DoSCSIMsgIn, DoSCSIMsgOut
|
|
IMPORT NewSCSIRead, NewSCSIWrite, Unimplemented, NewSCSIRBlind, NewSCSIWBlind ;<v1.4>
|
|
IMPORT DataIO, Command, StatusPhase, ResetBus, MsgOut, MsgIn
|
|
IMPORT SlowRead, SlowWrite, FastRead, FastWrite
|
|
IMPORT SlowComp, FastComp
|
|
IMPORT FastReadOSS, FastWriteOSS ;<v1.4>
|
|
IMPORT VFastReadOSS, VFastRead, VFastWriteOSS, VFastWrite
|
|
IMPORT PFastReadOSS, PFastRead, PFastWriteOSS, PFastWrite
|
|
IMPORT msgCmdComplete, msgSaveDataPtr, msgRestorePtrs, msgDisconnect
|
|
IMPORT msgIdentifyIn, msgInvalidIn, msgMsgRejIn, msgLCCF
|
|
IMPORT msgIdentifyOut, msgMsgRejOut, msgInvalidOut, msgKillio, msgNoOp
|
|
IMPORT msgBusDevRst ;<v1.5>
|
|
IMPORT Preflight, EnDequeue
|
|
IMPORT Message, ClearIRQ, DisEnable, SCSIDT, LogError ;<v1.4>
|
|
IMPORT Find, Setup, ClearBus, BusErrHandler
|
|
IMPORT Arb, Sel, Delay22, ClearState, Transfer, SetTimer
|
|
IMPORT TimeTask, SCSIIntHnd, NewSCSITrap
|
|
IMPORT SCSISetFlags ; <v1.3>
|
|
IMPORT SleepTask, DoSpinDown, StartItUp
|
|
IMPORT InitHW_SCSI_PSC
|
|
IMPORT InitHW_SCSI96_BIOS, InitMgr_SCSI96_BIOS ; <SM11> CSS
|
|
IMPORT InitHW_SCSI96,InitMgr_SCSI96 ; <SM11> CSS
|
|
|
|
WITH scsiPB,scsiPrivPB, scsiGlobalRecord, dcInstr, machSpecRecord, ROMHeader ;<v1.4>
|
|
WITH DecoderInfo,PmgrRec,SleepQRec,pmCommandRec ; <11> rb
|
|
|
|
;-------------------------------------------------------------
|
|
;
|
|
; Initialization code for the SCSI Manager (called by StartInit).
|
|
;
|
|
|
|
InitSCSIMgr
|
|
movem.l intrRegs,-(sp) ; save all registers, for convenience
|
|
moveq.l #0,zeroReg ; initialize "zeroReg"
|
|
|
|
;=== Set up the new improved SCSI manager globals <v1.3>
|
|
|
|
move.l #GlobalSize,d0 ; size of globals to allocate
|
|
_NewPtr ,SYS,CLEAR ; put it in the system heap
|
|
bne @InitSCSIDone ; failed, just exit (bad news...)
|
|
|
|
move.l a0,SCSIGlobals ; save low-mem ptr to globals
|
|
@setupA4
|
|
movea.l a0,a4 ; use normal SCSI Mgr register conventions
|
|
|
|
;--- Allocate additional space if there's a power manager for "machine specific structure"
|
|
|
|
TestFor hwCbPwrMgr ; is there a power manager in this machine? <11> rb
|
|
beq.s @nopmgr ; no power manager
|
|
move.l #machSpecSize,d0 ; size of additional globals to allocate
|
|
_NewPtr ,SYS,CLEAR ; put it in the system heap
|
|
bne @InitSCSIDone ; failed, just exit (bad news...) <11> rb
|
|
move.l a0,G_Reserved2(a4) ; save pointer to machine-specific structure
|
|
movea.l a4,a0 ; restore ptr to beginning of globals again <1.2>
|
|
@nopmgr
|
|
|
|
;--- Set up hardware config flags for this machine <v1.3>
|
|
|
|
jsr SCSISetFlags ; get the flags in d0
|
|
move.l d0,G_Reserved0(a4) ; save in globals
|
|
|
|
;--- Hardware initialization right here in the middle of software init
|
|
|
|
; turn off test mode for chip if we have a SCSI DMA part <v1.3>
|
|
btst.b #sSCSIDMAExists,G_Reserved0+3(a4) ; see if we really have the DMA chip<2.8>
|
|
beq.s @DMAdone ; if not, skip it <2.8>
|
|
movea.l SCSIBase,a3 ; get the chip base <2.9>
|
|
move.l #iINTREN,sDCTRL(a3) ; turn off SCSI Test Mode and enable intrs <C914><v1.4>
|
|
@DMAdone ; <2.8>
|
|
|
|
|
|
;ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
;
|
|
;=== Now set up the jump table (for SCSIDispatch selectors)
|
|
;
|
|
moveq.l #numSelectors-1,d1 ; loop count <v1.6>
|
|
lea.l SCSIMgr,a1 ; get start of SCSI Mgr code
|
|
move.l a1,d0 ; remember base address
|
|
lea OffsetTbl,a1 ; address of offset table
|
|
movea.l a4,a0 ; point to base of old SCSI Mgr jump table <v1.3>
|
|
@MakeJmpTbl
|
|
move.w (a1)+,d2 ; get the next offset
|
|
ext.l d2 ; make it a long <SM3>
|
|
add.l d0,d2 ; compute the address
|
|
move.l d2,(a0)+ ; install it in the jump table
|
|
dbra d1,@MakeJmpTbl ; loop for all vectors
|
|
|
|
;--- set the SCSI chip base addresses <v1.3>
|
|
|
|
lea.l base5380(a4),a0 ; point to hardware portion of globals <v1.5>
|
|
|
|
@SCSIBase move.l SCSIBase,(a0)+ ; addr of SCSI chip
|
|
move.l SCSIDMA,(a0)+ ; pseudo-DMA base of SCSI chip
|
|
move.l SCSIHsk,(a0)+ ; hardware-handshaking base of SCSI chip
|
|
@wrOff
|
|
move.w #wrOffs,(a0)+ ; write offset to SCSI chip <v1.7>
|
|
moveq.l #-1,d0 ; "infinite" value for timeout <v1.5>
|
|
move.l d0,timeout(a4) ; set timeout to infinity <v1.5>
|
|
|
|
|
|
;ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
;
|
|
;ÑÑÑ Do PRAM stuff : Bytes 2 & 3 are allocated for SCSI stuff
|
|
;
|
|
; ÑÑÑ Byte 2 ÑÑÑ
|
|
; bit - def: meaning
|
|
; 7 - 0 : If set, disable the SCSIReset on machine reset
|
|
; 6 - 1 : unused
|
|
; 5 - 0 : unused
|
|
; 4 - 0 : unused (on PDM debug, affects Read DMA reads)
|
|
; 3 - 1 : validity bit (both must be 1 for bytes 2&3 to be valid, else init them)
|
|
; 2 - 1 : \
|
|
; 1 - 1 : Ñ Host ID (i.e. SCSI ID of this Macintosh)
|
|
; 0 - 1 : /
|
|
;
|
|
; ÑÑÑ Byte 3 ÑÑÑ
|
|
; 7 - 0 : unused
|
|
; 6 - 1 : unused
|
|
; 5 - 0 : unused
|
|
; 4 - 0 : unused (on PDM debug, affects Read DMA writes)
|
|
; 3 - 1 : validity bit (see above)
|
|
; 2 - 0 : \
|
|
; 1 - 0 : Ñ "Internal Drive" ID (i.e. zero generally because nobody changes this)
|
|
; 0 - 0 : /
|
|
;
|
|
subq.l #2,sp ; make space for PRAM SCSI id <v1.4>
|
|
move.l sp,a0 ; address of PRAM return buffer
|
|
|
|
move.l #$00020002,d0 ; read 2 bytes of PRAM at offset 2 <C613>
|
|
_ReadXPRam ; get the SCSI id
|
|
move.w (sp),d0 ; check high bits for validity <A324>
|
|
and.w #$0808,d0 ; look at upper bit in lower nibble <SM15> pdw
|
|
cmp.w #$0808,d0 ; equal to magic pattern? <C613>
|
|
beq.s @GotID ; yes, so use those SCSI IDs <A324>
|
|
|
|
;--- if invalid, reinitialize values to defaults
|
|
@SetID
|
|
move.w #(($48+7)<<8) + ($48+0),(sp) ; defaults: CPU=7,hd=0 <C613>
|
|
move.l sp,a0 ; address of new PRAM value
|
|
move.l #$00020002,d0 ; write 2 bytes of PRAM to offset 2 <C613>
|
|
_WriteXPRam ; save the IDs in parameter RAM <C613>
|
|
@GotID
|
|
move.w (sp)+, D3 ; hold PRAM in D3 for later check of RESET bit
|
|
|
|
move.w D3,D0
|
|
lsr.w #8,d0 ; get CPU SCSI ID for shift count
|
|
and.w #$7,d0 ; mask all but the ID bit
|
|
|
|
moveq.l #1,d1 ; 1 << SCSI id
|
|
lsl.b d0,d1 ; form the SCSI id mask
|
|
move.b d1,G_ID(a4) ; initialize the ID mask
|
|
move.b d1,SCSIDrvrs ; clear all SCSI driver flags but our own
|
|
|
|
;ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
;--- Jerry's stuff's starting
|
|
|
|
btst.b #sSCSIDMAExists,G_Reserved0+3(a4) ; do we have SCSI DMA ?
|
|
beq.s @noDCTRL ; if not, we don't need this constant
|
|
andi.l #LUNMask,d0 ; make sure CPU's SCSI ID is only thing in d0
|
|
moveq.l #bDMABERR+1,d1 ; bit position of CPU ID in sDCTRL register
|
|
lsl.l d1,d0 ; shift the CPU SCSI ID up
|
|
ori.l #(iARBIDEN)|\ ; enable auto-arbitration
|
|
iINTREN,d0 ; set up for auto-arbitration
|
|
move.l d0,G_Reserved2(a4) ; save "machine-specific" value
|
|
move.l #sc250msTicks,G_Reserved1(a4) ; constant for 250ms 4-byte timeout <3>
|
|
@noDCTRL
|
|
|
|
move.w #250,G_Async(a4) ; old SCSI Mgr Select timeout of 250 ms
|
|
; (G_State, G_Reserved0-2 (pageFault), G_ExtPtr = 0)
|
|
; (discLUN, discID, state1 = 0)
|
|
@setIntfLvl
|
|
move.b #mgrVersion,state2(a4) ; save the version number
|
|
@setBusTO
|
|
move.l #4,busTO(a4) ; assume 4 us byte-to-byte hhsk timeout (default)
|
|
btst.b #sSCSIDMAExists,G_Reserved0+3(a4) ; do we have a SCSI DMA chip ?
|
|
beq.s @initPhaseTable ; if not, skip
|
|
move.l #$19999999,busTO(a4) ; 7.2 minute byte-to-byte timeout <v1.5>
|
|
@initPhaseTable
|
|
moveq.l #numExtVec-1,d1 ; lots of jump table entries to process
|
|
lea.l SCSIMgr,a1 ; point to start of SCSI Mgr code
|
|
move.l a1,d0 ; keep base of it
|
|
lea OffsetTbl2,a1 ; address of offset table
|
|
lea.l phaseTable(a4),a0 ; point at the phase handler jump table
|
|
@MakeJmpTbl2
|
|
move.w (a1)+,d2 ; get the next offset
|
|
ext.l d2 ; make it a long <SM3>
|
|
beq.s @zero ; if it is zero, place a zero in the globals
|
|
add.l d0,d2 ; compute the address
|
|
move.l d2,(a0)+ ; install it in the jump table
|
|
bra.s @loop ; continue looping
|
|
@zero
|
|
move.l zeroReg,(a0)+ ; zero the vector (unique error vector ???) <v1.4>
|
|
@loop
|
|
dbra d1,@MakeJmpTbl2 ; loop for all vectors
|
|
@setupMsgInTbl
|
|
@setupMsgOutTbl
|
|
moveq.l #(numMsgVct/2)-1,d1 ; # of message routing vectors ("2*numMsgVct/4" longs)
|
|
lea.l msgTbl,a1 ; address of message routing table
|
|
lea.l msgInTbl(a4),a0 ; point at the message routing table in RAM
|
|
@makeMsgTbl
|
|
move.l (a1)+,(a0)+ ; copy the routing information
|
|
dbra.w d1,@makeMsgTbl ; do for all entries
|
|
@setupDeferredTask
|
|
lea.l dTask(a4),a1 ; point to Deferred Task Mgr task record
|
|
move.w #dtQType,qType(a1) ; set qType <v1.5>
|
|
lea.l SCSIDT,a0 ; address of deferred task
|
|
|
|
move.l a0,dtAddr(a1) ; set dtAddr <v1.5>
|
|
@setupTimer
|
|
lea.l timer(a4),a0 ; point to Time Mgr task record
|
|
lea.l TimeTask,a1 ; point to timer interrupt handler
|
|
|
|
move.l a1,tmAddr(a0) ; point to interrupt handler
|
|
_InsTime ; install the task record in Time Mgr queue <v1.7>
|
|
@setupReqSense
|
|
;
|
|
; This sets up the data-chaining commands for the automatic Request Sense feature.
|
|
;
|
|
move.w #$0300,RSCmd(a4) ; Request Sense command byte <v1.5>
|
|
lea.l RSDC(a4),a1 ; point to Req Sense data-chaining instr
|
|
moveq.l #1,d0
|
|
move.l d0,dcCount(a1) ; move one byte
|
|
move.l d0,dcOffset(a1) ; bump address by one
|
|
adda.w #dcSize,a1 ; point to next data-chaining instr
|
|
moveq.l #dcLoop,d0 ; "dcLoop" instruction (-1)
|
|
move.l d0,dcAddr(a1) ; set the opcode
|
|
move.l d0,dcOffset(a1) ; -1 happens to be the loop offset, also
|
|
@setupDummyPB
|
|
lea.l dummy(a4),a1 ; point to the dummy parameter block <v1.8>
|
|
st.b scsiReqID(a1) ; mark as a dummy parameter block (only once) <v1.8>
|
|
lea.l dummyPriv(a4),a0 ; point to private storage for dummy PB <v1.5>
|
|
move.l a0,scsiPrivate(a1) ; attach private storage to dummy PB <v1.5>
|
|
@setupDummyPrivate
|
|
@setupFaultPrivate
|
|
; nothing to do
|
|
@setupPrivates
|
|
lea.l firstPriv(a4),a1 ; point to first private storage record <v1.7>
|
|
move.l a1,firstPrivate(a4) ; save ptr to head of queue
|
|
move.l a1,nextPrivate(a4) ; it's also the first available record
|
|
move.l a1,d0 ; put addr of record in d0
|
|
moveq.l #scsiPrivPBSize,d1 ; size of each record
|
|
add.l d1,d0 ; addr of next record
|
|
move.l d0,(a1) ; save pointer to next record
|
|
move.l d0,a1 ; point to next record
|
|
add.l d1,d0 ; addr of next record
|
|
move.l d0,(a1) ; save pointer to next record
|
|
move.l d0,a1 ; point to next record
|
|
add.l d1,d0 ; addr of next record
|
|
move.l d0,(a1) ; save pointer to next record
|
|
|
|
;--- Jerry's stuff's over
|
|
|
|
|
|
;ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
;ÑÑÑ Do the 53c96 Software Initializations
|
|
|
|
TestFor GrandCentralExists ; do we have Grand Central ?
|
|
bne.s @xit
|
|
|
|
TestFor SCSI96_1Exists ; do we have a SCSI96_1 chip ?
|
|
beq.s @xit ; no c96, so exit
|
|
|
|
TestFor PSCExists ; are we running with a PSC ?
|
|
beq.s @noPSC ; no, do the c96 stuff.
|
|
|
|
IMPORT InitMgr_SCSI_PSC ; <P2>
|
|
bsr.l InitMgr_SCSI_PSC ; initialize SCSIMgr for 5396 (with PSC)<P2>
|
|
bra @xit
|
|
|
|
; The Quadra 700/9x0 machines are the only ones that will ever use <SM11> CSS
|
|
; combination of Orwell + DAFB_Turbo_SCSI ASICs. Identify whether <SM11> CSS
|
|
; we're on a Quadra by the memory controller, which is readily <SM11> CSS
|
|
; testable via the TestFor MACRO. <SM11> CSS
|
|
@noPSC
|
|
TestFor HMCDecoder ;
|
|
bne.s @96_Init ; IF PDM SCSI <SM14> CSS
|
|
TestFor OrwellExists ; <SM11> CSS
|
|
beq.s @BIOS_Init ; ELSE IF Quadra_Based_SCSI THEN <SM11> CSS
|
|
@96_Init bsr.l InitMgr_SCSI96 ; InitMgr_SCSI96() <SM11> CSS
|
|
bra.s @xit ; ELSE <SM11> CSS
|
|
@BIOS_Init
|
|
bsr.l InitMgr_SCSI96_BIOS ; InitMgr_SCSI96_BIOS() <SM11> CSS
|
|
|
|
@xit ;
|
|
|
|
;ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
;ÑÑÑ POWER MANAGER stuff in the SCSI Manager
|
|
|
|
; Install a sleep queue element
|
|
|
|
TestFor hwCbPwrMgr ; is there a power manager in this machine?
|
|
beq.s @nopmgr2 ; no power manager
|
|
@setupDoSpinDown
|
|
lea.l DoSpinDown,a1 ; ptr to the spin-down timer task
|
|
move.l PmgrBase,a0 ; point to the Power Mgr globals
|
|
move.l a1,HDvector(a0) ; store the routine address
|
|
@setupSleepTask
|
|
movea.l G_Reserved2(a4),a0 ; point a0 at the Sleep queue element
|
|
lea.l SleepTask,a1 ; ptr to the Sleep task
|
|
move.l a1,SleepqProc(a0) ; store the routine address
|
|
move.w #SlpQType,SleepqType(a0) ; set up the type
|
|
clr.w SleepqFlags(a0) ; clear out the flags
|
|
_SlpQInstall ; enqueue the element
|
|
@nopmgr2
|
|
|
|
|
|
;ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
;ÑÑÑ Install the new dual bus DB Lite SCSI manager if we have a valid external c80 address <H3>
|
|
|
|
@InstallSCSIDB ; <SM11> CSS
|
|
TestFor MSCChipBit ; <SM11> CSS
|
|
beq.s @noExtc80 ; don't initialize if not on a DB Lite <SM11> CSS
|
|
IMPORT InitMgr_SCSIDB ; <SM11> CSS
|
|
bsr.l InitMgr_SCSIDB ; initialize SCSIMgr for DB Lite external c80 <SM11> CSS
|
|
@noExtc80
|
|
|
|
|
|
;ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
;ÑÑÑ If this ROM (build time) hasAsyncSCSI and (runtime) we Should have it, run InitItt
|
|
|
|
IF hasAsyncSCSI THEN
|
|
|
|
bsr.s ShouldWeDoAsyncSCSI
|
|
beq.s @skipAsync ; no -> don't run async
|
|
|
|
CASE ON
|
|
IMPORT InitItt
|
|
movem.l D0-D2/A1, -(sp)
|
|
lea InitItt, A0
|
|
jsr (A0) ; This will only initialize Itt on 53c96 machines.
|
|
movem.l (sp)+, D0-D2/A1 ; It has no effect on other machines.
|
|
CASE OFF
|
|
@skipAsync
|
|
|
|
ENDIF
|
|
|
|
;ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
@resetBus
|
|
btst #15,D3 ; (pram 2,bit7) skip the reset? <C644>
|
|
bne.s @skip ; skip if set <C644>
|
|
|
|
subq.l #2, sp
|
|
_SCSIReset ; taken from StartInit.a <A300/30Oct86>
|
|
addq.l #2, sp
|
|
@skip
|
|
|
|
;ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
@InitSCSIDone
|
|
movem.l (sp)+,intrRegs ; restore registers
|
|
rts
|
|
|
|
; NAME 'InitSCSIMgr'
|
|
;________________________________________________________________________________
|
|
|
|
|
|
|
|
;================================================================================
|
|
|
|
ShouldWeDoAsyncSCSI
|
|
|
|
TestFor SCSI96_1Exists ; Do we have at least 1 c96 ?
|
|
beq.s @DontDoAsyncSCSI ; -> Nope, we can't do it then
|
|
|
|
IF forPDMProto THEN
|
|
|
|
TestFor HMCDecoder ; are we PDM ?
|
|
beq.s @DoAsyncSCSI ; -> Nope, Try to initialize Itt
|
|
|
|
;
|
|
; Even if we're not an EVT1, we need to check how fast the bus clock is because of AMIC1,2 problem with the VIAs
|
|
; If BusClockRate < 50MHz then DoAsync else
|
|
; (if >= 50MHz) then check for AMIC3 (because we should be able to work with it)
|
|
;
|
|
movem.l ([ProcessorInfoPtr],\
|
|
ProcessorInfo.BusClockRateHz),D1 ; Get the I/O bus clock rate <SM17>
|
|
cmp.l #50000000, D1 ; 50MHz bus?
|
|
blo.s @DoAsyncSCSI ; -> we're lower, its ok to do itt. <SM17>
|
|
|
|
CASE ON
|
|
IMPORT DoWeHaveAMIC3B
|
|
bsr.w DoWeHaveAMIC3B
|
|
CASE OFF
|
|
beq.s @DontDoAsyncSCSI ; no -> don't run async
|
|
; yes: it's OK to run at 50MHz with an AMIC3B
|
|
ENDIF
|
|
|
|
@DoAsyncSCSI
|
|
moveq.l #1, D0
|
|
rts
|
|
|
|
@DontDoAsyncSCSI
|
|
clr.l D0
|
|
rts
|
|
|
|
; NAME 'ShouldWeDoAsyncSCSI'
|
|
;_______________________________________________________________________
|
|
|
|
|
|
|
|
;*********** Old SCSI Manager Dispatch Tables *******************
|
|
|
|
OffsetTbl
|
|
DC.W DoSCSIReset-SCSIMgr ; 0: SCSIReset
|
|
DC.W DoSCSIGet-SCSIMgr ; 1: SCSIGet
|
|
DC.W DoSCSISelect-SCSIMgr ; 2: SCSISelect
|
|
DC.W DoSCSICmd-SCSIMgr ; 3: SCSICmd
|
|
DC.W DoSCSIComplete-SCSIMgr ; 4: SCSIComplete
|
|
DC.W NewSCSIRead-SCSIMgr ; 5: SCSIRead
|
|
DC.W NewSCSIWrite-SCSIMgr ; 6: SCSIWrite
|
|
DC.W Unimplemented-SCSIMgr ; 7: Was SCSIInstall <v1.4>
|
|
DC.W NewSCSIRBlind-SCSIMgr ; 8: SCSIRBlind
|
|
DC.W NewSCSIWBlind-SCSIMgr ; 9: SCSIWBlind
|
|
DC.W DoSCSIStat-SCSIMgr ; 10: SCSIStat
|
|
DC.W DoSCSISelAtn-SCSIMgr ; 11: SCSISelAtn <A370/07Nov86>
|
|
DC.W DoSCSIMsgIn-SCSIMgr ; 12: SCSIMsgIn
|
|
DC.W DoSCSIMsgOut-SCSIMgr ; 13: SCSIMsgOut
|
|
|
|
|
|
;*********** Jerry's Tables *******************
|
|
|
|
OffsetTbl2
|
|
@patchPhaseTable
|
|
DC.W DataIO-SCSIMgr ; 00: Data (Out) phase handler
|
|
DC.W DataIO-SCSIMgr ; 01: Data (In) phase handler
|
|
DC.W Command-SCSIMgr ; 02: Command phase handler
|
|
DC.W StatusPhase-SCSIMgr ; 03: Status phase handler
|
|
DC.W ResetBus-SCSIMgr ; 04: Illegal phase handler
|
|
DC.W ResetBus-SCSIMgr ; 05: Illegal phase handler
|
|
DC.W MsgOut-SCSIMgr ; 06: Message Out phase handler
|
|
DC.W MsgIn-SCSIMgr ; 07: Message In phase handler
|
|
@patchTransferTable
|
|
DC.W SlowRead-SCSIMgr ; 08: Slow read routine
|
|
DC.W SlowWrite-SCSIMgr ; 09: Slow write routine
|
|
DC.W VFastRead-SCSIMgr ; 10: Fast read routine
|
|
DC.W VFastWrite-SCSIMgr ; 11: Fast write routine
|
|
DC.W 0 ; 12: Unused (illegal)
|
|
DC.W 0 ; 13: Unused (illegal)
|
|
DC.W PFastRead-SCSIMgr ; 14: Physical fast read routine
|
|
DC.W PFastWrite-SCSIMgr ; 15: Physical fast write routine
|
|
DC.W SlowRead-SCSIMgr ; 16: Slow read routine
|
|
DC.W SlowWrite-SCSIMgr ; 17: Slow write routine
|
|
DC.W FastRead-SCSIMgr ; 18: Old SCSI Mgr (hhsk) fast read routine
|
|
DC.W FastWrite-SCSIMgr ; 19: Old SCSI Mgr (hhsk) fast write routine
|
|
DC.W SlowComp-SCSIMgr ; 20: Slow compare routine
|
|
DC.W 0 ; 21: Unused
|
|
DC.W FastComp-SCSIMgr ; 22: Fast compare routine
|
|
DC.W 0 ; 23: Unused
|
|
@patchMsgTable
|
|
; Message In handlers
|
|
DC.W msgInvalidIn-SCSIMgr ; 24: bad incoming message -- start a Message Reject
|
|
DC.W msgIdentifyIn-SCSIMgr ; 25: incoming Identify message
|
|
DC.W msgCmdComplete-SCSIMgr ; 26: incoming Command Complete message
|
|
DC.W 0 ; 27: no Extended Message
|
|
DC.W msgSaveDataPtr-SCSIMgr ; 28: msgSaveDataPtr
|
|
DC.W msgRestorePtrs-SCSIMgr ; 29: msgRestorePtrs
|
|
DC.W msgDisconnect-SCSIMgr ; 30: msgDisconnect
|
|
DC.W msgMsgRejIn-SCSIMgr ; 31: incoming Message Reject
|
|
DC.W msgLCCF-SCSIMgr ; 32: Linked Command Complete with (or w/o) Flag
|
|
DC.W 0 ; 33: Unused10
|
|
DC.W 0 ; 34: Unused11
|
|
DC.W 0 ; 35: Unused12
|
|
DC.W 0 ; 36: Unused13
|
|
DC.W 0 ; 37: Unused14
|
|
DC.W 0 ; 38: Unused15
|
|
DC.W 0 ; 39: Unused16
|
|
; Message Out handlers
|
|
DC.W msgIdentifyOut-SCSIMgr ; 40: outgoing Identify message
|
|
DC.W msgMsgRejOut-SCSIMgr ; 41: outgoing Message Reject message
|
|
DC.W msgInvalidOut-SCSIMgr ; 42: bad Message Out state machine handler
|
|
DC.W msgKillio-SCSIMgr ; 43: Kill I/O sequence
|
|
DC.W msgNoOp-SCSIMgr ; 44: outgoing No Operation message
|
|
DC.W msgBusDevRst-SCSIMgr ; 45: outgoing Bus Device Reset message <v1.5>
|
|
DC.W 0 ; 46: Unused23
|
|
DC.W 0 ; 47: Unused24
|
|
DC.W 0 ; 48: Unused25
|
|
DC.W 0 ; 49: Unused26
|
|
DC.W 0 ; 50: Unused27
|
|
DC.W 0 ; 51: Unused28
|
|
DC.W 0 ; 52: Unused29
|
|
DC.W 0 ; 53: Unused30
|
|
DC.W 0 ; 54: Unused31
|
|
DC.W 0 ; 55: Unused32
|
|
@patchUtilityTable
|
|
DC.W SCSIIntHnd-SCSIMgr ; 56: interrupt handler
|
|
DC.W Message-SCSIMgr ; 57: send a msg to SCSIDT
|
|
DC.W ClearIRQ-SCSIMgr ; 58: clear SCSI interrupts
|
|
DC.W DisEnable-SCSIMgr ; 59: enable/disable interrupts
|
|
DC.W LogError-SCSIMgr ; 60: log errors in the PB <v1.4>
|
|
DC.W SCSIDT-SCSIMgr ; 61: SCSI Mgr deferred task
|
|
DC.W Find-SCSIMgr ; 62: find a PB to process
|
|
DC.W Setup-SCSIMgr ; 63: setup a PB
|
|
DC.W Preflight-SCSIMgr ; 64: preflight a PB
|
|
DC.W EnDequeue-SCSIMgr ; 65: enqueue/dequeue routine
|
|
DC.W Arb-SCSIMgr ; 66: Arb
|
|
DC.W Sel-SCSIMgr ; 67: Sel
|
|
DC.W Delay22-SCSIMgr ; 68: Delay22
|
|
DC.W ClearState-SCSIMgr ; 69: ClearState
|
|
DC.W Transfer-SCSIMgr ; 70: Transfer
|
|
DC.W SetTimer-SCSIMgr ; 71: SetTimer
|
|
DC.W ResetBus-SCSIMgr ; 72: ResetBus
|
|
DC.W ClearBus-SCSIMgr ; 73: ClearBus
|
|
DC.W BusErrHandler-SCSIMgr ; 74: Bus error handler
|
|
DC.W DataDMA-SCSIMgr ; 75: DMA-related data-chaining interpreter <v1.4>
|
|
DC.W 0 ; 76: Unused8
|
|
DC.W 0 ; 77: Unused9
|
|
DC.W 0 ; 78: Unused10
|
|
DC.W 0 ; 79: Unused11
|
|
DC.W 0 ; 80: Unused50
|
|
DC.W 0 ; 81: Unused51
|
|
DC.W 0 ; 82: Unused52
|
|
DC.W 0 ; 83: Unused53
|
|
DC.W 0 ; 84: Unused54
|
|
DC.W 0 ; 85: Unused55
|
|
DC.W 0 ; 86: Unused56
|
|
DC.W 0 ; 87: Unused57
|
|
@NewSCSIDispTbl
|
|
DC.W DoRequestIO-SCSIMgr ; 88: SCSIRequestIO
|
|
DC.W DoKillIO-SCSIMgr ; 89: SCSIKillIO
|
|
DC.W DoBusInfo-SCSIMgr ; 90: SCSIBusInfo
|
|
DC.W 0 ; 91: Unused63
|
|
DC.W 0 ; 92: Unused64
|
|
DC.W 0 ; 93: Unused65
|
|
DC.W 0 ; 94: Unused66
|
|
DC.W AltBusCall-SCSIMgr ; 95: Call to alternate SCSI bus
|
|
msgTbl
|
|
;
|
|
; Message In messages
|
|
;
|
|
DC.B jvCmdComplete-msgTable ; Command Complete sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvSaveDataPtr-msgTable ; Save Data Pointer sequence
|
|
DC.B jvRestorePtrs-msgTable ; Restore Pointers sequence
|
|
DC.B jvDisconnect-msgTable ; Disconnect sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvMsgRejIn-msgTable ; Message Reject in sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
DC.B jvInvalidIn-msgTable ; Message Reject out sequence
|
|
;
|
|
; Message Out scenarios
|
|
;
|
|
DC.B jvIdentifyOut-msgTable ; normal Identify sequence
|
|
DC.B jvMsgRejOut-msgTable ; Message Reject sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvKillIO-msgTable ; Kill I/O sequence
|
|
DC.B jvNoOp-msgTable ; No Operation sequence
|
|
DC.B jvBusDevRstOut-msgTable ; Bus Device Reset state machine state sequence <v1.5>
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
DC.B jvInvalidOut-msgTable ; Invalid state machine state sequence
|
|
|
|
|
|
|
|
; <11> rb, from here on we have new code from Terror
|
|
|
|
;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
|
|
;
|
|
; InitSCSIHW - Initialize whatever SCSCI controller this system has.
|
|
; Existing Mac SCSI systems are either 80-base or 96-based
|
|
;
|
|
; -> no inputs
|
|
; <- no outputs
|
|
; trashes D0, D1
|
|
;
|
|
; Called: from StartInit.a
|
|
|
|
InitSCSIHW
|
|
IMPORT InitHW_SCSI96
|
|
movem.l a3/a4,-(sp) ; <T9>
|
|
|
|
IF hasAsyncSCSI THEN
|
|
bsr.s ShouldWeDoAsyncSCSI
|
|
bne.s @Exit ; yes -> skip this bogus HW init
|
|
ENDIF
|
|
|
|
movea.l SCSIBase, a3 ; setup SCSI base addrs
|
|
TestFor SCSI96_1Exists ; use macro to check if we have
|
|
bne.s @FirstSCSI96 ; 1st SCSI96. Bra. if so
|
|
bsr.s InitHW_SCSI80 ; Init SCSI 5380 hw
|
|
bra @Exit ; <SM12> CSS
|
|
@FirstSCSI96
|
|
move.l #SCSI0_DAFB, a4 ; setup SCSI DAFB addrs <T9>
|
|
bsr.s @InitSCSIMulti ; Init first SCSI bus
|
|
@SecondSCSI96
|
|
TestFor SCSI96_2Exists ; use macro to check if we have
|
|
beq.s @Exit ; 2nd SCSI96. Bra. if not
|
|
movea.l SCSI2Base, a3 ; setup SCSI base addrs
|
|
move.l #SCSI1_DAFB, a4 ; setup SCSI DAFB addrs <T9>
|
|
bsr.s @InitSCSIMulti ; Init Second SCSI bus
|
|
@Exit movem.l (sp)+,a3/a4 ; <T9>
|
|
rts
|
|
|
|
;ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
@InitSCSIMulti
|
|
TestFor PSCExists ; are we running with a PSC ?
|
|
beq.s @noPSC ; no psc, do the 96
|
|
|
|
bsr.l InitHW_SCSI_PSC ; Init SCSI 5396 hw <P2>
|
|
bra.s @rts
|
|
|
|
; The Quadra 700/9x0 machines are the only ones that will ever use <SM11> CSS
|
|
; combination of Orwell + DAFB_Turbo_SCSI ASICs. Identify whether <SM11> CSS
|
|
; we're on a Quadra by the memory controller, which is readily <SM11> CSS
|
|
; testable via the TestFor MACRO. <SM11> CSS
|
|
@noPSC
|
|
TestFor HMCDecoder ;
|
|
bne.s @96_Init ; IF PDM SCSI <SM14> CSS
|
|
TestFor OrwellExists ; <SM11> CSS
|
|
beq.s @BIOS_Init ; ELSE IF Quadra_Based_SCSI THEN <SM11> CSS
|
|
@96_Init bsr.l InitHW_SCSI96 ; InitHW_SCSI96() <SM11> CSS
|
|
bra.s @rts ; ELSE <SM11> CSS
|
|
@BIOS_Init
|
|
bsr.l InitHW_SCSI96_BIOS ; InitHW_SCSI96_BIOS() <SM11> CSS
|
|
@rts rts
|
|
|
|
;ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
|
|
|
|
;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ
|
|
;
|
|
; Old InitSCSI: Reset 5380 registers to a known state.
|
|
; From StartInit.a, InitSCSI Proc. Should be in SCSIMgrHW.a (c80-based)
|
|
;
|
|
;
|
|
; a3 -> SCSI base address
|
|
;
|
|
; Destroys A0, D0
|
|
; Called by Hardware init sequence
|
|
|
|
InitHW_SCSI80
|
|
CLR.B sICR+wrOffs(a3) ; Clear Initiator Command Register.
|
|
CLR.B sMR+wrOffs(a3) ; Clear Mode Register.
|
|
CLR.B sTCR+wrOffs(a3) ; Clear Target Command Register.
|
|
CLR.B sSER+wrOffs(a3) ; Clear Select Enable Register.
|
|
RTS
|
|
|
|
|
|
|
|
ENDWITH
|
|
ENDP
|
|
|
|
END
|
|
|