mac-rom/OS/StartMgr/UnivTestEnv/ExceptionSupport.c
Elliot Nunn 4325cdcc78 Bring in CubeE sources
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.
2017-12-26 09:52:23 +08:00

97 lines
2.8 KiB
C

/*
File: ExceptionSupport.c
Contains: This file is the ExceptionSupport source file. It contains
the routines which are used by subtests running
in the CTE environment.
Written by: Mark Appleman
Copyright: © 1990, 1992 by Apple Computer, Inc., all rights reserved.
Change History (most recent first):
<SM2> 5/2/92 kc Roll in Horror. Comments follow:
<H2> 3/6/92 AL Upgraded to CTE v2.1 (copied over from XXTest project).
<1> 12/14/90 SS first checked in
*/
//
// ExceptionSupport.c
//
#include "CTETypes.h"
#include "ExceptionSupport.h"
#include "GenericInterface.h"
#include "68KOpCodes.h"
#define jsrOpCode (UWORD)0x4eb9
//
// CPUSHStubVector()
//
// NOTE: This #pragma had to be redeclared under the old MPW C syntax, without the
// __ for A0. The Horror ROM uses MPW 3.0 tools (not 3.2), so this needs
// to be changed back if the ROM starts using 3.2 final (or later).
//
// AARON AARON AARON
//
//#pragma parameter CPUSHStubVector(__A0)
static void CPUSHStubVector(void *lineAddress) =
{
0xF4E8, // CPUSHL <BothCaches>,(a0)
0x5488, // ADDQ #2, a0
0xF4E8, // CPUSHL <BothCaches>,(a0)
0x5488, // ADDQ #2, a0
0xF4E8 // CPUSHL <BothCaches>,(a0)
};
//
// InstallExceptionHandler()
//
void InstallExceptionHandler(struct CTEGlobals *globs, ExceptionInfo *exceptionInfo,
ExceptionHandler *handler, void *argPtr, int vectorNumber)
{
// Initialize the ExceptionInfo structure.
exceptionInfo->instruction = jsrOpCode ;
exceptionInfo->stubAddress = ExceptionHandlerStub ;
exceptionInfo->globs = globs ;
exceptionInfo->handler = handler ;
exceptionInfo->argPtr = argPtr ;
exceptionInfo->vectorNumber = vectorNumber ;
// If the processor is a MC68040, push the instruction and stubAddress
// from the data cache.
if(kCTEProcessorType68040 == globs->processorType)
CPUSHStubVector(&exceptionInfo->instruction) ;
// replace the entry in the ExceptionInfoPtrTable, saving the old one.
exceptionInfo->oldInfoPtr = globs->exceptionInfoPtrTable[vectorNumber] ;
globs->exceptionInfoPtrTable[vectorNumber] = exceptionInfo ;
// replace the entry in the Exception Vector Table with a pointer to a stub,
// saveing the old one.
exceptionInfo->oldVector =
InstallExceptionVector(exceptionInfo, vectorNumber) ;
}
//
// RemoveExceptionHandler()
//
void RemoveExceptionHandler(struct CTEGlobals *globs, ExceptionInfo *exceptionInfo)
{
unsigned short vectorNumber ;
// get the vector number.
vectorNumber = exceptionInfo->vectorNumber ;
// replace the saved entry in the Exception Vector Table.
InstallExceptionVector(exceptionInfo->oldVector, vectorNumber) ;
// replace the saved entry in the ExceptionInfoPtrTable.
globs->exceptionInfoPtrTable[vectorNumber] = exceptionInfo->oldInfoPtr ;
}