-- MemoryImpl.mesa -- Last changed by Doug Wyatt, October 1, 1980 1:26 AM DIRECTORY Memory, InlineDefs USING [LowHalf], SegmentDefs USING [PageNumber, BankIndex, Banks, memConfig, DataSegmentHandle, DataSegmentType, DefaultMDSBase, DefaultXMBase, MakeDataSegment, HardDown, LongDataSegmentAddress], SystemDefs USING [AllocateHeapNode, FreeHeapNode]; MemoryImpl: PROGRAM IMPORTS InlineDefs,SegmentDefs,SystemDefs EXPORTS Memory = { MemoryError: PUBLIC SIGNAL = CODE; -- Form of an MDSZone (= MDSHandle) MDSHandle: TYPE = POINTER TO MDSObject; MDSObject: TYPE = MACHINE DEPENDENT RECORD [ procs(0:0..15): POINTER TO MDSProcs, data(1:0..15): UNSPECIFIED ]; MDSProcs: TYPE = MACHINE DEPENDENT RECORD [ alloc(0): PROC[self: MDSHandle, size: CARDINAL] RETURNS[POINTER], free(1): PROC[self: MDSHandle, object: POINTER] ]; -- Form of an UNCOUNTED ZONE (= ZHandle) ZHandle: TYPE = LONG POINTER TO ZObject; ZObject: TYPE = MACHINE DEPENDENT RECORD [ procs(0:0..31): LONG POINTER TO ZProcs, data(2:0..31): LONG UNSPECIFIED ]; ZProcs: TYPE = MACHINE DEPENDENT RECORD [ alloc(0): PROC[self: ZHandle, size: CARDINAL] RETURNS[LONG POINTER], free(1): PROC[self: ZHandle, object: LONG POINTER] ]; -- A zone interface to the Mesa System heap MDSAlloc: PROC[self: MDSHandle, size: CARDINAL] RETURNS[POINTER] = { RETURN[SystemDefs.AllocateHeapNode[size]]; }; MDSFree: PROC[self: MDSHandle, object: POINTER] = { SystemDefs.FreeHeapNode[object]; }; mdsprocs: MDSProcs _ [alloc: MDSAlloc, free: MDSFree]; mdsobject: MDSObject _ [procs: @mdsprocs, data: 0]; mdshandle: MDSHandle = @mdsobject; mds: PUBLIC MDSZone _ LOOPHOLE[mdshandle]; long: PUBLIC BOOLEAN _ (SELECT SegmentDefs.memConfig.AltoType FROM D0,Dorado => TRUE, ENDCASE => FALSE); -- Uncounted Zones -- An interface to the system heap for the Alto heapProcs: ZProcs _ [alloc: HeapAlloc, free: HeapFree]; heapObject: ZObject _ [procs: @heapProcs, data: 0]; heapZone: UNCOUNTED ZONE = LOOPHOLE[LONG[@heapObject]]; nodes: CARDINAL_0; HeapAlloc: PROC[self: ZHandle, size: CARDINAL] RETURNS[LONG POINTER] = { nodes_nodes+1; RETURN[SystemDefs.AllocateHeapNode[size]]; }; HeapFree: PROC[self: ZHandle, object: LONG POINTER] = { nodes_nodes-1; SystemDefs.FreeHeapNode[InlineDefs.LowHalf[object]]; }; zbase: SegmentDefs.PageNumber _ IF long THEN SegmentDefs.DefaultXMBase ELSE SegmentDefs.DefaultMDSBase; -- A permanent zone for allocating the zone objects themselves GetPages: PROC[pages: CARDINAL, type: SegmentDefs.DataSegmentType] RETURNS[LONG POINTER] = { OPEN SegmentDefs; seg: DataSegmentHandle_MakeDataSegment[ base: zbase, pages: pages, info: HardDown]; seg.type_type; RETURN[LongDataSegmentAddress[seg]]; }; permPtr: LONG POINTER_NIL; permWords: CARDINAL_0; permType: SegmentDefs.DataSegmentType=100B; pageSize: CARDINAL=256; -- AltoDefs.PageSize permProcs: ZProcs _ [alloc: PermAlloc, free: PermFree]; permObject: ZObject _ [procs: @permProcs, data: 0]; perm: UNCOUNTED ZONE = LOOPHOLE[LONG[@permObject]]; PermAlloc: PROC[self: ZHandle, size: CARDINAL] RETURNS[LONG POINTER] = { p: LONG POINTER_permPtr; IF permWords