-- command interpreter module of silicon (pretty picture) program
-- modified by McCreight, April 7, 1983 4:57 PM
DIRECTORY
ChipUserInt,
multiGraphicsDefs,
InlineDefs,
AltoFileDefs,
ppdddefs,ppddefs,
ppdefs,
ppoutdefs,
ppMainDefs;
ppmain: PROGRAM
IMPORTS
ppdddefs, multiGraphicsDefs, ppdefs, ppddefs, ppMainDefs,
ppoutdefs, InlineDefs, ChipUserInt
EXPORTS ppMainDefs, ppdefs = PUBLIC
BEGIN
OPEN ppdefs, ppdddefs,ppddefs, ppMainDefs, multiGraphicsDefs, InlineDefs;
ii: CARDINAL; -- exported to ppMainDefs
ss: STRING;
ke: keyEvent;
cp, cpp: LONG POINTER TO cList;
lp, lpp, lqp: listPtr;
cmdArray: POINTER TO ARRAY [0..77B] OF cmdEnt = LOOPHOLE[@snerdArray];
snerdArray: ARRAY [0..77B] OF POINTER ← [
@cmZer, @cmDig, @cmDig, @cmDig, @cmDig, @cmDig, @cmDig, @cmDig -- 0-7
, @cmDig, @cm9, @cmA, @cmB, @cmC, @cmD, @cmE, @cmF -- 89A-F
, @cmG, @cmH, @cmI, NIL, NIL, @cmL, @cmM, @cmN -- G-N
, @cmO, @cmP, @cmQ, @cmR, @cmS, @cmT, @cmU, NIL --O-V
, @cmW, @cmX, NIL, @cmZ, @cmSemi, @cmEQ, @cmFlp, NIL -- WXYZ;=,-
, @cmFlp, @cmQues, NIL, NIL, @cmBSL, NIL, @cmUN, @cmUPAR -- ./'[\](DN)←
, NIL, @cmLF, NIL, @cmDEL, @cmSPC, @cmESC, NIL, NIL
-- CR LF BS DEL SPC ESC ??? ???
, NIL, NIL, NIL, @cmYUB, NIL, NIL, NIL, @cmBUT];
-- ??? ??? ??? release yellow ??? ??? ??? NONE
red: CARDINAL = 1;
yellow: CARDINAL = 2;
blue: CARDINAL = 4;
notMouse: CARDINAL = 3770B;
basicKbd: CARDINAL = 10B;
ctrl: CARDINAL = 20B;
tab: CARDINAL = 40B;
ctrlTab: CARDINAL = 100B;
shift: CARDINAL = 200B;
ctrlShift: CARDINAL = 400B;
tabShift: CARDINAL = 1000B;
ctrlTabShift: CARDINAL = 2000B;
ctrlTabAny: CARDINAL = ctrlTab+ctrlTabShift;
else: CARDINAL = 7777B;
cmZer: ARRAY [0..2] OF cmdLent ← [
[red, doDefaultPnt], [ctrl, doDefaultSel], [else, ignore]];
cmDig: ARRAY [0..3] OF cmdLent ← [
[yellow, makCont], [red, setMark], [ctrl+blue, selLayer], [else, ignore]];
cmA: ARRAY [0..5] OF cmdLent ← [[red, doAsel],[yellow,doAlter],[blue, doASel],[ctrl, doRepeatOb], [tab, doSelectAll], [else, ignore]];
cmB: ARRAY [0..4] OF cmdLent ← [[red, doBurr], [yellow, doMakBus], [ctrl, convToBus],
[100B, convToBusDamnit], [else, ignore]];
cmC: ARRAY [0..5] OF cmdLent ← [
[tab, setCols], [ctrl, defCell], [red, getCell], [ctrlTabAny, makeCif], [yellow, doCopy], [
else, ignore]];
cmD: ARRAY [0..3] OF cmdLent ← [
[yellow, delPnt], [ctrl, delSel], [blue, doDeSel], [else, ignore]];
cmE: ARRAY [0..4] OF cmdLent ← [
[red, doExpP], [ctrl, doExpS], [tab, dispErf], [ctrlTabAny, getErfil], [
else, ignore]];
cmF: ARRAY [0..1] OF cmdLent ← [[ctrlTabShift, doFlush], [else, ignore]];
cmG: ARRAY [0..0] OF cmdLent ← [[else, ignore]];
cmH: ARRAY [0..1] OF cmdLent ← [[ctrlTabAny, doHard], [else, ignore]];
cmI: ARRAY [0..4] OF cmdLent ← [[ctrlShift, doUnImplSel],[ctrl, doImplSel],[1B, doImplPnt],[ctrlTabAny, doInput], [else, ignore]];
cmL: ARRAY [0..2] OF cmdLent ← [
[red, doLenPnt],[ctrl, doLenSel], [else, ignore]];
cmM: ARRAY [0..3] OF cmdLent ← [
[yellow, doMove], [ctrl, mirrorSel], [red, mirrorPnt], [else, ignore]];
cmN: ARRAY [0..4] OF cmdLent ← [
[red, doNarwPnt], [ctrl, doNarwSel], [tab, doNormalize], [yellow, doTub], [else, ignore]];
cmO: ARRAY [0..3] OF cmdLent ← [
[ctrlTabAny, doOutput], [tab, doOvg], [yellow, doOvgR], [else, ignore]];
cmP: ARRAY [0..4] OF cmdLent ← [
[ctrl, pushSel], [red, pushPnt], [yellow,doPu], [shift,pushName],[else,ignore]];
cmQ: ARRAY [0..2] OF cmdLent ← [[ctrlTabAny, doQuit], [yellow, oneWire], [else, ignore]];
cmR: ARRAY [0..4] OF cmdLent ← [ [yellow, doRectangle],
[2000B, doRestart], [ctrl, rotSel], [red, rotPnt], [else, ignore]];
cmS: ARRAY [0..3] OF cmdLent ← [
[red, doShrtPnt], [420B, doShrtSel], [yellow, doStretch], [else, ignore]];
cmT: ARRAY [0..4] OF cmdLent ← [[ctrl, enterName],
[red, enterText], [yellow, doTran], [tab, setFont], [else, ignore]];
cmU: ARRAY [0..1] OF cmdLent ← [[ctrl, doUnDel], [else, ignore]];
cmW: ARRAY [0..3] OF cmdLent ← [
[red, doWidenPnt], [yellow,doWAlter],[ctrl, doWidenSel], [else, ignore]];
cmX: ARRAY [0..1] OF cmdLent ← [[yellow, doTran], [else, ignore]];
cmZ: ARRAY [0..2] OF cmdLent ← [[ctrl, doZee], [yellow, doATran],[else, ignore]];
cmSemi: ARRAY [0..1] OF cmdLent ← [[ctrlTabAny, doRunConfig], [else, ignore]];
cmUN: ARRAY [0..1) OF cmdLent ← [[else, unDo]];
cmUPAR: ARRAY [0..1] OF cmdLent ← [[notMouse, doPop], [else, ignore]];
cmSPC: ARRAY [0..4] OF cmdLent ← [
[red, movColScrn], [blue, movBWScrn], [yellow, movMidScrn], [ctrl, flipWires], [
else, ignore]];
cmESC: ARRAY [0..1) OF cmdLent ← [[else, doESC]];
cmYUB: ARRAY [0..1) OF cmdLent ← [[else, yellowUnButSeen]];
cmBUT: ARRAY [0..3] OF cmdLent ← [
[red, setMark], [blue, doSelect], [yellow, doDraw], [else, ignore]];
cmQues: ARRAY [0..1) OF cmdLent ← [[else, ignore]];
cmFlp: ARRAY [0..1] OF cmdLent ← [[ctrlTab+basicKbd, flipWires], [else, ignore]];
cmEQ: ARRAY [0..1] OF cmdLent ← [[notMouse, movLft], [else, ignore]];
cmBSL: ARRAY [0..1] OF cmdLent ← [[notMouse, movRgt], [else, ignore]];
cmDEL: ARRAY [0..1] OF cmdLent ← [[notMouse, movDn], [else, ignore]];
cmLF: ARRAY [0..1] OF cmdLent ← [[notMouse, movUp], [else, ignore]];
cm9: ARRAY [0..1] OF cmdLent ← [[red+blue, modParam], [else, ignore]];
CNcmdArray: POINTER TO ARRAY [0..77B] OF cmdEnt = LOOPHOLE[@CNsnerdArray];
CNsnerdArray: ARRAY [0..77B] OF POINTER ← [
NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL -- 0-7
, NIL, NIL, NIL, NIL, NIL, @cccD, NIL, NIL -- 89A-F
, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL -- G-N
, NIL, NIL, @cccQ, NIL, NIL, @cccT, NIL, NIL --O-V
, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL -- WXYZ;=,-
, NIL, NIL, NIL, NIL, NIL, NIL, @cccUN, NIL -- ./'[\](DN)←
, NIL, NIL, NIL, NIL, @cccSPC, NIL, NIL, NIL
-- CR LF BS DEL SPC ESC ??? ???
, NIL, NIL, NIL, @cccYUB, NIL, NIL, NIL, @cccBUT];
-- ??? ??? ??? release yellow ??? ??? ??? NONE
cccD: ARRAY [0..1] OF cmdLent ← [[ctrl, delCnSel], [else, ignore]];
cccQ: ARRAY [0..1] OF cmdLent ← [[ctrlTabAny, doQuit], [else, ignore]];
cccT: ARRAY [0..1] OF cmdLent ← [[tab, setFont], [else, ignore]];
cccUN: ARRAY [0..1) OF cmdLent ← [[else, unZee]];
cccSPC: ARRAY [0..3] OF cmdLent ← [
[red, movColScrn], [blue, movBWScrn], [yellow, movMidScrn], [else, ignore]];
cccYUB: ARRAY [0..1) OF cmdLent ← [[else, yellowUnButSeen]];
cccBUT: ARRAY [0..1] OF cmdLent ← [[blue, doCnSelect], [else, ignore]];
delCnSel: PUBLIC cmdProc =
BEGIN
cn: LONG POINTER TO list;
cob: LONG POINTER TO cnText object;
WHILE cnList # NIL DO
cn ← cnList;
cnList ← cnList.nxt;
IF cn.selected THEN
BEGIN cob ← LOOPHOLE[cn.ob]; delCellDef[cob.np, cob.op]; END;
cn.ob.p.release[cn.ob];
freeList[cn];
ENDLOOP;
dChange ← TRUE;
doZee[k];
END;
unZee: PUBLIC cmdProc =
BEGIN
cn: LONG POINTER TO list;
cellNameMode ← FALSE;
dChange ← TRUE;
WHILE cnList # NIL DO
cn ← cnList.nxt;
cnList.ob.p.release[cnList.ob];
freeList[cnList];
cnList ← cn;
ENDLOOP;
END;
ignore, unDo: PUBLIC cmdProc = {noChange ← TRUE};
doRestart: PUBLIC cmdProc =
BEGIN
IF sinceIOchanges THEN
BEGIN
ke←typeInC["Unwritten-out Changes",
"Should I restart anyway?","Type Y or N:"];
IF ke.k # 42B THEN {refreshTypeInScreen[];RETURN}; -- Y?
END;
refreshTypeInScreen[];
masterList ← NIL;
EraseHeap[];
yelButFlg ← FALSE;
dChange ← TRUE;
anyChanges ← TRUE;
sinceIOchanges ← FALSE;
SIGNAL RestSig;
END;
doStretch: PUBLIC cmdProc =
BEGIN
r: Rect;
dif, ln: INTEGER;
yType, moveIt, found: BOOLEAN ← FALSE;
IF NOT bb THEN RETURN;
lp ← masterList;
WHILE lp # NIL DO
IF lp.selected AND (lp.ob.otyp = wire OR lp.ob.otyp = bus)
AND lp.ob.p.inMe[lp.ob, markPnt.x-lp.lx, markPnt.y-lp.ly,lp.idx] THEN
BEGIN
ln ← lp.ob.size[1];
IF BITAND[lp.idx, 4] = 0 THEN
BEGIN
dif ← yy - markPnt.y;
yType ← TRUE;
IF markPnt.y<lp.ly+ln/2 THEN BEGIN dif← -dif; moveIt←TRUE; END;
END
ELSE
BEGIN
dif ← xx - markPnt.x;
yType ← FALSE;
IF markPnt.x < lp.lx+ln/2 THEN BEGIN dif← -dif; moveIt←TRUE; END;
END;
found ← TRUE;
EXIT;
END;
lp ← lp.nxt;
ENDLOOP;
IF NOT found THEN RETURN;
lp ← masterList;
WHILE lp # NIL DO
IF lp.selected AND (lp.ob.otyp = wire OR lp.ob.otyp = bus) THEN
BEGIN
r ← getRect[lp];
IF lp.ob.p.setParm[lp, length, dif, 1, FALSE] THEN
BEGIN
IF moveIt THEN
BEGIN IF yType THEN lp.ly ← lp.ly-dif ELSE lp.lx ← lp.lx-dif;END;
anyChanges ← sinceIOchanges ← TRUE;
r ← mergeRects[getRect[lp], r];
reDrawRect[r, 1, TRUE, TRUE, FALSE];
END;
END;
lp ← lp.nxt;
ENDLOOP;
IF NOT wiring THEN setMark[k];
END;
doUnDel: PUBLIC cmdProc =
BEGIN
IF unDelPnt # NIL THEN
BEGIN
jj: CARDINAL ← 0;
lpp ← lp ← unDelPnt;
lpp.selected ← TRUE;
WHILE lpp.nxt # NIL AND lpp.mark = lpp.nxt.mark DO
lpp ← lpp.nxt; jj ← jj + 1; ENDLOOP;
unDelPnt ← lpp.nxt;
-- lpp.nxt←masterList;
-- masterList←lp;
WHILE lp # unDelPnt DO
lqp ← lp.nxt;
lp.deleted ← FALSE;
masterList ← insertList[masterList, lp];
reDrawRect[getRect[lp], 0, TRUE, TRUE, FALSE];
selCount ← selCount + 1;
lp ← lqp;
ENDLOOP;
anyChanges ← sinceIOchanges ← TRUE;
unDelGrpCnt ← unDelGrpCnt - 1;
unDelItemCnt ← unDelItemCnt - jj - 1;
IF unDelPnt = NIL THEN unDelGrpCnt ← unDelItemCnt ← 0;
END;
END;
doFlush: PUBLIC cmdProc =
BEGIN
flushDel[unDelPnt];
unDelPnt ← NIL;
unDelGrpCnt ← 0;
unDelItemCnt ← 0;
END;
yelButFlg: BOOLEAN ← FALSE;
yellowUnButSeen: PUBLIC cmdProc =
BEGIN
IF yelButFlg THEN
BEGIN
yelButFlg ← FALSE;
IF k.mx > colWidth THEN
BEGIN
bwClipx2 ← bwClipx2 + bwxoff;
bwClipy2 ← bwClipy2 + bwyoff;
bwxoff ← ((k.mx - colWidth)*bwScaleD)/bwScaleN - markx;
bwyoff ← (k.my*bwScaleD)/bwScaleN - marky;
bwClipx2 ← bwClipx2 - bwxoff;
bwClipy2 ← bwClipy2 - bwyoff;
bwClipx1 ← -bwxoff;
bwClipy1 ← -bwyoff;
bChange ← TRUE;
END
ELSE
BEGIN
cClipx2 ← cClipx2 + cxoff;
cClipy2 ← cClipy2 + cyoff;
cxoff ← (k.mx*cScaleD)/cScaleN - markx;
cyoff ← (k.my*cScaleD)/cScaleN - marky;
cClipx2 ← cClipx2 - cxoff;
cClipy2 ← cClipy2 - cyoff;
cClipx1 ← -cxoff;
cClipy1 ← -cyoff;
cChange ← TRUE;
END;
RETURN;
END;
noChange ← TRUE;
END;
termWire: PROCEDURE [x, y: INTEGER, unSel: BOOLEAN] =
BEGIN
IF wclNx - x = 0 THEN wiringOrn ← 0
ELSE IF wclNy - y = 0 THEN wiringOrn ← 2 ELSE makeaWire[x, y, 1, unSel];
oldNx ← wclNx;
oldNy ← wclNy;
makeaWire[x, y, 0, unSel];
END;
doESC: PUBLIC cmdProc =
BEGIN
dChange ← TRUE;
wiring←busMaking ← FALSE;
boxing ← doingAreaSel ← FALSE;
reCount[];
END;
doQuit: PUBLIC cmdProc =
BEGIN OPEN ChipUserInt;
IF NOT sinceIOchanges OR
HeSaysYes["Unwritten-out Changes", "Should I quit anyway?"] THEN
SIGNAL QuitSig;
END;
flipWires: PUBLIC cmdProc =
BEGIN
IF wiring THEN
BEGIN wiringOrn ← (wiringOrn + 2) MOD 4; setWireParms[FALSE]; END;
END;
movColScrn: PUBLIC cmdProc = BEGIN cChange ← TRUE; setCoffset[xx, yy]; END;
movMidScrn: PUBLIC cmdProc = {markx ← xx; marky ← yy; yelButFlg ← TRUE};
movBWScrn: PUBLIC cmdProc = {bChange ← TRUE; setBWoffset[xx, yy]};
noBBbuttons: PUBLIC cmdProc =
BEGIN
SELECT BITAND[k.ctl, 3] FROM
1 => BEGIN [cChange, bChange] ← doRfeed[]; RETURN; END;
2 => BEGIN [cChange, bChange] ← doYfeed[]; RETURN; END;
3 => BEGIN [cChange, bChange] ← doBfeed[]; RETURN; END;
ENDCASE;
END;
setMark: PUBLIC cmdProc =
BEGIN
SELECT TRUE FROM
wiring AND busMaking =>
BEGIN
calcaBusAndDoIt[bmNews,TRUE,TRUE];
calcaBusAndDoIt[0,FALSE,FALSE];
END;
wiring =>
BEGIN
termWire[xx, yy, BITAND[k.ctl, 34B] = 0];
IF k.k IN [1..5] -- new conductor level -- THEN
BEGIN -- drop a contact and continue in same direction
-- in new level
oldLev: level ← favLev;
oldDifType: DiffusionType ← diffusionType;
oldDifPurpose: DiffusionPurpose ← diffusionPurpose;
-- DropContact[];
putMark[xx, yy, k.mx>colWidth];
wiring ← FALSE;
selLayer[k];
doDraw[k];
END
ELSE wiring ← FALSE;
END
ENDCASE => putMark[xx, yy, k.mx>colWidth];
END;
doDraw: PUBLIC cmdProc =
BEGIN
SELECT TRUE FROM
wiring AND busMaking =>
BEGIN
calcaBusAndDoIt[bmNews,TRUE,TRUE];
setBusParms[FALSE];
END;
wiring => makeaWire[xx, yy, 1, BITAND[k.ctl, 34B] = 0];
ENDCASE =>
IF wireOK[favLev] THEN
BEGIN
anyChanges ← sinceIOchanges ← TRUE;
wclNx ← markPnt.x;
wclNy ← markPnt.y;
wclLp ← lp;
wirePrevPnt ← NIL;
wiringOrnSet ← TRUE;
wiringOrn ← IF ABS[wclNx - xx] < ABS[wclNy - yy] THEN 0 ELSE 2;
wiringLev ← favLev;
setWireParms[FALSE];
busMaking ← FALSE;
END;
END;
calcaBusAndDoIt:PROCEDURE[newSpace:INTEGER,eraseSel,extnd:BOOLEAN] =
BEGIN
ln1,ln2,lspc:INTEGER;
wd:INTEGER←minWidthAr[wiringLev];
spc,aa:INTEGER;
vert:BOOLEAN←wiringOrn=0;
IF vert THEN
BEGIN
ln1←yy-wclNy;
spc←bm2dx;
lspc←bm2dy;
aa←IF xx>wclNx THEN -newSpace ELSE newSpace;
wiringOrn←2;
END
ELSE
BEGIN
ln1←xx-wclNx;
spc←bm2dy;
lspc←bm2dx;
aa←IF yy>wclNy THEN -newSpace ELSE newSpace;
wiringOrn←0;
END;
IF ln1<0 THEN aa←-aa;
IF spc<0 THEN aa←-aa;
ln2←ln1-lspc+aa;
lp ← makeaBuss[ln1,ln2,spc,wclNx,wclNy,lspc,wd,
bmCount,vert,extnd,wiringLev];
IF vert THEN BEGIN bm2dy←aa;wclNy←yy;END
ELSE BEGIN bm2dx←aa;wclNx←xx;END ;
masterList ← insertList[masterList, lp];
IF createSel THEN
BEGIN selNewThing[masterList,lp,eraseSel];END;
reDrawRect[getRect[lp], 0, TRUE, TRUE, FALSE];
END;
CmdTwerpMess: PUBLIC PROCEDURE [os1, os2, os3: STRING,check:keCheckProc]
RETURNS[kkk:keyEvent] =
BEGIN
invertColors[];
typeOut[os1,os2,os3];
kkk←CmdTwerp[check];
restoreColors[];
END;
minSpaceAr:ARRAY level OF INTEGER = [2,6,4,6,2,2,2,2 , 2,6,4,8,2,2,2,2];
doMakBus: PUBLIC cmdProc =
BEGIN
IF wiring AND busMaking THEN doDraw[k]
ELSE
BEGIN
checkMark:keCheckProc =
BEGIN
return←FALSE;
execute←(k.k=64B OR k.k=65B OR k.k=73B);
IF (k.k=77B AND BITAND[15,k.ctl]=1) OR k.k=56B THEN
{return←TRUE;execute←FALSE};
END;
ok: BOOLEAN;
x,y:INTEGER;
ke:keyEvent;
IF NOT wireOK[favLev] THEN RETURN;
x←xx;y←yy;
ke←CmdTwerpMess["","Mark Origin of Second Wire","",checkMark];
IF ke.k=56B THEN RETURN;
xx←x;yy←y;
[ok, x, y] ← deScaledCursor[ke.mx, ke.my];
IF NOT ok THEN RETURN;
bm2dx←x-markPnt.x;
bm2dy←y-markPnt.y;
bmNews←minSpaceAr[favLev]+minWidthAr[favLev];
[ok,bmCount,ke]←typeInNum["","Type Number of Wires","In BUS:"];
IF NOT ok THEN RETURN;
anyChanges ← sinceIOchanges ← TRUE;
wiringLev ← favLev;
wclNx ← markPnt.x;
wclNy ← markPnt.y;
wiringOrn←IF ABS[wclNx - xx] < ABS[wclNy - yy] THEN 0 ELSE 2;
wiring←busMaking←TRUE;
setBusParms[FALSE];
refreshTypeInScreen[];
END;
END;
makeaBuss:PROCEDURE[ln1,ln2,spc,x,y,lenSpc,wd,cnt:INTEGER,vert,extend:BOOLEAN,lev:level]
RETURNS[lp:LONG POINTER TO list]=
BEGIN
tinc,binc:INTEGER;
rots,refls:CARDINAL←0;
wofn:INTEGER←((wd+lambdaGrid)/(2*lambdaGrid))*lambdaGrid;
IF ln1<0 THEN
BEGIN
IF vert THEN
BEGIN
x←x-wofn;
IF extend THEN y←y-wofn;
IF spc<0 THEN
BEGIN
tinc←lenSpc+ln2-ln1;
binc←lenSpc;
spc←-spc;
x←x-(cnt-1)*spc;
refls←1;
END
ELSE
BEGIN
tinc←lenSpc+ln2-ln1;
binc←lenSpc;
END;
IF tinc<0 THEN y←y+tinc*(cnt-1);
y←y+ln1;
END
ELSE
BEGIN
rots←2;refls←1;
y←y-wofn;
IF extend THEN x←x-wofn;
IF spc<0 THEN
BEGIN
tinc←lenSpc+ln2-ln1;
binc←lenSpc;
spc←-spc;
y←y-(cnt-1)*spc;
refls←0;rots←6;
END
ELSE
BEGIN
tinc←lenSpc+ln2-ln1;
binc←lenSpc;
END;
IF tinc<0 THEN x←x+tinc*(cnt-1);
x←x+ln1;
END;
ln1←-ln1;
IF extend THEN ln1←ln1+wofn;
END
ELSE
BEGIN
IF vert THEN
BEGIN
x←x-wofn;
IF spc<0 THEN
BEGIN
tinc←lenSpc;
binc←lenSpc+ln2-ln1;
spc←-spc;
x←x-(cnt-1)*spc;
refls←1;
END
ELSE
BEGIN
tinc←lenSpc;
binc←lenSpc+ln2-ln1;
END;
IF tinc<0 THEN y←y+tinc*(cnt-1);
END
ELSE
BEGIN
rots←2;refls←1;
y←y-wofn;
IF spc<0 THEN
BEGIN
tinc←lenSpc;
binc←lenSpc+ln2-ln1;
spc←-spc;
y←y-(cnt-1)*spc;
refls←0;rots←6;
END
ELSE
BEGIN
tinc←lenSpc;
binc←lenSpc+ln2-ln1;
END;
IF tinc<0 THEN x←x+tinc*(cnt-1);
END;
IF extend THEN ln1←ln1+wd-wofn;
END;
lp ← makeList[
makeBus[ln1,wd,lev,cnt,spc,tinc,binc],x,y,
rots, refls];
END;
oneWire: PUBLIC cmdProc =
BEGIN
IF wiring THEN
BEGIN
oldNx ← wclNx;
oldNy ← wclNy;
makeaWire[xx, yy, 0, TRUE];
wiring ← FALSE;
END
ELSE
BEGIN
IF NOT wireOK[favLev] THEN RETURN;
anyChanges ← sinceIOchanges ← TRUE;
wclNx ← markPnt.x;
wclNy ← markPnt.y;
wclLp ← lp;
wirePrevPnt ← NIL;
wiringOrnSet ← TRUE;
wiringOrn ← IF ABS[wclNx - xx] < ABS[wclNy - yy] THEN 0 ELSE 2;
wiringLev ← favLev;
makeaWire[xx, yy, 0, TRUE];
wiring ← FALSE;
END;
END;
setWireParms: PROCEDURE [big: BOOLEAN] =
BEGIN
x, y, ww,wd,offs: INTEGER;
wd ← minWidthAr[wiringLev];
ww ← (wd*cScaleN)/cScaleD;
offs←((wd+lambdaGrid)/(2*lambdaGrid))*lambdaGrid;
offs ← (offs*cScaleN)/cScaleD;
[, x, y, , ] ← cscaleRect[wclNx, wclNy, cClipx2 - 2, cClipy2 - 2];
setupTempWires[ [x, y], wiringOrn,wiringLev,ww, offs, big];
END;
doDeSel: PUBLIC cmdProc =
BEGIN
IF doingAreaSel THEN
BEGIN
boxing ← doingAreaSel ← FALSE;
unselAreaSingle[masterList, xx, yy];
RETURN;
END;
unselSingle[masterList, xx, yy];
RETURN;
END;
doASel: PUBLIC cmdProc =
BEGIN
boxing ← doingAreaSel ← FALSE;
IF BITAND[k.ctl, 34B] = 0 THEN
BEGIN selAreaSingle[masterList, xx, yy]; RETURN; END
ELSE BEGIN selAreaExtend[masterList, xx, yy]; RETURN; END;
END;
doSelect: PUBLIC cmdProc =
BEGIN
IF doingAreaSel THEN
BEGIN
boxing ← doingAreaSel ← FALSE;
IF BITAND[k.ctl, 34B] = 0 THEN
BEGIN selAreaSingle[masterList, xx, yy]; RETURN; END
ELSE BEGIN selAreaExtend[masterList, xx, yy]; RETURN; END;
END;
IF BITAND[k.ctl, 34B] = 0 THEN
BEGIN selSingle[masterList, xx, yy]; RETURN; END
ELSE BEGIN selExtend[masterList, xx, yy]; RETURN; END;
END;
doSelectAll: PUBLIC cmdProc =
BEGIN
boxing ← doingAreaSel ← FALSE;
selCount ← 0;
FOR lp: listPtr ← masterList, lp.nxt WHILE lp#NIL DO
lp.selected ← TRUE;
selCount ← selCount+1;
ENDLOOP;
dChange ← TRUE;
END;
doNormalize: PUBLIC cmdProc =
BEGIN
IF cellStack#NIL THEN
BEGIN
p: Point = ChipUserInt.GridPoint[[x: (cellStack.origBB.x2+cellStack.origBB.x1)/2,
y: (cellStack.origBB.y2+cellStack.origBB.y1)/2]];
IF cursorOnBW THEN
{setBWoffset[p.x, p.y]; bChange ← TRUE}
ELSE {setCoffset[p.x, p.y]; cChange ← TRUE};
END;
END;
doCnSelect: PUBLIC cmdProc =
BEGIN
IF doingAreaSel THEN
BEGIN
boxing ← doingAreaSel ← FALSE;
IF BITAND[k.ctl, 34B] = 0 THEN
BEGIN selAreaSingle[cnList, xx, yy]; RETURN; END
ELSE BEGIN selAreaExtend[cnList, xx, yy]; RETURN; END;
END;
IF BITAND[k.ctl, 34B] = 0 THEN BEGIN selSingle[cnList, xx, yy]; RETURN; END
ELSE BEGIN selExtend[cnList, xx, yy]; RETURN; END;
END;
strtAreaSel: PROCEDURE [xx, yy: INTEGER] =
BEGIN
x, y: INTEGER;
doingAreaSel ← TRUE;
selMarkPnt ← [xx, yy];
[, x, y, , ] ← cscaleRect[
selMarkPnt.x, selMarkPnt.y, cClipx2 - 2, cClipy2 - 2];
setupBox[[x, y], FALSE];
END;
doAsel: PUBLIC cmdProc = BEGIN IF bb THEN strtAreaSel[xx, yy]; END;
doX: PUBLIC cmdProc =
BEGIN
IF BITAND[k.ctl, 3] = 2 THEN -- if yellow mouse button (draw)
doTran[k];
END;
doTran: PUBLIC cmdProc =
BEGIN
IF bb THEN
BEGIN
anyChanges ← sinceIOchanges ← TRUE;
lp ← makeList[
makeXstr[cWidth*xRatiow, cLength*xRatiol, implant], xx, yy,
basicOrientation, 0];
masterList ← insertList[masterList, lp];
IF createSel THEN
BEGIN selNewThing[masterList, lp, TRUE]; putMark[xx, yy]; END;
reDrawRect[getRect[lp], 0, TRUE, TRUE, FALSE];
END;
END;
doATran: PUBLIC cmdProc =
BEGIN
IF bb THEN
BEGIN
anyChanges ← sinceIOchanges ← TRUE;
lp ← makeList[
makeAngleXstr[cWidth*xRatiow, cLength*xRatiol, implant], xx, yy,
basicOrientation, 0];
masterList ← insertList[masterList, lp];
IF createSel THEN
BEGIN selNewThing[masterList, lp, TRUE]; putMark[xx, yy]; END;
reDrawRect[getRect[lp], 0, TRUE, TRUE, FALSE];
END;
END;
doPu: PUBLIC cmdProc =
BEGIN
xx, yy: INTEGER;
bb: BOOLEAN;
[bb, xx, yy] ← deScaledCursor[k.mx, k.my];
IF NOT bb THEN RETURN;
anyChanges ← sinceIOchanges ← TRUE;
lp ← makeList[
makePullup[cWidth*pRatiow, cLength*pRatiol], xx, yy, basicOrientation, 0];
masterList ← insertList[masterList, lp];
IF createSel THEN
BEGIN selNewThing[masterList, lp, TRUE]; putMark[xx, yy]; END;
reDrawRect[getRect[lp], 0, TRUE, TRUE, FALSE];
END;
makeaWire: PROCEDURE [xx, yy, extend: INTEGER, unSel: BOOLEAN] =
BEGIN
tx, ty, ttx, tty: INTEGER;
wdt, wdtt,wof,wofp, ln, llx, lly: CARDINAL;
wdtt ← minWidthAr[wiringLev];
wof←((wdtt+lambdaGrid)/(2*lambdaGrid))*lambdaGrid;
wofp←wdtt-wof;
wdt ← wdtt*extend;
IF wiringOrn = 0 OR wiringOrn = 4 THEN
BEGIN
llx ← wdtt;
IF extend=0 THEN tty←yy ELSE
tty ← IF wclNy < yy THEN yy + wofp ELSE yy - wof;
ty ← MIN[wclNy, tty];
lly ← ln ← ABS[wclNy - tty];
ttx ← wclNx - wof;
IF wclNy = yy THEN
lp ← makeList[makeWire[wdt, wdtt, wiringLev],
ttx, yy, wiringOrn, 0]
ELSE lp ← makeList[makeWire[ln, wdtt, wiringLev],
ttx, ty, wiringOrn, 0];
wclNy ← yy;
END
ELSE
BEGIN
lly ← wdtt;
IF extend=0 THEN ttx←xx ELSE
ttx ← IF wclNx < xx THEN xx + wofp ELSE xx - wof;
tx ← MIN[wclNx, ttx];
llx ← ln ← ABS[wclNx - ttx];
tty ← wclNy - wof;
IF wclNx = xx THEN
lp ← makeList[makeWire[wdt, wdtt, wiringLev],
xx, tty, wiringOrn, 0]
ELSE lp ← makeList[makeWire[ln, wdtt, wiringLev],
tx, tty, wiringOrn, 0];
wclNx ← xx;
END;
wirePrevPnt ← lp;
wclLp ← lp;
wiringOrn ← (wiringOrn + 2) MOD 4;
masterList ← insertList[masterList, lp];
IF createSel THEN BEGIN selNewThing[masterList, lp, unSel]; END;
setWireParms[FALSE];
reDrawRect[getRect[lp], 1, TRUE, TRUE, FALSE];
END;
CmdTwerp:PUBLIC PROCEDURE[lookAtChr:keCheckProc] RETURNS[keyEvent] =
BEGIN
retn,xeq:BOOLEAN;
savedNoChange: BOOLEAN ← noChange;
DO
tmpCP: cmdEnt;
IF dChange THEN cChange ← bChange ← TRUE;
IF cChange OR bChange THEN
reDrawRect[[0, 0, 0, 0], 2, bChange, cChange, TRUE];
IF cChange THEN
BEGIN
IF wiring THEN
{IF busMaking THEN setBusParms[TRUE] ELSE setWireParms[TRUE]};
IF boxing THEN
BEGIN
x, y: INTEGER;
[, x, y, , ] ← cscaleRect[selMarkPnt.x, selMarkPnt.y, cClipx2 - 2, cClipy2 - 2];
setupBox[[x, y], TRUE];
END;
IF NOT bChange THEN redoCBBox[];
END;
IF NOT noChange THEN displayParameters[];
noChange ← dChange ← bChange ← cChange ← FALSE;
ppoutdefs.EnableBackup[];
ke ← getKchr[];
ppoutdefs.DisableBackup[];
[retn,xeq]←lookAtChr[ke];
ii ← IF BITAND[ke.ctl, 3]=0 THEN BITSHIFT[10B,BITSHIFT[ke.ctl,-2]]
ELSE BITSHIFT[1, (BITAND[ke.ctl, 3] - 1)];
tmpCP ← IF cellNameMode THEN CNcmdArray[ke.k] ELSE cmdArray[ke.k];
IF tmpCP = NIL OR NOT xeq THEN ignore[ke]
ELSE
BEGIN
noChange ← FALSE;
[bb, xx, yy] ← deScaledCursor[ke.mx, ke.my];
IF ke.k = 77B AND NOT bb THEN noBBbuttons[ke]
ELSE
FOR jj: CARDINAL IN [0..20) DO
IF BITAND[ii, tmpCP[jj].mask] # 0 THEN {tmpCP[jj].proc[ke]; EXIT};
ENDLOOP;
END;
IF retn THEN
BEGIN
noChange ← noChange AND savedNoChange;
RETURN[ke];
END;
ENDLOOP;
END;
fontNumber: CARDINAL←0;
fontNumberMax: CARDINAL = 3;
fontTable: ARRAY [0..fontNumberMax) OF POINTER TO StrikeFont =
[GetStrikeHandle["TimesRoman10"], GetStrikeHandle["Helvetica7"],
GetStrikeHandle["TimesRoman8"]];
setFont: PUBLIC cmdProc =
BEGIN
fontNumber ← fontNumber + 1;
IF fontNumber >= fontNumberMax THEN fontNumber ← 0;
fnt ← fontTable[fontNumber];
END;
fnt ← fontTable[0];
END.