mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-29 05:49:19 +00:00
69 lines
3.0 KiB
C
69 lines
3.0 KiB
C
/*
|
|
File: Zone24.h
|
|
|
|
Contains: Information needed by 24-bit heap management routines. Mode non-specific
|
|
information is in Zone.h. 32-bit heap information is in Zone32.h.
|
|
|
|
Written by: David Harrison
|
|
|
|
Copyright: © 1989-1991 by Apple Computer, Inc., all rights reserved.
|
|
|
|
Change History (most recent first):
|
|
|
|
<0> x/xx/89 DFH New Today.
|
|
|
|
*/
|
|
|
|
/************************************************************************************
|
|
* Structure definition for heap block header
|
|
************************************************************************************/
|
|
|
|
typedef struct HeapBlock
|
|
{
|
|
unsigned int tagBC24 : 4; /* tag field (reloc/nonreloc/free) */
|
|
unsigned int SizeCor24 : 4; /* size correction */
|
|
unsigned int blkSize24 : 24; /* physical block size */
|
|
Handle handle24; /* handle24 depends on block type, as follows:
|
|
* non-relocatable: address of zone
|
|
* relocatable: offset from zone to master pointer
|
|
* free: undefined
|
|
*/
|
|
long blkData24[0]; /* data starts here */
|
|
} HeapBlock, *HeapBlockPtr;
|
|
|
|
/************************************************************************************
|
|
* Macros for basic block header field access.
|
|
* NOTE: Header access could be made faster/small by special-casing combinations of the
|
|
* fields in the first long word. I opted not to do this, though, so that the code in
|
|
* MemoryMgr24Patches.c and MemoryMgr32Patches.c matched as closely as possible.
|
|
************************************************************************************/
|
|
|
|
/* Characteristics */
|
|
#define SIZEOF_BLOCK_HEADER (8)
|
|
#define MIN_PHYSICAL_SIZE (SIZEOF_BLOCK_HEADER + MIN_LOGICAL_SIZE)
|
|
|
|
/* Field extraction and evaluation */
|
|
#define TAGBYTE(heapBlockPtr) ((heapBlockPtr)->tagBC24)
|
|
#define freeTagVal 0x0
|
|
#define nRelTagVal 0x4
|
|
#define relTagVal 0x8
|
|
#define SIZE_CORR(heapBlockPtr) ((heapBlockPtr)->SizeCor24)
|
|
#define BLOCK_SIZE(heapBlockPtr) ((heapBlockPtr)->blkSize24)
|
|
#define BLOCK_HANDLE(heapBlockPtr) ((heapBlockPtr)->handle24)
|
|
#define BLOCK_DATA(heapBlockPtr) ((heapBlockPtr)->blkData24)
|
|
#define MP_TAGBYTE(heapBlockPtr,theZone) (*((Ptr)(BLOCK_HANDLE(heapBlockPtr))+(unsigned long)(theZone)))
|
|
#define resourceMPTagFlag 0x20
|
|
#define purgeableMPTagFlag 0x40
|
|
#define lockedMPTagFlag 0x80
|
|
|
|
/************************************************************************************
|
|
* Compound macros for block header field access.
|
|
************************************************************************************/
|
|
|
|
#define CLEAR_BLOCK_ATTRS(heapBlockPtr) (*((char *) (heapBlockPtr)) = 0)
|
|
#define IS_FREE_BLOCK(heapBlockPtr) (TAGBYTE(heapBlockPtr) == freeTagVal)
|
|
#define IS_NOT_FREE_BLOCK(heapBlockPtr) (TAGBYTE(heapBlockPtr) != freeTagVal)
|
|
#define IS_NRELOC_BLOCK(heapBlockPtr) (TAGBYTE(heapBlockPtr) == nRelTagVal)
|
|
#define IS_RELOC_BLOCK(heapBlockPtr) (TAGBYTE(heapBlockPtr) == relTagVal)
|
|
#define IS_LOCKED_RELOC_BLOCK(heapBlockPtr,zonePtr) ((MP_TAGBYTE(heapBlockPtr,zonePtr) & lockedMPTagFlag) != 0)
|