{
Created: Sunday, January 6, 1991 at 10:47 PM
    Memory.p
    Pascal Interface to the Macintosh Libraries

        Copyright Apple Computer, Inc.    1985-1990
        All rights reserved
}


{$IFC UNDEFINED UsingIncludes}
{$SETC UsingIncludes := 0}
{$ENDC}

{$IFC NOT UsingIncludes}
    UNIT Memory;
    INTERFACE
{$ENDC}

{$IFC UNDEFINED UsingMemory}
{$SETC UsingMemory := 1}

{$I+}
{$SETC MemoryIncludes := UsingIncludes}
{$SETC UsingIncludes := 1}
{$IFC UNDEFINED UsingTypes}
{$I $$Shell(PInterfaces)Types.p}
{$ENDC}
{$SETC UsingIncludes := MemoryIncludes}

CONST
maxSize = $800000;  {Max data block size is 8 megabytes}
defaultPhysicalEntryCount = 8;

{ values returned from the GetPageState function }
kPageInMemory = 0;
kPageOnDisk = 1;
kNotPaged = 2;

TYPE
Size = LONGINT;     { size of a block in bytes }

THz = ^Zone;
Zone = RECORD
    bkLim: Ptr;
    purgePtr: Ptr;
    hFstFree: Ptr;
    zcbFree: LONGINT;
    gzProc: ProcPtr;
    moreMast: INTEGER;
    flags: INTEGER;
    cntRel: INTEGER;
    maxRel: INTEGER;
    cntNRel: INTEGER;
    maxNRel: INTEGER;
    cntEmpty: INTEGER;
    cntHandles: INTEGER;
    minCBFree: LONGINT;
    purgeProc: ProcPtr;
    sparePtr: Ptr;
    allocPtr: Ptr;
    heapData: INTEGER;
    END;

MemoryBlock = RECORD
    address: Ptr;
    count: LONGINT;
    END;

LogicalToPhysicalTable = RECORD
    logical: MemoryBlock;
    physical: ARRAY [0..defaultPhysicalEntryCount - 1] OF MemoryBlock;
    END;


PageState = INTEGER;
StatusRegisterContents = INTEGER;

FUNCTION GetApplLimit: Ptr;
    INLINE $2EB8,$0130;
FUNCTION GetZone: THz;
    INLINE $A11A,$2E88;
FUNCTION SystemZone: THz;
    INLINE $2EB8,$02A6;
FUNCTION ApplicZone: THz;
    INLINE $2EB8,$02AA;
FUNCTION ApplicationZone: THz;
    INLINE $2EB8,$02AA;
FUNCTION NewHandle(byteCount: Size): Handle;
FUNCTION NewHandleSys(byteCount: Size): Handle;
FUNCTION NewHandleClear(byteCount: Size): Handle;
FUNCTION NewHandleSysClear(byteCount: Size): Handle;
FUNCTION HandleZone(h: Handle): THz;
FUNCTION RecoverHandle(p: Ptr): Handle;
FUNCTION NewPtr(byteCount: Size): Ptr;
FUNCTION NewPtrSys(byteCount: Size): Ptr;
FUNCTION NewPtrClear(byteCount: Size): Ptr;
FUNCTION NewPtrSysClear(byteCount: Size): Ptr;
FUNCTION PtrZone(p: Ptr): THz;
FUNCTION GZSaveHnd: Handle;
    INLINE $2EB8,$0328;
FUNCTION TopMem: Ptr;
    INLINE $2EB8,$0108;
FUNCTION MaxBlock: LONGINT;
FUNCTION MaxBlockSys: LONGINT;
FUNCTION StackSpace: LONGINT;
FUNCTION NewEmptyHandle: Handle;
FUNCTION NewEmptyHandleSys: Handle;
PROCEDURE HLock(h: Handle);
    INLINE $205F,$A029;
