DIRECTORY Basics USING [bitsPerWord], DoradoInputOutput USING [millisecondsPerTick, savedCursor, SetDisplayFieldRate], DeviceCleanup USING [Await, Item, Reason], PrincOpsUtils USING [BITOR, LowHalf], ProcessorFace USING [GetClockPulses, microsecondsPerHundredPulses], TerminalDefs USING [Background, Cursor, KeyBits, Position], TerminalFace USING [FieldRate, MonitorType]; TerminalHeadDorado: CEDAR PROGRAM IMPORTS DeviceCleanup, DoradoInputOutput, PrincOpsUtils, ProcessorFace EXPORTS TerminalFace ~ BEGIN OPEN TerminalDefs; CSBPtr: TYPE = LONG POINTER TO CSBState; CSBState: TYPE = MACHINE DEPENDENT RECORD [dcbChainHead: PDCB, wakeupMask: WORD]; csbPtr: CSBPtr = LOOPHOLE[LONG[420B]]; -- SHOULD MOVE TO IO PAGE PDCB: TYPE = POINTER TO DCB; DCB: TYPE = MACHINE DEPENDENT RECORD [ -- address must be even next: PDCB, resolution: {high, low}, background: Background, indenting: [0..77B], -- in units of 16 bits width: [0..377B], -- in units of 16 bits; must be even shortBitmap: POINTER, -- must be even tag: {short, long}, height: [0..77777B], -- in double scan lines longBitmap: LONG POINTER -- must be even ]; longBitMapSeal: POINTER = LOOPHOLE[177423B]; -- required value of DCB.shortBitmap pDCBReal: LONG POINTER TO DCB; pDCBBlank: LONG POINTER TO DCB; pDCBNull: PDCB = LOOPHOLE[0]; cslRefreshRate: CARDINAL = 30; lfRefreshRate: CARDINAL = 38; -- actually ?? cslWordsPerLine: CARDINAL = 38; cslScanLines: CARDINAL = 808; lfWordsPerLine: CARDINAL = 64; lfScanLines: CARDINAL = 808; displayState: {disconnected, off, on} _ disconnected; bitmapBase: LONG POINTER _ NIL; -- undefined if displayState=disconnected hasBuffer: PUBLIC BOOL _ FALSE; pixelsPerInch: PUBLIC CARDINAL _ 72; refreshRate: PUBLIC CARDINAL _ 0; -- frames (two fields) per second interlaced: PUBLIC BOOL _ TRUE; width: PUBLIC NAT _ 0; height: PUBLIC NAT _ 0; wordsPerLine: PUBLIC NAT _ 0; Connect: PUBLIC UNSAFE PROC [base: LONG POINTER] = UNCHECKED { displayState _ off; bitmapBase _ base; csbPtr.dcbChainHead _ PrincOpsUtils.LowHalf[pDCBBlank]; -- DCB's are in first64K }; Disconnect: PUBLIC PROC = TRUSTED { displayState _ disconnected; bitmapBase _ NIL; csbPtr.dcbChainHead _ pDCBNull; }; TurnOn: PUBLIC UNSAFE PROC = UNCHECKED { IF displayState = disconnected THEN ERROR; displayState _ on; pDCBReal.longBitmap _ bitmapBase; csbPtr.dcbChainHead _ PrincOpsUtils.LowHalf[pDCBReal]; -- DCB's are in first64K }; TurnOff: PUBLIC PROC = TRUSTED { IF displayState = disconnected THEN ERROR; displayState _ off; csbPtr.dcbChainHead _ PrincOpsUtils.LowHalf[pDCBBlank]; -- DCB's are in first64K }; SetBackground: PUBLIC PROC [background: Background] = TRUSTED { pDCBReal.background _ pDCBBlank.background _ background; }; hasBorder: PUBLIC BOOL _ FALSE; SetBorderPattern: PUBLIC PROC [oddPairs, evenPairs: [0..377B]] = { }; monitorType: PUBLIC TerminalFace.MonitorType _ lf; -- changed in Start SetFieldRate: PUBLIC PROC [rate: TerminalFace.FieldRate] RETURNS [ok: BOOL] = TRUSTED { SELECT monitorType FROM alto => RETURN [rate=normalAlto]; lf => { SELECT rate FROM normalLF => DoradoInputOutput.SetDisplayFieldRate[sync: 18, visible: 430, topBorder: 14]; lfBall60hz => DoradoInputOutput.SetDisplayFieldRate[sync: 18, visible: 560, topBorder: 14]; lfPhillips60hz => DoradoInputOutput.SetDisplayFieldRate[sync: 58, visible: 520, topBorder: 25]; ENDCASE => RETURN [FALSE]; RETURN [TRUE]; }; ENDCASE; }; SetVerticalWaveforms: PUBLIC PROC [sync, visible, topBorder: CARDINAL] RETURNS [ok: BOOL] = TRUSTED { DoradoInputOutput.SetDisplayFieldRate[sync: sync, visible: visible, topBorder: topBorder]; RETURN [TRUE] }; cursorPosition: PUBLIC LONG POINTER TO Position _ LOOPHOLE[LONG[426B]]; pHardwareCursor: LONG POINTER TO Cursor = LOOPHOLE[LONG[431B]]; SetCursorPattern: PUBLIC PROC [cursor: Cursor] = TRUSTED { pHardwareCursor^ _ cursor; DoradoInputOutput.savedCursor _ cursor; }; globalStateSize: PUBLIC CARDINAL _ SIZE[DCB]*2; InitializeCleanup: PUBLIC PROC = TRUSTED { OPEN DeviceCleanup; item: Item; reason: Reason; state: CSBState; mouseCoord: Position; cursorCoord: Position; timeDone: LONG CARDINAL; maxPulsesPerRefresh: LONG CARDINAL = 2* --for safety-- (LONG[100]* --pulsesPerHundredPulses-- 1000000 --microsecondsPerSecond-- )/(LONG[refreshRate] --framesPerSecond-- *ProcessorFace.microsecondsPerHundredPulses); DO reason _ Await[@item]; SELECT reason FROM turnOff => { state _ csbPtr^; mouseCoord _ mouse^; cursorCoord _ cursorPosition^; csbPtr.dcbChainHead _ pDCBNull; timeDone _ ProcessorFace.GetClockPulses[]; WHILE ProcessorFace.GetClockPulses[] - timeDone < maxPulsesPerRefresh DO ENDLOOP; }; turnOn => { mouse^ _ mouseCoord; cursorPosition^ _ cursorCoord; csbPtr^ _ state; }; ENDCASE; ENDLOOP; }; Initialize: PUBLIC UNSAFE PROC [globalState: LONG POINTER, wakeVF: WORD] = TRUSTED { dcb: DCB = [ next: pDCBNull, resolution: high, background: white, indenting: 0, width: 0, shortBitmap: longBitMapSeal, tag: long, height: 0, longBitmap: NIL]; csbPtr.wakeupMask _ PrincOpsUtils.BITOR[wakeVF, csbPtr.wakeupMask]; pDCBBlank _ LOOPHOLE[globalState]; pDCBReal _ LOOPHOLE[globalState + SIZE[DCB]]; pDCBBlank^ _ pDCBReal^ _ dcb; pDCBReal.width _ width/Basics.bitsPerWord; pDCBReal.height _ height/2; }; keyboard: PUBLIC LONG POINTER TO READONLY KeyBits _ LOOPHOLE[LONG[177033B]]; mouse: LONG POINTER TO Position = LOOPHOLE[LONG[424B]]; mousePosition: PUBLIC LONG POINTER TO READONLY Position _ mouse; SetMousePosition: PUBLIC PROC [position: Position] = TRUSTED { mouse^ _ position }; hasSoundGenerator: PUBLIC BOOL _ FALSE; Beep: PUBLIC PROC [frequency, duration: CARDINAL] ~ { }; cslMillisecondsPerTick: CARDINAL = 50; lfMillisecondsPerTick: CARDINAL = 40; -- actually 39.7 torMillisecondsPerTick: CARDINAL = 40; -- what should this be? TRUSTED { monitorType _ lf; refreshRate _ lfRefreshRate; DoradoInputOutput.millisecondsPerTick _ lfMillisecondsPerTick; wordsPerLine _ lfWordsPerLine; width _ wordsPerLine*Basics.bitsPerWord; height _ lfScanLines; csbPtr.dcbChainHead _ pDCBNull; -- DCB's are in first64K }; END. February 6, 1980 3:55 PM Gobbel Create file from UserTerminalImpl February 8, 1980 12:29 PM McJones Start chaining February 25, 1980 1:46 PM McJones Automatic determination of LF/CSL/Tor display March 7, 1980 5:56 PM McJones Wait for two frames in turnOff arm of cleanup procedure June 26, 1980 11:04 AM McJones OISProcessorFace=>ProcessorFace; allow Disconnect in disconnected state; add cursorPosition, mousePosition July 29, 1980 9:54 AM McJones Add keyboard, hasBorder; split off MouseFace July 30, 1980 6:21 PM McJones Add pagesForBitmap, GetBitBltTables; buffered=>hasBuffer January 28, 1981 9:27 AM McJones Dummy SoundGenerator March 21, 1981 4:51 PM Taft Convert for Dorado 9-Jun-81 18:04:35 Taft LF display February 27, 1983 2:12 pm Taft DisplayFaceExtras zTerminalHeadDorado.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Taft, February 27, 1983 3:27 pm Levin, August 8, 1983 3:08 pm Birrell, August 18, 1983 1:54 pm Russ Atkinson (RRA) February 19, 1985 2:08:51 pm PST Doug Wyatt, May 21, 1985 6:46:09 pm PDT Black and white display Border pattern Monitor type, field rate, and waveforms Cursor Initialization copy of cursor pattern itself is saved by SetCursorPattern cursor pattern itself is restored by SetMP trap handler in ProcessorHeadDorado Keyboard Mouse Sound Generator Constants for ProcessorFace condition variable time Main Body displayIsLF: BOOL = (DoradoInputOutput.RWMufMan[[useDMD: FALSE, dMuxAddr: 3106B]].dMuxData # 0); IF displayIsLF THEN { monitorType _ lf; wordsPerLine _ lfWordsPerLine; refreshRate _ lfRefreshRate; DoradoInputOutput.millisecondsPerTick _ lfMillisecondsPerTick; } ELSE { monitorType _ alto; wordsPerLine _ cslWordsPerLine; refreshRate _ cslRefreshRate; DoradoInputOutput.millisecondsPerTick _ cslMillisecondsPerTick; }; The following assumes an LF display. As far as we know, no Dorado running Cedar has an alto display. -- DKW Κ “˜codešœ™Kšœ Οmœ1™KšœŸœ˜ K˜Kšœ˜Kšœž˜,Kšœž$˜7Kšœ Ÿœž˜&K˜Kšœž˜-Kšœ ŸœŸœž˜)Kšœ˜K˜—KšœŸœŸœ ž$˜QK˜Kš œ ŸœŸœŸœŸœ˜Kš œ ŸœŸœŸœŸœ˜Kšœ ŸœŸœ˜K˜KšœŸœ˜KšœŸœž˜-K˜KšœŸœ˜KšœŸœ˜KšœŸœ˜Kšœ Ÿœ˜K˜K˜5Kšœ ŸœŸœŸœž)˜JK˜Kšœ ŸœŸœŸœ˜KšœŸœŸœ˜$Kšœ ŸœŸœž!˜CKšœ ŸœŸœŸœ˜KšœŸœŸœ˜KšœŸœŸœ˜KšœŸœŸœ˜K˜šΟnœŸœŸœŸœŸœŸœŸ œ˜>K˜Kšœ˜Kšœ8ž˜PKšœ˜K˜—š‘ œŸœŸœŸœ˜#Kšœ˜Kšœ Ÿœ˜Kšœ˜Kšœ˜K˜—š ‘œŸœŸœŸœŸ œ˜(KšŸœŸœŸœ˜*K˜K˜!Kšœ7ž˜OKšœ˜K˜—š‘œŸœŸœŸœ˜ KšŸœŸœŸœ˜*K˜Kšœ8ž˜PKšœ˜K˜—š‘ œŸœŸœŸœ˜?K˜8K˜K˜—K˜Kšœ™K˜Kšœ ŸœŸœŸœ˜K˜Kš‘œŸœŸœ(˜EK˜K™'K˜Kšœ Ÿœ!ž˜GK˜š ‘ œŸœŸœ ŸœŸœŸœ˜WšŸœ Ÿ˜KšœŸœ˜!šœ˜šŸœŸ˜˜ K˜M—˜ K˜M—˜K˜M—šŸœ˜ KšŸœŸœ˜——KšŸœŸœ˜Kšœ˜—KšŸœ˜—Kšœ˜K˜—š‘œŸœŸœŸœŸœŸœŸœ˜eK˜ZKšŸœŸœ˜ Kšœ˜—K™Kšœ™K˜Kš œŸœŸœŸœŸœ ŸœŸœ˜GK™Kš œŸœŸœŸœ ŸœŸœ˜?K˜š‘œŸœŸœŸœ˜:Kšœ˜Kšœ'˜'Kšœ˜K˜—Kšœ™K˜Kš œŸœŸœŸœŸœ˜/K˜š‘œŸœŸœŸœ˜*KšŸœ˜K˜ K˜K˜K˜K˜Kšœ ŸœŸœ˜šœŸœŸœ˜$šœž˜šœŸœžœ ž˜IšœŸœž˜)K˜-————šŸ˜K˜šŸœŸ˜˜ K˜K˜K˜Kšœ:™:K˜K˜*šŸœAŸ˜HKšŸœ˜—Kšœ˜—šœ ˜ K˜K˜KšœN™NK˜Kšœ˜—KšŸœ˜—KšŸœ˜—Kšœ˜K˜—š‘ œŸœŸœŸœŸœŸœ ŸœŸœ˜TšœŸœ˜ K˜LKšœ?Ÿœ˜D—Kšœ"Ÿœ˜CKšœ Ÿœ˜"Kšœ ŸœŸœŸœ˜-K˜Kšœ*˜*K˜Kšœ˜K˜K˜—K™Kšœ™K˜Kšœ ŸœŸœŸœŸœŸœ ŸœŸœ ˜LK˜Kšœ™K˜Kš œŸœŸœŸœ ŸœŸœ˜7K˜Kš œŸœŸœŸœŸœŸœ˜@K˜Kš‘œŸœŸœŸœ˜SK˜K™K™KšœŸœŸœŸœ˜'Kš‘œŸœŸœŸœ˜8K™Kšœ3™3K˜KšœŸœ˜&KšœŸœž˜7KšœŸœž˜?K˜Kšœ ™ K™KšŸœ˜ šœ Ÿœ™Kšœ%Ÿœ"™L—KšŸœ ™šŸœ™K™Kšœ™Kšœ™Kšœ>™>K™—šŸœ™K™Kšœ™K™Kšœ?™?Kšœ™—Kšœ$™$K™FKšœ˜Kšœ˜Kšœ>˜>Kšœ˜Kšœ(˜(Kšœ˜Kšœ!ž˜9šœ˜K˜—K˜K™šŸœ˜K˜—KšœŸœ)˜BKšœŸœ˜1KšœŸœ$ŸœŸœ ˜PKšœŸœ@˜VKšœŸœs˜ŠKšœŸœ5˜KKšœŸœA˜WKšœŸœ˜6šœŸœ˜/KšœŸœ˜!—K˜2K˜—…—¦(³