-- IntVMDefs.mesa
-- Derived from JaMVMDefs
-- Last changed by MN, 3-Aug-81 17:15:35
DIRECTORY
Inline USING [LongCOPY];
IntVMDefs: DEFINITIONS
IMPORTS Inline = {
VMBase: TYPE = LONG BASE POINTER;
VMAddr: TYPE = VMBase RELATIVE LONG POINTER;
VMOffs: TYPE = [0..1];
vmNIL: VMAddr = LOOPHOLE[LONG[0]];
NilVMAddr: VMAddr = vmNIL;
InitVM: PROCEDURE RETURNS [BOOLEAN];
FinishVM: PROCEDURE RETURNS [BOOLEAN];
AllocateBlock: PROCEDURE [size: CARDINAL] RETURNS [VMAddr];
-- Allocate size words in Virtual memory
-- Generates VMFull:
FreeBlock: PROCEDURE [block: VMAddr] = INLINE {NULL};
LPWord: TYPE = LONG POINTER TO WORD;
PutWord: PROC[where: VMAddr, val: UNSPECIFIED] = INLINE
{vmbase[where] ← val };
GetWord: PROC[where: VMAddr] RETURNS[value: WORD] = INLINE
{RETURN[vmbase[where]] };
-- Get a word from VM address vmaddr
-- Put and Get long quantities from VM.
PutLong: PROCEDURE [where: VMAddr, val: LONG UNSPECIFIED] = INLINE
{ PutBlock[@val, where, 2]};
GetLong: PROCEDURE [where: VMAddr] RETURNS [LONG UNSPECIFIED] = INLINE
{ v: LONG UNSPECIFIED;
GetBlock[where, @v, 2];
RETURN[v]};
PutBlock: PROCEDURE[src: POINTER TO UNSPECIFIED, dest: VMAddr, size: CARDINAL] = INLINE {
Inline.LongCOPY[src, size, @vmbase[dest]] };
GetBlock: PROCEDURE[src: VMAddr, dest: POINTER TO UNSPECIFIED, size: CARDINAL] = INLINE
{Inline.LongCOPY[@vmbase[src], size, dest] };
-- Copy nwords words from VM address vmaddr to actual memory address realAddr
-- Virtual memory base pointer
vmbase: READONLY VMBase;
-- SIGNALS
VMBadPointer: ERROR;
VMFull: ERROR;
VMFileProblem: ERROR;
}.