-- variables for command interpreter part of silicon (pretty picture) program -- created by Petit, September 23, 1981 3:44 PM -- last modified by McCreight, October 17, 1982 3:48 PM DIRECTORY InlineDefs, StringDefs, ppoutdefs, ppdddefs,ppddefs, ppdefs, ppMainDefs; ppmain3: PROGRAM IMPORTS ppdddefs, ppdefs, ppddefs, ppMainDefs, InlineDefs EXPORTS ppMainDefs,ppddefs = PUBLIC BEGIN OPEN ppdefs, ppddefs, ppdddefs,ppoutdefs, StringDefs, InlineDefs, ppMainDefs; busMaking:BOOLEAN_FALSE; bmCount,bm2dx,bm2dy,bmNews:INTEGER; minSpaceAr:ARRAY[0..7] OF INTEGER = [2,6,4,6,2,2,2,2]; wClosestDisp: BOOLEAN _ FALSE; wirePrevPnt: LONG POINTER TO list; wiringLev: level; wiringOrnSet: BOOLEAN _ FALSE; moving: BOOLEAN _ FALSE; copying: BOOLEAN _ FALSE; areaSel: BOOLEAN _ FALSE; moveMarked: BOOLEAN _ FALSE; markx, marky: INTEGER; wclLp: LONG POINTER TO list; wclNx, wclNy, oldNx, oldNy: INTEGER; currentLevel: level _ cut; curcol: INTEGER _ 0; insertList: PROCEDURE [mp, lp: LONG POINTER TO list] RETURNS [LONG POINTER TO list] = BEGIN lp^.nxt _ mp; RETURN[lp]; END; doAlter: cmdProc = BEGIN found,top:BOOLEAN_FALSE; l,w,dl,dw,wNum,wl1,wl2:INTEGER; pt:parmType; r: Rect; IF NOT bb THEN RETURN; FOR lp: listPtr _ masterList, lp.nxt WHILE lp # NIL DO IF NOT lp.selected OR NOT lp.ob.p.inMe[lp.ob, markPnt.x - lp.lx, markPnt.y - lp.ly, lp.idx] THEN LOOP; SELECT lp.ob.otyp FROM cont, xstr => BEGIN IF lp.ob.otyp=cont AND (LOOPHOLE[lp.ob,LONG POINTER TO cont object].typ)#burr THEN LOOP; found_TRUE; IF BITAND[lp.idx,4]=0 THEN BEGIN l_markPnt.y-lp.ly;dl_yy-markPnt.y; w_markPnt.x-lp.lx;dw_xx-markPnt.x; END ELSE BEGIN w_markPnt.y-lp.ly;dw_yy-markPnt.y; l_markPnt.x-lp.lx;dl_xx-markPnt.x; END; IF l>1 THEN BEGIN l_lp.ob.size[1]-l;dl_-dl;END; IF w>1 THEN BEGIN w_lp.ob.size[0]-w;dw_-dw;END; IF (l>1 AND w>1) OR l=w THEN RETURN; IF l BEGIN dNum,do:INTEGER; ob:LONG POINTER TO bus object; [wNum,found,wl1,wl2,w,l,dw,dl]_findWhichWire[lp]; IF NOT found THEN LOOP; anyChanges _ sinceIOchanges _ TRUE; top_l-wl1 <= wl2-l; ob_LOOPHOLE[lp.ob]; r_getRect[lp]; IF dl=0 THEN BEGIN -- peg that wire in place IF top THEN ob.tWhich_wNum ELSE ob.bWhich_wNum; RETURN; END; dNum_IF top THEN ob.tWhich ELSE ob.bWhich; IF wNum=dNum THEN BEGIN IF top THEN do_-dl ELSE do_dl; ob.firstLength_ob.firstLength+do; IF ob.firstLength<=0 THEN ob.firstLength_1; END ELSE BEGIN do_IF dl>=0 THEN (dl+ABS[dNum-wNum]-1)/(wNum-dNum) ELSE (dl-ABS[dNum-wNum]+1)/(wNum-dNum); IF top THEN BEGIN ob.topIncr_ob.topIncr+do; ob.lenIncr_ob.lenIncr-do; ob.firstLength_ob.firstLength+do*dNum; END ELSE BEGIN ob.lenIncr_ob.lenIncr+do; ob.firstLength_ob.firstLength-do*dNum; END; END; wl1_ob.lenIncr+ob.topIncr;--binc ob.offsetFirst _ IF ob.topIncr>=0 THEN 0 ELSE (1-ob.wCnt)*ob.topIncr; l_IF wl1>0 THEN ob.offsetFirst+ob.firstLength+(ob.wCnt-1)*wl1 ELSE ob.offsetFirst+ob.firstLength; dl_ob.size[1]-l; ob.size[1]_l; SELECT lp.idx FROM 0,1,2,3 => BEGIN IF top THEN lp.ly_lp.ly+dl;END; 4,6,13,15 => BEGIN IF NOT top THEN lp.lx_lp.lx+dl;END; 5,7,12,14 => BEGIN IF top THEN lp.lx_lp.lx+dl;END; 8,9,10,11 => BEGIN IF NOT top THEN lp.ly_lp.ly+dl;END; ENDCASE; r _ mergeRects[getRect[lp], r]; reDrawRect[r, 1, TRUE, TRUE, FALSE]; RETURN; END; ENDCASE => NULL; ENDLOOP; IF NOT found THEN RETURN; FOR lp: listPtr _ masterList, lp.nxt WHILE lp # NIL DO IF lp.selected AND (lp.ob.otyp = xstr OR lp.ob.otyp=cont) THEN BEGIN r _ getRect[lp]; IF lp.ob.p.setParm[lp, pt, dl, 1, TRUE] THEN BEGIN anyChanges _ sinceIOchanges _ TRUE; r _ mergeRects[getRect[lp], r]; reDrawRect[r, 1, TRUE, TRUE, FALSE]; END; END; ENDLOOP; IF NOT wiring THEN putMark[xx, yy]; END; doWAlter: cmdProc = BEGIN wNum,dNum,wl1,wl2,l,w,dl,dw,do:INTEGER; r: Rect; top,found:BOOLEAN; IF NOT bb THEN RETURN; FOR lp: listPtr _ masterList, lp.nxt WHILE lp # NIL DO IF NOT lp.selected OR NOT lp.ob.p.inMe[lp.ob,markPnt.x-lp.lx, markPnt.y - lp.ly, lp.idx] THEN LOOP; WITH ob: lp.ob SELECT FROM bus => BEGIN [wNum,found,wl1,wl2,w,l,dw,dl]_findWhichWire[lp]; IF NOT found THEN LOOP; anyChanges _ sinceIOchanges _ TRUE; top_l-wl1 <= wl2-l; r_getRect[lp]; dNum_IF top THEN ob.tWhich ELSE ob.bWhich; IF wNum=dNum THEN RETURN; do_IF dw>=0 THEN (dw+ABS[dNum-wNum]-1)/(wNum-dNum) ELSE (dw-ABS[dNum-wNum]+1)/(wNum-dNum); l_ob.wspace+do; IF l<=0 THEN l_1; dl_l-ob.wspace; ob.wspace_l; ob.size[0]_ob.size[2]_(ob.wCnt-1)*l+ob.wwidth; SELECT lp.idx FROM 0,2,9,11 => BEGIN lp.lx_lp.lx-dl*dNum;END; 1,3,8,10 => BEGIN lp.lx_lp.lx-dl*(ob.wCnt-dNum-1);END; 4,5,6,7 => BEGIN lp.ly_lp.ly-dl*dNum;END; 12,13,14,15 => BEGIN lp.ly_lp.ly-dl*(ob.wCnt-dNum-1);END; ENDCASE; r _ mergeRects[getRect[lp], r]; reDrawRect[r, 1, TRUE, TRUE, FALSE]; RETURN; END; -- wire => -- BEGIN -- END; ENDCASE => NULL; ENDLOOP; END; doImplSel: cmdProc = BEGIN IF wiring AND busMaking THEN BEGIN bmCount_bmCount+1; setBusParms[FALSE]; RETURN; END; doParmSel[count, FALSE, TRUE, 1, 1]; END; doUnImplSel: cmdProc = BEGIN IF wiring AND busMaking THEN BEGIN bmCount_MAX[1,bmCount-1]; setBusParms[FALSE]; RETURN; END; doParmSel[count, TRUE, FALSE, -1, 1]; END; doImplPnt: cmdProc = BEGIN IF NOT bb THEN RETURN; doParmPnt[count, TRUE, TRUE, (IF BITAND[k.ctl,20B]=0 THEN 1 ELSE -1), 1]; END; END.