IMPLEMENTATION MODULE Memory ; FROM SYSTEM IMPORT ADR ; TYPE SlotRec = RECORD CASE : BOOLEAN OF | TRUE: b : ARRAY [0..7] OF CHAR ; | FALSE: q : LONGCARD ; END ; END ; WordRec = RECORD CASE : BOOLEAN OF | TRUE: b : ARRAY [0..3] OF CHAR ; | FALSE: w : CARDINAL ; END ; END ; LongRec = RECORD CASE : BOOLEAN OF | TRUE: b : ARRAY [0..7] OF CHAR ; | FALSE: l : LONGINT ; END ; END ; VAR ms : ARRAY [0 .. MaxMem - 1] OF CHAR ; arenaBase : LONGCARD ; PROCEDURE Init ; BEGIN arenaBase := 1048576 ; heapPointer := TopOfMemory () ; END Init ; PROCEDURE ArenaBase () : LONGCARD ; BEGIN RETURN arenaBase ; END ArenaBase ; PROCEDURE TopOfMemory () : LONGCARD ; BEGIN RETURN VAL (LONGCARD, MaxMem) ; END TopOfMemory ; PROCEDURE ReadByte (a: LONGCARD) : CARDINAL ; BEGIN RETURN ORD (ms [VAL (CARDINAL, a)]) ; END ReadByte ; PROCEDURE WriteByte (a: LONGCARD; b: CARDINAL) ; BEGIN ms [VAL (CARDINAL, a)] := CHR (b MOD 256) ; END WriteByte ; PROCEDURE ReadSlot (a: LONGCARD) : LONGCARD ; VAR sr: SlotRec ; i: CARDINAL ; BEGIN sr.q := 0 ; FOR i := 0 TO 7 DO sr.b [i] := ms [VAL (CARDINAL, a) + i] ; END ; RETURN sr.q ; END ReadSlot ; PROCEDURE WriteSlot (a: LONGCARD; v: LONGCARD) ; VAR sr: SlotRec ; i: CARDINAL ; BEGIN sr.q := v ; FOR i := 0 TO 7 DO ms [VAL (CARDINAL, a) + i] := sr.b [i] ; END ; END WriteSlot ; PROCEDURE ReadWord (a: LONGCARD) : CARDINAL ; VAR wr: WordRec ; i: CARDINAL ; BEGIN wr.w := 0 ; FOR i := 0 TO 3 DO wr.b [i] := ms [VAL (CARDINAL, a) + i] ; END ; RETURN wr.w ; END ReadWord ; PROCEDURE WriteWord (a: LONGCARD; v: CARDINAL) ; VAR wr: WordRec ; i: CARDINAL ; BEGIN wr.w := v ; FOR i := 0 TO 3 DO ms [VAL (CARDINAL, a) + i] := wr.b [i] ; END ; END WriteWord ; PROCEDURE ReadLong (a: LONGCARD) : LONGINT ; VAR lr: LongRec ; i: CARDINAL ; BEGIN lr.l := 0 ; FOR i := 0 TO 7 DO lr.b [i] := ms [VAL (CARDINAL, a) + i] ; END ; RETURN lr.l ; END ReadLong ; PROCEDURE WriteLong (a: LONGCARD; v: LONGINT) ; VAR lr: LongRec ; i: CARDINAL ; BEGIN lr.l := v ; FOR i := 0 TO 7 DO ms [VAL (CARDINAL, a) + i] := lr.b [i] ; END ; END WriteLong ; PROCEDURE CopyBytes (src, dst: LONGCARD; n: LONGCARD) ; VAR i: LONGCARD ; BEGIN i := 0 ; WHILE i < n DO ms [VAL (CARDINAL, dst + i)] := ms [VAL (CARDINAL, src + i)] ; i := i + 1 ; END ; END CopyBytes ; PROCEDURE FillBytes (dst: LONGCARD; n: LONGCARD; b: CARDINAL) ; VAR i: LONGCARD ; BEGIN i := 0 ; WHILE i < n DO ms [VAL (CARDINAL, dst + i)] := CHR (b MOD 256) ; i := i + 1 ; END ; END FillBytes ; PROCEDURE LoadImage (VAR data: ARRAY OF CHAR; off: CARDINAL; dst: LONGCARD; n: CARDINAL) ; VAR i: CARDINAL ; j: LONGCARD ; BEGIN i := 0 ; j := 0 ; WHILE i < n DO ms [VAL (CARDINAL, dst + j)] := data [off + i] ; INC (i) ; j := j + 1 ; END ; END LoadImage ; END Memory.