DIRECTORY Basics USING [BITOR, bitsPerWord], D0InputOutput USING [ ControllerNumber, ControllerType, GetNextController, Input, millisecondsPerTick, null, nullControllerNumber, uibScb, utvfc], DeviceCleanup USING [Await, Item, Reason], DisplayFace USING [Background, Cursor, CursorPtr, FieldRate, GlobalStatePtr, MonitorType, Point], PrincOps USING [BBTable, PageCount, PageNumber, wordsPerPage], PrincOpsUtils USING [AddressForPageNumber, LowHalf, PagesForWords], KeyboardFace USING [KeyBits], MouseFace USING [Buttons, Point], ProcessorFace USING [GetClockPulses, microsecondsPerHundredPulses]; UserTerminalHeadD0: PROGRAM IMPORTS Basics, D0InputOutput, DeviceCleanup, 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 UTVFCControlRegister: TYPE = MACHINE DEPENDENT RECORD [ controlNibbles: [0..377B] _ 0, IncNC: [0..1] _ 0, PPBckGnd: [0..3] _ 0, PPBlank, PPVS, PreOField, AllowWU, ClrNC: [0..1] _ 0]; UTVFCInputRegister: TYPE = MACHINE DEPENDENT RECORD [ controllerIDa: [0..377B] _ 2, bitClockRate: [0..37B], controllerIDb: [0..3] _ 2, test: [0..1]]; cslBitClockRate: [0..37B] = 5B; lfBitClockRate: [0..37B] = 3B; displayState: {disconnected, off, on} _ disconnected; bitmapBase: LONG POINTER; -- undefined if displayState=disconnected controllerType: D0InputOutput.ControllerType; controller: D0InputOutput.ControllerNumber; pDCBReal: LONG POINTER TO DCB; pDCBBlank: LONG POINTER TO DCB; pDCBNull: PDCB = LOOPHOLE[0]; hasBuffer: PUBLIC BOOLEAN _ FALSE; pagesForBitmap: PUBLIC PrincOps.PageCount; -- see initialization below Connect: PUBLIC SAFE PROCEDURE [bitmap: PrincOps.PageNumber] = TRUSTED BEGIN displayState _ off; bitmapBase _ PrincOpsUtils.AddressForPageNumber[bitmap]; csbPtr.dcbChainHead _ PrincOpsUtils.LowHalf[pDCBBlank]; -- DCB's are in first64K END; Disconnect: PUBLIC SAFE PROCEDURE = TRUSTED {displayState _ disconnected; csbPtr.dcbChainHead _ pDCBNull}; TurnOn: PUBLIC SAFE PROCEDURE = TRUSTED BEGIN IF displayState = disconnected THEN ERROR; displayState _ on; pDCBReal.longBitmap _ bitmapBase; csbPtr.dcbChainHead _ PrincOpsUtils.LowHalf[pDCBReal] -- DCB's are in first64K END; TurnOff: PUBLIC SAFE PROCEDURE = TRUSTED BEGIN IF displayState = disconnected THEN ERROR; displayState _ off; csbPtr.dcbChainHead _ PrincOpsUtils.LowHalf[pDCBBlank]; -- DCB's are in first64K END; GetBitBltTable: PUBLIC SAFE PROCEDURE RETURNS [PrincOps.BBTable] = TRUSTED BEGIN IF displayState = disconnected THEN ERROR; RETURN[[ dst: [word: bitmapBase, bit: 0], dstBpl: bitmapWidth, src: [word: bitmapBase, bit: 0], srcDesc: [srcBpl[bitmapWidth]], width: width, height: height, flags: []]]; END; SetBackground: PUBLIC SAFE PROCEDURE [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 BOOLEAN _ TRUE; hasBorder: PUBLIC BOOLEAN _ FALSE; SetBorderPattern: PUBLIC SAFE PROCEDURE [oddPairs, evenPairs: [0..377B]] = CHECKED{}; pHardwareCursor: DisplayFace.CursorPtr = LOOPHOLE[LONG[431B]]; SetCursorPattern: PUBLIC SAFE PROCEDURE [cursorPtr: DisplayFace.CursorPtr] = TRUSTED BEGIN pHardwareCursor^ _ cursorPtr^ END; cursorPosition: PUBLIC LONG POINTER TO DisplayFace.Point _ LOOPHOLE[LONG[426B]]; globalStateSize: PUBLIC CARDINAL _ SIZE[DCB]*2; InitializeCleanup: PUBLIC SAFE PROCEDURE = TRUSTED BEGIN OPEN DeviceCleanup; item: Item; reason: Reason; state: CSBState; mouseCoord: MouseFace.Point; cursorCoord: DisplayFace.Point; cursor: DisplayFace.Cursor; 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 => BEGIN state _ csbPtr^; mouseCoord _ mouse^; cursorCoord _ cursorPosition^; cursor _ pHardwareCursor^; csbPtr.dcbChainHead _ pDCBNull; timeDone _ ProcessorFace.GetClockPulses[]; WHILE ProcessorFace.GetClockPulses[] - timeDone < maxPulsesPerRefresh DO ENDLOOP; END; turnOn => BEGIN mouse^ _ mouseCoord; cursorPosition^ _ cursorCoord; pHardwareCursor^ _ cursor; csbPtr^ _ state; END; ENDCASE; ENDLOOP; END; Initialize: PUBLIC PROCEDURE [ globalState: DisplayFace.GlobalStatePtr, wakeVF: WORD] = BEGIN dcb: DCB = [next: pDCBNull, resolution: high, background: white, indenting: 0, width: 0, shortBitmap: NIL, tag: long, height: 0, longBitmap: NIL]; csbPtr.wakeupMask _ Basics.BITOR[wakeVF, csbPtr.wakeupMask]; pDCBBlank _ globalState; pDCBReal _ globalState + SIZE[DCB]; pDCBBlank^ _ pDCBReal^ _ dcb; pDCBReal.width _ width/Basics.bitsPerWord; pDCBReal.height _ height/2; END; monitorType: PUBLIC DisplayFace.MonitorType _ lf; -- changed in Init SetFieldRate: PUBLIC SAFE PROCEDURE [rate: DisplayFace.FieldRate] RETURNS [ok: BOOLEAN] = CHECKED BEGIN RETURN [ SELECT monitorType FROM alto => rate=normalAlto, lf => rate=normalLF, ENDCASE => FALSE]; END; SetVerticalWaveforms: PUBLIC SAFE PROCEDURE [sync, visible, topBorder: CARDINAL] RETURNS [ok: BOOLEAN] = CHECKED {RETURN [FALSE]}; keyboard: PUBLIC LONG POINTER TO READONLY KeyboardFace.KeyBits _ LOOPHOLE[LONG[177033B]]; position: PUBLIC LONG POINTER TO READONLY MouseFace.Point _ mouse; SetPosition: PUBLIC SAFE PROCEDURE [newMousePosition: MouseFace.Point] = TRUSTED BEGIN mouse^ _ newMousePosition END; buttons: PUBLIC LONG POINTER TO READONLY MouseFace.Buttons _ LOOPHOLE[keyboard]; mouse: LONG POINTER TO MouseFace.Point = LOOPHOLE[LONG[424B]]; Init: PROCEDURE = BEGIN OPEN D0InputOutput; cslMillisecondsPerTick: CARDINAL = 50; lfMillisecondsPerTick: CARDINAL = 40; -- actually 39.7 torMillisecondsPerTick: CARDINAL = 40; -- what should this be? D0InputOutput.millisecondsPerTick _ lfMillisecondsPerTick; IF (controller _ GetNextController[utvfc, nullControllerNumber]) ~= nullControllerNumber THEN BEGIN inputReg: UTVFCInputRegister = Input[[controller: controller, register: 0]]; controllerType _ utvfc; IF inputReg.bitClockRate = cslBitClockRate THEN BEGIN monitorType _ alto; bitmapWidth _ width _ cslWordsPerLine*Basics.bitsPerWord; refreshRate _ cslRefreshRate; D0InputOutput.millisecondsPerTick _ cslMillisecondsPerTick; END; END ELSE IF (controller _ GetNextController[uibScb, nullControllerNumber]) ~= nullControllerNumber THEN BEGIN monitorType _ lf; controllerType _ uibScb; width _ torWordsPerLine*Basics.bitsPerWord; bitmapWidth _ torWordsPerLine*Basics.bitsPerWord; height _ torHeight; D0InputOutput.millisecondsPerTick _ torMillisecondsPerTick; END ELSE controllerType _ null; pagesForBitmap _ PrincOpsUtils.PagesForWords[(bitmapWidth.LONG/Basics.bitsPerWord)*height]; csbPtr.dcbChainHead _ pDCBNull; -- DCB's are in first64K END; Init[]; 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 24, 1981 3:06 PM Jose Correct width for Tor. February 27, 1983 2:12 pm Taft DisplayFaceExtras November 3, 1983 10:28 am Birrell conversion to 5.0 UserTerminalHeadD0.mesa Last Edited by: Taft, February 27, 1983 3:27 pm Last Edited by: Birrell, November 3, 1983 2:23 pm DisplayFace not currently used LongPointerFromPage See Start for initialization: Size of bitmap, possibly large than screen image (initialized in Start): See Start for initialization: See Start for initialization: Scan line wakeups SetScanLineWakeup not implemented. GetScanLine not implemented. Border pattern Cursor SHOULD BE IN IO PAGE Initialization KeyboardFace MouseFace Initialization Ê †˜Jšœ™Jšœ/™/Jšœ1™1J˜šÏk ˜ Jšœœœ˜"šœœ˜JšœV˜VJ˜%—Jšœœ˜*Jšœ œP˜aJšœ œ0˜>Jšœœ0˜CJšœ œ ˜Jšœ œ˜!Jšœœ0˜CJ˜—šœ˜š˜JšœB˜B—š˜Jšœ&˜&—Jš˜J™J™Jšœ ™ J˜Jš œœœœœ ˜(š œ œœ œœ˜+Jšœœœ˜&—Jšœœœ Ïc˜@J˜Jš œœœœœ˜š œœœ œœž˜>Jšœœ˜ J˜J˜#Jšœž˜+Jšœž$˜6Jšœ œž˜%J˜Jšœž˜,Jšœ œœž˜*J˜—š œœœ œœ˜7Jšœ™J˜J˜J˜Jšœ œ)˜6J˜—š œœœ œœ˜5J˜J˜J˜J˜—J˜J˜J˜J˜5Jšœ œœž)˜CJ˜J˜-J˜+Jš œ œœœœ˜Jš œ œœœœ˜Jšœ œœ˜J˜Jšœ œœœ˜"J˜Jšœœž˜FJ˜š Ïnœœœ œ!˜FJš˜J˜šœ8˜8Jšœ™—Jšœ8ž˜PJšœ˜J˜—š Ÿ œœœ œ˜+J˜>J˜—š Ÿœœœ œ˜'Jš˜Jšœœœ˜*J˜J˜!Jšœ6ž˜NJšœ˜J˜—š Ÿœœœ œ˜(Jš˜Jšœœœ˜*J˜Jšœ8ž˜PJšœ˜J˜—š Ÿœœœ œœ˜JJš˜Jšœœœ˜*šœ˜J˜5J˜@J˜*—Jšœ˜J˜—š Ÿ œœœ œ(˜SJ˜:J˜—Jšœ™šœœœ%˜6Jšœœ˜Jšœœ˜Jšœœ˜—JšœH™HJšœ œ%˜:J˜Jšœ™šœœœž ˜'Jšœ œ˜J˜—Jšœœœ˜$J˜Jšœ™šœ œœž!˜OJšœœ˜Jšœœž˜,J˜—Jšœ œœœ˜"˜Jšœ™J˜—Jšœ"™"J˜Jšœ™˜Jšœ™J˜—Jšœ œœœ˜"J˜Jš Ÿœœœ œ$œ˜U˜Jšœ™J˜—šœ)œœ˜>Jšœ™J˜—š Ÿœœœ œ&˜TJšœœ˜(J˜—š œœœœœ˜:Jšœœ˜˜Jšœ™J˜——Jš œœœœœ˜/J˜š Ÿœœœ œ˜2Jšœœ˜J˜ J˜J˜J˜J˜J˜Jšœ œœ˜šœœœ˜$šœž˜šœœžœž˜Gšœœž˜(J˜-————š˜J˜šœ˜˜ Jš˜J˜J˜J˜J˜J˜J˜*šœA˜HJšœ˜—Jšœ˜—˜ Jš˜J˜J˜J˜J˜Jšœ˜—Jšœ˜—Jšœ˜—Jšœ˜J˜—šŸ œœ œ˜Jšœ1œ˜8Jš˜šœœ˜ ˜CJšœœ$œ˜C——Jšœœ˜J˜J™J™J˜šŸœ œ˜Jšœœ˜Jšœœ˜&Jšœœž˜6Jšœœž˜?Jšœ:˜:šœA˜CJšœ˜Jš˜J˜LJ˜šœ)˜/Jš˜J˜Jšœ9˜9J˜Jšœ;˜;Jšœ˜—Jš˜—š˜šœB˜DJšœ˜Jš˜J˜J˜Jšœ+˜+Jšœ1˜1J˜Jšœ;˜;Jš˜—Jšœ˜—šœ˜Jšœ)œ˜J—Jšœ ž˜8Jšœ˜—J™J˜J˜Jšœ˜J˜—Jšœœ)˜BJšœœ˜1Jšœœ$œœ ˜PJšœœ@˜VJšœœs˜ŠJšœœ5˜KJšœœA˜WJšœœ˜6Jšœœ˜3J˜2J˜5J˜—…—!†.