;========================================================================== ; ; File: SCSIGlue.a ; ; Contains: Entry glue for A089 trap and other misc. ; ; Written by: Paul Wolf ; ; Copyright: © 1991-1994 by Apple Computer, Inc., All rights reserved. ; ; Change History (most recent first): ; ; 1/31/94 DCB Added a semaphore around the call to jSCSIFreeHook so we don't ; do a trap to DeferUserFn every time sync safe becomes zero. ; 1/5/94 pdw (DCB) Added calling of SCSIFreeHook from VMEnableUserCode when we go ; sync-safe and old API is not busy. ; 12/19/93 DCB Call jSCSIFreeHook from VMEnableUserCode if syncUnsafe is zero ; and if our SCSIBusy patch was called when syncUnsafe was ; non-zero. ; 11/22/93 pdw Rolling in from . ; 11/8/93 pdw Changed recording criteria. ; 11/21/93 pdw Removed IllegalInstruction and UnimplentedATrap procedures. ; 11/19/93 chp Hacked some more on TestFor_GrandCentralExists. The TestFor ; macro looks in DecoderInfo, so I use DecoderInfoVers to validate ; 96-bit Universal info rather than ProductInfoVers. ; 11/17/93 DCB Changing TestFor_GrandCentralExists so that it works on ; pre-SuperMario ROMs. This is necessary for the INIT version of ; the code. ; 9/22/93 chp Implement a TestFor for Grand Central. ; 10/29/93 DCB roll-in. ; 10/28/93 pdw Changed recording. ; 10/15/93 pdw Added the tst.b -300(sp) to the SCSIAtomic call glue to avoid ; any stack paged out problems. ; 10/14/93 pdw Added support for Synchronous data transfers, rewrote State ; Machine, message handling etc. ; 9/9/93 pdw Lots of little changes. Name changes, temporary cache_bug ; stuff. ; 8/23/93 DCB Fixing TestFor_djMEMCExists to so that uses UnivROMFlags. ; 8/13/93 pdw Added -exists to TestFor_Orwell. ; 7/17/93 pdw Added VMRunning routine. ; 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. ; 5/25/93 DCB Rollin from Ludwig. (The next item below) ; 5/21/93 PW Changing VM-ON check to use $B78<0 instead of $CF0=-1. ; 5/5/93 PW Adding IllegalInstr() function. ; 5/5/93 PW Converted names to meanies-friendly names. Updated with latest ; from Ludwig stuff. ; 5/1/93 PW Got rid of RECORD_ON and RECORD_rCMD definitions (should only be ; in Debug.a now. ; 4/30/93 DCB Changing default RECORD_ON to 0 for final Candidate ; 4/14/93 DCB Added the CallOldXPT function to facillitate switching from one ; XPT to another. ; 3/8/93 PW Recording EnVM and DsVM again. ; 2/17/93 PW Added TestFor_HMCDecoder for PDM support. ; 4/8/93 DCB Added TestForDJMEMC and TestForOrwell to identify Wombats ; 1/31/93 PW Update from the latest of Ludwig. Also changes required for PDM ; (will update Ludwig with these as needed myself). ; 1/27/93 PW Changed values for 'EnVM' and 'DsVM' events to include VM's ; UserCodeDisabled value. Removed EnV0 check and event. Made EnVM ; return void again. ; 1/12/93 DCB Changed ifdefs for RECORD_ON so that the makefile will turn them ; on and off correctly. ; 12/18/92 PW Added general SyncRequestsEnabled counter support to fix ; SCSIGets at VBL time bug. ; 12/5/92 PW Changed to default to recording A089 traps. ; 12/5/92 PW Changed the record_event for A089. ; 11/20/92 DCB Moved the VM stuff here where it belongs ; 10/30/92 DCB Changed the record data for 'AO89' tape entry ; 8/24/92 PN Take out CycloneboxEVT1 stuff ; 7/28/92 PW Added onEVT1 check routine so that InitItt can choose not to ; install Itt if on an EVT1. ; 7/25/92 PW New Today. ; ;========================================================================== MACHINE MC68020 ; '020-level BLANKS ON ; assembler accepts spaces & tabs in operand field PRINT OFF ; do not send subsequent lines to the listing file ; don't print includes CASE OBJECT ; preserve case in object file LOAD 'StandardEqu.d' ; from StandardEqu.a and for building ROMs INCLUDE 'HardwarePrivateEqu.a' INCLUDE 'SysPrivateEqu.a' INCLUDE 'UniversalEqu.a' ; for TestFor INCLUDE 'Debug.a' ; for NAME macro INCLUDE 'ACAM.a' INCLUDE 'SCSI.a' ; for scsiBPhysical INCLUDE 'XPTEqu.a' IMPORT RecordEvent VMGlobals EQU $B78 ;!!! until I update InternalOnlyEqu.a VMVectors EQU $CF0 ; pointer to VM vector table ;-------------------------------------------------------------------------- ******** Entry point from A089 Trap ************* SCSIAtomic PROC EXPORT IMPORT SCSITrap: CODE IF CALL_RECORD_ON THEN pea 'A089' move.l SCSI_IO.scsiDevice(A0), -(sp) move.b SCSI_IO.scsiFunctionCode(A0), (sp) ;into diReserved bsr RecordEvent addq.l #8, sp move.l A0, -(sp) move.l sp, -(sp) bsr RecordEvent addq.l #8, sp ENDIF ; let's make sure that there's enough stack space paged in for us to use. ; this is desired because of the enormous number of non-driver clients ; that don't hold the stack when making SCSI calls tst.b -$300(sp) ; push parameters and call SCSITrap move.l A0, -(sp) ; store SCSI_PB argument on the stack move.l D0, -(sp) ; store scsiSelector argument on the stack bsr.w SCSITrap ; call the SCSITrap in the SCSI manager ; result in D0.L add.l #8, sp ; pop-off arguments rts NAME 'SCSIAtomic' ENDPROC ;——————————————————————————————————————————————————————————————————————— TestFor_SCSI96_1Exists PROC EXPORT ;——————————————————————————————————————————————————————————————————————— ; moveq.l #0, D0 TestFor SCSI96_1Exists sne D0 rts NAME 'TestFor_SCSI96_1Exists' ;——————————————————————————————————————————————————————————————————————— TestFor_SCSI96_2Exists PROC EXPORT ;——————————————————————————————————————————————————————————————————————— ; moveq.l #0, D0 TestFor SCSI96_2Exists sne D0 rts NAME 'TestFor_SCSI96_2Exists' ;——————————————————————————————————————————————————————————————————————— TestFor_PSCExists PROC EXPORT ;——————————————————————————————————————————————————————————————————————— ; moveq.l #0, D0 TestFor PSCExists sne D0 rts NAME 'TestFor_PSCExists' ENDP ;——————————————————————————————————————————————————————————————————————— TestFor_HMCDecoder PROC EXPORT ;——————————————————————————————————————————————————————————————————————— ; moveq.l #0, D0 TestFor HMCDecoder ; are we PDM ? sne D0 rts NAME 'TestFor_HMCDecoder' ENDP ;——————————————————————————————————————————————————————————————————————— TestFor_OrwellExists PROC EXPORT ;——————————————————————————————————————————————————————————————————————— ; moveq.l #0, D0 TestFor OrwellExists ; are we Quadra ? sne D0 rts NAME 'TestFor_OrwellExists' ENDP ;——————————————————————————————————————————————————————————————————————— TestFor_djMEMCExists PROC EXPORT ;——————————————————————————————————————————————————————————————————————— ; move.l UnivROMFlags, D0 btst.l #ProductInfo.djMEMCChipBit, D0 sne D0 rts NAME 'TestFor_djMEMCExists' ENDP ;——————————————————————————————————————————————————————————————————————— TestFor_GrandCentralExists PROC EXPORT ;——————————————————————————————————————————————————————————————————————— ; ; First make sure the ROM has 96-bit AddrMapFlags. ; moveq #0,d0 movea.l UnivInfoPtr,a0 adda.l ProductInfo.DecoderInfoPtr(a0),a0 tst.b DecoderInfo.DecoderInfoVers(a0) beq.b @exit TestFor GrandCentralExists sne d0 @exit rts NAME 'TestFor_GrandCentralExists' ENDP ;************************************************************************** ; ; VMEnableUserCode, VMDisableUserCode - ; ;========================================================================== ; Pointer to V_UserCode is stored at *VMVECTORS + 0x48; ; Pointer to userCodeDisabled is stored at *VMG + 0x48; ; Pointer to pageFaultFatal is stored at *VMG + 0x4a; ;——————————————————————————————————————————————————————————————————————— VMEnableUserCode PROC EXPORT move.l ([SCSIGlobals],SCSIGlobalsRec.xptGlobals), A0 subq.w #1, XPTglobals.syncUnsafeCount(A0) bhs.s @cool moveq.l #0, D0 move.w D0, XPTglobals.syncUnsafeCount(A0) IF 1 AND RECORD_ON THEN ; pea 'EnV0' pea 0 move.w XPTglobals.syncUnsafeCount(A0), 2(sp) tst.l VMGlobals bmi.s @10 move.l VMGlobals, A0 move.b $49(A0), (sp) move.b $4b(A0), 1(sp) @10 bsr RecordEvent addq.l #8, sp ENDIF IfDebugStr 'syncUnsafeCount gone negative' bra.s @exitVMEn @cool IF 0 AND RECORD_ON THEN ; pea 'EnVM' pea 0 move.w XPTglobals.syncUnsafeCount(A0), 2(sp) tst.l VMGlobals bmi.s @11 move.l VMGlobals, A0 move.b $49(A0), (sp) move.b $4b(A0), 1(sp) @11 bsr RecordEvent addq.l #8, sp ENDIF tst.l VMGlobals bmi.s @1 move.l #1, -(sp) move.l VMVECTORS, a0 move.l $48(a0), A0 jsr (a0) addq.l #4, sp @1 tst.l XPTglobals.syncUnsafeCount(A0) ; Safe? bne.b @2 btst #kbOldAPIBusy, XPTglobals.flags(A0) ; old API clear? bne.b @2 IF 0 AND RECORD_ON THEN pea 'Free' pea 0 move.w ([SCSIGlobals],XPTglobals.syncUnsafeCount), 2(sp) tst.l VMGlobals bmi.s @12 move.l VMGlobals, A0 move.b $49(A0), (sp) move.b $4b(A0), 1(sp) @12 bsr RecordEvent addq.l #8, sp ENDIF jsr callFreeHook ; Tell File Mgr what's up @2 moveq.l #1, D0 @exitVMEn rts NAME 'VMEnableUserCode' callFreeHook move.l SCSIGlobals, a0 ; aquire our globals bclr.b #0,SCSIGlobalsRec.ciWasBusy(a0); do we need to call the free hook? beq.b @Done ; nope bset.b #1,SCSIGlobalsRec.ciBusyPending(a0) ; test and set the freehook pending flag bne.s @Done ; one already pending - done lea PostFreeHook,a0 ; get addr of routine to execute _DeferUserFn ; execute deferred @Done rts NAME 'callFreeHook' PostFreeHook movea.l ExpandMem,a0 ; a0 = ptr to expand mem move.l ExpandMemRec.jSCSIFreeHook(a0),d0 ; d0 = SCSI free vector beq.s @Done ; no freehook to execute movea.l d0,a0 jsr (a0) ; execute "jSCSIFreeHook" @Done move.l SCSIGlobals, a0 ; aquire our globals clr.b SCSIGlobalsRec.ciBusyPending(a0) ; clear pending flag rts NAME 'PostFreeHook' ENDP ;——————————————————————————————————————————————————————————————————————— VMDisableUserCode PROC EXPORT IF 0 AND RECORD_ON THEN pea 'DsVM' pea 0 move.w XPTglobals.syncUnsafeCount(A0), 2(sp) tst.l VMGlobals bmi.s @12 move.l VMGlobals, A0 move.b $49(A0), (sp) move.b $4b(A0), 1(sp) @12 bsr RecordEvent addq.l #8, sp ENDIF tst.l VMGlobals bmi.s @1 clr.l -(sp) move.l VMVECTORS, a0 move.l $48(a0), A0 jsr (a0) addq.l #4, sp @1 move.l ([SCSIGlobals],SCSIGlobalsRec.xptGlobals), A0 addq.w #1, XPTglobals.syncUnsafeCount(A0) bcc.s @cool IfDebugStr 'syncUnsafeCount gone big!' moveq #dsIOCoreErr, D0 _SysError @cool rts NAME 'VMDisableUserCode' ENDP ;——————————————————————————————————————————————————————————————————————— CallOldXPT PROC EXPORT ;——————————————————————————————————————————————————————————————————————— ; move.l 12(sp),a1 ; get the XPT move.l 8(sp),d0 ; get the scsiSelector move.l 4(sp),a0 ; get the parameter block jmp (a1) ; jump to it RTSNAME 'CallOldXPT' ENDP ;——————————————————————————————————————————————————————————————————————— VMRunning PROC EXPORT ;——————————————————————————————————————————————————————————————————————— tst.l VMGlobals spl D0 ; if plus, D0 gets set (i.e. VM is on) rts NAME 'VMRunning' ENDP END