DIRECTORY Basics USING [bitsPerWord], ColorDisplayFace USING [baseA, baseB, bplA, bplB, Disconnect, height, Mode, PagesForMode, Show, TurnOff, TurnOn, width], ColorDisplayFaceExtras USING [Connect, SetDisplaySize], Terminal USING [BitmapState, ChannelsVisible, ColorMode, Object, Virtual], TerminalImpl USING [ColorFaceMode, ExpandColorCursorPattern, LegalColorFaceMode, VirtualImpl, current], TerminalColorExtras USING [], VM USING [AddressForPageNumber, Allocate, CantAllocate, Free, Interval, nullInterval, Pin, Unpin]; TerminalColorExtrasImpl: CEDAR MONITOR IMPORTS ColorDisplayFace, ColorDisplayFaceExtras, TerminalImpl, VM EXPORTS TerminalColorExtras SHARES Terminal, TerminalImpl = BEGIN Virtual: TYPE = Terminal.Virtual; VirtualImpl: TYPE = TerminalImpl.VirtualImpl; TerminalColorExtrasError: PUBLIC SIGNAL [reason: ATOM] ~ CODE; SetColorBitmapState: PUBLIC PROC [vt: Virtual, newState: Terminal.BitmapState, newMode: Terminal.ColorMode, newVisibility: Terminal.ChannelsVisible, width, height: NAT _ 0, vMem: VM.Interval _ VM.nullInterval ] RETURNS [ oldState: Terminal.BitmapState, oldMode: Terminal.ColorMode, oldVisibility: Terminal.ChannelsVisible ] = { impl: VirtualImpl = NARROW[vt.impl]; SetColorBitmapStateInner: ENTRY PROC = { ENABLE UNWIND => NULL; AllocateColorVM: PROC[fmode: ColorDisplayFace.Mode] RETURNS [interval: VM.Interval] = { pages: INT; IF width > 0 AND height > 0 THEN TRUSTED{ -- set screen dimensions if not defaulted ColorDisplayFaceExtras.SetDisplaySize[width, height]; }; TRUSTED { pages _ ColorDisplayFace.PagesForMode[fmode] }; IF vMem = VM.nullInterval THEN { interval _ VM.Allocate[ count: pages ! VM.CantAllocate => ERROR TerminalColorExtrasError[$CantGetVM] ]; } ELSE IF pages <= vMem.count THEN interval _ vMem ELSE ERROR TerminalColorExtrasError[$BadDimensions]; }; Connect: INTERNAL PROC[fmode: ColorDisplayFace.Mode] = TRUSTED { impl.colorVM _ AllocateColorVM[fmode]; ColorDisplayFaceExtras.Connect[mode: fmode, firstPage: impl.colorVM.page, nPages: impl.colorVM.count]; vt.colorWidth _ ColorDisplayFace.width; vt.colorHeight _ ColorDisplayFace.height; vt.colorBitmapA _ ColorDisplayFace.baseA; vt.colorBitmapB _ ColorDisplayFace.baseB; IF (ColorDisplayFace.bplA MOD Basics.bitsPerWord)=0 THEN vt.colorWordsPerLineA _ ColorDisplayFace.bplA/Basics.bitsPerWord ELSE ERROR TerminalColorExtrasError[$BitsPerLineABad]; IF (ColorDisplayFace.bplB MOD Basics.bitsPerWord)=0 THEN vt.colorWordsPerLineB _ ColorDisplayFace.bplB/Basics.bitsPerWord ELSE ERROR TerminalColorExtrasError[$BitsPerLineBBad]; impl.colorCursorVM _ VM.Allocate[3]; VM.Pin[impl.colorCursorVM]; impl.colorCursorSourceA _ VM.AddressForPageNumber[impl.colorCursorVM.page]; --page 1 impl.colorCursorBackupA _ impl.colorCursorSourceA+256; --page 2 impl.colorCursorSourceB _ impl.colorCursorBackupA+256; --first half of page 3 impl.colorCursorBackupB _ impl.colorCursorSourceB+128; --second half of page 3 TerminalImpl.ExpandColorCursorPattern[vt, impl]; }; Disconnect: INTERNAL PROC = TRUSTED { vt.colorBitmapA _ vt.colorBitmapB _ NIL; vt.colorWordsPerLineA _ vt.colorWordsPerLineB _ 0; ColorDisplayFace.Disconnect[]; impl.colorVM _ VM.nullInterval; -- Garbage collector will get it if not impl.colorBitmapState _ none; impl.colorCursorSourceA _ impl.colorCursorBackupA _ NIL; impl.colorCursorSourceB _ impl.colorCursorBackupB _ NIL; VM.Free[impl.colorCursorVM]; impl.colorCursorVM _ VM.nullInterval; }; TurnOn: INTERNAL PROC = { IF TerminalImpl.current=vt THEN { VM.Pin[impl.colorVM]; TRUSTED{ColorDisplayFace.TurnOn[]}; }; }; TurnOff: INTERNAL PROC = { IF TerminalImpl.current=vt THEN { TRUSTED{ColorDisplayFace.TurnOff[]}; VM.Unpin[impl.colorVM]; }; }; oldMode _ vt.colorMode; oldState _ impl.colorBitmapState; oldVisibility _ impl.colorVisibility; IF (newMode#oldMode) OR (width > 0 AND height > 0) OR (vMem # VM.nullInterval) THEN { fmode: ColorDisplayFace.Mode ~ TerminalImpl.ColorFaceMode[newMode]; IF TerminalImpl.LegalColorFaceMode[fmode] THEN vt.colorMode _ newMode ELSE ERROR TerminalColorExtrasError[$BadColorMode]; IF oldState#none THEN { IF oldState=displayed THEN TurnOff[]; Disconnect[]; }; IF newState#none THEN { Connect[fmode]; IF newState=displayed THEN TurnOn[]; }; } ELSE IF newState#oldState THEN { IF oldState=displayed THEN TurnOff[]; IF newState=none THEN Disconnect[]; IF oldState=none THEN Connect[TerminalImpl.ColorFaceMode[vt.colorMode]]; IF newState=displayed THEN TurnOn[]; }; impl.colorBitmapState _ newState; IF newVisibility#oldVisibility THEN { impl.colorVisibility _ newVisibility; IF vt=TerminalImpl.current THEN SELECT newVisibility FROM none => TRUSTED{ColorDisplayFace.Show[a: FALSE, b: FALSE]}; aOnly => TRUSTED{ColorDisplayFace.Show[a: TRUE, b: FALSE]}; bOnly => TRUSTED{ColorDisplayFace.Show[a: FALSE, b: TRUE]}; all => TRUSTED{ColorDisplayFace.Show[a: TRUE, b: TRUE]}; ENDCASE => ERROR TerminalColorExtrasError[$BadVisibility]; }; }; --AcquireAndMarkTerminalUnstable[]; SetColorBitmapStateInner[]; --MarkTerminalStable[]; }; END. úTerminalColorExtras.mesa Cribbed from TerminalImpl, October 8, 1984 12:53:00 pm PDT Last Edited by: Birrell, November 16, 1983 11:24 am Last Edited by: Wyatt, December 21, 1983 1:19 pm implement color display Last Edited by: Russ Atkinson, December 21, 1983 5:17 pm fix problems with ShowColorCursor & HideColorCursor Last Edited by: Frank Crow, October 8, 1984 12:53:47 pm PDT Types Color Display Set color display up: Height, Width and Bitmap may be provided if desired VM.Free[impl.colorVM]; -- Don't throw this away, somebody else may own it! Acquire/Release replaced by ENTRY on inner proc to prevent deadlock in notifier stuff. This is probably not a good fix, since it may keep the monitor locked for a long time while allocating the bitmap �Ê»˜Jšœ™™:J™3™0J™—™8J™3——J™;J˜šÏk ˜ Jšœ �œ˜!Jšœ�œ/˜HJšœ=˜=Jšœ�œ˜8Jšœ�œ<˜OJšœ�œ*˜@Jšœ5˜5Jšœ�œ˜Jš�œ�œ5˜DJšœ/˜/J˜—šœ�œ�˜&š�˜Jšœ8�˜:—Jš�œ˜Jš�œ˜—J˜Jš�˜J˜J™J™Jšœ �œ˜!Jšœ �œ˜-J™š œ�œ�œ �œ�œ˜>J˜—šœ ™ J™J™J—šÏnœ�œ�œ˜.Jšœ˜Jšœ˜Jšœ)˜)Jšœ�œ˜Jšœ�œ �œ ˜#Jšœ˜Jš�œ˜ Jšœ˜JšœD˜DJšœ˜Jšœ�œ ˜$šžœ�œ�œ˜(Jš�œ�œ�œ˜šžœ�œ�œ �œ˜WJšœ�œ˜ š �œ �œ �œ�œÏc)˜SJšœ5˜5J˜—Jš�œ2˜9š�œ�œ�œ˜ šœ �œ ˜Jšœ�œ�œ(˜O—J˜—Jš�œ�œ�œ˜1Jšœ �œ�œ*˜=J˜—šžœ�œ�œ!�œ˜@Jšœ&˜&šœ+˜+Jšœ:˜:—J˜'J˜)Jšœ)˜)Jšœ)˜)š�œ�œ�˜8Jšœ@˜@—Jš�œ�œ+˜6š�œ�œ�˜8Jšœ@˜@—Jš�œ�œ+˜6Jšœ�œ ˜$Jš�œ˜Jšœ�œ1Ÿ˜UJšœ8Ÿ˜@Jšœ8Ÿ˜NJšœ8Ÿ˜OJ˜0J˜—šž œ�œ�œ�œ˜%Jšœ$�œ˜(Jšœ2˜2Jšœ˜JšœM™MJšœ�œŸ'˜IJšœ˜Jšœ4�œ˜8Jšœ4�œ˜8Jš�œ˜Jšœ�œ˜%J˜—šžœ�œ�œ˜š�œ�œ˜!Jš�œ˜Jš�œ˜#J˜—J˜—šžœ�œ�œ˜š�œ�œ˜!Jš�œ˜$Jš�œ˜J˜—J˜—J˜Jšœ!˜!Jšœ%˜%J˜Jš �œ�œ �œ �œ �œ˜Nš�œ˜JšœC˜Cš�œ(˜*Jš�œ˜Jš�œ�œ)˜3—š�œ�œ˜Jš�œ�œ ˜%J˜ J˜—š�œ�œ˜J˜Jš�œ�œ ˜$J˜—J˜—š�œ�œ�œ˜ Jš�œ�œ ˜%Jš�œ�œ˜#Jš�œ�œ3˜HJš�œ�œ ˜$J˜—J˜!J˜š�œ�œ˜%J˜%š�œ�œ�œ�˜9Jšœ�œ�œ�œ˜;Jšœ �œ�œ�œ˜;Jšœ �œ�œ�œ˜;Jšœ�œ�œ�œ˜8Jš�œ�œ*˜:—J˜—J˜—JšœÉ™ÉJ˜#Jšœ˜J˜J˜—J˜J˜Jš�œ˜J˜J˜—…—Ð…