-- STDebugXD.mesa Edited by Bruce, October 13, 1980 6:25 PM
DIRECTORY
CBinary USING [DebugTab],
CGDBinaryDefs USING [FopNames, MopNames],
DebugFormat USING [LongSubString],
FrameDefs USING [IsBound],
Init USING [DebugTab],
Inline USING [LowHalf],
MiscDefs USING [DestroyFakeModule],
RESOut USING [PSubString],
SegmentDefs USING [FileSegmentHandle, LongFileSegmentAddress, SwapIn, Unlock],
STDebugDefs USING [TableId],
String USING [AppendSubString, SubStringDescriptor];
STDebugXD: PROGRAM
IMPORTS
CBinary, CGDBinaryDefs, FrameDefs, Init, Inline, MiscDefs, RESOut,
String, SegmentDefs
EXPORTS STDebugDefs =
BEGIN OPEN STDebugDefs;
AppendLongSubString: PUBLIC PROC [s: STRING, ss: DebugFormat.LongSubString] = {
desc: String.SubStringDescriptor ← [
base: Inline.LowHalf[ss.base], offset: ss.offset, length: ss.length];
String.AppendSubString[s, @desc]};
PLongSubString: PUBLIC PROC [ss: DebugFormat.LongSubString] = {
desc: String.SubStringDescriptor ← [
base: Inline.LowHalf[ss.base], offset: ss.offset, length: ss.length];
RESOut.PSubString[@desc]};
Tab: TYPE = RECORD [seg: SegmentDefs.FileSegmentHandle, state: {in, out}];
tables: ARRAY TableId OF Tab ← ALL[[NIL,out]];
LockTableSegment: PUBLIC PROC [id: TableId] RETURNS [LONG POINTER] =
BEGIN
seg: SegmentDefs.FileSegmentHandle;
seg ← IF tables[id].seg = NIL THEN TableSegment[id] ELSE tables[id].seg;
IF tables[id].state = out THEN {
SegmentDefs.SwapIn[seg]; tables[id].seg ← seg; tables[id].state ← in};
RETURN [SegmentDefs.LongFileSegmentAddress[seg]];
END;
TableSegment: PROC [id: TableId] RETURNS [seg: SegmentDefs.FileSegmentHandle] =
BEGIN
offset: CARDINAL;
[seg, offset] ← MiscDefs.DestroyFakeModule[SELECT id FROM
mopcodes => LOOPHOLE[CGDBinaryDefs.MopNames],
fopcodes => LOOPHOLE[CGDBinaryDefs.FopNames],
debugtab =>
IF FrameDefs.IsBound[Init.DebugTab] THEN LOOPHOLE[Init.DebugTab]
ELSE LOOPHOLE[CBinary.DebugTab],
ENDCASE => ERROR];
IF offset # 0 THEN ERROR;
RETURN[seg];
END;
UnlockTableSegment: PUBLIC PROC [id: TableId] = {
IF tables[id].state = in THEN {
SegmentDefs.Unlock[tables[id].seg]; tables[id].state ← out}};
END.