-- initialization module of silicon (pretty picture) program
-- modified by McCreight, March 23, 1983  1:06 PM

DIRECTORY
  ChipUserInt,
  multiGraphicsDefs,
  InlineDefs,
  ImageDefs,
  AltoFileDefs,
  StringDefs,
  IODefs,
  MiscDefs,
  SegmentDefs,
  StreamDefs,
  ppCache,
  ppdddefs,ppddefs,
  ppdefs,
  ppoutdefs,
  ppMainDefs,
  ProcessDefs;

ppInit: PROGRAM
  IMPORTS
    ImageDefs, ppdddefs, multiGraphicsDefs, ppCache, ppdefs, ppddefs, ppMainDefs,
    InlineDefs, StreamDefs, IODefs, MiscDefs, SegmentDefs, StringDefs,
    ppoutdefs, ChipUserInt, ProcessDefs
  EXPORTS ppdefs, ppMainDefs = PUBLIC
  BEGIN
  OPEN ppdefs, ppdddefs,ppddefs, ppMainDefs, multiGraphicsDefs, InlineDefs, StringDefs, ppoutdefs;

  --core banks 4 & 5 use scheme (NOTE: set mesabanks to 170000B)
  --	1000000B:	color buffer (160x481 = 76960 = 226240B)
  --			empty (8 = 10B)
  --	1226250B:	color table (76 = 114B)
  --			empty (12 = 14B)
  --	1226400B:	B&W table (808x38 = 30704 = 73760B)
  --			empty (16 = 20B)
  --	1322400B:	color tables (avail:23296 = 55400B
  --				each table is 48 = 60B words,
  --				so 60 tables is 2880 wds
  --				or avail is room for 485 tables)

  colorWasOn: BOOLEAN;

QuitSig:PUBLIC SIGNAL = CODE;
RestSig:PUBLIC SIGNAL = CODE;

fileName: PUBLIC STRING ← NIL;
universe: PUBLIC Rect ← univ;

  fontNumber: CARDINAL←0;
  fontNumberMax: CARDINAL = 3;
cfa:POINTER TO AltoFileDefs.CFA;
fa:AltoFileDefs.FA;
fp:AltoFileDefs.FP;
cfile: StreamDefs.DiskHandle;
chr:CHARACTER;
dotSeen:BOOLEAN;

  cmdLineFile: BOOLEAN;
  cmFileName:STRING←[30];

  blankColors:ARRAY [0..48) OF CARDINAL←ALL[255];


  MaintainColorSanity: ImageDefs.CleanupProcedure =
    BEGIN OPEN ChipUserInt;
    SELECT why FROM
      Abort, OutLd =>
        {colorWasOn ← ColorIsOn[]; ColorOff[]};
      InLd => IF colorWasOn THEN ColorOn[];
      ENDCASE => ERROR;
    END;

  cleanupItem: ImageDefs.CleanupItem ←
    [link: NIL,
    mask: ImageDefs.CleanupMask[Abort]+
      ImageDefs.CleanupMask[OutLd]+
      ImageDefs.CleanupMask[InLd],
    proc: MaintainColorSanity
    ];


  config: SegmentDefs.MemoryConfig ←
    SegmentDefs.GetMemoryConfig[];

