|
|
@@ -2,19 +2,20 @@ IMPLEMENTATION MODULE Extended ;
|
|
|
|
|
|
FROM Instruction IMPORT Fetch ;
|
|
|
FROM Stack IMPORT Pop, Push, PopReal, PushReal ;
|
|
|
-FROM Memory IMPORT CopyBytes, FillBytes, WriteSlot, ReadSlot,
|
|
|
- TopOfMemory ;
|
|
|
+FROM Memory IMPORT CopyBytes, FillBytes, WriteSlot, ReadSlot ;
|
|
|
FROM Local IMPORT GetSP, SetSP ;
|
|
|
FROM Console IMPORT Fatal ;
|
|
|
|
|
|
VAR
|
|
|
hp : LONGCARD ;
|
|
|
|
|
|
+PROCEDURE SetHeapBase (b: LONGCARD) ;
|
|
|
+BEGIN
|
|
|
+ hp := b ;
|
|
|
+END SetHeapBase ;
|
|
|
+
|
|
|
PROCEDURE HeapPtr () : LONGCARD ;
|
|
|
BEGIN
|
|
|
- IF hp = 0 THEN
|
|
|
- hp := TopOfMemory () ;
|
|
|
- END ;
|
|
|
RETURN hp ;
|
|
|
END HeapPtr ;
|
|
|
|
|
|
@@ -43,14 +44,18 @@ BEGIN
|
|
|
END Mul64 ;
|
|
|
|
|
|
PROCEDURE AllocateHeap (size: LONGCARD) : LONGCARD ;
|
|
|
-VAR sz: LONGCARD ;
|
|
|
+VAR sz, base: LONGCARD ;
|
|
|
BEGIN
|
|
|
sz := size ;
|
|
|
IF (sz MOD 8) # 0 THEN
|
|
|
sz := sz + 8 - (sz MOD 8) ;
|
|
|
END ;
|
|
|
- hp := HeapPtr () - sz ;
|
|
|
- RETURN hp ;
|
|
|
+ base := hp ;
|
|
|
+ IF base + sz >= GetSP () THEN
|
|
|
+ Fatal ("extended: OutOfMemory (heap meets stack)") ;
|
|
|
+ END ;
|
|
|
+ hp := base + sz ;
|
|
|
+ RETURN base ;
|
|
|
END AllocateHeap ;
|
|
|
|
|
|
PROCEDURE Execute ;
|
|
|
@@ -87,7 +92,7 @@ BEGIN
|
|
|
hp := mark ;
|
|
|
WriteSlot (dst, 0) ;
|
|
|
| 9 : (* FREEMEM *)
|
|
|
- Push (TopOfMemory () - HeapPtr ()) ;
|
|
|
+ Push (GetSP () - HeapPtr ()) ;
|
|
|
| 0AH, 0BH, 0CH : (* TRANSFER/IOTRANSFER/NEWPROCESS *)
|
|
|
Fatal ("extended: processes unimplemented") ;
|
|
|
| 0DH : (* BIOS (no-op) *)
|