-- keyboard interrupt routines for silicon (pretty picture) program -- modified by McCreight, January 4, 1983 2:58 PM DIRECTORY ppddefs, ppdddefs,ppdefs, multiGraphicsDefs, InlineDefs, SystemDefs; ppccur: MONITOR IMPORTS ppdefs,ppddefs, multiGraphicsDefs,InlineDefs EXPORTS ppdddefs = BEGIN OPEN InlineDefs, ppdefs, ppdddefs,ppddefs, multiGraphicsDefs; wiring, boxing: PUBLIC BOOLEAN; wireCol: level; wireWidth: INTEGER; oldboxing, oldwiring, wireFlipped: BOOLEAN ← FALSE; oldwx, oldwy, oldbx, oldby,veryOldSpac,oldSpac: INTEGER; wirePnt, boxPnt: Point; wireOrn: orientation; tempwireOffset: INTEGER; -- for temp busses: bussing: BOOLEAN←FALSE; wpOffx, wpOffy, cornSpac, bCnt: INTEGER; dx1, dy1, dx2, dy2, cx, cy: INTEGER; cSize: INTEGER; colCursPnt: POINTER TO Bitmap; ccOn, gotARect, ccHidden: BOOLEAN; initCcurse: PUBLIC PROCEDURE [size: CARDINAL, cp: POINTER TO Bitmap] = BEGIN cSize ← size; ccOn ← gotARect ← ccHidden ← FALSE; colCursPnt ← cp; wiring ← boxing ← FALSE; END; gonnaDoCrect: PUBLIC ENTRY PROCEDURE [x1, y1, x2, y2: INTEGER] = BEGIN dx1 ← x1; dy1 ← y1; dx2 ← x2; dy2 ← y2; gotARect ← TRUE; IF NOT ccOn THEN RETURN; IF overlap[] THEN BEGIN ccHidden ← TRUE; XorColorBitmap[colCursPnt, cx, cy]; END; END; doneCrect: PUBLIC ENTRY PROCEDURE = BEGIN gotARect ← FALSE; IF NOT ccOn THEN RETURN; IF ccHidden THEN XorColorBitmap[colCursPnt, cx, cy]; ccHidden ← FALSE; END; drawColorCurs: PUBLIC ENTRY PROCEDURE [x, y: INTEGER] = BEGIN IF ccOn AND NOT ccHidden THEN XorColorBitmap[colCursPnt, cx, cy]; cx ← x; cy ← y; IF gotARect AND overlap[] THEN ccHidden ← TRUE ELSE BEGIN ccHidden ← FALSE; XorColorBitmap[colCursPnt, cx, cy]; END; ccOn ← TRUE; END; undrawColorCurs: PUBLIC ENTRY PROCEDURE = BEGIN IF ccOn AND NOT ccHidden THEN XorColorBitmap[colCursPnt, cx, cy]; ccOn ← FALSE; END; overlap: PROCEDURE RETURNS [BOOLEAN] = BEGIN IF cx > dx2 OR cy > dy2 OR cx + cSize < dx1 OR cy + cSize < dy1 THEN RETURN[FALSE]; RETURN[TRUE]; END; drawTempWire: PROCEDURE [x1, y1, x2, y2: INTEGER] = BEGIN wdt: INTEGER ← wireWidth-tempwireOffset; t: INTEGER; a, c: CARDINAL; IF x1 = x2 THEN BEGIN x1 ← x1 - tempwireOffset; x2 ← x1 + wireWidth; IF y1 < y2 THEN y2 ← y2 + wdt ELSE BEGIN t ← y1; y1 ← y2 - tempwireOffset; y2 ← t; END; END ELSE IF y1 = y2 THEN BEGIN y1 ← y1 - tempwireOffset; y2 ← y1 + wireWidth; IF x1 < x2 THEN x2 ← x2 + wdt ELSE BEGIN t ← x1; x1 ← x2 - tempwireOffset; x2 ← t; END; END; a←BITAND[orLtab[wireCol],377B]; c←BITOR[a,BITSHIFT[a,8]]; a←BITOR[c,4000B]; [[x1: x1, y1: y1, x2: x2, y2: y2]] ← ClipRect[ [x1: x1, y1: y1, x2: x2, y2: y2], [x1: 0, y1: 0, x2: xColorMax, y2: yColorMax]]; IF x1<=x2 AND y1<=y2 THEN PutColorTemp[x1: x1, y1: y1, x2: x2, y2: y2, gray: [a, 0, c, 0, a, 0, c]]; END; doTemps: PUBLIC PROCEDURE = BEGIN q,qq:INTEGER; IF wiring THEN BEGIN IF oldwiring AND (oldwx # curx OR oldwy # cury) THEN reDrawRect[getERect[], 1, FALSE, TRUE, FALSE]; IF wireOrn = 0 OR wireOrn = 4 THEN BEGIN drawTempWire[wirePnt.x, wirePnt.y, wirePnt.x, cury]; drawTempWire[curx, cury, wirePnt.x, cury]; IF bussing THEN BEGIN q←IF curx>wirePnt.x THEN cornSpac ELSE -cornSpac; IF cury>wirePnt.y THEN q←-q; drawTempWire[wirePnt.x+wpOffx, wirePnt.y+wpOffy, wirePnt.x+wpOffx, cury+q]; drawTempWire[curx, cury+q, wirePnt.x+wpOffx, cury+q]; q←q*bCnt; qq←wpOffx*bCnt; drawTempWire[wirePnt.x+qq, wirePnt.y+wpOffy*bCnt, wirePnt.x+qq, cury+q]; drawTempWire[curx, cury+q, wirePnt.x+qq, cury+q]; END; END ELSE BEGIN drawTempWire[wirePnt.x, wirePnt.y, curx, wirePnt.y]; drawTempWire[curx, cury, curx, wirePnt.y]; IF bussing THEN BEGIN q←IF cury>wirePnt.y THEN cornSpac ELSE -cornSpac; IF curx>wirePnt.x THEN q←-q; drawTempWire[wirePnt.x+wpOffx, wirePnt.y+wpOffy, curx+q, wirePnt.y+wpOffy]; drawTempWire[curx+q, cury, curx+q, wirePnt.y+wpOffy]; q←q*bCnt; qq←wpOffy*bCnt; drawTempWire[wirePnt.x+wpOffx*bCnt, wirePnt.y+qq, curx+q, wirePnt.y+qq]; drawTempWire[curx+q, cury, curx+q, wirePnt.y+qq]; END; END; oldwx ← curx; oldwy ← cury; oldSpac←q; veryOldSpac←qq; oldwiring ← TRUE; END; IF oldwiring AND NOT wiring THEN BEGIN reDrawRect[ cannonRect[[wirePnt.x, wirePnt.y, oldwx, oldwy]], 1, FALSE, TRUE, FALSE]; oldwiring ← FALSE; END; IF boxing THEN BEGIN white: Color = 15; r: Rect = cannonRect[[x1: boxPnt.x, y1: boxPnt.y, x2: curx, y2: cury]]; IF oldboxing AND (oldbx # curx OR oldby # cury) THEN unBox[]; ReplaceColorArea[x1: r.x1, y1: r.y1, x2: r.x1, y2: r.y2, c: white]; ReplaceColorArea[x1: r.x1, y1: r.y1, x2: r.x2, y2: r.y1, c: white]; ReplaceColorArea[x1: r.x2, y1: r.y1, x2: r.x2, y2: r.y2, c: white]; ReplaceColorArea[x1: r.x1, y1: r.y2, x2: r.x2, y2: r.y2, c: white]; oldbx ← curx; oldby ← cury; oldboxing ← TRUE; END; IF oldboxing AND NOT boxing THEN unBox[]; END; getERect: PROCEDURE RETURNS [r: Rect] = BEGIN wd: INTEGER ← wireWidth-tempwireOffset; two: INTEGER ← tempwireOffset; IF bussing THEN IF oldSpac<0 THEN two←two-oldSpac ELSE wd←wd+oldSpac; IF wireFlipped THEN BEGIN r ← cannonRect[[wirePnt.x, wirePnt.y, oldwx, oldwy]]; r.x1 ← r.x1 - two; r.y1 ← r.y1 - two; r.x2 ← r.x2 + wd; r.y2 ← r.y2 + wd; wireFlipped ← FALSE; END ELSE IF wireOrn = 0 OR wireOrn = 4 THEN BEGIN r.x1 ← MIN[(IF bussing AND veryOldSpac<0 THEN wirePnt.x+veryOldSpac ELSE wirePnt.x), oldwx] - tempwireOffset; r.x2 ← MAX[(IF bussing AND veryOldSpac>0 THEN wirePnt.x+veryOldSpac ELSE wirePnt.x), oldwx] + wireWidth-tempwireOffset; IF wirePnt.y < oldwy THEN BEGIN r.y1 ← MIN[oldwy, MAX[wirePnt.y, cury]] - two; r.y2 ← oldwy + wd; END ELSE BEGIN r.y2 ← MAX[oldwy, MIN[wirePnt.y, cury]] + wd; r.y1 ← oldwy - two; END; END ELSE BEGIN r.y1 ← MIN[(IF bussing AND veryOldSpac<0 THEN wirePnt.y+veryOldSpac ELSE wirePnt.y), oldwy] - tempwireOffset; r.y2 ← MAX[(IF bussing AND veryOldSpac>0 THEN wirePnt.y+veryOldSpac ELSE wirePnt.y), oldwy] + wireWidth-tempwireOffset; IF wirePnt.x < oldwx THEN BEGIN r.x1 ← MIN[oldwx, MAX[wirePnt.x, curx]] - two; r.x2 ← oldwx + wd; END ELSE BEGIN r.x2 ← MAX[oldwx, MIN[wirePnt.x, curx]] + wd; r.x1 ← oldwx - two; END; END; [r.x1, r.y1] ← deScale[r.x1, r.y1]; [r.x2, r.y2] ← deScale[r.x2, r.y2]; END; unBox: PROCEDURE = BEGIN x1, y1, x2, y2: INTEGER; r: Rect; r ← cannonRect[[oldbx, oldby, boxPnt.x, boxPnt.y]]; [x1, y1] ← deScale[r.x1, r.y1]; [x2, y2] ← deScale[r.x2, r.y2]; reDrawRect[[x1, y1, x1, y2], 1, FALSE, TRUE, FALSE]; reDrawRect[[x1, y1, x2, y1], 1, FALSE, TRUE, FALSE]; reDrawRect[[x2, y1, x2, y2], 1, FALSE, TRUE, FALSE]; reDrawRect[[x1, y2, x2, y2], 1, FALSE, TRUE, FALSE]; oldboxing ← FALSE; END; deScale: PROCEDURE [x, y: INTEGER] RETURNS [INTEGER, INTEGER] = BEGIN IF x > colWidth THEN x←colWidth; IF y > colHeight THEN y←colHeight; IF x < 0 THEN x←0; IF y < 0 THEN y←0; RETURN[(x*cScaleD)/cScaleN - cxoff, (y*cScaleD)/cScaleN - cyoff]; END; setupTempWires: PUBLIC PROCEDURE [ p: Point, o: orientation, col:level, wid,cornerOffset:INTEGER, bigChange: BOOLEAN] = BEGIN wirePnt ← p; IF wiring AND wireOrn # o THEN wireFlipped ← TRUE; IF NOT wiring THEN wireFlipped ← FALSE; wireOrn ← o; wireCol ← col; wireWidth ← wid; wiring ← TRUE; bussing ← FALSE; tempwireOffset ← cornerOffset; IF bigChange THEN oldwiring ← FALSE; END; setupBox: PUBLIC PROCEDURE [p: Point, bigChange: BOOLEAN] = BEGIN boxPnt ← p; boxing ← TRUE; IF bigChange THEN oldboxing ← FALSE; END; setupTempBus: PUBLIC PROCEDURE [ p: Point, o: orientation, col:level, wid,cornerOffset:INTEGER, bigChange: BOOLEAN, strtOffx,strtOffy,cornerOff,count:INTEGER] = BEGIN wirePnt ← p; IF wiring AND wireOrn # o THEN wireFlipped ← TRUE; IF NOT wiring THEN wireFlipped ← FALSE; wireOrn ← o; wireCol ← col; wireWidth ← wid; wiring ← TRUE; bussing ← TRUE; tempwireOffset ← cornerOffset; IF bigChange THEN oldwiring ← FALSE; wpOffx←strtOffx; wpOffy←strtOffy; cornSpac←cornerOff; bCnt←count-1; IF wireOrn = 0 OR wireOrn = 4 THEN BEGIN IF strtOffx<0 THEN cornSpac←-cornSpac;END ELSE BEGIN IF strtOffy<0 THEN cornSpac←-cornSpac;END; END; XorColorBitmap: PROC [source: BitmapPtr, x, y: INTEGER] = INLINE {SetColorFromSource[source: source, x: x, y: y, fn: invert]}; END.