mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-22 19:31:02 +00:00
320 lines
8.3 KiB
C
320 lines
8.3 KiB
C
/*
|
||
File: UniversalEqu.h
|
||
|
||
Contains: low-level equates for accessing the Universal ROM information
|
||
|
||
Written by: Craig Prouse
|
||
|
||
Copyright: © 1993 by Apple Computer, Inc., all rights reserved.
|
||
|
||
Change History (most recent first):
|
||
|
||
<1> 11/10/93 fau first checked in
|
||
|
||
*/
|
||
|
||
#ifndef __UNIVERSALEQU__
|
||
#define __UNIVERSALEQU__
|
||
|
||
|
||
/* private low-memory globals for Universal info */
|
||
|
||
enum {
|
||
AddrMapFlags = 0x0DD0, // RAM copy of the machine’s BasesValid flags
|
||
AddrMapFlags1 = 0x2400,
|
||
AddrMapFlags2 = 0x2404,
|
||
UnivROMFlags = 0x0DD4, // RAM copy of the machine’s ExtValid flags
|
||
UnivROMFlags1 = 0x2408,
|
||
UnivROMFlags2 = 0x240C,
|
||
UnivInfoPtr = 0x0DD8 // points to the machine’s ProductInfo record
|
||
};
|
||
|
||
|
||
|
||
// --------------------------------------------------------------------------------------------
|
||
// DecoderInfo Record
|
||
//
|
||
// This record contains information pertaining to the memory decoder
|
||
// of a particular machine.
|
||
//
|
||
// If you change the DecoderInfo record, bump the version up by 1.
|
||
//--------------------------------------------------------------------------------------------
|
||
|
||
#define DecoderInfoVersion 1
|
||
|
||
|
||
// This record actually precedes the DecoderInfo record below. Normally accessed only
|
||
// from assembly language using negative offsets, a pointer to this information can
|
||
// also be generated by subtracting the size of this record from the address of the
|
||
// DecoderInfo record.
|
||
|
||
struct DecoderInfoPrivate {
|
||
unsigned long defaultBases;
|
||
unsigned long defaultBases1;
|
||
unsigned long defaultBases2;
|
||
unsigned long defExtFeatures;
|
||
unsigned long defExtFeatures1;
|
||
unsigned long defExtFeatures2;
|
||
unsigned char avoidVIA1A;
|
||
unsigned char avoidVIA1B;
|
||
unsigned char avoidVIA2A;
|
||
unsigned char avoidVIA2B;
|
||
long checkForProc;
|
||
unsigned char addrMap;
|
||
unsigned char decoderInfoVers;
|
||
unsigned char filler [2];
|
||
};
|
||
|
||
|
||
struct DecoderInfo {
|
||
|
||
void * ROMAddr;
|
||
void * DiagROMAddr;
|
||
void * VIA1Addr;
|
||
void * SCCRdAddr;
|
||
void * SCCWrAddr;
|
||
void * IWMAddr;
|
||
void * PWMAddr;
|
||
void * SoundAddr;
|
||
void * SCSIAddr;
|
||
void * SCSIDackAddr;
|
||
void * SCSIHskAddr;
|
||
void * VIA2Addr;
|
||
void * ASCAddr;
|
||
void * RBVAddr;
|
||
void * VDACAddr;
|
||
void * SCSIDMAAddr;
|
||
void * SWIMIOPAddr;
|
||
void * SCCIOPAddr;
|
||
void * OSSAddr;
|
||
void * FMCAddr;
|
||
void * RPUAddr;
|
||
void * OrwellAddr;
|
||
void * JAWSAddr;
|
||
void * SonicAddr;
|
||
void * SCSI96Addr1;
|
||
void * SCSI96Addr2;
|
||
void * DAFBAddr;
|
||
void * PSCAddr;
|
||
void * ROMPhysAddr;
|
||
void * PatchROMAddr;
|
||
void * NewAgeAddr;
|
||
void * Unused31Addr;
|
||
|
||
void * SingerAddr;
|
||
void * DSPAddr;
|
||
void * MACEAddr;
|
||
void * MUNIAddr;
|
||
void * AMICAddr;
|
||
void * PrattAddr;
|
||
void * SWIM3Addr;
|
||
void * AwacsAddr;
|
||
void * CivicAddr;
|
||
void * SebastianAddr;
|
||
void * BARTAddr;
|
||
void * GrandCentralAddr;
|
||
void * Unused44Addr;
|
||
void * Unused45Addr;
|
||
void * Unused46Addr;
|
||
void * Unused47Addr;
|
||
void * Unused48Addr;
|
||
void * Unused49Addr;
|
||
void * Unused50Addr;
|
||
void * Unused51Addr;
|
||
void * Unused52Addr;
|
||
void * Unused53Addr;
|
||
void * Unused54Addr;
|
||
void * Unused55Addr;
|
||
void * Unused56Addr;
|
||
void * Unused57Addr;
|
||
void * Unused58Addr;
|
||
void * Unused59Addr;
|
||
void * Unused60Addr;
|
||
void * Unused61Addr;
|
||
void * FooAddr;
|
||
void * Unused63Addr;
|
||
|
||
void * Unused64Addr;
|
||
void * BarAddr;
|
||
void * Unused66Addr;
|
||
void * Unused67Addr;
|
||
void * Unused68Addr;
|
||
void * Unused69Addr;
|
||
void * Unused70Addr;
|
||
void * Unused71Addr;
|
||
void * Unused72Addr;
|
||
void * Unused73Addr;
|
||
void * Unused74Addr;
|
||
void * Unused75Addr;
|
||
void * Unused76Addr;
|
||
void * Unused77Addr;
|
||
void * Unused78Addr;
|
||
void * Unused79Addr;
|
||
void * Unused80Addr;
|
||
void * Unused81Addr;
|
||
void * Unused82Addr;
|
||
void * Unused83Addr;
|
||
void * Unused84Addr;
|
||
void * Unused85Addr;
|
||
void * Unused86Addr;
|
||
void * Unused87Addr;
|
||
void * Unused88Addr;
|
||
void * Unused89Addr;
|
||
void * Unused90Addr;
|
||
void * Unused91Addr;
|
||
void * Unused92Addr;
|
||
void * Unused93Addr;
|
||
void * Unused94Addr;
|
||
void * Unused95Addr;
|
||
};
|
||
typedef struct DecoderInfo DecoderInfo;
|
||
|
||
|
||
enum DecoderKinds {
|
||
UnknownDecoder,
|
||
MacPALDecoder,
|
||
BBUDecoder,
|
||
NormandyDecoder,
|
||
GLUEDecoder,
|
||
MDUDecoder,
|
||
OSSFMCDecoder,
|
||
VISADecoder,
|
||
OrwellDecoder,
|
||
JAWSDecoder,
|
||
MSCDecoder,
|
||
SonoraDecoder,
|
||
NiagraDecoder,
|
||
YMCADecoder,
|
||
djMEMCDecoder,
|
||
HMCDecoder,
|
||
PrattDecoder,
|
||
HHeadDecoder
|
||
};
|
||
|
||
|
||
enum BasesValidFlags {
|
||
ROMExists,
|
||
DiagROMExists,
|
||
VIA1Exists,
|
||
SCCRdExists,
|
||
SCCWrExists,
|
||
IWMExists,
|
||
PWMExists,
|
||
SoundExists,
|
||
SCSIExists,
|
||
SCSIDackExists,
|
||
SCSIHskExists,
|
||
VIA2Exists,
|
||
ASCExists,
|
||
RBVExists,
|
||
VDACExists,
|
||
SCSIDMAExists,
|
||
SWIMIOPExists,
|
||
SCCIOPExists,
|
||
OSSExists,
|
||
FMCExists,
|
||
RPUExists,
|
||
OrwellExists,
|
||
JAWSExists,
|
||
SonicExists,
|
||
SCSI96_1Exists,
|
||
SCSI96_2Exists,
|
||
DAFBExists,
|
||
PSCExists,
|
||
ROMPhysAddrExists,
|
||
PatchROMExists,
|
||
NewAgeExists,
|
||
|
||
SingerExists = 32,
|
||
DSPExists,
|
||
MACEExists,
|
||
MUNIExists,
|
||
AMICExists,
|
||
PrattExists,
|
||
SWIM3Exists,
|
||
AwacsExists,
|
||
CivicExists,
|
||
SebastianExists,
|
||
BARTExists,
|
||
GrandCentralExists
|
||
};
|
||
|
||
|
||
// This macro is equivalent in part to the assembly language TestFor macro,
|
||
// although it only works for features listed in DecoderInfo. It requires a
|
||
// BasesValidFlag (enumerated above) and returns a boolean value. Example:
|
||
// if (TestForBaseAddr(GrandCentralExists)) { }
|
||
|
||
#define TestForBaseAddr(bvFlag) \
|
||
((1 << ((bvFlag) & 0x1F) & \
|
||
((bvFlag) < 32 ? *(unsigned long *) AddrMapFlags : \
|
||
((bvFlag) < 64 ? *(unsigned long *) AddrMapFlags1 : \
|
||
((bvFlag) < 96 ? *(unsigned long *) AddrMapFlags2 : \
|
||
0)))) != 0)
|
||
|
||
|
||
// This macro is used to conveniently recover a base address from the DecoderInfo
|
||
// table in one easy-to-read operation. Assuming that the corresponding BasesValid
|
||
// flag is true, the base address can be recovered directly by its field name in
|
||
// the DecoderInfo record. The macro handles all the arcane offsets, casts, and
|
||
// dereferences. Example:
|
||
// void *gcBase = GetUnivInfoBaseAddr(GrandCentralAddr);
|
||
|
||
#define GetUnivInfoBaseAddr(fieldName) \
|
||
(((DecoderInfo *) (*(unsigned long *) UnivInfoPtr \
|
||
+ (**(ProductInfo **) UnivInfoPtr).decoderInfoPtr)) \
|
||
->##fieldName)
|
||
|
||
|
||
|
||
//--------------------------------------------------------------------------------------------
|
||
// ProductInfo Record
|
||
//
|
||
// This record contains information specific to a particular machine.
|
||
// The lowmem UnivInfoPtr is a pointer to this data structure.
|
||
//
|
||
// If you change the ProductInfo record, bump the version up by 1.
|
||
//--------------------------------------------------------------------------------------------
|
||
|
||
#define ProductInfoVersion 1
|
||
|
||
|
||
struct ProductInfo {
|
||
|
||
long decoderInfoPtr; // offset to address decoder info
|
||
long ramInfoPtr; // offset to RAM bank base/size info
|
||
long videoInfoPtr; // offset to built-in video info
|
||
long nubusInfoPtr; // offset to NuBus slot info
|
||
unsigned short hwCfgWord; // value to load into hwCfgFlags
|
||
unsigned char productKind; // unique ID of this product (boxFlag value)
|
||
unsigned char decoderKind; // unique ID of associated address decoder
|
||
unsigned short rom85Word; // value to load into ROM85
|
||
unsigned char defaultRSRCs; // default ROM resource configuration
|
||
unsigned char productInfoVers; // version number of ProductInfo record
|
||
|
||
unsigned long basesValid; // valid flags for base addresses 0-31
|
||
unsigned long basesValid1; // valid flags for base addresses 32-63
|
||
unsigned long basesValid2; // valid flags for base addresses 64-95
|
||
unsigned long extValid; // valid flags for external features 0-31
|
||
unsigned long extValid1; // valid flags for external features 32-63
|
||
unsigned long extValid2; // valid flags for external features 64-95
|
||
unsigned long viaIDMask; // mask for VIA1/2 port A/B inputs
|
||
unsigned long viaIDMatch; // value to match to identify this product
|
||
long via1InitPtr; // offset to VIA1 initialization info
|
||
long via2InitPtr; // offset to VIA2 initialization info
|
||
|
||
long sndControlPtr; // offset to low level sound vector table
|
||
long clockPRAMPtr; // offset to low level clock/PRAM vector table
|
||
long adbDebugUtilPtr; // offset to low level ADB/DebugUtil vector table
|
||
long powerManagerPtr; // offset to low level Power Manager vector table
|
||
long intHandlerPtr; // offset to low level interrupt handler setup table
|
||
|
||
unsigned short cpuIDValue; // expected contents of CPU ID register
|
||
unsigned short filler;
|
||
long iconInfoPtr; // offset to icon info table
|
||
};
|
||
typedef struct ProductInfo ProductInfo;
|
||
|
||
|
||
#endif __UNIVERSALEQU__
|