<> <> DIRECTORY MesaRuntimeInit USING [], PrincOps USING [ ControlLink, EPRange, GFT, GFTItem, GlobalFrameHandle, NullProgram, SD, sGFTLength, UnboundLink], PrincOpsUtils USING [], RuntimeError USING [UnboundProcedure]; FrameImpl: PROGRAM IMPORTS RuntimeError EXPORTS MesaRuntimeInit, PrincOpsUtils = BEGIN OPEN PrincOps; <<>> <> GlobalFrame: PUBLIC SAFE PROC [link: --ControlLink--UNSPECIFIED] RETURNS [PROGRAM] = TRUSTED { DO OPEN l: LOOPHOLE[link, ControlLink]; SELECT TRUE FROM l = UnboundLink => link _ SIGNAL RuntimeError.UnboundProcedure[link]; l.proc => IF l.gfi IN [1..SD[sGFTLength]) THEN { gftItem: GFTItem _ GFT[l.gfi]; gftItem.epbias _ 0; RETURN[LOOPHOLE[gftItem.framePtr]] } ELSE RETURN[NullProgram]; l.indirect => link _ l.link^; link = 0 => RETURN[NullProgram]; ENDCASE => RETURN[LOOPHOLE[l.frame.accesslink]] ENDLOOP; }; GlobalFrameAndEntryPoint: PUBLIC SAFE PROC [link: --ControlLink--UNSPECIFIED] RETURNS [gf: GlobalFrameHandle, ep: CARDINAL] = TRUSTED { DO OPEN l: LOOPHOLE[link, ControlLink]; SELECT TRUE FROM l = UnboundLink => link _ SIGNAL RuntimeError.UnboundProcedure[link]; l.proc => IF l.gfi IN [1..SD[sGFTLength]) THEN { gftItem: GFTItem _ GFT[l.gfi]; RETURN[gf: gftItem.framePtr, ep: gftItem.epbias*EPRange+l.ep] } ELSE ERROR; l.indirect => link _ l.link^; ENDCASE => ERROR; -- not meaningful for type-0 control links ENDLOOP; }; END.