DIRECTORY BitBlt, ViewerOps, CKViewerButtons, ColorDisplay, MessageWindow, Inline, Process USING [MsecToTicks, Pause]; CKViewerOps: PROGRAM IMPORTS BitBlt, ColorDisplay, Inline, Process, MessageWindow, ViewerOps EXPORTS CKViewerButtons = BEGIN OPEN MW: MessageWindow; CKViewer: TYPE = CKViewerButtons.CKViewer; CKViewerState: TYPE = CKViewerButtons.CKViewerState; sym: BOOLEAN _ FALSE; bbspace: BitBlt.BBTableSpace; bb: BitBlt.BBptr _ InitBB[@bbspace]; grayword: CARDINAL _ 0; bitmap,bitmapB: LONG POINTER _ NIL; wpl,wplB: CARDINAL _ 0; width,height: CARDINAL _ 0; lbpp,lbppB: CARDINAL _ 0; -- log (base 2) bits per pixel bpp,bppB: CARDINAL _ 0; -- bits per pixel full: BOOLEAN _ FALSE; ashow,bshow: BOOLEAN _ TRUE; splat: BOOLEAN _ TRUE; test: BOOLEAN _ FALSE; neg: BOOLEAN _ FALSE; cornerSize: CARDINAL _ 4; cornerColor: CARDINAL _ 8; Triple: TYPE = RECORD[r,g,b: [0..256)]; testmap: ARRAY[0..8] OF Triple _ [ [127,127,127], -- gray (background) [ 0, 0, 0], -- black [255, 0, 0], -- red [ 0,255, 0], -- green [255,255, 0], -- yellow [ 0, 0,255], -- blue [255, 0,255], -- magenta [ 0,255,255], -- cyan [255,255,255] -- white ]; ShowTPat: PROC = { x: CARDINAL = 60; h: CARDINAL = 60; w: CARDINAL = 50; gap: CARDINAL = 15; IF NOT full THEN { FOR i: CARDINAL IN[0..9) DO ColorDisplay.SetColor[pixelA: i, r: testmap[i].r, g: testmap[i].g, b: testmap[i].b]; ENDLOOP; ColorDisplay.Show[TRUE,FALSE,FALSE]; }; Rect[0,0,width,height,0]; { s: CARDINAL = cornerSize; c: CARDINAL = cornerColor; -- color Rect[0,0,s,s,c]; Rect[width-s,0,s,s,c]; Rect[0,height-s,s,s,c]; Rect[width-s,height-s,s,s,c]; }; FOR i: CARDINAL IN[0..8) DO r,g,b: [0..256); r _ (i MOD 2)*255; g _ ((i/2) MOD 2)*255; b _ ((i/4) MOD 2)*255; Rect[4,i*h+10,x,h-20,i+1]; ENDLOOP; FOR i: CARDINAL IN[0..8) DO r,g,b: [0..256); r _ (i MOD 2)*255; g _ ((i/2) MOD 2)*255; b _ ((i/4) MOD 2)*255; Rect[x+i*w+gap,0,w-gap,8*h,i+1]; ENDLOOP; }; Rect: PROC[x,y,w,h: CARDINAL, i: [0..8]] = { IF NOT (x width DO Rect[xx, 0, vThick, height, white]; ENDLOOP; FOR v: CARDINAL _ 0, v+vStep UNTIL v > height DO Rect[0, v, width, hThick ,white]; ENDLOOP; }; ShowBigRed,ShowSmallRed: PROCEDURE [] = { MW.Append[message: "RedScreen NOT IMPLEMENTED !!", clearFirst: TRUE]; MW.Blink[]; }; ShowBigGreen,ShowSmallGreen: PROCEDURE [] = { MW.Append[message: "GreenScreen NOT IMPLEMENTED !!", clearFirst: TRUE]; MW.Blink[]; }; ShowBigBlue,ShowSmallBlue: PROCEDURE [] = { MW.Append[message: "BlueScreen NOT IMPLEMENTED !!", clearFirst: TRUE]; MW.Blink[]; }; ShowCBars: PROCEDURE [] = { MW.Append[message: "ShowCBars NOT IMPLEMENTED !!", clearFirst: TRUE]; MW.Blink[]; }; NextRoll: PROCEDURE [] = { r,g,b,r0,g0,b0: [0..256); [r0,g0,b0] _ ColorDisplay.GetColor[0]; FOR i: CARDINAL IN[0..255) DO [r,g,b] _ ColorDisplay.GetColor[i+1]; ColorDisplay.SetColor[i,0,r,g,b]; ENDLOOP; ColorDisplay.SetColor[255,0,r0,g0,b0]; Wait[100]; }; NextScramble: PROCEDURE [] = { SetUpColors; Wait[200]; }; SetBackground: PROCEDURE [v: INTEGER] = BEGIN background _ v; ColorDisplay.SetColor[0, 0, v, v, v]; END; background: INTEGER _ 255; -- initially white ClearScreen: PROCEDURE = { IF NOT full THEN { ColorDisplay.SetColor[0, 0, background, background, background]; SetGray[0] }; Rectangle[0,0,width,height]; }; Wait: PROCEDURE[millisecs: CARDINAL] = INLINE { Process.Pause[Process.MsecToTicks[millisecs]] }; defaultSeed: CARDINAL = 27183; numCalls: INTEGER = 3; a: ARRAY [0..55] OF CARDINAL; p: INTEGER [0..55]; InitRandom: PUBLIC PROC[seed: INTEGER] RETURNS[INTEGER] = { minSeed: CARDINAL = LAST[CARDINAL]/10; g, gPrev, gSave: CARDINAL; IF seed<=0 THEN seed _ defaultSeed; WHILE seed max THEN ERROR; intervalLen _ max - min + 1; --is 0 when min=0, max=LAST[CARDINAL] IF intervalLen = 0 THEN RETURN[Random[]]; DO r, rem: CARDINAL; p _ p-1; IF p=0 THEN { RandomGen[]; p _ 55 }; r _ a[p]; rem _ r MOD intervalLen; IF (r - rem) > LOOPHOLE[-LOOPHOLE[intervalLen,INTEGER],CARDINAL] THEN LOOP; RETURN[min + rem]; ENDLOOP; };--Choose SetLogBitsPerPixel: PROC[n: [0..4)] RETURNS[BOOLEAN] = { b: CARDINAL _ Inline.BITSHIFT[1,n]; mode: ColorDisplay.Mode _ [FALSE,b,1]; IF NOT ColorDisplay.HasMode[mode] THEN { mode.bitsPerPixelB _ 0; IF NOT ColorDisplay.HasMode[mode] THEN RETURN[FALSE]; }; IF NOT ColorDisplay.SetMode[mode] THEN ERROR; lbpp _ n; bpp _ b; full _ FALSE; lbppB _ 0; bppB _ 1; ashow _ bshow _ TRUE; width _ ColorDisplay.width; height _ ColorDisplay.height; bitmap _ ColorDisplay.baseA; wpl _ ColorDisplay.wplA; bitmapB _ ColorDisplay.baseB; wplB _ ColorDisplay.wplB; ClearScreen; SetUpColors; ColorDisplay.TurnOn[]; RETURN[TRUE]; }; Set24BitsPerPixel: PROC = { mode: ColorDisplay.Mode _ [TRUE,0,0]; IF NOT ColorDisplay.HasMode[mode] THEN RETURN; IF NOT ColorDisplay.SetMode[mode] THEN ERROR; lbpp _ 0; bpp _ 0; full _ TRUE; bitmap _ NIL; bitmapB _ NIL; wpl _ 0; ashow _ bshow _ TRUE; width _ ColorDisplay.width; height _ ColorDisplay.height; IF test THEN { ShowTPat[]; test _ FALSE } ELSE ClearScreen; ColorDisplay.TurnOn[]; }; Go: PUBLIC PROC [ckViewer: CKViewer] = { [] _ InitRandom[0]; SELECT TRUE FROM SetLogBitsPerPixel[3] => NULL; SetLogBitsPerPixel[2] => NULL; ENDCASE => { MW.Append[message: "NO COLOR DISPLAY !!", clearFirst: TRUE]; MW.Blink[]; RETURN; }; DO IF ckViewer.state.quit THEN { ClearScreen; ViewerOps.DestroyViewer[ckViewer.container]; []_ColorDisplay.SetMode[ColorDisplay.disconnected]; EXIT; }; IF ckViewer.state.bpp=1 AND bpp#1 THEN { [] _ SetLogBitsPerPixel[0]; IF NOT splat THEN test _ TRUE }; IF ckViewer.state.bpp=2 AND bpp#2 THEN { [] _ SetLogBitsPerPixel[1]; IF NOT splat THEN test _ TRUE }; IF ckViewer.state.bpp=4 AND bpp#4 THEN { [] _ SetLogBitsPerPixel[2]; IF NOT splat THEN test _ TRUE }; IF ckViewer.state.bpp=8 AND bpp#8 THEN { [] _ SetLogBitsPerPixel[3]; IF NOT splat THEN test _ TRUE }; IF ckViewer.state.bpp=24 AND NOT full THEN { Set24BitsPerPixel[]; IF NOT splat THEN test _ TRUE }; IF ckViewer.state.aToggle THEN { ashow _ NOT ashow; ColorDisplay.Show[ashow,bshow,TRUE]; ckViewer.state.aToggle _ FALSE}; IF ckViewer.state.bToggle THEN { bshow _ NOT bshow; ColorDisplay.Show[ashow,bshow,TRUE]; ckViewer.state.bToggle _ FALSE}; IF ckViewer.state.random THEN { sym _ FALSE; splat _ TRUE; ClearScreen[]; ckViewer.state.random _ FALSE}; IF ckViewer.state.symmetric THEN { sym _ TRUE; splat _ TRUE; ClearScreen[]; ckViewer.state.symmetric _ FALSE}; IF NOT ckViewer.state.freeze THEN { ckViewer.state.roll _ ckViewer.state.scramble _ FALSE; --only TRUE when frozen SELECT TRUE FROM test OR ckViewer.state.testPattern => { test _ TRUE; splat _ FALSE; ShowTPat[]; test _ ckViewer.state.testPattern _ FALSE; }; ckViewer.state.cbars => {ShowCBars[]; splat _ ckViewer.state.cbars _ FALSE}; ckViewer.state.converge => {ShowConverge[]; splat _ ckViewer.state.converge _ FALSE}; ckViewer.state.bigRed => {ShowBigRed[]; splat _ ckViewer.state.bigRed _ FALSE}; ckViewer.state.bigGreen => {ShowBigGreen[]; splat _ ckViewer.state.bigGreen _ FALSE}; ckViewer.state.bigBlue => {ShowBigBlue[]; splat _ ckViewer.state.bigBlue _ FALSE}; ckViewer.state.smallRed => {ShowSmallRed[]; splat _ ckViewer.state.smallRed _ FALSE}; ckViewer.state.smallGreen => {ShowSmallGreen[]; splat _ ckViewer.state.smallGreen _ FALSE}; ckViewer.state.smallBlue => {ShowSmallBlue[]; splat _ ckViewer.state.smallBlue _ FALSE}; ENDCASE => IF splat THEN {ColorDisplay.Show[ashow,bshow,TRUE]; RandomSplat[ckViewer]; }; } ELSE { SELECT TRUE FROM ckViewer.state.scramble => NextScramble[]; ckViewer.state.roll => NextRoll[]; ENDCASE => NULL; }; ENDLOOP; IF NOT ColorDisplay.SetMode[ColorDisplay.disconnected] THEN ERROR; }; END. ZCKViewerOps.mesa Last edited by Ken Pier, July 21, 1983 4:36 pm gray background four corners various colors at left edge a bunch of stripes Positive: PROC = { IF NOT full THEN RETURN; ColorDisplay.TurnOff[]; FOR i: CARDINAL IN[0..256) DO ColorDisplay.SetRedMap[i,i]; ColorDisplay.SetGreenMap[i,i]; ColorDisplay.SetBlueMap[i,i]; ENDLOOP; ColorDisplay.TurnOn[]; }; Negative: PROC = { IF NOT full THEN RETURN; ColorDisplay.TurnOff[]; FOR i: CARDINAL IN[0..256) DO ColorDisplay.SetRedMap[i,255-i]; ColorDisplay.SetGreenMap[i,255-i]; ColorDisplay.SetBlueMap[i,255-i]; ENDLOOP; ColorDisplay.TurnOn[]; }; bitmap A bitmap B Constant definitions (meanings described in InitRandom below) Module state Holds 55 random cardinals, to be returned by Random. (A[0] is wasted to make the code generator produce better array accesses.) a[1..p-1] has not yet been returned by Random; p is [1..55] except within Random. Procedures The parameter seed determines the sequence generated by procedure Random below. If seed=0, a default seed value is used to determine the starting point of the sequence; if seed>0, seed is scaled if necessary and then used; if seed<0, a seed value is derived from the system clock. In any case, the seed value actually used (after scaling) is the integer value returned. Now scale the seed into the proper range (no log routine available...) Seed can't be too big since LAST[INTEGER] < LAST[CARDINAL]*(9/10) The array a is initialized by placing seed in a[55], and scattering the values (-1)**(i-1) * (F(i) - seed*F(i-1)) MOD maxRand, 0J˜SJšœ˜—Jšœ˜J˜—šŸœœ™Jšœœœœ™J™šœœœ ™J™J™J™Jšœ™—J™J™J™—šŸœœ™Jšœœœœ™J™šœœœ ™J™ J™"J™!Jšœ™—J™J™J˜—š Ÿœ œœœœœ˜EJšœ œ˜Jšœ˜J˜—JšŸœœ+˜8J˜šŸœœœœ˜1Jšœ œ˜šœœ˜Jšœœ ž˜*Jšœœ œœ ˜8Jšœ œ ˜Jšœ œœœ˜IJ˜—Jšœ ˜J˜J˜—š Ÿœœœœœœ˜RJ˜.˜Jšœ œ ˜J˜ J˜J˜CJ˜Jšœœœ˜#J˜—Jšœ˜ J˜J˜—šŸœœ œ˜6Jšœœ ˜Jšœœ ˜Jšœœœœ˜Jšœ™Jšœ%œ#˜LJ˜!J˜!J˜J˜J˜Jšœœ˜Jšœ™Jšœ%œ'œ˜XJ˜!J˜*J˜J˜J˜Jšœœ˜J˜J˜—šŸœœ œ-˜JJšœœ˜Jšœœ œ ˜)Jšœ%œ+œ˜\J˜!J˜)Jšœœ ˜#J˜J˜Jšœœ˜J˜J˜—J˜J˜šŸ œœœ ˜Ešœœ˜J˜J˜8J˜"J˜—šœ˜Jšœœ˜J˜"J˜—J˜J˜—šŸ œœœ˜+Jšœœ œ ˜+Jšœœ ˜Jšœœœ˜EJ˜J˜ Jšœœ˜*J˜J˜Jšœœ˜J˜J˜—šŸ œ œ˜/Jšœ œ ˜Jšœ œ ˜Jšœ œ˜Jšœœ˜Jšœœœœ˜BJ˜J˜šœœ˜ J˜J˜J˜J˜J˜"J˜ J˜"J˜ J˜"J˜$Jšœ˜—šœ˜J˜J˜J˜J˜J˜"Jšœ˜—šœ œœ˜J˜J˜J˜J˜J˜J˜—Jšœœ ž ˜3Jšœ˜J˜—šŸ œ œ˜Jšœž˜(Jšœž˜(Jšœœ˜Jšœœ ˜Jšœœ˜Jšœœ ˜J˜šœœœ˜šœœœ˜J˜TJšœ˜—Jšœœœœ˜$J˜—Jšœž˜0šœœœ ˜2Jšœ#˜#Jšœ˜—šœœœ ˜0Jšœ!˜!Jšœ˜—J˜—J˜šœ Ÿ œ œ˜)Jšœ=œ˜EJšœ ˜ Jšœ˜—J˜šœ Ÿœ œ˜-Jšœ?œ˜GJšœ ˜ Jšœ˜—J˜šœ Ÿ œ œ˜+Jšœ>œ˜FJšœ ˜ Jšœ˜—J˜šŸ œ œ˜Jšœ=œ˜EJšœ ˜ Jšœ˜—J˜šŸœ œ˜J˜J˜&šœœœ ˜J˜%J˜!Jšœ˜—J˜&J˜ Jšœ˜—J˜šŸ œ œ˜J˜Jšœ˜—J˜šŸ œ œœ˜-J˜J˜%Jšœ˜J˜—Jšœ œž˜-šŸ œ œ˜šœœœ˜J˜@J˜ —J˜J˜J˜—šŸœ œ œœ˜/J˜0J˜Jšœ=™=J˜Jšœ œ ˜Jšœ œ˜J˜J˜Jšœ ™ J˜šœœ œœ˜JšœP™PJšœ.™.—šœœ ˜JšœQ™QJ˜J˜—Jšœ ™ J˜š Ÿ œœœœœœ˜;JšœO™OJšœN™NJšœR™RJšœR™RJšœ.™.J˜Jšœ œœœ˜&Jšœœ˜J˜Jšœ œ˜#JšœF™FJšœœœ˜,JšœA™AJšœN™NJ˜Jšœ7™7J˜JšœN™NJšœL™LJšœ™J˜J˜J˜šœœœ ˜Jšœ œ˜J˜/—Jšœ˜šœ˜J˜ —Jšœ˜JšœH™HJ˜Jšœ˜ —Jšœž ˜J˜J˜š Ÿœœœœœœ˜0J˜Jšœœ˜'Jšœ˜ —Jšœž˜ J˜J˜šŸ œœœ˜JšœO™OJšœQ™QJšœ?™?šœœœ œ˜J˜—Jšœ˜šœœœ œ˜J˜—Jšœ˜—Jšœž ˜ J˜J˜š Ÿœœœ œœžœ˜KJšœ œ˜Jšœ œœ˜Jšœž%˜BJšœœœ ˜)š˜JšœV™VJšœU™UJšœZ™ZJšœ;™;Jšœœ˜Jšœ™J˜Jšœœ˜'J˜ Jšœœ ˜Jšœ œœ œœœœ˜KJšœ ˜—Jšœ˜—Jšœž˜ J˜—šŸœœ œœ˜8Jšœœ œ˜#Jšœœ˜&šœœœ˜(J˜Jš œœœœœ˜5J˜—Jšœœœœ˜-Jšœœ˜ J˜Jšœœ˜J˜9J˜5J˜7J˜ J˜ J˜Jšœœ˜ J˜J˜—šŸœœ˜Jšœœ˜%Jšœœœœ˜.Jšœœœœ˜-Jšœœ˜Jšœ œ œ ˜%Jšœœ˜J˜9Jšœœœœ ˜;J˜J˜J˜—JšŸœœœ˜(Jšœ˜J˜šœœ˜Jšœœ˜Jšœœ˜šœ˜ Jšœ4œ˜