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