-- CGenDebugCons.mesa Edited by Sweet,  15-Oct-80  9:41:48
    
DIRECTORY
  CGenDebugDefs USING [],
  CodeDefs USING [ConsDestination],
  FormSW USING [
    AllocateItemDescriptor, BooleanItem, ClientItemsProcType, Display, 
    ItemHandle, line0, line1, line2, NumberItem, StringItem],
  Symbols USING [ContextLevel, lG, lL, lZ],
  Tool USING [Create, MakeFormSW, MakeSWsProc],
  ToolWindow USING [SetTinyName, TransitionProcType],
  Window USING [Handle, Place];
      
CGenDebugCons: PROGRAM 
  IMPORTS FormSW, Tool, ToolWindow
  EXPORTS CGenDebugDefs =
  BEGIN
  OPEN FormSW, CGenDebugDefs;
    
  window: Window.Handle;
  h: Window.Handle;
  windowIsActive: BOOLEAN ← FALSE;
  
  MakeMySWs: Tool.MakeSWsProc =
    BEGIN
    h ← Tool.MakeFormSW[window: window, formProc: MakeParameterArray];
    END;

  Init: PRIVATE PROCEDURE =
    BEGIN
    window ← Tool.Create[
      makeSWsProc: MakeMySWs,
      name: "Constructor Destination"L,
      clientTransition: Transit];
    ToolWindow.SetTinyName[window, "Cons"L, "Dest"L]
    END;

  Transit: ToolWindow.TransitionProcType = {windowIsActive ← new = active};

  ConsParamIndex: TYPE = {bd, inFrame, pLoaded, pLink, ignSafen,
    wSize, fOff, pSti, pLvl, pDel, bSize, fLvl, pLen, pOff, rem};
  ConsParams: TYPE = DESCRIPTOR FOR ARRAY ConsParamIndex OF
    FormSW.ItemHandle;

  Col1: CARDINAL = 0*7;
  Col2: CARDINAL = Col1 + 12*7;
  Col3: CARDINAL = Col2 + 13*7;
  Col4: CARDINAL = Col3 + 13*7;
  Col5: CARDINAL = Col4 + 13*7;

  bdPlace: Window.Place = [x: Col1, y: line0];
  wSizePlace: Window.Place = [x: Col1, y: line1];
  bSizePlace: Window.Place = [x: Col1, y: line2];

  inFramePlace: Window.Place = [x: Col2, y: line0];
  fOffPlace: Window.Place = [x: Col2, y: line1];
  fLvlPlace: Window.Place = [x: Col2, y: line2];

  pLoadedPlace: Window.Place = [x: Col3, y: line0];
  pStiPlace: Window.Place = [x: Col3, y: line1];
  pLenPlace: Window.Place = [x: Col3, y: line2];

  pLinkPlace: Window.Place = [x: Col4, y: line0];
  pLvlPlace: Window.Place = [x: Col4, y: line1];
  pOffPlace: Window.Place = [x: Col4, y: line2];

  ignSafenPlace: Window.Place = [x: Col5, y: line0];
  pDelPlace: Window.Place = [x: Col5, y: line1];
  remPlace: Window.Place = [x: Col5, y: line2];

  MakeParameterArray: FormSW.ClientItemsProcType =
    BEGIN OPEN FormSW; 
    nParams: CARDINAL = LOOPHOLE[LAST[ConsParamIndex], CARDINAL] + 1;
    params: ConsParams ← LOOPHOLE[
      AllocateItemDescriptor[nParams]];

    params[bd] ← NumberItem[readOnly: TRUE, signed: FALSE,
      tag: "bd"L, place: bdPlace, value: @bdWord];
    params[wSize] ← NumberItem[readOnly: TRUE, signed: FALSE,
      tag: "wSize"L, place: wSizePlace, value: @cd.wSize];
    params[bSize] ← NumberItem[readOnly: TRUE, signed: FALSE,
      tag: "bSize"L, place: bSizePlace, value: @bSizeWord];
    
    params[inFrame] ← BooleanItem[
      tag: "inFrame"L, place: inFramePlace, switch: @inFrame];
    params[fOff] ← NumberItem[readOnly: TRUE, signed: FALSE,
      tag: "fOff"L, place: fOffPlace, value: @cd.fOffset];
    params[fLvl] ← StringItem[
      tag: "fLvl"L, place: fLvlPlace, readOnly: TRUE, string: @fLvlString];
    
    params[pLoaded] ← BooleanItem[
      tag: "pLoaded"L, place: pLoadedPlace, switch: @pLoaded];
    params[pSti] ← NumberItem[readOnly: TRUE, signed: FALSE,
      tag: "pSti"L, place: pStiPlace, value: @pStiWord];
    params[pLen] ← NumberItem[readOnly: TRUE, signed: FALSE,
      tag: "pLen"L, place: pLenPlace, value: @pLenWord];
    
    params[pLink] ← BooleanItem[
      tag: "pLink"L, place: pLinkPlace, switch: @pLink];
    params[pLvl] ← StringItem[
      tag: "pLvl"L, place: pLvlPlace, readOnly: TRUE, string: @pLvlString];
    params[pOff] ← NumberItem[readOnly: TRUE, signed: FALSE,
      tag: "pOff"L, place: pOffPlace, value: @pOffWord];
    
    params[ignSafen] ← BooleanItem[
      tag: "ignSafen"L, place: ignSafenPlace, switch: @ignSafen];
    params[pDel] ← NumberItem[readOnly: TRUE,
      tag: "pDel"L, place: pDelPlace, value: @cd.pDelta];
    params[rem] ← NumberItem[readOnly: TRUE, signed: FALSE,
      tag: "rem"L, place: remPlace, value: @cd.remaining];

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

  cd: PUBLIC CodeDefs.ConsDestination;

  UpdateConstDest: PUBLIC PROCEDURE =
    BEGIN
    DoLvl: PROC [s: STRING, l: Symbols.ContextLevel] =
      BEGIN
      s.length ← 1;
      s[0] ← SELECT l FROM
	Symbols.lZ => 'Z,
	Symbols.lG => 'G,
	Symbols.lL => 'L,
	> LAST[Symbols.ContextLevel] => '?,
	ENDCASE => '0 + l;
      END;
    inFrame ← IF cd.inFrame THEN TRUE ELSE FALSE;
    pLoaded ← IF cd.pLoaded THEN TRUE ELSE FALSE;
    pLink ← IF cd.pLink THEN TRUE ELSE FALSE;
    ignSafen ← IF cd.ignoreSafen THEN TRUE ELSE FALSE;
    bdWord ← cd.bd;
    DoLvl[pLvlString, cd.pLevel];
    bSizeWord ← cd.bSize;
    DoLvl[fLvlString, cd.fLevel];
    pLenWord ← cd.pLength;
    pOffWord ← cd.pOffset;
    pStiWord ← LOOPHOLE[cd.pSti];

    IF windowIsActive THEN FormSW.Display[h];
    END;


  inFrame, pLoaded, pLink, ignSafen: BOOLEAN;
  bdWord: CARDINAL;
  bSizeWord: CARDINAL;
  pLenWord: CARDINAL;
  pOffWord: CARDINAL;
  pStiWord: CARDINAL;
  pLvlString: STRING ← [1];
  fLvlString: STRING ← [1];

  Init[];
  
  END.