mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-12-28 16:31:01 +00:00
302 lines
11 KiB
C
302 lines
11 KiB
C
|
/*
|
|||
|
File: SysMisc.h
|
|||
|
|
|||
|
Contains: Miscellaneous Mac system nonsense that has no better home...
|
|||
|
|
|||
|
Written by: Phil Goldman and Erich Ringewald
|
|||
|
|
|||
|
Copyright: <EFBFBD> 1986-1992 by Apple Computer, Inc., all rights reserved.
|
|||
|
|
|||
|
Change History (most recent first):
|
|||
|
|
|||
|
<13> 8/26/92 DTY Roll in latest changes for A/UX.
|
|||
|
<12> 1/22/92 DTY Take the synFOND field out of the synthetic strike table
|
|||
|
structure. We<EFBFBD>re gauranteeing unique font IDs, so this extra
|
|||
|
differentiation won<EFBFBD>t be necessary.
|
|||
|
<11> 11/15/91 DTY Added synFOND to the SynEntry structure. (We might need to
|
|||
|
store this information elsewhere if it turns out that developers
|
|||
|
are looking at the synthetic fonts.
|
|||
|
<10> 9/16/91 DFH Added GetCPUStatusRegister and SR definitions.
|
|||
|
<9> 4/1/91 DFH (with John Iarocci) Merge in latest AUX support code. NOTE: No
|
|||
|
AUX support code is referenced unless the build defines the
|
|||
|
HAS_AUX_PROCESSMGR condition.
|
|||
|
<8> 3/1/91 DFH KST,WS#DFH-910301a: Added xfiScriptCodeMask.
|
|||
|
<7> 1/21/91 DFH (KSM) Removed system menu IDs, since they are now in
|
|||
|
MenuMgrPriv.a.
|
|||
|
<6> 1/15/91 DFH (VL) Conditionalize out the AUX call macros.
|
|||
|
<4> 12/10/90 DFH Moved file attribute and finder flag equates from
|
|||
|
OSDispatchPrivate.h.
|
|||
|
<3> 12/5/90 DFH Added #defines for prettier calls to AuxDispatch. Removed
|
|||
|
NewFXInfo since FXInfo is now in Files.h.
|
|||
|
<0> 10/25/86 PYG New Today.
|
|||
|
|
|||
|
*/
|
|||
|
|
|||
|
#ifndef __SYSMISC__
|
|||
|
#define __SYSMISC__
|
|||
|
|
|||
|
#include <Retrace.h>
|
|||
|
|
|||
|
/* Access to the CPU's status register (SR) */
|
|||
|
#define kCPUSupervisorMode (1<<13)
|
|||
|
#define kCPUMasterStack (1<<12)
|
|||
|
unsigned short GetCPUStatusRegister(void) = {0x40C0};
|
|||
|
|
|||
|
/* Definitions of the flags in the ioFlAttrib of a CInfoPBRec */
|
|||
|
#define FILE_ATTRIB_ISLOCKED (0x00)
|
|||
|
#define FILE_ATTRIB_RFOPEN (0x04)
|
|||
|
#define FILE_ATTRIB_DFOPEN (0x08)
|
|||
|
#define FILE_ATTRIB_ISDIR (0x10)
|
|||
|
#define FILE_ATTRIB_ISBUSY (0x80)
|
|||
|
|
|||
|
/* Definitions for the fdFlags field in the ioFndrInfo record of an FInfo structure */
|
|||
|
#define FILE_FLAG_LOCKED (1<<15)
|
|||
|
#define FILE_FLAG_INVISIBLE (1<<14)
|
|||
|
#define FILE_FLAG_HASBUNDLE (1<<13)
|
|||
|
#define FILE_FLAG_SYSTEM (1<<12)
|
|||
|
#define FILE_FLAG_HAS_CUSTOM_ICON (1<<10)
|
|||
|
#define FILE_FLAG_CHANGED (1<<9)
|
|||
|
#define FILE_FLAG_INITED (1<<8)
|
|||
|
#define FILE_FLAG_MULTILAUNCH (1<<6)
|
|||
|
#define FILE_FLAG_BF_ALWAYS (1<<5)
|
|||
|
#define FILE_FLAG_BF_NEVER (1<<4)
|
|||
|
#define FILE_FLAG_BF_OWNAPPL (1<<1)
|
|||
|
#define FILE_FLAG_ONDESKTOP (1<<0)
|
|||
|
|
|||
|
/* The icon family resource ID when FILE_FLAG_HAS_CUSTOM_ICON is on */
|
|||
|
#define kCustomIconID (-16455)
|
|||
|
|
|||
|
/* Flag in fdScript field of FXInfo (extended Finder file information). */
|
|||
|
#define kScriptValidBit (7)
|
|||
|
#define xfiScriptCodeMask (0x7F)
|
|||
|
|
|||
|
#ifdef HAS_AUX_PROCESSMGR
|
|||
|
/* Stuff that ought to be in Aux.h, whenever that gets moved to {CIncludes}. */
|
|||
|
#define AUX_StartTimer() (void) AUXDispatch(AUX_STARTTIMER, 0)
|
|||
|
#define AUX_StopTimer() (void) AUXDispatch(AUX_STOPTIMER, 0)
|
|||
|
#define AUX_Highest() (short) AUXDispatch(AUX_HIGHEST, 0)
|
|||
|
#define AUX_SetAUXMask(newMask) (Boolean) AUXDispatch(AUX_SETAUXMASK, (void *) newMask)
|
|||
|
#define AUX_ForkExec(pParams) AUXDispatch(AUX_FORKEXEC, pParams)
|
|||
|
#define AUX_GetAnyEvent(pParams) AUXDispatch(AUX_GETANYEVENT, pParams)
|
|||
|
#define AUX_GetTask(pTaskId) (void) AUXDispatch(AUX_GETTASK, pTaskId)
|
|||
|
#define AUX_Kill(fatedTaskID) (void) AUXDispatch(AUX_KILL, (void *) fatedTaskID)
|
|||
|
#define AUX_Switch(taskID) AUXDispatch(AUX_SWITCH, (void *) taskId)
|
|||
|
#define AUX_SetTimeOut(timeout) (void) AUXDispatch(AUX_SETTIMEOUT, (void *) timeout)
|
|||
|
#define AUX_SetBounds(bounds) (void) AUXDispatch(AUX_SETBOUNDS, bounds)
|
|||
|
#define AUX_COFF_FSSpec(coffname) AUXDispatch(AUX_COFFFSSPEC, (char *) coffname)
|
|||
|
#define AUX_EnableCoffLaunch() AUXDispatch(AUX_ENABLECOFFLAUNCH, 0)
|
|||
|
|
|||
|
#endif HAS_AUX_PROCESSMGR
|
|||
|
|
|||
|
/* Command characters understood by the MDEF */
|
|||
|
#define noMarkSmallIconCmd (0x1A) /* small icon with no left margin */
|
|||
|
#define shrunkenIconCmd (0x1D) /* shrink the icon to 16x16 */
|
|||
|
#define smallIconCmd (0x1E) /* small icon */
|
|||
|
#define largeIconCmd (0x1F) /* large icon */
|
|||
|
#define familyIconCmd (0x20) /* icon suite/cache */
|
|||
|
|
|||
|
/* Internal menu manager structures we crawl */
|
|||
|
typedef struct MenuPair
|
|||
|
{
|
|||
|
MenuHandle menuHdl;
|
|||
|
short leftEdge;
|
|||
|
} MenuPair;
|
|||
|
|
|||
|
typedef struct MenuList
|
|||
|
{
|
|||
|
unsigned short lastMenu;
|
|||
|
short lastRight;
|
|||
|
short notUsed;
|
|||
|
MenuPair menuPairs[];
|
|||
|
} MenuList, *MenuListPtr, **MenuListHandle;
|
|||
|
|
|||
|
typedef struct MenuItemAttributes {
|
|||
|
unsigned char itemIcon; /* icon resource number */
|
|||
|
unsigned char itemCmd; /* key equivalent (& variant) */
|
|||
|
unsigned char itemMark; /* mark character */
|
|||
|
unsigned char itemStyle; /* text style */
|
|||
|
} MenuItemAttributes;
|
|||
|
|
|||
|
/* Menu Manager keeps track of enable/disabled state as bits in a long word, and one
|
|||
|
* flag (bit 0) is assigned for the menu itself. This means that item numbered greater
|
|||
|
* than MAX_ENABLEFLAG_INDEX can't be tracked, so they are always enabled.
|
|||
|
*/
|
|||
|
#define MAX_ENABLEFLAG_INDEX (sizeof(long) - 1)
|
|||
|
|
|||
|
/* Mungy way to walk a menu data structure */
|
|||
|
#define INC_MENU_ITEMPTR(pItem) \
|
|||
|
pItem += Length(pItem) + 1 + sizeof(MenuItemAttributes);
|
|||
|
#define SKIP_TO_MENU_ATTRIBUTES(pItem) pItem += Length(pItem) + 1;
|
|||
|
#define FROM_MENU_ATTRIBUTES_TO_NEXT_ITEM(pItem) pItem += sizeof(MenuItemAttributes);
|
|||
|
#define IS_NOT_LAST_MENUITEM(pItem) (Length(pItem) != 0)
|
|||
|
#define IS_LAST_MENUITEM(pItem) (Length(pItem) == 0)
|
|||
|
|
|||
|
/* If we're using GetItem, all our IS_DASH_STRING calls are against
|
|||
|
* strings on the stack, which are naturally even-aligned. If we look
|
|||
|
* directly into the menu structure, alignment is not guaranteed.
|
|||
|
* This requires a different, bigger, and slower check.
|
|||
|
*/
|
|||
|
#define IS_DASH_STRING(pStr) ( (Length(pStr) == 1) && (StringByte(pStr, 0) == '-') )
|
|||
|
|
|||
|
/* Macros to construct or examine a menu selection. A menu selection is a long
|
|||
|
* word whose high word is the menu ID, and whose low word is the item ID.
|
|||
|
*/
|
|||
|
#define BUILD_MENUSELECTION(menu, item) ((menu << 16) | item)
|
|||
|
#define MENU_ID_OF_SELECTION(menuSelection) (*((short *)&(menuSelection)))
|
|||
|
#define ITEM_ID_OF_SELECTION(menuSelection) ((unsigned short)(menuSelection))
|
|||
|
#define SMALLEST_VALID_MENULONG 0x00010000
|
|||
|
#define VALID_MENUSELECTION(menuSelection) ((u_long) menuSelection >= SMALLEST_VALID_MENULONG)
|
|||
|
|
|||
|
/* Owned resource format (from IM I-109). */
|
|||
|
#define OWNED_RESOURCE (0xC000)
|
|||
|
#define OWNED_BY_DRVR (OWNED_RESOURCE | (0 <<11))
|
|||
|
#define OWNED_BY_WDEF (OWNED_RESOURCE | (1 <<11))
|
|||
|
#define OWNED_BY_MDEF (OWNED_RESOURCE | (2 <<11))
|
|||
|
#define OWNED_BY_CDEF (OWNED_RESOURCE | (3 <<11))
|
|||
|
#define OWNED_BY_PDEF (OWNED_RESOURCE | (4 <<11))
|
|||
|
#define OWNED_BY_PACK (OWNED_RESOURCE | (5 <<11))
|
|||
|
|
|||
|
#define MAX_OWNED_RESOURCE_ID (63)
|
|||
|
|
|||
|
/* Tests for ROM versions */
|
|||
|
#define IS_NUMAC_ROMS(romVersion) ((*((char *)&(romVersion)) & (char)0xC0) == 0)
|
|||
|
#define IS_OLD_ROMS(romVersion) (*((char *)&(romVersion)) < 0)
|
|||
|
|
|||
|
/* Flags in EXTENSIONSENABLEBYTE */
|
|||
|
#define ExtensionsEnabledBit (5)
|
|||
|
/*
|
|||
|
* Structures we don't know where else to put.
|
|||
|
*/
|
|||
|
|
|||
|
/* Previously unused field in the WDPBRec */
|
|||
|
#define ioWDCreated filler1
|
|||
|
|
|||
|
/* Working directory structure from fsequ.a */
|
|||
|
typedef struct WDCB
|
|||
|
{
|
|||
|
Ptr WDVCBPtr;
|
|||
|
long WDDirID;
|
|||
|
long WDCatHint;
|
|||
|
long WDProcID;
|
|||
|
} WDCB, *WDCBPtr;
|
|||
|
|
|||
|
/* Definition of the APPPARMHANDLE (files to open and/or print) */
|
|||
|
typedef struct AppParmRec {
|
|||
|
short message;
|
|||
|
short count;
|
|||
|
AppFile appFiles[0];
|
|||
|
} AppParmRec, *AppParmRecPtr, **AppParmRecHdl;
|
|||
|
|
|||
|
/* Launch-time parameters to application */
|
|||
|
struct appparmarea {
|
|||
|
unsigned long stdin;
|
|||
|
unsigned long stdout;
|
|||
|
Handle parmhandle;
|
|||
|
unsigned short physexec;
|
|||
|
};
|
|||
|
|
|||
|
/* SIZE resource */
|
|||
|
typedef struct swParmDesc {
|
|||
|
unsigned short flags;
|
|||
|
unsigned long psize;
|
|||
|
unsigned long msize;
|
|||
|
} swParms, *swParmPtr, **swParmHdl;
|
|||
|
|
|||
|
/* The value of the DEFLTSTACK lomem on a MacPlus. MacPlus is used as a base machine
|
|||
|
* for default partition and stack sizes.
|
|||
|
*/
|
|||
|
#define MACPLUS_DEFLTSTACK (0x2000)
|
|||
|
|
|||
|
/* Segment header information */
|
|||
|
typedef struct CodeEntry
|
|||
|
{
|
|||
|
short pea; /* This is the PEA instruction ($3F3C) */
|
|||
|
#define PEA 0x3F3C
|
|||
|
short segID; /* This is the segment (i.e. rsrc) id */
|
|||
|
short LoadSeg; /* This is the _LoadSeg ($A9F0) */
|
|||
|
} CodeEntry;
|
|||
|
|
|||
|
/* Jump table entry after CODE segment has been loaded in by LoadSeg */
|
|||
|
typedef struct JTEntry {
|
|||
|
short jmpOpCode;
|
|||
|
void (*routinePC)();
|
|||
|
} JTEntry;
|
|||
|
|
|||
|
#define CODE_ENTRY_UNLOADED(pCodeEntry) ((pCodeEntry)->pea == PEA)
|
|||
|
#define FNC_PTR_UNLOADED(pFnc) (CODE_ENTRY_UNLOADED((CodeEntry *)(pFnc)))
|
|||
|
#define GET_SEGMENT_ID_FROM_FNC_PTR(pFnc) (((CodeEntry *)pFnc)->segID)
|
|||
|
#define GET_SCOD_HDL_FROM_FNC_PTR(pFnc) (GetResource(SYS_SEGMENT_TYPE, GET_SEGMENT_ID_FROM_FNC_PTR(pFnc)))
|
|||
|
#define ROUTINE_ADDR(jta) (((JTEntry *)jta)->routinePC)
|
|||
|
|
|||
|
/* The header of a CODE 0 resource looks like this... */
|
|||
|
struct code0 {
|
|||
|
unsigned long abovea5;
|
|||
|
unsigned long belowa5;
|
|||
|
unsigned long jtsize;
|
|||
|
unsigned long jtoffset;
|
|||
|
unsigned char jt[];
|
|||
|
};
|
|||
|
|
|||
|
/* Header information for driver and DA code. There is no hard and fast way to
|
|||
|
* distinguish a DA from a device driver just by looking in the unit table or in
|
|||
|
* this header. By convention, though, device driver names start with a particular
|
|||
|
* character. The character is a period ('.', ASCII $2E).
|
|||
|
*/
|
|||
|
|
|||
|
typedef struct Driver
|
|||
|
{
|
|||
|
short drvrFlags; /* flags */
|
|||
|
short drvrDelay; /* ticks between periodic actions */
|
|||
|
short drvrEMask; /* DA event mask */
|
|||
|
short drvrMenu; /* menu ID of driver's menu */
|
|||
|
short drvrOpen; /* offset to open routine */
|
|||
|
short drvrPrime; /* offset to prime routine */
|
|||
|
short drvrCtl; /* offset to control routine */
|
|||
|
short drvrStatus; /* offset to status routine */
|
|||
|
short drvrClose; /* offset to close routine */
|
|||
|
char drvrName[]; /* driver name (Pascal string) */
|
|||
|
} Driver, *DriverPtr, **DriverHandle;
|
|||
|
|
|||
|
#define DrvrNameFirstChar '.' /* distinction between drivers and DAs */
|
|||
|
#define DNeedLock (1<<(8+6)) /* Driver will be locked when opened? */
|
|||
|
#define DNeedTime (1<<(8+5)) /* Does driver need periodic control calls? */
|
|||
|
#define DNeedGoodbye (1<<(8+4)) /* Does driver need a goodbye kiss? */
|
|||
|
#define DStatEnable (1<<(8+3)) /* Can driver respond to Status calls? */
|
|||
|
#define DCtlEnable (1<<(8+2)) /* Can driver respond to Control calls? */
|
|||
|
#define DWritEnable (1<<(8+1)) /* Can driver respond to Write calls? */
|
|||
|
#define DReadEnable (1<<(8+0)) /* Can driver respond to Read calls? */
|
|||
|
#define DActive (1<<7) /* Is driver currently executing? */
|
|||
|
#define DRamBased (1<<6) /* Is driver RAM-based? */
|
|||
|
#define DOpened (1<<5) /* Is driver already open? */
|
|||
|
|
|||
|
#define WantsTime(pDCE) \
|
|||
|
((pDCE->dCtlFlags & (DNeedTime | DCtlEnable | DOpened | DActive)) == (DNeedTime | DCtlEnable | DOpened))
|
|||
|
|
|||
|
#define FIRSTDREFNUM (-1) /* Ref Num of first driver */
|
|||
|
#define NOTDREFNUM (0) /* Invalid ref num */
|
|||
|
#define csCodeGoodBye ((short) -1) /* GoodBye control code */
|
|||
|
|
|||
|
/* Synthetic strike descriptor */
|
|||
|
typedef struct SynEntry
|
|||
|
{
|
|||
|
Handle synStrikeHdl;
|
|||
|
short synNFNT;
|
|||
|
short synID;
|
|||
|
RGBColor synFGColor, synBGColor;
|
|||
|
} SynEntry, *SynEntryPtr, **SynEntryHandle;
|
|||
|
|
|||
|
/* Count of color inverse tables */
|
|||
|
#define NUMITABLES (12)
|
|||
|
|
|||
|
/* Flags in ALARMSTATE lomem */
|
|||
|
#define AlrmParity (0x80)
|
|||
|
#define AlrmBeeped (0x40)
|
|||
|
#define AlrmFlEnable (0x01)
|
|||
|
|
|||
|
/* MacJmp bits */
|
|||
|
#define DEBUGGER_RUNNING (1<<7)
|
|||
|
#define DEBUGGER_INITIALIZED (1<<6)
|
|||
|
#define DEBUGGER_INSTALLED (1<<5)
|
|||
|
|
|||
|
#endif __SYSMISC__
|