DIRECTORY Basics USING [bitsPerWord], DoradoInputOutput USING [millisecondsPerTick, RWMufMan, savedCursor, SetDisplayFieldRate], DeviceCleanup USING [Await, Item, Reason], DisplayFace USING [ Background, CursorPtr, FieldRate, GlobalStatePtr, MonitorType, Point], KeyboardFace USING [KeyBits], MouseFace USING [Buttons, Point], PrincOps USING [BBTable, PageCount, PageNumber], PrincOpsUtils USING [AddressForPageNumber, BITOR, LowHalf, PagesForWords], ProcessorFace USING [GetClockPulses, microsecondsPerHundredPulses]; UserTerminalHeadDorado: CEDAR PROGRAM IMPORTS DeviceCleanup, DoradoInputOutput, PrincOpsUtils, ProcessorFace EXPORTS DisplayFace, KeyboardFace, MouseFace = BEGIN 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: DisplayFace.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 displayState: {disconnected, off, on} _ disconnected; bitmapBase: LONG POINTER; -- undefined if displayState=disconnected pDCBReal: LONG POINTER TO DCB; pDCBBlank: LONG POINTER TO DCB; pDCBNull: PDCB = LOOPHOLE[0]; hasBuffer: PUBLIC BOOL _ FALSE; pagesForBitmap: PUBLIC PrincOps.PageCount; -- see initialization below Connect: PUBLIC PROC [bitmap: PrincOps.PageNumber] = TRUSTED { displayState _ off; bitmapBase _ PrincOpsUtils.AddressForPageNumber[bitmap]; csbPtr.dcbChainHead _ PrincOpsUtils.LowHalf[pDCBBlank]; -- DCB's are in first64K }; Disconnect: PUBLIC PROC = TRUSTED { displayState _ disconnected; csbPtr.dcbChainHead _ pDCBNull; }; TurnOn: PUBLIC PROC = TRUSTED { 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 }; GetBitBltTable: PUBLIC PROC RETURNS [PrincOps.BBTable] = TRUSTED { RETURN[ [ dst: [word: IF displayState = disconnected THEN NIL ELSE bitmapBase, bit: 0], dstBpl: bitmapWidth, src: [word: IF displayState = disconnected THEN NIL ELSE bitmapBase, bit: 0], srcDesc: [srcBpl[bitmapWidth]], width: width, height: height, flags: []]]; }; SetBackground: PUBLIC PROC [background: DisplayFace.Background] = TRUSTED { pDCBReal.background _ pDCBBlank.background _ background}; width: PUBLIC NAT _ lfWordsPerLine*Basics.bitsPerWord; cslWordsPerLine: CARDINAL = 38; lfWordsPerLine: CARDINAL = 64; torWordsPerLine: CARDINAL = 40; bitmapWidth: CARDINAL _ lfWordsPerLine*Basics.bitsPerWord; height: PUBLIC NAT _ 808; -- LF and CSL torHeight: CARDINAL = 800; pixelsPerInch: PUBLIC CARDINAL _ 72; refreshRate: PUBLIC CARDINAL _ lfRefreshRate; -- frames (two fields) per second cslRefreshRate: CARDINAL = 30; lfRefreshRate: CARDINAL = 38; -- actually ?? interlaced: PUBLIC BOOL _ TRUE; hasBorder: PUBLIC BOOL _ FALSE; SetBorderPattern: PUBLIC PROC [oddPairs, evenPairs: [0..377B]] = TRUSTED {}; monitorType: PUBLIC DisplayFace.MonitorType _ lf; -- changed in Start SetFieldRate: PUBLIC PROC [rate: DisplayFace.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] }; pHardwareCursor: DisplayFace.CursorPtr = LOOPHOLE[LONG[431B]]; SetCursorPattern: PUBLIC PROC [cursorPtr: DisplayFace.CursorPtr] = TRUSTED { pHardwareCursor^ _ cursorPtr^; DoradoInputOutput.savedCursor _ cursorPtr^; }; cursorPosition: PUBLIC LONG POINTER TO DisplayFace.Point _ LOOPHOLE[LONG[426B]]; globalStateSize: PUBLIC CARDINAL _ SIZE[DCB]*2; InitializeCleanup: PUBLIC PROC = TRUSTED { OPEN DeviceCleanup; item: Item; reason: Reason; state: CSBState; mouseCoord: MouseFace.Point; cursorCoord: DisplayFace.Point; 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: DisplayFace.GlobalStatePtr, 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 KeyboardFace.KeyBits _ LOOPHOLE[LONG[177033B]]; position: PUBLIC LONG POINTER TO READONLY MouseFace.Point _ mouse; SetPosition: PUBLIC PROC [newMousePosition: MouseFace.Point] = TRUSTED { mouse^ _ newMousePosition }; buttons: PUBLIC LONG POINTER TO READONLY MouseFace.Buttons _ LOOPHOLE[keyboard]; mouse: LONG POINTER TO MouseFace.Point = LOOPHOLE[LONG[424B]]; cslMillisecondsPerTick: CARDINAL = 50; lfMillisecondsPerTick: CARDINAL = 40; -- actually 39.7 torMillisecondsPerTick: CARDINAL = 40; -- what should this be? TRUSTED { displayIsLF: BOOL = (DoradoInputOutput.RWMufMan[[useDMD: FALSE, dMuxAddr: 3106B]].dMuxData # 0); IF displayIsLF THEN DoradoInputOutput.millisecondsPerTick _ lfMillisecondsPerTick ELSE { monitorType _ alto; bitmapWidth _ width _ cslWordsPerLine*Basics.bitsPerWord; refreshRate _ cslRefreshRate; DoradoInputOutput.millisecondsPerTick _ cslMillisecondsPerTick; }; pagesForBitmap _ PrincOpsUtils.PagesForWords[(bitmapWidth.LONG/Basics.bitsPerWord)*height]; 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 rUserTerminalHeadDorado.mesa Last Edited by: Taft, February 27, 1983 3:27 pm Last Edited by: Levin, August 8, 1983 3:08 pm Last Edited by: Birrell, August 18, 1983 1:54 pm DisplayFace Size of bitmap, possibly large than screen image Scan line wakeups SetScanLineWakeup not implemented. GetScanLine not implemented. 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 KeyboardFace MouseFace Constants for ProcessorFace condition variable time Main Body Ê ´˜Jšœ™Jšœ/™/JšÏc-™-J™0šÏk ˜ Jšœžœ˜JšœžœC˜ZJšœžœ˜*šœ žœ˜JšœF˜F—Jšœ žœ ˜Jšœ žœ˜!Jšœ žœ"˜0Jšœžœžœ˜JJšœžœ0˜CJ˜—šœž ˜%šž˜J˜>—šž˜J˜&——J˜Jšž˜J˜J™Jšœ ™ J˜Jš œžœžœžœžœ ˜(Jš œ žœžœž œžœžœžœ˜QJšœžœžœ ˜AJ˜Jš žœžœžœžœžœ˜š žœžœžœž œžœ˜?Jšœžœ˜ J˜J˜#Jšœ˜,Jšœ$˜7Jšœ žœ˜&J˜Jšœ˜-Jšœ žœžœ˜+J˜—Jšœžœžœ $˜QJ˜J˜5Jšœ žœžœ)˜DJ˜Jš œ žœžœžœžœ˜Jš œ žœžœžœžœ˜Jšœ žœžœ˜J˜Jšœ žœžœžœ˜J˜Jšœžœ˜GJ˜šÏnœžœžœ!žœ˜>J˜Jšœ8˜8Jšœ9˜QJšœ˜J˜—šŸ œžœžœžœ˜#Jšœ<˜J˜šŸœžœžœ%žœ˜LJšœ˜Jšœ+˜+Jšœ˜J˜—Jš œžœžœžœžœžœžœ˜PJ™Jšœ™J˜Jš œžœžœžœžœ˜/J˜šŸœžœžœžœ˜*Jšžœ˜J˜ J˜J˜J˜J˜Jšœ žœžœ˜šœžœžœ˜$šœ˜šœžœœ ˜Išœžœ˜)J˜-————šž˜J˜šžœž˜˜ J˜J˜J˜Jšœ:™:J˜J˜*šžœAž˜HJšžœ˜—Jšœ˜—šœ ˜ J˜J˜JšœN™NJ˜Jšœ˜—Jšžœ˜—Jšžœ˜—Jšœ˜J˜—š Ÿ œžœžœžœ3žœžœ˜bšœžœ˜ J˜LJšœ?žœ˜D—Jšœ"žœ˜CJšœ žœ˜"Jšœ žœžœžœ˜-J˜Jšœ*˜*J˜Jšœ˜J˜J˜—J™Jšœ ™ J˜š œ žœžœžœžœžœ˜@Jšžœžœ ˜—J˜Jšœ ™ J˜Jš œ žœžœžœžœžœ˜BšŸ œžœžœ'ž˜FJšœ˜—Jš œ žœžœžœžœžœžœ ˜PJš œžœžœžœžœžœ˜>J˜Jšœ3™3J˜Jšœžœ˜&Jšœžœ˜7Jšœžœ˜?J˜Jšœ ™ J™Jšžœ˜ šœ žœ˜Jšœ%žœ"˜L—Jšžœ ˜Jšžœ>˜Bšžœ˜J˜Jšœ9˜9J˜Jšœ?˜?Jšœ˜—Jšœ:žœ˜[Jšœ!˜9šœ˜J˜—J˜J™šžœ˜J˜—Jšœžœ)˜BJšœžœ˜1Jšœžœ$žœžœ ˜PJšœžœ@˜VJšœžœs˜ŠJšœžœ5˜KJšœžœA˜WJšœžœ˜6šœžœ˜/Jšœžœ˜!—J˜2J˜—…—ª*Ð