DIRECTORY Basics USING [BITOR, bitsPerWord, LongDiv, LowHalf], DeviceCleanup USING [Await, Item, Reason], DLionInputOutput USING [IOPage--, SetReservedMemoryUse--], Process USING [GetPriority, MsecToTicks, Pause, Priority, priorityRealTime, SetPriority], TerminalDefs USING [Background, Cursor, KeyBits, Position], TerminalFace USING [FieldRate, MonitorType]; TerminalHeadDLion: MONITOR IMPORTS Basics, DeviceCleanup, DLionInputOutput, Process EXPORTS TerminalFace = BEGIN OPEN TerminalDefs; CSB: TYPE = MACHINE DEPENDENT RECORD [ wakeups: WORD, --vertical field wake up bits-- off: BOOL, unused: [0..7], invert, disconnect: BOOL, line: CARDINAL [0..1024), border: RECORD [oddPairs, evenPairs: [0..400B)], cursor: Position, --cursor location-- map: Cursor --cursor bit map-- ]; csb: LONG POINTER TO CSB = LOOPHOLE[DLionInputOutput.IOPage + 353B]; --FFEB-- hasBuffer: PUBLIC BOOL _ TRUE; width: PUBLIC NAT _ 1024; height: PUBLIC NAT _ 808; wordsPerLine: PUBLIC NAT _ (width+Basics.bitsPerWord-1)/Basics.bitsPerWord; bitmapAddress: LONG POINTER _ NIL; Connect: PUBLIC UNSAFE PROC [base: LONG POINTER] = { csb.off _ TRUE; csb.disconnect _ FALSE; bitmapAddress _ base; }; Disconnect: PUBLIC SAFE PROC = TRUSTED { csb.off _ TRUE; csb.disconnect _ TRUE; bitmapAddress _ NIL; }; TurnOn: PUBLIC UNSAFE PROC = {csb.off _ FALSE}; TurnOff: PUBLIC SAFE PROC = TRUSTED {csb.off _ TRUE}; pixelsPerInch: PUBLIC CARDINAL _ 75; refreshRate: PUBLIC CARDINAL _ 39; interlaced: PUBLIC BOOL _ TRUE; SetBackground: PUBLIC SAFE PROC [background: Background] = TRUSTED {csb.invert _ (background = black)}; hasBorder: PUBLIC BOOL _ TRUE; SetBorderPattern: PUBLIC SAFE PROC [oddPairs, evenPairs: [0..377B]] = TRUSTED {csb.border _ [oddPairs, evenPairs]}; monitorType: PUBLIC TerminalFace.MonitorType _ lf; SetFieldRate: PUBLIC SAFE PROC [rate: TerminalFace.FieldRate] RETURNS [ok: BOOL] = CHECKED {RETURN [rate=normalLF]}; SetVerticalWaveforms: PUBLIC SAFE PROC [sync, visible, topBorder: CARDINAL] RETURNS [ok: BOOL] = CHECKED {RETURN [FALSE]}; SetCursorPattern: PUBLIC SAFE PROC [cursor: Cursor] = TRUSTED {csb.map _ cursor}; cursorPosition: PUBLIC LONG POINTER TO Position _ @csb.cursor; globalStateSize: PUBLIC CARDINAL _ 0; Initialize: PUBLIC PROC[globalState: LONG POINTER, wakeVF: WORD] = { csb^ _ CSB[ wakeups: Basics.BITOR[wakeVF, csb.wakeups], off: NULL, unused: 0, invert: FALSE, disconnect: TRUE, line: 0, border: [210B, 42B], cursor: [0,0], map: ALL[0] ]; pSGCSB^ _ SoundGeneratorCSB[ busy: FALSE, command: NULL, period: 0 ]; }; keyboard: PUBLIC LONG POINTER TO READONLY KeyBits _ LOOPHOLE[DLionInputOutput.IOPage + 72B]; --FF3A mousePointer: LONG POINTER TO Position ~ LOOPHOLE[DLionInputOutput.IOPage + 70B]; --FF38 mousePosition: PUBLIC LONG POINTER TO READONLY Position _ mousePointer; SetPositionRec: TYPE ~ MACHINE DEPENDENT RECORD [ point(0:0..31): Position, busy(2:0..0): BOOL, fill(2:1..15): [0..32767] ]; setPosition: LONG POINTER TO SetPositionRec ~ LOOPHOLE[DLionInputOutput.IOPage + 133B]; --FF5B SetMousePosition: PUBLIC SAFE PROC [p: Position] = TRUSTED { DO mousePointer^ _ p; IF NOT setPosition.busy THEN EXIT ENDLOOP; setPosition.point _ p; setPosition.busy _ TRUE; }; hasSoundGenerator: PUBLIC BOOL _ TRUE; SoundGeneratorCSBOffset: CARDINAL = 136B; -- = 0101 1110 = 5EX SoundGeneratorCSB: TYPE = MACHINE DEPENDENT RECORD [ busy (0:0..0): BOOL, command (0:1..15): MACHINE DEPENDENT {start (0), stop (1)}, period (1:0..15): CARDINAL -- = 1843200/f, where f is frequency in Hz ]; pSGCSB: LONG POINTER TO SoundGeneratorCSB = DLionInputOutput.IOPage + SoundGeneratorCSBOffset; Beep: PUBLIC ENTRY SAFE PROC [frequency: CARDINAL, duration: CARDINAL] = TRUSTED { priority: Process.Priority = Process.GetPriority[]; aborted: BOOL _ FALSE; WHILE pSGCSB.busy DO ENDLOOP; Process.SetPriority[MAX[Process.priorityRealTime, priority]]; pSGCSB.period _ Basics.LowHalf[Basics.LongDiv[1843200, MAX[frequency, 29]]]; pSGCSB.command _ start; pSGCSB.busy _ TRUE; WHILE pSGCSB.busy DO ENDLOOP; Process.Pause[Process.MsecToTicks[duration] ! ABORTED => {aborted _ TRUE; CONTINUE}]; pSGCSB.command _ stop; pSGCSB.busy _ TRUE; WHILE pSGCSB.busy DO ENDLOOP; Process.SetPriority[priority]; IF aborted THEN RETURN WITH ERROR ABORTED; }; InitializeCleanup: PUBLIC SAFE PROC = TRUSTED { OPEN DeviceCleanup; csbState: CSB; sgcsbState: SoundGeneratorCSB; item: Item; mousePos: Position; DO reason: Reason = Await[@item]; SELECT reason FROM turnOff, kill => { csbState _ csb^; csb.off _ TRUE; mousePos _ mousePosition^; THROUGH [0..8000] DO --wait for field-- ENDLOOP; THROUGH [0..30000] DO IF ~pSGCSB.busy THEN EXIT ENDLOOP; sgcsbState _ pSGCSB^; pSGCSB.command _ stop; pSGCSB.busy _ TRUE; THROUGH [0..30000] DO IF ~pSGCSB.busy THEN EXIT ENDLOOP; }; turnOn => { setPosition.point _ mousePos; setPosition.busy _ TRUE; mousePointer^ _ mousePos; pSGCSB^ _ sgcsbState; csb^ _ csbState; }; ENDCASE; ENDLOOP; }; setPosition.fill _ 0; END. February 27, 1983 2:12 pm Taft DisplayFaceExtras LTerminalHeadDLion.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Last Edited by: Taft, February 27, 1983 3:27 pm Doug Wyatt, April 25, 1985 11:00:56 am PST DisplayFace Implementation it should it be an ERROR to this if already connected or to turn on/off a disconnected display DLionInputOutput.SetReservedMemoryUse[Display]; DLionInputOutput.SetReservedMemoryUse[notBusy]; Keyboard Mouse Sound Generator Beep wants to run at interrupt priority, so it can accurately time the duration of the beep. Either interrupt priority should have an extra state vector, or Beep's code (and local and global frame) must be pinned. The MAX in the next statement prevents the LowHalf from overflowing. The period (in usec*1.8432) will be in the range [~29..63535]. Display/Raven/Sound Generator cleanup Proc stop sound generator Κ–˜codešœ™Kšœ Οmœ1™K˜Kšœžœžœ˜%K˜š ‘ œžœžœžœžœ žœ˜Dšœžœ˜ Kšœžœ˜+Kšœžœ˜ K˜ Kšœžœ˜Kšœ žœ˜K˜K˜K˜Kšœžœ˜ Kšœ˜—˜Kšœžœ˜ Kšœ žœ˜K˜ K˜—Kšœ˜K˜K˜—Kšœ™K˜š œ žœžœžœžœžœ ˜3Kšžœ!Ÿ˜/K˜—Kšœ™K˜šœžœžœžœ ˜(Kšžœ!Ÿ˜/K˜—Kš œžœžœžœžœžœ˜GK˜š œžœžœž œžœ˜1K˜Kšœžœ˜Kšœ˜Kšœ˜—šœ žœžœžœ˜-Kšžœ"Ÿ˜0K˜—š ‘œžœžœžœžœ˜<šž˜Kšœ˜Kšžœžœžœž˜!Kšžœ˜—Kšœ*žœ˜/Kšœ˜K˜K˜—Kšœ™K˜Kšœžœžœžœ˜&K˜Kšœžœ Ÿ˜>K˜š œžœžœž œžœ˜4Kšœžœ˜Kšœžœž œ˜;KšœžœŸ*˜EKšœ˜K˜—šœžœžœžœ˜+K˜2K˜—KšœB™BKšœI™IKšœI™IK˜š‘œžœžœžœžœ žœ žœžœ˜RK˜3Kšœ žœžœ˜Kšžœ žœžœ˜Kšœžœ&˜=K˜KšœD™DKšœ>™>Kšœ7žœ˜LK˜Kšœžœ˜Kšžœ žœžœ˜K˜˜-Kšžœžœžœ˜'K˜—K˜Kšœžœ˜Kšžœ žœžœ˜K˜K˜Kš žœ žœžœžœžœžœ˜*Kšœ˜K™K˜—Kšœ*™*K˜š ‘œžœžœžœžœžœ˜CKšœ žœ˜K˜K˜ K˜šž˜K˜šžœž˜šœ˜K˜Kšœ žœ˜K˜Kšžœ žœŸœžœ˜0š žœ žœžœžœžœžœ˜8Kšœ™—K˜K˜Kšœžœ˜Kš žœ žœžœžœžœžœ˜8Kšœ˜—šœ ˜ Kšœ1žœ˜6Kšœ˜K˜K˜Kšœ˜—Kšžœ˜—Kšžœ˜—Kšœ˜—K˜Kšœ˜K˜Kšžœ˜K˜K˜2K˜—…—Žp