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