-- SimStorageImpl.mesa
-- last edited by Suzuki: November 30, 1981 2:46 PM
DIRECTORY
AltoDefs,
SegmentDefs,
SimStorage,
SimTsim;
SimStorageImpl: PROGRAM
IMPORTS SegmentDefs
EXPORTS SimStorage = { OPEN SimTsim;
restNode: CARDINAL ← 0;
originNode: LONG POINTER;
restTrans: CARDINAL ← 0;
originTrans: LONG POINTER;
restUsymbol: CARDINAL ← 0;
originUsymbol: LONG POINTER;
restWnode: CARDINAL ← 0;
originWnode: LONG POINTER;
VMPageUsed: PACKED ARRAY [0..AltoDefs.MaxVMPage] OF BOOLEAN;
AllocateNode: PUBLIC PROC RETURNS [ret: LONG POINTER] = { OPEN SegmentDefs;
segment: DataSegmentHandle;
IF restNode<SIZE[Node] THEN {
restNode ← 1024;
segment ← NewDataSegment[base: DefaultXMBase, pages: 4];
MarkVMPage[segment, 4];
originNode ← LongDataSegmentAddress[segment]};
ret ← originNode;
originNode ← originNode + SIZE[Node];
restNode ← restNode - SIZE[Node];
};
AllocateTrans: PUBLIC PROC RETURNS [ret: LONG POINTER] = { OPEN SegmentDefs;
segment: DataSegmentHandle;
IF restTrans<SIZE[Trans] THEN {
restTrans ← 1024;
segment ← NewDataSegment[base: DefaultXMBase, pages: 4];
MarkVMPage[segment, 4];
originTrans ← LongDataSegmentAddress[segment]};
ret ← originTrans;
originTrans ← originTrans + SIZE[Trans];
restTrans ← restTrans - SIZE[Trans];
};
AllocateUsymbol: PUBLIC PROC RETURNS [ret: LONG POINTER] = { OPEN SegmentDefs;
segment: DataSegmentHandle;
IF restUsymbol<SIZE[Usymbol] THEN {
restUsymbol ← 1024;
segment ← NewDataSegment[base: DefaultXMBase, pages: 4];
MarkVMPage[segment, 4];
originUsymbol ← LongDataSegmentAddress[segment]};
ret ← originUsymbol;
originUsymbol ← originUsymbol + SIZE[Usymbol];
restUsymbol ← restUsymbol - SIZE[Usymbol];
};
AllocateWnode: PUBLIC PROC RETURNS [ret: LONG POINTER] = { OPEN SegmentDefs;
segment: DataSegmentHandle;
IF restWnode<SIZE[Wnode] THEN {
restWnode ← 1024;
segment ← NewDataSegment[base: DefaultXMBase, pages: 4];
MarkVMPage[segment, 4];
originWnode ← LongDataSegmentAddress[segment]};
ret ← originWnode;
originWnode ← originWnode + SIZE[Wnode];
restWnode ← restWnode - SIZE[Wnode];
};
MarkVMPage: PROC [segment: SegmentDefs.DataSegmentHandle, pages: CARDINAL] = {
i: CARDINAL;
FOR i IN [0..pages) DO
VMPageUsed[segment.VMpage+i] ← TRUE
ENDLOOP};
FreeNodes: PUBLIC PROC = { OPEN SegmentDefs;
i: [0..AltoDefs.MaxVMPage];
p: LONG POINTER;
ds: DataSegmentHandle;
FOR i IN [0..AltoDefs.MaxVMPage] DO
IF VMPageUsed[i]=TRUE THEN {
VMPageUsed[i] ← FALSE;
p ← LongAddressFromPage[i];
ds ← LongVMtoDataSegment[p];
IF ds#NIL THEN DeleteDataSegment[ds]}
ENDLOOP};
i: [0..AltoDefs.MaxVMPage];
FOR i IN [0..AltoDefs.MaxVMPage] DO
VMPageUsed[i] ← FALSE
ENDLOOP;
}.