<> <> <> DIRECTORY Atom, CD, CDTechnology, CDValue, CDVPrivate, Convert, Graphics USING [Color, black], PrincOpsUtils, Rope, SafeStorage, TerminalIO, TIPUser; CDTechnologyImpl: CEDAR MONITOR IMPORTS Atom, CDValue, CDVPrivate, Convert, PrincOpsUtils, Rope, SafeStorage, TerminalIO, TIPUser EXPORTS CDTechnology = BEGIN SetTipTable: PUBLIC ENTRY PROC [tech: CD.Technology, tipTable: Rope.ROPE] = BEGIN ENABLE UNWIND => NULL; tTable: TIPUser.TIPTable _ NIL; tTable _ TIPUser.InstantiateNewTIPTable[tipTable ! TIPUser.InvalidTable => { TerminalIO.WriteRope["Tiptable not installed; "]; TerminalIO.WriteRope[errorMsg]; TerminalIO.WriteLn[]; GOTO NotDone } ]; CDValue.Store[boundTo: tech, key: $TipTable, value: tTable]; EXITS NotDone => NULL END; GetTipTable: PUBLIC PROC [tech: CD.Technology, allowDefault: BOOL_TRUE] RETURNS [TIPUser.TIPTable] = BEGIN x: REF _ CDValue.Fetch[boundTo: tech, key: $TipTable, propagation: global]; IF x=NIL THEN { SetTipTable[NIL, "ChipNDale.TIP"]; x _ CDValue.Fetch[boundTo: tech, key: $TipTable, propagation: global] }; WITH x SELECT FROM ttr: TIPUser.TIPTable => RETURN [ttr]; ENDCASE => RETURN [NIL]; END; <<>> TeachGraphicsColor: PUBLIC PROC [lev: CD.Level, color: Graphics.Color_Graphics.black] = BEGIN TerminalIO.WriteRope["not yet implemented"]; ERROR END; Brick: TYPE = CDTechnology.Brick; TeachColor: PUBLIC PROC[lev: CD.Level, bpp: CARDINAL, brick: Brick] = BEGIN CDVPrivate.TeachColor[lev, bpp, brick]; END; TeachGrey: PUBLIC PROC[lev: CD.Level, bpp: CARDINAL, brick: Brick] = BEGIN CDVPrivate.TeachGrey[lev, bpp, brick]; END; TeachColorCode: PUBLIC PROC[lev: CD.Level, bpp: CARDINAL, code: CARDINAL] = <<--sets value into the default Color- and GreyTable>> BEGIN CDVPrivate.TeachColorCode[lev, bpp, code]; END; Brick4: PUBLIC PROC[color: CARDINAL_177777B, pattern: CARDINAL_177777B] RETURNS [b: Brick_ALL[0]] = BEGIN Slice: PROC [color: CARDINAL, pattern: CARDINAL] RETURNS [c: CARDINAL_0] = { FOR i: CARDINAL IN [0..4) DO c _ c*16+(IF pattern>7 THEN color ELSE 0); pattern _ (pattern MOD 8)*2 ENDLOOP }; TRUSTED {color _ PrincOpsUtils.BITAND[color, 15]}; FOR i: CARDINAL IN [0..4) DO b[3-i] _ Slice[color, pattern MOD 16]; pattern _ pattern / 16 ENDLOOP END; Brick8: PUBLIC PROC[color: CARDINAL_177777B, pattern: CARDINAL_177777B] RETURNS [b: Brick_ALL[0]] = BEGIN Slice: PROC [color: CARDINAL, pattern: CARDINAL] RETURNS [c: CARDINAL_0] = { IF pattern MOD 2 =1 THEN c_c+color; IF (pattern/2) MOD 2 =1 THEN c_c+color*256 }; TRUSTED{color _ PrincOpsUtils.BITAND[color, 255]}; TRUSTED{pattern _ PrincOpsUtils.BITAND[pattern, 255]}; FOR i: CARDINAL IN [0..4) DO b[3-i] _ Slice[color, pattern MOD 4]; pattern _ pattern / 4 ENDLOOP END; OrBricks: PUBLIC PROC[b1, b2: Brick] RETURNS [b: Brick] = BEGIN FOR i: CARDINAL IN [0..4) DO TRUSTED{b[i] _ PrincOpsUtils.BITOR[b1[i], b2[i]]} ENDLOOP END; widthAtomTable: PUBLIC --private!-- REF ARRAY CD.Level OF ATOM _ SafeStorage.GetPermanentZone[].NEW[ARRAY CD.Level OF ATOM]; CDValue.EnregisterKey[key: $TipTable, boundTo: NIL]; CDValue.EnregisterKey[key: $CurrentLevel, boundTo: NIL]; FOR l: CD.Level IN [0..CD.levelNumber) DO widthAtomTable[l] _ Atom.MakeAtom[Rope.Concat["CDxLevelNo", Convert.RopeFromInt[l]]]; [] _ CDValue.EnregisterKey[widthAtomTable[l], NIL]; ENDLOOP; END.