| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- 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.
|