2017-09-17 17:09:04 +08:00
|
|
|
|
;__________________________________________________________________________________________________
|
|
|
|
|
;
|
|
|
|
|
; File: StartErr.a
|
|
|
|
|
;
|
|
|
|
|
; Contains: System Error Handler & Debugger Interface
|
|
|
|
|
; This file contains the error handling interface code for Macintosh.
|
|
|
|
|
;
|
|
|
|
|
; This code can be divided into three pieces:
|
|
|
|
|
;
|
|
|
|
|
; 1) _Debugger trap handler
|
|
|
|
|
; 2) _SysError trap handler
|
|
|
|
|
; 3) Exception/interrupt handler
|
|
|
|
|
;
|
|
|
|
|
; The key to the new interface is the MacJmp low-memory vector. If nil, it
|
|
|
|
|
; implies that the current 'debugger' is the DeepShit error handler, otherwise
|
|
|
|
|
; it points to the entry point for alternate debugger, be it Macsbug, MPS remote
|
|
|
|
|
; or Joe Blow's turboProbe.
|
|
|
|
|
;
|
|
|
|
|
; The _Debugger trap interface is in the form of
|
|
|
|
|
; Debugger (Arg1, Arg2, ... ArgN, SizeOfParams, CmdWord)
|
|
|
|
|
;
|
|
|
|
|
; SizeOfParams (INTEGER) is the number of bytes occupied by Arg1...ArgN
|
|
|
|
|
; CmdWord (INTEGER) is the dispatch word (0...N) for the debugger
|
|
|
|
|
;
|
|
|
|
|
; The _SysError trap interface is the same, i.e. error value in D0.W
|
|
|
|
|
;
|
|
|
|
|
; The Exception/interrupt handler & _SysError both save registers in syserror space
|
|
|
|
|
; ($7FC80), then they and the _Debugger trap handler attempt to dispatch either
|
|
|
|
|
; to an installed debugger (MacJmp <> 0) or (if not _Debugger) to the DeepShit
|
|
|
|
|
; handler.
|
|
|
|
|
;
|
|
|
|
|
; The MacJmp (or MacJmpFlag for 32 bit clean machine) vector has three high-byte flags
|
|
|
|
|
;
|
|
|
|
|
; | Debugger Running | Debugger Initialized | Debugger Installed | 5 unused bits |
|
|
|
|
|
;
|
|
|
|
|
; Debugger Running (bit set) => the debugger is currently executing
|
|
|
|
|
; Debugger Initialized => Able to handle system errors
|
|
|
|
|
; Debugger Installed => MacJmp vector pts to usable debugger
|
|
|
|
|
;
|
|
|
|
|
; Written by: Ken Krugler
|
|
|
|
|
;
|
|
|
|
|
; Copyright: <09> 1985-1993 by Apple Computer, Inc., all rights reserved.
|
|
|
|
|
;
|
|
|
|
|
; Change History (most recent first):
|
|
|
|
|
;
|
|
|
|
|
; <SM8> 11/9/93 KW added some eieioSTP macros. Only expands for CygnusX1 ROM
|
|
|
|
|
; <SM7> 6/3/93 SAM Added some Supports24Bit around the DSHandler.
|
|
|
|
|
; <SM6> 12/1/92 RB Under SuperMario ROMs, change the system error for No patch to
|
|
|
|
|
; the system error that saiz this is an older system. When someone
|
|
|
|
|
; boots a SM ROM with a system less than 7.1 they should get that
|
|
|
|
|
; error and not a 'can't find patch' system error.
|
|
|
|
|
; <SM5> 11/24/92 HY Change Parity NMI check. Wrong branch sense (changed bne to beq)
|
|
|
|
|
; <SM4> 11/3/92 rab Roll in Horror changes. <H5> 5/4/92 JC Change Parity NMI patch
|
|
|
|
|
; to check specifically for PGC bit in Hardware External features
|
|
|
|
|
; flags on RBV type machines instead of checking for V8 flag.
|
|
|
|
|
; <SM3> 8/19/92 CSS Update from Reality:
|
|
|
|
|
; <13> 8/18/92 DTY Change the name of BootGlobs to StartGlobals to avoid confusion
|
|
|
|
|
; with BootGlobals, which is used by the boot code in Boot[1-3].a.
|
|
|
|
|
; <SM2> 5/16/92 kc Roll in Horror. Comments follow:
|
|
|
|
|
; <H7> 5/29/91 CCH Backed out revision 6.
|
|
|
|
|
; <H6> 5/29/91 WM Changed MOVE to SR into OR to SR
|
|
|
|
|
; <H5> 5/10/91 HJR Backed out of last revisions changes since a much cleaner
|
|
|
|
|
; implementation was done in PowerMgr.a.
|
|
|
|
|
; <H4> 4/29/91 HJR Added NMIExcpPatch to NMIExcp in order allow NMI on portables
|
|
|
|
|
; with power-cycling.
|
|
|
|
|
; <H3> 12/11/90 JJ Mac LC: Change reference to VISAChipBit to be V8ChipBit.
|
|
|
|
|
; <H3> 12/11/90 JJ Mac LC: Changes references to VISAChipBit to V8ChipBit.
|
|
|
|
|
; <H2> 10/25/90 CCH Added support for ReAnimator when forRomulator equate is set.
|
|
|
|
|
; <12> 1/15/92 KC Fix "If last BRA.S to import is to next instruction, BAD CODE
|
|
|
|
|
; will be generated" assembler error.
|
|
|
|
|
; <11> 10/1/91 JSM Don<6F>t use eclipseDebug.
|
|
|
|
|
; <10> 9/30/91 JSM Don<6F>t use is32BitClean conditional, all future ROMs will be.
|
|
|
|
|
; <9> 9/16/91 JSM Cleanup header.
|
|
|
|
|
; <8> 6/12/91 LN removed #include 'HardwareEqu.a'
|
|
|
|
|
; <7> 10/22/90 JJ Rex V8: Change VISAChipBit to V8ChipBit.
|
|
|
|
|
; <6> 7/2/90 CCH Removed a fatally redundant MOVEC xxx,VBR.
|
|
|
|
|
; <5> 6/27/90 CCH Added code to be nice to the ReAnimator nub so that it's
|
|
|
|
|
; exception vectors don't get initialized over. Also moved the
|
|
|
|
|
; initialization of VBR (Cpu <20> 020) to AFTER we actually have
|
|
|
|
|
; useful vectors in the exception vector table.
|
|
|
|
|
; <4> 4/14/90 JJ Add runtime check to avoid seeing parity error NMI on Elsie.
|
|
|
|
|
; <3> 1/11/90 CCH Added include of <20>HardwarePrivateEqu.a<>.
|
|
|
|
|
; <2> 12/26/89 GMR RPU parity is now disabled after the error, just as the IIci was
|
|
|
|
|
; handled.
|
|
|
|
|
; <2.1> 12/7/89 GMR COMMENT:NEEDED FOR ZONE5: Updated NMI handler for Zone-5 parity
|
|
|
|
|
; interrupts.
|
|
|
|
|
; <2.0> 8/22/89 SES Removed references to nFiles.
|
|
|
|
|
; <1.9> 7/17/89 GMR fixed bug when blasting warm start on MMU machines: call
|
|
|
|
|
; _SwapMMUMode before looking at bootglobs and after.
|
|
|
|
|
; <1.8> 5/26/89 rwh fixed changed names of BootGlobals fields
|
|
|
|
|
; <1.7> 5/19/89 GMR Use equate for parity error code (dsParityErr)
|
|
|
|
|
; <1.5> 5/16/89 GMR Added parity code in NMI handler, to set error code to 101 if
|
|
|
|
|
; parity caused NMI on RBV based machines.
|
|
|
|
|
; <1.6> 5/16/89 rwh (for gmr) cleared warmstart flag after parity error, so ram gets
|
|
|
|
|
; re-initialized.
|
|
|
|
|
; <1.4> 5/11/89 SWC Changed conditionals from machine- to feature-based for
|
|
|
|
|
; universal ROM.
|
|
|
|
|
; <1.3> 2/24/89 SES Added setup of VBR for '020 machines and greater.
|
|
|
|
|
; <1.2> 2/17/89 CSL Added MacJmpFlag to make MacJmp a clean 32 bit vector.
|
|
|
|
|
; <1.1> 11/10/88 CCH Fixed Header.
|
|
|
|
|
; <1.0> 11/9/88 CCH Adding to EASE.
|
|
|
|
|
; <<3C>1.1> 9/23/88 CCH Got rid of inc.sum.d and empty nFiles
|
|
|
|
|
; <1.0> 2/10/88 BBM Adding file for the first time into EASE<53>
|
|
|
|
|
; <C914> 10/29/87 rwh Port to Modern Victorian (onMvMac)
|
|
|
|
|
; <C882> 9/3/87 RDC Fix code for new MacsBug - make NMI handler set error code(reg
|
|
|
|
|
; D0) = 13 on entry to SysError - have Syserror check only for
|
|
|
|
|
; D0=13 for NMI exceptions - provide alternate entry point into
|
|
|
|
|
; SysError for BadTrap routine
|
|
|
|
|
; <C875> 9/2/87 MSH Port to HcMac (Laguna)
|
|
|
|
|
; <C447> 11/20/86 DAH Clear NMIFlag in SysErrInit.
|
|
|
|
|
; <A375> 11/8/86 CSL fixed launching into Microbug.
|
|
|
|
|
; <C206> 10/9/86 bbm Modified to mpw aincludes.
|
|
|
|
|
; <C152> 9/18/86 WRL Turned this into a separately compiled PROC.
|
|
|
|
|
; <C84> 7/29/86 WRL Removed nub debugger installation.
|
|
|
|
|
; <C28> 6/3/86 CSL Added changes for Aladddin (onMacPP).
|
|
|
|
|
; <C1> 4/14/86 RDC Added changes for 68020 Reno project (NuMac)
|
|
|
|
|
; - Changed variable for NMI debounce
|
|
|
|
|
; - Removed init of Nubdebugger for now
|
|
|
|
|
; 11/4/85 JTC Save 8 bytes of address/bus error info in SExxx space for new
|
|
|
|
|
; debuggers.
|
|
|
|
|
; 11/2/85 JTC Fix handling of exception frame. Pass whole business to
|
|
|
|
|
; debugger, saving up for a grand RTE finale. Must dummy a
|
|
|
|
|
; format-0 frame for 010 and 020.
|
|
|
|
|
; 7/23/85 RDC added changes for MidMac
|
|
|
|
|
; - code to setup and handle true NMI exception
|
|
|
|
|
; - debounce of NMI int
|
|
|
|
|
; 7/13/85 JTC Modified SysErr interface for 010/020 stack handling.
|
|
|
|
|
; 5/2/85 KWK new MacJmp flags, NMI signals init call
|
|
|
|
|
; 5/1/85 KWK Significant re-structure for flexible debugger call
|
|
|
|
|
; 4/30/85 KWK new today
|
|
|
|
|
;__________________________________________________________________________________________________
|
|
|
|
|
|
|
|
|
|
BLANKS ON
|
|
|
|
|
STRING ASIS
|
|
|
|
|
|
|
|
|
|
IF CPU >= 20 THEN ; <1.3>
|
|
|
|
|
MACHINE MC68020 ; <1.3>
|
|
|
|
|
ENDIF ; <1.3>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PRINT OFF ; <C152>
|
|
|
|
|
LOAD 'StandardEqu.d'
|
|
|
|
|
INCLUDE 'HardwarePrivateEqu.a'
|
|
|
|
|
INCLUDE 'UniversalEqu.a' ; <1.5>
|
|
|
|
|
INCLUDE 'MMUEqu.a' ; <C152>
|
|
|
|
|
INCLUDE 'BootEqu.a' ; <C152>
|
|
|
|
|
PRINT ON ; <C152>
|
|
|
|
|
|
|
|
|
|
;----------------------------------------------------------------------
|
|
|
|
|
; Routine SysErrInit
|
|
|
|
|
; Arguments A3.L (input) Ram overlay offset value
|
|
|
|
|
; A6.L (input) Return address
|
|
|
|
|
; Function Set up exception vectors, nub memory, etc.
|
|
|
|
|
; Uses A2
|
|
|
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
SysErrInit PROC EXPORT ; <C152>
|
|
|
|
|
|
|
|
|
|
IMPORT GenExcps ; <C152>
|
|
|
|
|
IMPORT IRQException ; <C152>
|
|
|
|
|
IMPORT NMIExcp ; <C152>
|
|
|
|
|
|
|
|
|
|
SUB.L A0,A0 ; point A0 at start of RAM
|
|
|
|
|
|
|
|
|
|
IF NOT forRomulator THEN ; <T2>
|
|
|
|
|
MOVE.L A0,D0 ; setup the VBR for '020s and greater <1.3>
|
|
|
|
|
MOVEC D0,VBR ; <1.3>
|
|
|
|
|
ENDIF
|
|
|
|
|
|
|
|
|
|
ADDQ.W #BusErrVct,A0 ; start stuffing at the bus error vector <1.4>
|
|
|
|
|
LEA GenExcps,A1
|
|
|
|
|
|
|
|
|
|
MOVEQ #10-1,D0 ; setup exception handlers for <1.4>
|
|
|
|
|
@0 MOVE.L A1,(A0)+ ; bus error thru line 1111 emulator vectors
|
|
|
|
|
ADDQ.W #2,A1 ; <1.4>
|
|
|
|
|
DBRA D0,@0
|
|
|
|
|
|
|
|
|
|
MOVEQ #13-1,D0 ; point unassigned (vector 12) thru spurious <1.4>
|
|
|
|
|
@1 MOVE.L A1,(A0)+ ; interrupt vectors to the "undefined" handler
|
|
|
|
|
DBRA D0,@1 ; (System Error #11)
|
|
|
|
|
|
|
|
|
|
LEA IRQException,A2 ; point to the IRQ exception handler
|
|
|
|
|
MOVEQ #6-1,D0 ; stuff the IRQ pointer into first 6 autovectors<1.4>
|
|
|
|
|
@2 MOVE.L A2,(A0)+
|
|
|
|
|
DBRA D0,@2
|
|
|
|
|
LEA NMIExcp,A2 ; level 7 (NMI) has a special routine to de-bounce the
|
|
|
|
|
MOVE.L A2,(A0)+ ; programmer's switch on some machines (else don't care)
|
|
|
|
|
|
|
|
|
|
MOVEQ #32-1,D0 ; point TRAP #0 vector thru unassigned (63) <1.4>
|
|
|
|
|
@3 MOVE.L A1,(A0)+ ; to the "undefined" handler (System Error #11)
|
|
|
|
|
DBRA D0,@3 ; since they aren't user-definable
|
|
|
|
|
|
|
|
|
|
IF forRomulator THEN ; <T2>
|
|
|
|
|
SUB.L A0,A0 ; point A0 at start of RAM
|
|
|
|
|
|
|
|
|
|
TestInRam a1 ; only allow vector-nuking if running in RAM <bg>
|
|
|
|
|
beq.s @dontNukeMe ; skip vector restoration if running from ROM <bg>
|
|
|
|
|
movec vbr,a1 ; get OUR VBR
|
|
|
|
|
; ... and put them in the standard vector tbl
|
|
|
|
|
move.l BusErrVct(a1),BusErrVct(a0) ; then copy in our vectors
|
|
|
|
|
move.l AddrVector(a1),AddrVector(a0)
|
|
|
|
|
move.l IlglVector(a1),IlglVector(a0)
|
|
|
|
|
move.l ZeroVector(a1),ZeroVector(a0)
|
|
|
|
|
move.l CheckVector(a1),CheckVector(a0)
|
|
|
|
|
move.l TrapVVector(a1),TrapVVector(a0)
|
|
|
|
|
move.l PrivlgVector(a1),PrivlgVector(a0)
|
|
|
|
|
move.l TraceVector(a1),TraceVector(a0)
|
|
|
|
|
move.l DebugVector(a1),DebugVector(a0)
|
|
|
|
|
move.l FmtErrVect(a1),FmtErrVect(a0)
|
|
|
|
|
move.l BadIntVector(a1),BadIntVector(a0)
|
|
|
|
|
move.l BkptVector(a1),BkptVector(a0)
|
|
|
|
|
@dontNukeMe ; <bg>
|
|
|
|
|
|
|
|
|
|
MOVE.L A0,D0 ; setup the VBR for '020s and greater
|
|
|
|
|
MOVEC D0,VBR ;
|
|
|
|
|
ENDIF ;
|
|
|
|
|
|
|
|
|
|
; now clear out the SysErr data space. Starts at $7FC80 and continues for 128 bytes. Used to save off
|
|
|
|
|
; registers and maintain other nub state information (nub data ptr, etc).
|
|
|
|
|
|
|
|
|
|
CLR.B NMIFlag ; clear debouncing flag <C447>
|
|
|
|
|
|
|
|
|
|
LEA SEVars,A0 ; pt to start of nub memory
|
|
|
|
|
MOVEQ #(SEVSize/4)-1,D0 ; data size
|
|
|
|
|
@4 CLR.L (A0)+ ; clear it
|
|
|
|
|
DBRA D0,@4 ; loop
|
|
|
|
|
|
|
|
|
|
; set up the default debugger (serial interface to MPS debugger)
|
|
|
|
|
|
|
|
|
|
CLR.L MacJmp ; init debugger flag for no debugger <C1/14Apr86>
|
|
|
|
|
CLR.B MacJmpFlag ; init debugger flag for 32 bit clean machine <v1.2>
|
|
|
|
|
|
|
|
|
|
RTS6
|
|
|
|
|
|
|
|
|
|
ENDP ; <C152>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;----------------------------------------------------------------------
|
|
|
|
|
; Routine ToDeepShit
|
|
|
|
|
; Arguments (SP) (input) Return address to exception receiver
|
|
|
|
|
; xxxx(SP) CPU and exception type stack frame <13Jul85>
|
|
|
|
|
; Function Receives all the hardware exceptions. It derives the
|
|
|
|
|
; deepShit ID from the return address on the stack and then
|
|
|
|
|
; invokes the deepShit manager.
|
|
|
|
|
; Modified to call yoghurt manager with stack cleansed of all frame <13Jul85>
|
|
|
|
|
; information. Idea is to save Reg/Stack info then RTE to DS manager, <13Jul85>
|
|
|
|
|
; using the RTE to clear whatever frame info is there. <13Jul85>
|
|
|
|
|
; Nowadays, pass entire frame (sans PC and SR) to debugger, for later RTE <02Nov85> JTC
|
|
|
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
ToDeepShit PROC EXPORT ; <C152>
|
|
|
|
|
|
|
|
|
|
IMPORT GenExcps ; <C152>
|
|
|
|
|
IMPORT SysErr2 ; <C152>
|
|
|
|
|
|
|
|
|
|
MOVE.W #$2700,SR ; turn off interrupts
|
|
|
|
|
TST.B MacJmpFlag ; are the debuggers in control here?
|
|
|
|
|
BMI.S @0 ; yes, don't bother saving regs
|
|
|
|
|
|
|
|
|
|
MOVEM.L A0-A7/D0-D7,SEVars ; save all regs for debug
|
|
|
|
|
|
|
|
|
|
; Compute small integer exception index 1,2,... into D0, based on address atop the stack. <13Jul85>
|
|
|
|
|
|
|
|
|
|
@0 LEA GenExcps,A0 ; get address of receiver table
|
|
|
|
|
MOVE.L (SP)+,D0 ; get return address
|
|
|
|
|
SUB.L A0,D0 ; compute delta
|
|
|
|
|
LSR #1,D0 ; divide by 2
|
|
|
|
|
|
|
|
|
|
; Now clear stack of exception info, saving SR and PC unless re-entered. A special case <13Jul85>
|
|
|
|
|
; is class 0 exception on the 68000, which has 4 words of info on top of the usual SR/PC. <13Jul85>
|
|
|
|
|
|
2017-09-20 19:58:54 +08:00
|
|
|
|
TST.B $BFF
|
|
|
|
|
BMI.S @3
|
2017-09-17 17:09:04 +08:00
|
|
|
|
|
|
|
|
|
MOVE (SP)+,SESR ; SR on top for all CPUs <13Jul85>
|
|
|
|
|
MOVE.L (SP)+,SEPC ; next is the saved PC <13Jul85>
|
2017-09-20 19:58:54 +08:00
|
|
|
|
BRA SysErr2 ; bypass nonsaving pop <13Jul85><1.4>
|
2017-09-17 17:09:04 +08:00
|
|
|
|
|
|
|
|
|
@3 ADDQ.W #6,SP ; kill SR and PC <13Jul85><1.4>
|
2017-09-20 19:58:54 +08:00
|
|
|
|
BRA SysErr2
|
2017-09-17 17:09:04 +08:00
|
|
|
|
NOP ; appease the assembler gods <12> kc
|
|
|
|
|
ENDP ; <C152>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; This is the receiver table for all exceptions (except 1010). Look at ToDeepShit
|
|
|
|
|
; code to understand BSR.S stuff
|
|
|
|
|
|
|
|
|
|
GenExcps PROC EXPORT ; <C152>
|
|
|
|
|
IMPORT ToDeepShit ; <C152>
|
|
|
|
|
EXPORT IRQException ; <C152>
|
|
|
|
|
EXPORT NMIExcp ; <C152>
|
|
|
|
|
|
|
|
|
|
BSR.S ToDeepShit ; (1) bus error
|
|
|
|
|
BSR.S ToDeepShit ; (2) address error
|
|
|
|
|
BSR.S ToDeepShit ; (3) illegal instruction
|
|
|
|
|
BSR.S ToDeepShit ; (4) zero divide
|
|
|
|
|
BSR.S ToDeepShit ; (5) check instruction
|
|
|
|
|
BSR.S ToDeepShit ; (6) trapv instruction
|
|
|
|
|
BSR.S ToDeepShit ; (7) privilege violation
|
|
|
|
|
BSR.S ToDeepShit ; (8) trace
|
|
|
|
|
BSR.S ToDeepShit ; (9) line 1010 (temporarily)
|
|
|
|
|
BSR.S ToDeepShit ; (10) line 1111
|
|
|
|
|
BSR.S ToDeepShit ; (11) other exceptions (TRAP calls, spurious int, etc)
|
|
|
|
|
BSR.S ToDeepShit ; (12) Place holder for no trap number exception
|
|
|
|
|
IRQException
|
|
|
|
|
BSR.S ToDeepShit ; (13) interrupt exceptions
|
|
|
|
|
|
|
|
|
|
NMIExcp BSET #7,NMIFlag ; use high bit of NMI flag as indicator <C1/14Apr86>
|
|
|
|
|
BEQ.S IRQException ; process first interrupt <23Jul85><1.4>
|
|
|
|
|
RTE ; else just ignore <23Jul85>
|
|
|
|
|
|
|
|
|
|
ENDP ; <C152>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;----------------------------------------------------------------------
|
|
|
|
|
; Routine SystemError
|
|
|
|
|
; Arguments D0.W (input) System error number
|
|
|
|
|
; Function Handle system errors. Allows consistant interface to
|
|
|
|
|
; debuggers.
|
|
|
|
|
; Stack is cleansed of all trap parameters, so that return with RTE <13Jul85>
|
|
|
|
|
; depends on information restored from SEPC and SESR. <13Jul85>
|
|
|
|
|
; Nowadays, debugger is called with exception parameters on stack. <02Nov85> JTC
|
|
|
|
|
; So must dummy up a format-0 frame when SystemError is called. <02Nov85> JTC
|
|
|
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
SystemError PROC EXPORT ; <C152>
|
|
|
|
|
|
|
|
|
|
EXPORT SysErr1 ; <C882>
|
|
|
|
|
EXPORT SysErr2 ; <C152>
|
|
|
|
|
IMPORT DebugProlog ; <C152>
|
|
|
|
|
IMPORT DSErrorHandler ; <C152>
|
|
|
|
|
|
|
|
|
|
MOVEM.L D0-D7/A0-A7,SEVars ; save regs up high in nub space
|
|
|
|
|
|
|
|
|
|
; entry point from BadTrap routine <C882>
|
|
|
|
|
|
|
|
|
|
SysErr1 MOVE.W SR,SESR ; save SR <13Jul85>
|
|
|
|
|
MOVE.L (SP)+,SEPC ; clean PC for fall-through to SysErr2 <13Jul85>
|
|
|
|
|
CLR.W -(SP) ; <02Nov85> JTC
|
|
|
|
|
|
|
|
|
|
; entry point for standard system exceptions (address error, etc)
|
|
|
|
|
|
|
|
|
|
SysErr2
|
|
|
|
|
TST.B MacJmpFlag ; re-entrancy? (presumed PLus for SystemError) <v1.2>
|
|
|
|
|
BMI.S @0 ; yes, skip reg saving
|
|
|
|
|
MOVE.L SP,SEA7 ; save true PC
|
|
|
|
|
@0 ; deleted obsolete stack-cleansing instructions <13Jul85>
|
2017-09-20 19:58:54 +08:00
|
|
|
|
BSET.B #7,MacJmpFlag ; prevent re-entrancy, vote Republican <v1.2>
|
|
|
|
|
|
|
|
|
|
|
2017-09-17 17:09:04 +08:00
|
|
|
|
cmpi.w #dsNoPatch,d0 ; is this Error can't find patch ? <SM6> rb
|
|
|
|
|
beq.s @PreCubeE ; change the error message then <SM6> rb
|
|
|
|
|
cmpi.w #dsBadPatch,d0 ; is this a can't load patch message ? <SM6> rb
|
|
|
|
|
bne.s @SaveErr ; if not, don't touch it <SM6> rb
|
|
|
|
|
@PreCubeE ; SM ROMs don't have patches, user booted 7.0 <SM6> rb
|
|
|
|
|
moveq #dsOldSystem,d0 ; set error (system on disk is too old) <SM6> rb
|
|
|
|
|
@SaveErr ; <SM6> rb
|
|
|
|
|
|
|
|
|
|
MOVE.W D0,DSErrCode ; Save the possibly modified ErrCode <SM7>
|
|
|
|
|
|
2017-09-20 19:58:54 +08:00
|
|
|
|
MOVE.L MacJmp,A1
|
|
|
|
|
MOVE.B MacJmpFlag,D3
|
|
|
|
|
ADD.B D3,D3
|
2017-09-17 17:09:04 +08:00
|
|
|
|
|
|
|
|
|
BPL.S Call2DS ; yes, but not initialized (init bit not set)
|
|
|
|
|
BNE.S CallDB ; yes, initialized, call 'em
|
|
|
|
|
|
|
|
|
|
; We got a system error w/un-initialized debuggers, if NMI then assume that user wants to try
|
|
|
|
|
; to get the debugger up and running.
|
|
|
|
|
|
|
|
|
|
Call2DS CMP.W #13,D0 ; Exception?
|
|
|
|
|
BNE.S CallDS ; no, call the deepshit handler
|
|
|
|
|
|
|
|
|
|
MOVEQ #0,D0 ; set special system error (0) for initialization
|
|
|
|
|
BRA.S CallDB ; and call the debugger
|
|
|
|
|
|
|
|
|
|
CallDS LEA DSErrorHandler,A1 ; point at system alert handler
|
|
|
|
|
CallDB Move.L A1,D1 ; check if A1 is nil <A375>
|
|
|
|
|
BEQ.S CallDS ; if nil, go to DSErrorHandler <A375>
|
|
|
|
|
JSR (A1) ; call the debugger/system error handler
|
|
|
|
|
TST.W D0 ; any error?
|
|
|
|
|
BNE.S CallDS ; yes, call deepshit
|
|
|
|
|
|
|
|
|
|
SysErrExit
|
|
|
|
|
BCLR #7,MacJmpFlag ; NOT in debugger any longer <v1.2>
|
|
|
|
|
MOVEM.L SEVars,D0-D7/A0-A7 ; restore regs
|
|
|
|
|
|
|
|
|
|
; In order to return with RTE, must set up vanilla 000 or 4-word 010/020 frame. <13Jul85>
|
|
|
|
|
|
|
|
|
|
MOVE.L SEPC,-(SP) ; push user's PC
|
|
|
|
|
MOVE.W SESR,-(SP) ; restore status reg
|
|
|
|
|
RTE ; and return to caller
|
|
|
|
|
|
|
|
|
|
ENDP ; <C152>
|
|
|
|
|
|
|
|
|
|
END
|
|
|
|
|
|