-- FramesXD.Mesa Edited by: Sandman July 22, 1980 4:28 PM -- Edited by: Bruce Oct 10, 1980 11:47 AM DIRECTORY DebugOps USING [Lengthen, LongREAD, ShortCopyREAD, ShortREAD], Frames USING [PreDeclared], Gf USING [CodeBase, Handle], Init USING [bootLoaded], Inline USING [LowHalf], MachineDefs USING [ControlLink, FSHandle, GFHandle, GFT, GFTIndex, PageSize], PrincOps USING [ControlLink, FrameCodeBase], SegmentDefs USING [FileSegmentObject], State USING [GetGS, GSHandle]; FramesXD: PROGRAM IMPORTS DebugOps, Frames, Init, Gf, Inline, State EXPORTS Gf, MachineDefs = BEGIN OPEN Gf, MachineDefs; data: State.GSHandle = State.GetGS[]; GfiToFrame: PUBLIC PROC [gfi: GFTIndex] RETURNS [GFHandle] = { RETURN[DebugOps.ShortREAD[@MachineDefs.GFT[gfi].frame]]}; GfiToOffset: PUBLIC PROC [gfi: GFTIndex] RETURNS [CARDINAL] = { RETURN[DebugOps.ShortREAD[@MachineDefs.GFT[gfi].epbase]]}; OldLink: PUBLIC PROC [ncl: PrincOps.ControlLink] RETURNS [ocl: MachineDefs.ControlLink] = BEGIN IF Frames.PreDeclared[ncl] THEN RETURN[LOOPHOLE[ocl]]; IF ncl.proc THEN BEGIN ocl.gfi ← ncl.gfi; ocl.ep ← ncl.ep; ocl.tag ← IF ncl.gfi = 0 THEN unbound ELSE procedure; END ELSE ocl ← LOOPHOLE[ncl]; END; SameModule: PUBLIC PROC [gf1, gf2: Handle] RETURNS [BOOLEAN] = BEGIN code1: PrincOps.FrameCodeBase = CodeBase[gf1]; code2: PrincOps.FrameCodeBase = CodeBase[gf2]; seg1, seg2: POINTER; o1, o2: CARDINAL; IF code1.out AND code2.out THEN RETURN[code1.handle = code2.handle]; IF code1.highByte = 0 AND code2.highByte = 0 THEN RETURN[code1.longbase = code2.longbase]; IF Init.bootLoaded THEN RETURN[FALSE]; [seg1, o1] ← MungeCodeBase[code1]; [seg2, o2] ← MungeCodeBase[code2]; RETURN[seg1 = seg2 AND o1 = o2]; END; MungeCodeBase: PROC [code: PrincOps.FrameCodeBase] RETURNS [seg: POINTER, o: CARDINAL] = BEGIN SELECT TRUE FROM code.out => {code.out ← FALSE; o ← code.offset; seg ← code.handle}; code.highByte # 0 => { o ← code.shortbase - UserFileSegmentAddress[code.handle]; seg ← code.handle}; ENDCASE => { seg ← SegFromPage[bank: code.otherByte, p: code.offset/MachineDefs.PageSize]; o ← Inline.LowHalf[code.longbase - UserLongFileSegmentAddress[seg]]}; END; SegFromPage: PROCEDURE [bank, p: CARDINAL] RETURNS [POINTER] = INLINE { RETURN[DebugOps.LongREAD[LP[p, bank]]]}; LP: PROCEDURE [low, high: CARDINAL] RETURNS [LONG POINTER] = MACHINE CODE BEGIN END; UserFileSegmentAddress: PROC [seg: MachineDefs.FSHandle] RETURNS [POINTER] = BEGIN OPEN DebugOps, SegmentDefs; lseg: FileSegmentObject; ShortCopyREAD[from: seg, to: @lseg, nwords: SIZE[FileSegmentObject]]; RETURN[LOOPHOLE[lseg.VMpage*MachineDefs.PageSize]] END; UserLongFileSegmentAddress: PROC [seg: MachineDefs.FSHandle] RETURNS [LONG POINTER] = BEGIN OPEN DebugOps, SegmentDefs; lseg: FileSegmentObject; ShortCopyREAD[from: seg, to: @lseg, nwords: SIZE[FileSegmentObject]]; RETURN[LOOPHOLE[LONG[lseg.VMpage]*MachineDefs.PageSize]] END; END.