PROCEDURE HUnlock(h: Handle);
    INLINE $205F,$A02A;
PROCEDURE HPurge(h: Handle);
    INLINE $205F,$A049;
PROCEDURE HNoPurge(h: Handle);
    INLINE $205F,$A04A;
PROCEDURE HLockHi(h: Handle);
    INLINE $205F,$A064,$A029;
FUNCTION StripAddress(theAddress: UNIV Ptr): Ptr;
{$IFC SystemSixOrLater }
    INLINE $201F,$A055,$2E80;
{$ENDC}
FUNCTION Translate24To32(addr24: UNIV Ptr): Ptr;
    INLINE $201F,$A091,$2E80;
FUNCTION TempNewHandle(logicalSize: Size;VAR resultCode: OSErr): Handle;
    INLINE $3F3C,$001D,$A88F;
FUNCTION TempMaxMem(VAR grow: Size): Size;
    INLINE $3F3C,$0015,$A88F;
FUNCTION TempFreeMem: LONGINT;
    INLINE $3F3C,$0018,$A88F;

{  Temporary Memory routines renamed, but obsolete, in System 7.0 and later.  }
PROCEDURE TempHLock(h: Handle;VAR resultCode: OSErr);
    INLINE $3F3C,$001E,$A88F;
PROCEDURE TempHUnlock(h: Handle;VAR resultCode: OSErr);
    INLINE $3F3C,$001F,$A88F;
PROCEDURE TempDisposeHandle(h: Handle;VAR resultCode: OSErr);
    INLINE $3F3C,$0020,$A88F;
FUNCTION TempTopMem: Ptr;
    INLINE $3F3C,$0016,$A88F;

{  Temporary Memory routines as they were known before System 7.0.  }
FUNCTION MFMaxMem(VAR grow: Size): Size;
    INLINE $3F3C,$0015,$A88F;
FUNCTION MFFreeMem: LONGINT;
    INLINE $3F3C,$0018,$A88F;
FUNCTION MFTempNewHandle(logicalSize: Size;VAR resultCode: OSErr): Handle;
    INLINE $3F3C,$001D,$A88F;
PROCEDURE MFTempHLock(h: Handle;VAR resultCode: OSErr);
    INLINE $3F3C,$001E,$A88F;
PROCEDURE MFTempHUnlock(h: Handle;VAR resultCode: OSErr);
    INLINE $3F3C,$001F,$A88F;
PROCEDURE MFTempDisposHandle(h: Handle;VAR resultCode: OSErr);
    INLINE $3F3C,$0020,$A88F;
FUNCTION MFTopMem: Ptr;
    INLINE $3F3C,$0016,$A88F;
PROCEDURE InitApplZone;
    INLINE $A02C;
PROCEDURE InitZone(pgrowZone: ProcPtr;cmoreMasters: INTEGER;limitPtr: UNIV Ptr;
    startPtr: UNIV Ptr);
PROCEDURE SetZone(hz: THz);
    INLINE $205F,$A01B;
FUNCTION CompactMem(cbNeeded: Size): Size;
FUNCTION CompactMemSys(cbNeeded: Size): Size;
PROCEDURE PurgeMem(cbNeeded: Size);
    INLINE $201F,$A04D;
PROCEDURE PurgeMemSys(cbNeeded: Size);
    INLINE $201F,$A44D;
FUNCTION FreeMem: LONGINT;
    INLINE $A01C,$2E80;
FUNCTION FreeMemSys: LONGINT;
    INLINE $A41C,$2E80;
PROCEDURE ResrvMem(cbNeeded: Size);
    INLINE $201F,$A040;
PROCEDURE ReserveMem(cbNeeded: Size);
    INLINE $201F,$A040;
PROCEDURE ReserveMemSys(cbNeeded: Size);
    INLINE $201F,$A440;
