DIRECTORY VM, PDInterpSysCalls, PrincOps USING [PageCount, wordsPerPage], ProcessorFace USING [SetMP]; PDInterpSysCallsDevelImpl: MONITOR IMPORTS VM, ProcessorFace EXPORTS PDInterpSysCalls = BEGIN SetDisplayLights: PUBLIC PROC [value: [0..9999]] = {ProcessorFace.SetMP[value]}; AllocateSpace: PUBLIC ENTRY PROC [words: INT] RETURNS [LONG POINTER] = { ENABLE UNWIND => NULL; pages: CARDINAL _ (words+PrincOps.wordsPerPage)/PrincOps.wordsPerPage; RETURN [ScratchMap[pages]] }; FreeSpace: PUBLIC ENTRY PROC [pointer: LONG POINTER] = { ENABLE UNWIND => NULL; [] _ Unmap[pointer]; }; BadFreeSpaceRequest: PUBLIC ERROR = CODE; ScratchMap: PUBLIC PROCEDURE [count: VM.PageCount] RETURNS [pointer: LONG POINTER] ~ { interval: Interval _ Allocate[count]; AddToScratchList[interval]; pointer _ interval.pointer; }; Unmap: PUBLIC PROCEDURE [pointer: LONG POINTER] RETURNS [nil: LONG POINTER _ NIL] ~ { interval: Interval _ RemoveFromScratchList[pointer]; IF interval.pointer = NIL THEN BadFreeSpaceRequest; Deallocate[interval]; }; scratchList: LIST OF Interval _ NIL; AddToScratchList: PROC [interval: Interval] ~ { scratchList _ CONS[interval, scratchList]; }; RemoveFromScratchList: PROC [pointer: LONG POINTER] RETURNS [Interval] ~ { prev: LIST OF Interval _ NIL; FOR p: LIST OF Interval _ scratchList, p.rest UNTIL p=NIL DO IF p.first.pointer = pointer THEN { IF prev = NIL THEN scratchList _ p.rest ELSE prev.rest _ p.rest; p.rest _ NIL; RETURN [p.first]; }; prev _ p; ENDLOOP; RETURN [[NIL, 0]] }; Interval: TYPE ~ RECORD [pointer: LONG POINTER, count: PrincOps.PageCount]; Allocate: PUBLIC PROCEDURE [count: VM.PageCount] RETURNS [interval: Interval] ~ { interval _ SpaceIntervalFromVMInterval[VM.Allocate[count]]; }; Deallocate: PUBLIC PROCEDURE [interval: Interval] ~ { VM.Free[VMIntervalFromSpaceInterval[interval]]; }; SpaceIntervalFromVMInterval: PROCEDURE [vmInterval: VM.Interval] RETURNS [interval: Interval] ~ { interval.pointer _ VM.AddressForPageNumber[vmInterval.page]; interval.count _ vmInterval.count; }; VMIntervalFromSpaceInterval: PROCEDURE [interval: Interval] RETURNS [vmInterval: VM.Interval] ~ { vmInterval.page _ VM.PageNumberForAddress[interval.pointer]; vmInterval.count _ interval.count; }; END. τPDInterpSysCallsDevelImpl.mesa Michael Plass, November 30, 1983 10:21 am Tim Diebert: September 24, 1985 3:37:54 pm PDT Exported to Space Activate, ActivateProc, Deactivate, DeactivateProc, ForceOut, Kill, SetAccess unimplemented for now ΚΙ˜codešœ™K™)K™.—K˜šΟk ˜ Kšœ˜Kšœ˜Kšœ œ˜)Kšœœ ˜—K˜šΠlnœ˜"Kšœœ˜Kšœ˜Kšœ˜K˜šΟnœœœ3˜PK˜—šŸ œœœœ œœœœ˜HKšœœœ˜Kšœœ7˜FKšœ˜Kšœ˜K˜—š Ÿ œœœœ œœ˜8Kšœœœ˜Kšœ˜Kšœ˜K˜—Kšœœœœ˜)—šœ™J˜šŸ œœ œ œ ˜2Jšœ œœ˜#Jšœ%˜%Jšœ˜Jšœ˜šœ˜J˜——š Ÿœœ œ œœ˜/Jšœœœœ˜%Jšœ4˜4Jšœœœ˜3Jšœ˜Jšœ˜J˜—šœ œœ œ˜$J˜—šŸœœ˜/Jšœœ˜*Jšœ˜J˜—š Ÿœœ œœœ˜JJšœœœ œ˜š œœœ œœ˜<šœœ˜#Jšœœœœ˜@Jšœ œ˜ Jšœ ˜Jšœ˜—Jšœ ˜ Jšœ˜—Jšœœ˜Jšœ˜J˜—Jšœc™cJ˜Jš œ œœ œœ˜KJ˜š Ÿœœ œ œ œ˜QJšœ'œ˜;Jšœ˜J˜—šŸ œœ œ˜5Jšœ-˜/Jšœ˜J˜—šŸœ œœ œ˜aJšœœ'˜