-- CGenDebugInterface.mesa Edited by Bruce,  October 14, 1980  4:49 PM
    
DIRECTORY
  CGenDebugCommandDefs USING [ParamIndex, Params],
  CGenDebugDefs USING [ccInfo, handle, ParamNotify],
  CodeDefs USING [CCInfoType],
  FormSW USING [
    AllocateItemDescriptor, BooleanItem, ClientItemsProcType, CommandItem, 
    Enumerated, EnumeratedItem, line0, line1, line2, line3, nextPlace, 
    StringItem],
  ImageDefs USING [BcdTime],
  RESOut USING [WindowsObject],
  STDebugDefs USING [depthString, showLinks, STDebugMisc, STDebugSymbols, STDebugTrees],
  Storage USING [Expand],
  String USING [AppendString],
  Time USING [Append, Unpack],
  Tool USING [Create, MakeFileSW, MakeFormSW, MakeMsgSW, MakeSWsProc],
  ToolWindow USING [TransitionProcType],
  Window USING [Place];
      
CGenDebugInterface: PROGRAM 
  IMPORTS CGenDebugDefs, --CGenDebugVWDefs,-- FormSW, ImageDefs, STDebugDefs, 
    Storage, String, Time, Tool
  EXPORTS CGenDebugDefs =
  BEGIN
  OPEN FormSW, CGenDebugDefs;
    
  Init: PRIVATE PROCEDURE =
    BEGIN
    title: STRING = "CGen Debug 6.0 of "L;
    herald: STRING ← [60];
    String.AppendString[to: herald, from: title];
    Time.Append[herald, Time.Unpack[ImageDefs.BcdTime[]]];
    herald.length ← herald.length - 3;
    windows.main ← Tool.Create[
      makeSWsProc: MakeMySWs,
      clientTransition: StateChanged,
      name: herald];
    CGenDebugDefs.handle ← @windows;
    END;

  StateChanged: ToolWindow.TransitionProcType =
    BEGIN
    IF new = inactive THEN
      windows.msgSW ← windows.formSW ← windows.fileSW ← NIL;
    END;

  windows: RESOut.WindowsObject ← [NIL, NIL, NIL, NIL];

  MakeMySWs: Tool.MakeSWsProc =
    BEGIN
    windows.msgSW ← Tool.MakeMsgSW[window: window];
    windows.formSW ← Tool.MakeFormSW[window: window, formProc: MakeParameterArray];
    windows.fileSW ← Tool.MakeFileSW[window: window, name: "CGenDebug.log"L];
    END;


  TreeCol: CARDINAL = 0*7;
  FirstCol: CARDINAL = TreeCol + 14*7;
  TempCol: CARDINAL = FirstCol + 13*7;
  MTCol: CARDINAL = TempCol + 12*7;
  FopCol: CARDINAL = MTCol + 9*7;
  BodyCol: CARDINAL = FopCol + 6*7;
  SourceCol: CARDINAL = BodyCol + 7*7;

  treePlace: Window.Place = [x: TreeCol+0*7, y: line0];
  asCCPlace: Window.Place = [x: TreeCol+9*7, y: line0];
  varPlace: Window.Place = [x: TreeCol+0*7, y: line1];
  vcompPlace: Window.Place = [x: TreeCol+6*7, y: line1];
  linksPlace: Window.Place = [x: TreeCol+0*7, y: line2];
  depthPlace: Window.Place = [x: TreeCol+6*7, y: line2];

  mdiPlace: Window.Place = [x: MTCol+0*7, y: line0];
  htiPlace: Window.Place = [x: MTCol+4*7, y: line0];
  ctiPlace: Window.Place = [x: MTCol+0*7, y: line1];
  btiPlace: Window.Place = [x: MTCol+4*7, y: line1];
  seiPlace: Window.Place = [x: MTCol+0*7, y: line2];
  nextsePlace: Window.Place = [x: MTCol+4*7, y: line2];

  firstPlace: Window.Place = [x: FirstCol+0*7, y: line0];
  curPlace: Window.Place = [x: FirstCol+7*7, y: line0];
  rcntPlace: Window.Place = [x: FirstCol+0*7, y: line1];
  fwdPlace: Window.Place = [x: FirstCol+7*7, y: line1];
  prevPlace: Window.Place = [x: FirstCol+0*7, y: line2];
  nextPlace: Window.Place = [x: FirstCol+6*7, y: line2];
  infoPlace: Window.Place = [x: FirstCol+0*7, y: line3];

  tempPlace: Window.Place = [x: TempCol+0*7, y: line0];
  allStackPlace: Window.Place = [x: TempCol+6*7, y: line0];
  stackPlace: Window.Place = [x: TempCol+0*7, y: line1];
  tosPlace: Window.Place = [x: TempCol+6*7, y: line1];
  downPlace: Window.Place = [x: TempCol+0*7, y: line2];
  upPlace: Window.Place = [x: TempCol+7*7, y: line2];
  lblPlace: Window.Place = [x: TempCol+0*7, y: line3];
  liiPlace: Window.Place = [x: TempCol+6*7, y: line3];

  fopPlace: Window.Place = [x: FopCol+0*7, y: line0];
  mopPlace: Window.Place = [x: FopCol+0*7, y: line1];
  repPlace: Window.Place = [x: FopCol+0*7, y: line2];

  bodyPlace: Window.Place = [x: BodyCol+0*7, y: line0];
  stmtPlace: Window.Place = [x: BodyCol+0*7, y: line1];
  exprPlace: Window.Place = [x: BodyCol+0*7, y: line2];

  sourcePlace: Window.Place = [x: SourceCol + 0*7, y: line0];
  srcbkPlace: Window.Place = [x: SourceCol + 0*7, y: line1];
  srcfwdPlace: Window.Place = [x: SourceCol + 4*7, y: line1];

  MakeParameterArray: FormSW.ClientItemsProcType =
    BEGIN OPEN FormSW; 
    infoEnumRec: ARRAY CodeDefs.CCInfoType OF Enumerated ← [
      [string: "gen"L, value: CodeDefs.CCInfoType[generating]],
      [string: "bind"L, value: CodeDefs.CCInfoType[binding]],
      [string: "code"L, value: CodeDefs.CCInfoType[coding]]];
    nParams: CARDINAL =
      LOOPHOLE[LAST[CGenDebugCommandDefs.ParamIndex], CARDINAL] + 1;
    params: CGenDebugCommandDefs.Params ← LOOPHOLE[
      AllocateItemDescriptor[nParams]];

    params[tree] ← CommandItem[
      tag: "Tree"L, place: treePlace, proc: ParamNotify];
    params[asCC] ← CommandItem[
      tag: "CC"L, place: asCCPlace, proc: ParamNotify];
    params[var] ← CommandItem[
      tag: "Var"L, place: varPlace, proc: ParamNotify];
    params[vcomp] ← CommandItem[
      tag: "VComp"L, place: vcompPlace, proc: ParamNotify];
    params[links] ← BooleanItem[
      tag: "lnks"L, place: linksPlace, switch: @STDebugDefs.showLinks];
    params[depth] ← StringItem[
      tag: "d"L, place: depthPlace, string: @STDebugDefs.depthString,
      inHeap: TRUE];

    params[first] ← CommandItem[
      tag: "first"L, place: firstPlace, proc: ParamNotify];
    params[cur] ← CommandItem[
      tag: "cur"L, place: curPlace, proc: ParamNotify];
    params[rcnt] ← CommandItem[
      tag: "rcnt"L, place: rcntPlace, proc: ParamNotify];
    params[fwd] ← CommandItem[
      tag: "fwd"L, place: fwdPlace, proc: ParamNotify];
    params[prev] ← CommandItem[
      tag: "prev"L, place: prevPlace, proc: ParamNotify];
    params[next] ← CommandItem[
      tag: "next"L, place: nextPlace, proc: ParamNotify];
    params[info] ← EnumeratedItem[
      tag: "info"L, place: infoPlace, feedback: one,
      choices: LOOPHOLE[DESCRIPTOR[infoEnumRec]], value: @ccInfo];

    params[temp] ← CommandItem[
      tag: "temp"L, place: tempPlace, proc: ParamNotify];
    params[allStack] ← CommandItem[
      tag: "Stk"L, place: allStackPlace, proc: ParamNotify];
    params[stack] ← CommandItem[
      tag: "sti"L, place: stackPlace, proc: ParamNotify];
    params[tos] ← CommandItem[
      tag: "TOS"L, place: tosPlace, proc: ParamNotify];
    params[down] ← CommandItem[
      tag: "down"L, place: downPlace, proc: ParamNotify];
    params[up] ← CommandItem[
      tag: "up"L, place: upPlace, proc: ParamNotify];
    params[lbl] ← CommandItem[
      tag: "lbl"L, place: lblPlace, proc: ParamNotify];
    params[lii] ← CommandItem[
      tag: "lii"L, place: liiPlace, proc: ParamNotify];

    params[mdi] ← CommandItem[
      tag: "mt"L, place: mdiPlace, proc: ParamNotify];
    params[hti] ← CommandItem[
      tag: "ht"L, place: htiPlace, proc: ParamNotify];
    params[cti] ← CommandItem[
      tag: "ct"L, place: ctiPlace, proc: ParamNotify];
    params[bti] ← CommandItem[
      tag: "bt"L, place: btiPlace, proc: ParamNotify];
    params[sei] ← CommandItem[
      tag: "se"L, place: seiPlace, proc: ParamNotify];
    params[nextse] ← CommandItem[
      tag: "nx"L, place: nextsePlace, proc: ParamNotify];

    params[fop] ← CommandItem[
      tag: "fop"L, place: fopPlace, proc: ParamNotify];
    params[mop] ← CommandItem[
      tag: "mop"L, place: mopPlace, proc: ParamNotify];
    params[rep] ← CommandItem[
      tag: "rep"L, place: repPlace, proc: ParamNotify];

    params[body] ← CommandItem[
      tag: "Body"L, place: bodyPlace, proc: ParamNotify];
    params[stmt] ← CommandItem[
      tag: "Stmt"L, place: stmtPlace, proc: ParamNotify];
    params[expr] ← CommandItem[
      tag: "Expr"L, place: exprPlace, proc: ParamNotify];

    params[source] ← CommandItem[
      tag: "Source"L, place: sourcePlace, proc: ParamNotify];
    params[srcbk] ← CommandItem[
      tag: "<-"L, place: srcbkPlace, proc: ParamNotify];
    params[srcfwd] ← CommandItem[
      tag: "->"L, place: srcfwdPlace, proc: ParamNotify];

    RETURN[items: LOOPHOLE[params], freeDesc: TRUE];
    END;


 -- Mainline code
  Storage.Expand[8]; -- lots of heap space taken up by FormSW
  START STDebugDefs.STDebugMisc;
  START STDebugDefs.STDebugTrees;
  START STDebugDefs.STDebugSymbols;

  Init[];
  
END.