Memory.mod 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. IMPLEMENTATION MODULE Memory ;
  2. FROM SYSTEM IMPORT ADR ;
  3. TYPE
  4. SlotRec = RECORD CASE : BOOLEAN OF
  5. | TRUE: b : ARRAY [0..7] OF CHAR ;
  6. | FALSE: q : LONGCARD ;
  7. END ;
  8. END ;
  9. WordRec = RECORD CASE : BOOLEAN OF
  10. | TRUE: b : ARRAY [0..3] OF CHAR ;
  11. | FALSE: w : CARDINAL ;
  12. END ;
  13. END ;
  14. LongRec = RECORD CASE : BOOLEAN OF
  15. | TRUE: b : ARRAY [0..7] OF CHAR ;
  16. | FALSE: l : LONGINT ;
  17. END ;
  18. END ;
  19. VAR
  20. ms : ARRAY [0 .. MaxMem - 1] OF CHAR ;
  21. arenaBase : LONGCARD ;
  22. PROCEDURE Init ;
  23. BEGIN
  24. arenaBase := 1048576 ;
  25. heapPointer := TopOfMemory () ;
  26. END Init ;
  27. PROCEDURE ArenaBase () : LONGCARD ;
  28. BEGIN
  29. RETURN arenaBase ;
  30. END ArenaBase ;
  31. PROCEDURE TopOfMemory () : LONGCARD ;
  32. BEGIN
  33. RETURN VAL (LONGCARD, MaxMem) ;
  34. END TopOfMemory ;
  35. PROCEDURE ReadByte (a: LONGCARD) : CARDINAL ;
  36. BEGIN
  37. RETURN ORD (ms [VAL (CARDINAL, a)]) ;
  38. END ReadByte ;
  39. PROCEDURE WriteByte (a: LONGCARD; b: CARDINAL) ;
  40. BEGIN
  41. ms [VAL (CARDINAL, a)] := CHR (b MOD 256) ;
  42. END WriteByte ;
  43. PROCEDURE ReadSlot (a: LONGCARD) : LONGCARD ;
  44. VAR sr: SlotRec ; i: CARDINAL ;
  45. BEGIN
  46. sr.q := 0 ;
  47. FOR i := 0 TO 7 DO
  48. sr.b [i] := ms [VAL (CARDINAL, a) + i] ;
  49. END ;
  50. RETURN sr.q ;
  51. END ReadSlot ;
  52. PROCEDURE WriteSlot (a: LONGCARD; v: LONGCARD) ;
  53. VAR sr: SlotRec ; i: CARDINAL ;
  54. BEGIN
  55. sr.q := v ;
  56. FOR i := 0 TO 7 DO
  57. ms [VAL (CARDINAL, a) + i] := sr.b [i] ;
  58. END ;
  59. END WriteSlot ;
  60. PROCEDURE ReadWord (a: LONGCARD) : CARDINAL ;
  61. VAR wr: WordRec ; i: CARDINAL ;
  62. BEGIN
  63. wr.w := 0 ;
  64. FOR i := 0 TO 3 DO
  65. wr.b [i] := ms [VAL (CARDINAL, a) + i] ;
  66. END ;
  67. RETURN wr.w ;
  68. END ReadWord ;
  69. PROCEDURE WriteWord (a: LONGCARD; v: CARDINAL) ;
  70. VAR wr: WordRec ; i: CARDINAL ;
  71. BEGIN
  72. wr.w := v ;
  73. FOR i := 0 TO 3 DO
  74. ms [VAL (CARDINAL, a) + i] := wr.b [i] ;
  75. END ;
  76. END WriteWord ;
  77. PROCEDURE ReadLong (a: LONGCARD) : LONGINT ;
  78. VAR lr: LongRec ; i: CARDINAL ;
  79. BEGIN
  80. lr.l := 0 ;
  81. FOR i := 0 TO 7 DO
  82. lr.b [i] := ms [VAL (CARDINAL, a) + i] ;
  83. END ;
  84. RETURN lr.l ;
  85. END ReadLong ;
  86. PROCEDURE WriteLong (a: LONGCARD; v: LONGINT) ;
  87. VAR lr: LongRec ; i: CARDINAL ;
  88. BEGIN
  89. lr.l := v ;
  90. FOR i := 0 TO 7 DO
  91. ms [VAL (CARDINAL, a) + i] := lr.b [i] ;
  92. END ;
  93. END WriteLong ;
  94. PROCEDURE CopyBytes (src, dst: LONGCARD; n: LONGCARD) ;
  95. VAR i: LONGCARD ;
  96. BEGIN
  97. i := 0 ;
  98. WHILE i < n DO
  99. ms [VAL (CARDINAL, dst + i)] := ms [VAL (CARDINAL, src + i)] ;
  100. i := i + 1 ;
  101. END ;
  102. END CopyBytes ;
  103. PROCEDURE FillBytes (dst: LONGCARD; n: LONGCARD; b: CARDINAL) ;
  104. VAR i: LONGCARD ;
  105. BEGIN
  106. i := 0 ;
  107. WHILE i < n DO
  108. ms [VAL (CARDINAL, dst + i)] := CHR (b MOD 256) ;
  109. i := i + 1 ;
  110. END ;
  111. END FillBytes ;
  112. PROCEDURE LoadImage (VAR data: ARRAY OF CHAR; off: CARDINAL; dst: LONGCARD; n: CARDINAL) ;
  113. VAR i: CARDINAL ; j: LONGCARD ;
  114. BEGIN
  115. i := 0 ; j := 0 ;
  116. WHILE i < n DO
  117. ms [VAL (CARDINAL, dst + j)] := data [off + i] ;
  118. INC (i) ; j := j + 1 ;
  119. END ;
  120. END LoadImage ;
  121. END Memory.