DIRECTORY Basics USING [bitsPerWord], ColorDisplayFace USING [baseA, baseB, bplA, bplB, Disconnect, height, Mode, Show, TurnOff, TurnOn, width], ColorDisplayFaceExtras USING [Connect, SetDisplaySize, PagesForMode], Terminal USING [BitmapState, ChannelsVisible, ColorMode, Object, Virtual], TerminalImpl USING [ColorFaceMode, ExpandColorCursorPattern, 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, widthA, heightA, widthB, heightB: 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 widthA+heightA+widthB+heightB > 0 THEN TRUSTED{ -- set size if not defaulted ColorDisplayFaceExtras.SetDisplaySize[widthA, heightA, widthB, heightB]; }; TRUSTED { pages _ ColorDisplayFaceExtras.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; vt.colorWordsPerLineA _ ColorDisplayFace.bplA/Basics.bitsPerWord; IF (ColorDisplayFace.bplA MOD Basics.bitsPerWord) # 0 THEN vt.colorWordsPerLineA _ vt.colorWordsPerLineA + 1; vt.colorWordsPerLineB _ ColorDisplayFace.bplB/Basics.bitsPerWord; IF (ColorDisplayFace.bplB MOD Basics.bitsPerWord) # 0 THEN vt.colorWordsPerLineB _ vt.colorWordsPerLineB + 1; 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 (widthA+heightA+widthB+heightB > 0) OR (vMem # VM.nullInterval) THEN { fmode: ColorDisplayFace.Mode ~ TerminalImpl.ColorFaceMode[newMode]; IF TRUE -- TerminalImpl.LegalColorFaceMode[fmode] (fix sometime!!) 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. þTerminalColorExtrasImpl.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šœœ)˜FJšœœ<˜OJšœœ*˜@Jšœ!˜!Jšœœ˜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˜OJšœH˜HJ˜—Jšœ8˜?šœœœ˜ šœ œ ˜Jšœœœ(˜O—J˜—Jšœœœ˜1Jšœ œœ*˜=J˜—šžœœœ!œ˜@Jšœ&˜&šœ+˜+Jšœ:˜:—J˜'J˜)Jšœ)˜)Jšœ)˜)JšœA˜Ašœœ˜6Jšœ3˜7—JšœA˜Ašœœ˜6Jšœ3˜7—Jšœœ ˜$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šœœ%œ œ˜Wšœ˜JšœC˜CšœœŸ;˜FJšœ˜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˜—…— µ