mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-25 09:30:50 +00:00
321 lines
11 KiB
C
321 lines
11 KiB
C
/*
|
||
File: FragLoad.h
|
||
|
||
Contains: CFM Public API
|
||
|
||
Written by: Erik Eidt, Alan Lillich, Jeff Cobb
|
||
|
||
Copyright: © 1993 by Apple Computer, Inc., all rights reserved.
|
||
|
||
Change History (most recent first):
|
||
|
||
<15> 6/16/93 ELE (with AWL) Added new error code for UserInitProcFailure.
|
||
<14> 6/9/93 jrc (with SP) In the CFMTrap macro, remove the cast of (arg) to
|
||
signed short. This was confusing the interfacer.
|
||
<13> 6/9/93 EPT Changes for Universal Headers. Synched up with Reality.
|
||
<12> 6/5/93 BT (With JRG) "#ifndef interface_glue" should only be bracketing
|
||
the prototypes, not the type information. This was causing a
|
||
problem for ProcessesPriv.h where Eric was expecting some type
|
||
information to be available.
|
||
<11> 5/10/93 jrc Make C++ Happy.
|
||
<10> 4/7/93 jrc Use symbolic names for the MixedMode and CFM A-traps.
|
||
<9> 3/17/93 JRG Change how procinfos are constructed
|
||
<8> 3/4/93 AWL Change to "pascal" routines for Dagon.
|
||
<7> 3/2/93 jrc Fix Erik's fixes. "FourBytes" not "FourByte".
|
||
<6> 3/2/93 ELE Fixed two typo's in proc infos.
|
||
<5> 2/18/93 ELE Moved a bunch of stuff into here
|
||
from CodeFragments.h
|
||
<4> 2/15/93 ELE Added kAnyArchType.
|
||
<3> 1/28/93 jrc Rev for d4 MixedMode.
|
||
|
||
*/
|
||
|
||
/*******************************************************************************
|
||
|
||
FILENAME
|
||
FragLoad.h
|
||
|
||
COPYRIGHT
|
||
Copyright © Apple Computer, Inc. 1992
|
||
All rights reserved.
|
||
|
||
*******************************************************************************/
|
||
|
||
|
||
#ifndef __FRAGLOAD__
|
||
#define __FRAGLOAD__ 1
|
||
|
||
|
||
#include <Types.h>
|
||
#include <Files.h>
|
||
#include <Traps.h>
|
||
|
||
typedef long ConnectionID;
|
||
typedef unsigned long Mask;
|
||
typedef unsigned char SymClass;
|
||
|
||
#define kPowerPC 'pwpc' // use as the architecture type
|
||
#define kAnyArchType 0x3f3f3f3f // '????'
|
||
|
||
#define kNoLibName ((unsigned char *) 0)
|
||
#define kNoConnectionID ((ConnectionID) 0)
|
||
#define kUnresolvedSymbolAddress ((Ptr) 0x0)
|
||
|
||
enum { // use for findFlags mask
|
||
kLoadLib = 1, // use existing connection if possible
|
||
kFindLib = 2, // just see if library is already loaded
|
||
kLoadNewCopy = 5, // load a new instance no matter what
|
||
kUseInPlace = 0x80 // use container's sections in place
|
||
};
|
||
|
||
enum {
|
||
kCodeSym = 0,
|
||
kDataSym = 1,
|
||
kTVectSym = 2,
|
||
kTOCSym = 3,
|
||
kGlueSym = 4
|
||
};
|
||
|
||
|
||
|
||
/************************************************************************/
|
||
/* for fragment initialization routines */
|
||
/************************************************************************/
|
||
|
||
struct MemFragment {
|
||
Ptr address;
|
||
long length;
|
||
Boolean inPlace;
|
||
};
|
||
typedef struct MemFragment MemFragment;
|
||
|
||
struct DiskFragment {
|
||
FSSpecPtr fileSpec;
|
||
long offset;
|
||
long length;
|
||
};
|
||
typedef struct DiskFragment DiskFragment;
|
||
|
||
struct SegmentedFragment {
|
||
FSSpecPtr fileSpec;
|
||
OSType rsrcType;
|
||
short rsrcID;
|
||
};
|
||
typedef struct SegmentedFragment SegmentedFragment;
|
||
|
||
struct FragmentLocator {
|
||
long where;
|
||
union {
|
||
MemFragment inMem;
|
||
DiskFragment onDisk;
|
||
SegmentedFragment inSegs;
|
||
} u;
|
||
};
|
||
typedef struct FragmentLocator FragmentLocator, *FragmentLocatorPtr;
|
||
|
||
|
||
// NOTE: when fragLocator. where == kOnDisk, then
|
||
// fragLocator. u. onDisk. fileSpec is a pointer
|
||
// to the file that the library belonged to.
|
||
// the pointer is valid only for the duration
|
||
// of the init routine's invocation, so make
|
||
// a copy of the filespec if it is important
|
||
struct InitBlock {
|
||
long contextID;
|
||
long closureID;
|
||
long connectionID;
|
||
FragmentLocator fragLocator;
|
||
Ptr libName;
|
||
long reserved4a;
|
||
long reserved4b;
|
||
long reserved4c;
|
||
long reserved4d;
|
||
};
|
||
typedef struct InitBlock InitBlock, *InitBlockPtr;
|
||
|
||
|
||
// prototype for initialization routines
|
||
// Pascal calling conventions
|
||
// NOTE: initialization routines may comfortably ignore
|
||
// their parameters, however, they must return
|
||
// an error status (ie: noErr) in order to succeed
|
||
// with the load of the library
|
||
typedef pascal OSErr ConnectionInitializationRoutine ( InitBlockPtr initBlkPtr );
|
||
|
||
// termination routines get no parameters / return value
|
||
// Pascal calling conventions
|
||
typedef pascal void ConnectionTerminationRoutine ( void );
|
||
|
||
|
||
/************************************************************************/
|
||
/* for building shared libraries */
|
||
/************************************************************************/
|
||
|
||
#define kCFMRsrcType 'cfrg'
|
||
#define kSHLBFileType 'shlb'
|
||
|
||
|
||
/************************************************************************/
|
||
/* error codes */
|
||
/************************************************************************/
|
||
|
||
enum {
|
||
fragNoErr = 0,
|
||
fragContextNotFound = -2800, // contextID was not valid
|
||
fragConnectionIDNotFound = -2801, // connecionID was not valid
|
||
fragSymbolNotFound = -2802, // symbol was not found in connection
|
||
fragSectionNotFound = -2803, // section was not found
|
||
fragLibNotFound = -2804, // library name not found in Frag registry
|
||
fragDupRegLibName = -2805, // registered name already in use
|
||
fragFormatUnknown = -2806, // fragment container format unknown
|
||
fragHadUnresolveds = -2807, // loaded fragment had unacceptable unresolveds
|
||
fragHadSoftUnresolveds = -2808, // loaded fragment has acceptable unresolveds
|
||
fragNoMem = -2809, // out of memory for interal bookkeeping
|
||
fragNoAddrSpace = -2810, // out of memory in user's address space for loadable section
|
||
fragNoContextIDs = -2811, // no more context id’s
|
||
fragObjectInitSeqErr = -2812, // order error during user initialization function invocation
|
||
fragImportTooOld = -2813, // import library was too old and therefore incompatible
|
||
fragImportTooNew = -2814, // import library was too new and therefore incompatible
|
||
fragInitLoop = -2815, // circularity detected in mandatory initialization order
|
||
fragInitRtnUsageErr = -2816, // boot library has initialization routine
|
||
fragLibConnErr = -2817, // error connecting to library (error occured in sub prepare)
|
||
fragMgrInitErr = -2818, // error in initailization of this manager
|
||
fragConstErr = -2819, // internal inconstistancy
|
||
fragCorruptErr = -2820, // fragment container corrupted (known format)
|
||
fragUserInitProcErr = -2821, // user intialization routine did not return noErr
|
||
fragLastErrCode = -2899 // last reserved error code number
|
||
};
|
||
|
||
|
||
#if TurnOff68KCFMTraps || __powerc || powerc
|
||
#define CFMTrap(arg) /* don't want trap: 68k-code to link directly */
|
||
#else
|
||
#define CFMTrap(arg) = { 0x3F3C, arg, _CodeFragmentDispatch }
|
||
#endif
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
|
||
pascal OSErr GetSharedLibrary ( Str63 libName,
|
||
OSType archType,
|
||
Mask findFlags,
|
||
ConnectionID *connID,
|
||
Ptr *mainAddr,
|
||
Str255 errName )
|
||
CFMTrap ( 1 );
|
||
|
||
#define GetSharedLibraryProcInfo \
|
||
(kPascalStackBased | \
|
||
STACK_RESULT_FIELD(kTwoByteCode) | \
|
||
STACK_PARAM_FIELD(1, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(2, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(3, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(4, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(5, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(6, kFourByteCode))
|
||
|
||
|
||
pascal OSErr GetDiskFragment ( FSSpecPtr fileSpec,
|
||
long offset,
|
||
long length,
|
||
Str63 fragName,
|
||
Mask findFlags,
|
||
ConnectionID *connID,
|
||
Ptr *mainAddr,
|
||
Str255 errName )
|
||
CFMTrap ( 2 );
|
||
|
||
#define GetDiskFragmentProcInfo \
|
||
(kPascalStackBased | \
|
||
STACK_RESULT_FIELD(kTwoByteCode) | \
|
||
STACK_PARAM_FIELD(1, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(2, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(3, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(4, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(5, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(6, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(7, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(8, kFourByteCode))
|
||
|
||
|
||
pascal OSErr GetMemFragment ( Ptr memAddr,
|
||
long length,
|
||
Str63 fragName,
|
||
Mask findFlags,
|
||
ConnectionID *connID,
|
||
Ptr *mainAddr,
|
||
Str255 errName )
|
||
CFMTrap ( 3 );
|
||
|
||
#define GetMemFragmentProcInfo \
|
||
(kPascalStackBased | \
|
||
STACK_RESULT_FIELD(kTwoByteCode) | \
|
||
STACK_PARAM_FIELD(1, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(2, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(3, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(4, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(5, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(6, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(7, kFourByteCode))
|
||
|
||
|
||
pascal OSErr CloseConnection ( ConnectionID *connID )
|
||
CFMTrap ( 4 );
|
||
|
||
#define CloseConnectionProcInfo \
|
||
(kPascalStackBased | \
|
||
STACK_RESULT_FIELD(kTwoByteCode) | \
|
||
STACK_PARAM_FIELD(1, kFourByteCode))
|
||
|
||
|
||
pascal OSErr FindSymbol ( ConnectionID connID,
|
||
Str255 symName,
|
||
Ptr *symAddr,
|
||
SymClass *symClass )
|
||
CFMTrap ( 5 );
|
||
|
||
#define FindSymbolProcInfo \
|
||
(kPascalStackBased | \
|
||
STACK_RESULT_FIELD(kTwoByteCode) | \
|
||
STACK_PARAM_FIELD(1, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(2, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(3, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(4, kFourByteCode))
|
||
|
||
|
||
pascal OSErr CountSymbols ( ConnectionID connID,
|
||
long *symCount )
|
||
CFMTrap ( 6 );
|
||
|
||
#define CountSymbolsProcInfo \
|
||
(kPascalStackBased | \
|
||
STACK_RESULT_FIELD(kTwoByteCode) | \
|
||
STACK_PARAM_FIELD(1, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(2, kFourByteCode))
|
||
|
||
|
||
pascal OSErr GetIndSymbol ( ConnectionID connID,
|
||
long symIndex,
|
||
Str255 symName,
|
||
Ptr *symAddr,
|
||
SymClass *symClass )
|
||
CFMTrap ( 7 );
|
||
|
||
#define GetIndSymbolProcInfo \
|
||
(kPascalStackBased | \
|
||
STACK_RESULT_FIELD(kTwoByteCode) | \
|
||
STACK_PARAM_FIELD(1, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(2, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(3, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(4, kFourByteCode) | \
|
||
STACK_PARAM_FIELD(5, kFourByteCode))
|
||
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif
|