-- ppcolset.mesa -- color setting module of silicon (pretty picture) program -- last modified by McCreight, December 13, 1982 2:49 PM DIRECTORY multiGraphicsDefs, InlineDefs, StringDefs, ppdefs, ppddefs; ppcolset: PROGRAM IMPORTS ppdefs, ppddefs, multiGraphicsDefs, InlineDefs EXPORTS ppdefs = BEGIN OPEN ppdefs, ppddefs, multiGraphicsDefs, InlineDefs; Buttons: TYPE = MACHINE DEPENDENT RECORD [ KeyPadAndGarbage: [0..10000B), Red: [0..1], Blu: [0..1], Yel: [0..1]]; mButs: POINTER TO Buttons = LOOPHOLE[177030B]; ke: keyEvent; quitflg: BOOLEAN _ FALSE; rAr: ARRAY [0..90] OF RECORD [x1, x2, y1, y2: INTEGER, ccc: CARDINAL]; rArCnt: CARDINAL _ 0; marked: BOOLEAN _ FALSE; i, k, j,cc: CARDINAL; x,y: INTEGER; lv:level; curcol: INTEGER _ 0; ystrt: INTEGER = 122; found: BOOLEAN; --color setting stuff: Ctab: ARRAY [0..7] OF CARDINAL _ [9, 1, 4, 2, 76B, 8, 11, 10]; mak: PROCEDURE [x, y, xs, ys: INTEGER, c: CARDINAL] = BEGIN rAr[rArCnt] _ [ x1: x - xs/2, x2: x + xs/2, y1: y - ys/2, y2: y + ys/2, ccc: c]; -- rAr[rArCnt]_[x1:x-xs/2,x2:x+xs/2,y1:y-ys/2,y2:y+ys/2,ccc:Ctab[l]]; rArCnt _ rArCnt + 1; END; ersScrn: PROCEDURE [w, x, y, z: INTEGER] = INLINE {ReplaceColorArea[x1: w, y1: x, x2: y, y2: z, c: 0]}; orAreaUS: PROCEDURE [w, x, y, z: INTEGER, l: CARDINAL] = BEGIN gray: GrayPattern _ GetColorGray[l]; SetColorArea[x1: w, y1: x, x2: y, y2: z, fn: IF l IN [8..15] THEN replace ELSE paint, cGray: @gray]; -- SetGrayLevel[l]; -- PutGray[w,x,y,z]; END; makCross: PROCEDURE [x, y, bsiz, siz1, siz2, col1, col2: INTEGER] = BEGIN mak[x, y, bsiz*2, siz1*2, col1]; mak[x, y, siz2*2, bsiz*2, col2]; END; initColors: PUBLIC PROCEDURE = BEGIN rArCnt _ 0; k_15; FOR lv IN level DO mak[k,450,20,20,orLtab[lv]]; mak[k,390,14,14,BITAND[orLtab[lv],15]]; mak[k,420,14,14,BITAND[BITSHIFT[orLtab[lv],-4],15]]; k_k+30; ENDLOOP; FOR i IN [0..1] DO FOR j IN [0..7] DO mak[55 + j*55, 40 + i*55, 35, 35, i*8 + j]; ENDLOOP; ENDLOOP; makCross[100, 180, 30, 8, 12, 1, 2]; makCross[300, 180, 30, 8, 12, 4, 2]; makCross[200, 250, 30, 16, 8, 1, 4]; mak[298, 300, 40, 8, 4]; mak[322, 300, 40, 8, 1]; mak[310, 285, 12, 40, 2]; mak[100, 330, 16, 16, 3]; mak[100, 330, 8, 8, 9]; mak[130, 330, 16, 16, 6]; mak[130, 330, 8, 8, 9]; mak[160, 322, 16, 8, 6]; mak[160, 328, 16, 4, 7]; mak[160, 336, 16, 12, 3]; mak[160, 330, 8, 16, 9]; END; setColors: PUBLIC PROCEDURE = BEGIN savGrid: CARDINAL _ gridCol; gridCol _ 1; quitflg _ FALSE; ke.k _ 65B; UNTIL quitflg DO IF ke.k = 32B OR ke.k = 56B THEN quitflg _ TRUE; IF ke.k = 77B AND ke.ctl = 1 THEN -- red button push BEGIN IF curx IN [405..470] AND cury IN [ystrt - 10..ystrt + 265] THEN BEGIN j _ (curx - 400)/25; k _ IF cury < ystrt THEN 0 ELSE cury - ystrt; IF k > 255 THEN k _ 255; setGlev[curcol, j, k]; WHILE mButs.Red = 0 DO IF curx < 400 OR curx > 475 OR cury < ystrt - 30 THEN LOOP; j _ (curx - 400)/25; k _ IF cury < ystrt THEN 0 ELSE cury - ystrt; IF k > 255 THEN k _ 255; setGlev[curcol, j, k]; ENDLOOP; ersScrn[410, ystrt - 1, 472, ystrt + 260]; FOR i IN [0..2] DO j _ i; IF i = 0 THEN j _ 4; k _ getCurrenColor[curcol, i]; orAreaUS[412 + i*25, ystrt, 418 + i*25, ystrt + 255, j]; orAreaUS[410 + i*25, ystrt + k, 420 + i*25, ystrt + k, 10]; ENDLOOP; END ELSE IF cury IN [412..428] THEN BEGIN k_curx/30; ke.k_65B; lv_FIRST[level]; IF k>15 THEN k_15; THROUGH [0..k) DO lv_SUCC[lv];ENDLOOP; k_orLtab[lv]; orLtab[lv]_IF k>255 OR k<16 THEN BITOR[BITAND[k,17B],20B] ELSE IF BITAND[k,60B]=60B THEN BITOR[BITOR[ BITAND[k,17B],BITSHIFT[BITAND[k,17B],4]],1000B] ELSE k+20B; END; END; IF ke.k = 77B AND ke.ctl = 3 THEN -- blue button push BEGIN j _ 0; found _ FALSE; FOR i IN [0..rArCnt) DO IF curx IN [rAr[i].x1..rAr[i].x2] AND cury IN [rAr[i].y1..rAr[i].y2] THEN BEGIN found _ TRUE; k _ rAr[i].ccc; IF k < 9 THEN j _ BITOR[j, k] ELSE BEGIN j _ k; EXIT; END; END; ENDLOOP; IF found AND j<16 THEN BEGIN curcol _ j; ersScrn[410, ystrt - 1, 472, ystrt + 260]; ersScrn[480, ystrt, 520, ystrt+40]; orAreaUS[480, ystrt, 520, ystrt+40, curcol]; FOR i IN [0..2] DO j _ i; IF i = 0 THEN j _ 4; k _ getCurrenColor[curcol, i]; orAreaUS[412 + i*25, ystrt, 418 + i*25, ystrt + 255, j]; orAreaUS[410 + i*25, ystrt + k, 420 + i*25, ystrt + k, 10]; ENDLOOP; END; END; IF ke.k = 77B AND ke.ctl = 2 THEN -- yellow butn BEGIN ke.k_65B; j _ 0; found _ FALSE; FOR i IN [0..rArCnt) DO IF curx IN [rAr[i].x1..rAr[i].x2] AND cury IN [rAr[i].y1..rAr[i].y2] THEN BEGIN found _ TRUE; k _ rAr[i].ccc; IF k < 9 THEN j _ BITOR[j, k] ELSE BEGIN j _ k; EXIT; END; END; ENDLOOP; IF found AND j<16 THEN BEGIN WHILE mButs.Yel = 0 DO x_curx;y_cury; ENDLOOP; cc_j; j _ 0; found _ FALSE; FOR i IN [0..rArCnt) DO IF x IN [rAr[i].x1..rAr[i].x2] AND y IN [rAr[i].y1..rAr[i].y2] THEN BEGIN found _ TRUE; k _ rAr[i].ccc; IF k < 9 THEN j _ BITOR[j, k] ELSE BEGIN j _ k; EXIT; END; END; ENDLOOP; IF found AND j<16 THEN BEGIN IF y<380 THEN BEGIN FOR i IN [0..2] DO setGlev[j, i, getCurrenColor[cc, i]]; ENDLOOP; END ELSE BEGIN lv_FIRST[level]; k_x/30; IF k>15 THEN k_15; THROUGH [0..k) DO lv_SUCC[lv];ENDLOOP; k_BITOR[orLtab[lv],1000B]; orLtab[lv]_IF y<405 THEN BITOR[BITAND[k,177760B],cc] ELSE BITOR[BITAND[k,177417B],BITSHIFT[cc,4]]; END; END; END; END; IF ke.k = 65B THEN -- esc or yellow butn BEGIN ersScrn[0, 0, 700, 700]; i_0; FOR lv IN level DO k_orLtab[lv]; rAr[i].ccc_k; rAr[i+1].ccc_BITAND[k,15]; rAr[i+2].ccc_IF k>255 THEN BITAND[BITSHIFT[k,-4],15] ELSE k; i_i+3; ENDLOOP; FOR i IN [0..rArCnt) DO orAreaUS[rAr[i].x1, rAr[i].y1, rAr[i].x2, rAr[i].y2, rAr[i].ccc]; ENDLOOP; FOR i IN [0..2] DO j _ i; IF i = 0 THEN j _ 4; k _ getCurrenColor[curcol, i]; orAreaUS[412 + i*25, ystrt, 418 + i*25, ystrt + 255, j]; orAreaUS[410 + i*25, ystrt + k, 420 + i*25, ystrt + k, 10]; ENDLOOP; orAreaUS[480, ystrt, 520, ystrt+40, curcol]; END; IF NOT quitflg THEN ke _ getchr[]; ENDLOOP; anyCTChanges _ TRUE; gridCol _ savGrid; colPatternTabs[currentPattern]_orLtab; END; END.