-- 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.