<> <> <> <> 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