FUNCTION MaxMem(VAR grow: Size): Size;
FUNCTION MaxMemSys(VAR grow: Size): Size;
PROCEDURE SetGrowZone(growZone: ProcPtr);
    INLINE $205F,$A04B;
PROCEDURE SetApplLimit(zoneLimit: UNIV Ptr);
    INLINE $205F,$A02D;
PROCEDURE MoveHHi(h: Handle);
    INLINE $205F,$A064;
PROCEDURE DisposPtr(p: Ptr);
    INLINE $205F,$A01F;
PROCEDURE DisposePtr(p: Ptr);
    INLINE $205F,$A01F;
FUNCTION GetPtrSize(p: Ptr): Size;
PROCEDURE SetPtrSize(p: Ptr;newSize: Size);
PROCEDURE DisposHandle(h: Handle);
    INLINE $205F,$A023;
PROCEDURE DisposeHandle(h: Handle);
    INLINE $205F,$A023;
FUNCTION GetHandleSize(h: Handle): Size;
PROCEDURE SetHandleSize(h: Handle;newSize: Size);
PROCEDURE EmptyHandle(h: Handle);
    INLINE $205F,$A02B;
PROCEDURE ReallocHandle(h: Handle;byteCount: Size);
PROCEDURE ReallocateHandle(h: Handle;byteCount: Size);
PROCEDURE HSetRBit(h: Handle);
    INLINE $205F,$A067;
PROCEDURE HClrRBit(h: Handle);
    INLINE $205F,$A068;
PROCEDURE MoreMasters;
    INLINE $A036;
PROCEDURE BlockMove(srcPtr: UNIV Ptr;destPtr: UNIV Ptr;byteCount: Size);
FUNCTION MemError: OSErr;
    INLINE $3EB8,$0220;
PROCEDURE PurgeSpace(VAR total: LONGINT;VAR contig: LONGINT);
FUNCTION HGetState(h: Handle): SignedByte;
PROCEDURE HSetState(h: Handle;flags: SignedByte);
PROCEDURE SetApplBase(startPtr: UNIV Ptr);
    INLINE $205F,$A057;
PROCEDURE MaxApplZone;
    INLINE $A063;
FUNCTION HoldMemory(address: UNIV Ptr;count: LONGINT): OSErr;
FUNCTION UnholdMemory(address: UNIV Ptr;count: LONGINT): OSErr;
FUNCTION LockMemory(address: UNIV Ptr;count: LONGINT): OSErr;
FUNCTION LockMemoryContiguous(address: UNIV Ptr;count: LONGINT): OSErr;
FUNCTION UnlockMemory(address: UNIV Ptr;count: LONGINT): OSErr;
FUNCTION GetPhysical(VAR addresses: LogicalToPhysicalTable;VAR physicalEntryCount: LONGINT): OSErr;
FUNCTION DeferUserFn(userFunction: ProcPtr;argument: UNIV Ptr): OSErr;
FUNCTION DebuggerGetMax: LONGINT;
    INLINE $7000,$A08D,$2E80;
PROCEDURE DebuggerEnter;
    INLINE $7001,$A08D;
PROCEDURE DebuggerExit;
    INLINE $7002,$A08D;
PROCEDURE DebuggerPoll;
    INLINE $7003,$A08D;
FUNCTION GetPageState(address: UNIV Ptr): PageState;
    INLINE $205F,$7004,$A08D,$3E80;
FUNCTION PageFaultFatal: BOOLEAN;
    INLINE $7005,$A08D,$1E80;
FUNCTION DebuggerLockMemory(address: UNIV Ptr;count: LONGINT): OSErr;
FUNCTION DebuggerUnlockMemory(address: UNIV Ptr;count: LONGINT): OSErr;
FUNCTION EnterSupervisorMode: StatusRegisterContents;
    INLINE $7008,$A08D,$3E80;


{$ENDC}    { UsingMemory }

{$IFC NOT UsingIncludes}
    END.
{$ENDC}

