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