boot3/Internal/C/UniversalEqu.h

320 lines
8.3 KiB
C
Raw Normal View History

/*
File: UniversalEqu.h
Contains: low-level equates for accessing the Universal ROM information
Written by: Craig Prouse
Copyright: <EFBFBD> 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<6E>s BasesValid flags
AddrMapFlags1 = 0x2400,
AddrMapFlags2 = 0x2404,
UnivROMFlags = 0x0DD4, // RAM copy of the machine<6E>s ExtValid flags
UnivROMFlags1 = 0x2408,
UnivROMFlags2 = 0x240C,
UnivInfoPtr = 0x0DD8 // points to the machine<6E>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__