-- 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;

}.