nullChrThing: keCheckProc = {return←FALSE; execute←TRUE};

  IF InlineDefs.BITAND[config.banks, 6000B]#0 THEN
    BEGIN OPEN IODefs;
    WriteLine["MesaBanks must be set to 171777 from Executive"L];
    WriteLine["and debugger must be reinstalled."L];
    WriteLine["(Confirm)"L];
    []←ReadChar[];
    ImageDefs.StopMesa[];
    END;



  cellStack ← NIL;
  masterList ← NIL;
  initAll[]; -- starts repainting immediately
  ImageDefs.AddCleanupProcedure[@cleanupItem];

	cmdLineFile←dotSeen←FALSE;
	cfa←MiscDefs.CommandLineCFA[];
	fa←cfa↑.fa;
	fp←cfa↑.fp;
	cfile←StreamDefs.CreateByteStream[
		SegmentDefs.InsertFile[@fp,SegmentDefs.Read],StreamDefs.Read];
	StreamDefs.JumpToFA[cfile,@fa];
	IODefs.SetInputStream[cfile];
	cmFileName.length←0;
	UNTIL cfile.endof[cfile] DO
	  chr←IODefs.ReadChar[];
	  IF chr='. THEN
	    BEGIN
		dotSeen←TRUE;
	    END;
	  IF chr='  THEN
	    BEGIN
		IF cmFileName.length>0 THEN EXIT;
	    END
	   ELSE IF chr=15C THEN EXIT
	   ELSE AppendChar[cmFileName,chr];
	ENDLOOP;
	cfile.destroy[cfile];
	IF cmFileName.length>0 THEN
	    BEGIN
		cmdLineFile←TRUE;
		IF NOT dotSeen THEN
		    BEGIN
			AppendString[cmFileName,".chip"];
		    END;
	    END;

  ppoutdefs.DisableBackup[];
  ProcessDefs.Detach[FORK ppoutdefs.BackupDemonProcess[]];

  DO --  UNTIL quitflg DO

    InitHeap[1];

    masterList ← NIL;
    cellStack ← NIL;
    noChange ← FALSE;
    wClosestDisp ← FALSE;
    wiringOrnSet ← FALSE;
    moving ← FALSE;
    copying ← FALSE;
    areaSel ← FALSE;
    moveMarked ← FALSE;
    cellList ← NIL;
    pushLevel ← 0;
    currentLevel ← cut;
    curcol ← 0;
    cellNameMode ← FALSE;

    dChange ← TRUE;

    mode ← wire;
    setSelColor[0];
    unDelPnt ← NIL;
    unDelGrpCnt ← unDelItemCnt ← 0;
    selCount ← 0;
    doingAreaSel ← FALSE;
    locCell←"";
    locIName←"";
    insideCell←"";

    IF cmdLineFile THEN
      BEGIN
      inFile: StreamDefs.DiskHandle;
      getProc: PROC RETURNS [UNSPECIFIED] = {RETURN[inFile.get[inFile]]};
      cmdLineFile←FALSE;
      dChange ← TRUE;
      inFile ← StreamDefs.NewWordStream[cmFileName, StreamDefs.Read
        ! StreamDefs.FileNameError => GOTO NoFile];
      typeOut["", "Reading File:", cmFileName];
      readAll[getProc];
      inFile.destroy[inFile];
      FOR i: CARDINAL IN [0..cmFileName.length) DO
        IF cmFileName[i]='. THEN {cmFileName.length←i; EXIT};
        ENDLOOP;
      fileName←newString[cmFileName];
      anyChanges ← TRUE;
      sinceIOchanges ← FALSE;
      refreshTypeInScreen[];
      EXITS NoFile => NULL;
      END;

    DO OPEN ChipUserInt;

      [] ← CmdTwerp[nullChrThing
        ! Punt => CONTINUE; -- do another command
        RestSig => {ppCache.FlushEntireCache[]; EXIT}; -- restart Chipmonk
        QuitSig, ABORTED => GOTO ChipmonkExit; -- he asked for it
        UNWIND => ERROR];
      ENDLOOP;
    REPEAT ChipmonkExit => NULL;
    ENDLOOP;

  writeCTab[];
  SetColorTable[LOOPHOLE[@blankColors]];
  ReplaceColorArea[x1: 0, x2: colWidth-1, y1: 0, y2: colHeight-1, c: 0];

  FOR i: CARDINAL IN [1..10000] DO -- wait for Godot.
    jj: CARDINAL ← i+1;
    jj←jj/2;
  ENDLOOP;

  ChipUserInt.ColorOff[];
  ImageDefs.RemoveCleanupProcedure[@cleanupItem];
  ImageDefs.StopMesa[];

  END.