-- Copyright (C) 1983 by Xerox Corporation. All rights reserved. -- OscarTTY.mesa, HGM, 23-Sep-83 0:20:03 DIRECTORY Ascii USING [BS, CR], Inline USING [BITNOT], KeyStations USING [D1, D2, KeyBits], OthelloDefs USING [Cursor], OthelloForgot USING [], Runtime USING [IsBound], TTY USING [ BlinkDisplay, Create, GetChar, Handle, PutChar, ResetUserAbort, UserAbort], UserTerminal USING [ CursorArray, GetCursorPattern, keyboard, SetCursorPattern]; OscarTTY: PROGRAM IMPORTS Inline, Runtime, LfTTY: TTY, AdmTTY: TTY, UserTerminal EXPORTS OthelloDefs, OthelloForgot = BEGIN -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- TTY Interface Stuff -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ hasADM: BOOLEAN = Runtime.IsBound[LOOPHOLE[AdmTTY.Create]] AND (LOOPHOLE[UserTerminal.keyboard, LONG POINTER TO KeyStations.KeyBits] [KeyStations.D1]=up OR LOOPHOLE[UserTerminal.keyboard, LONG POINTER TO KeyStations.KeyBits] [KeyStations.D2]=up); ttyHandle: TTY.Handle = (IF hasADM THEN AdmTTY.Create ELSE LfTTY.Create)["Othello"L]; BlinkDisplay: PUBLIC PROC = { (IF hasADM THEN AdmTTY.BlinkDisplay ELSE LfTTY.BlinkDisplay)[ttyHandle]}; CheckUserAbort: PUBLIC PROC = { IF (IF hasADM THEN AdmTTY.UserAbort ELSE LfTTY.UserAbort)[ttyHandle] THEN { ResetAbort[]; ERROR ABORTED}}; EraseTTYChar: PUBLIC PROC [c: CHARACTER] = { SELECT c FROM IN [' ..'~] => NULL; Ascii.CR => RETURN; ENDCASE => EraseTTYChar[' ]; WriteChar[Ascii.BS]; WriteChar[' ]; WriteChar[Ascii.BS]}; ReadChar: PUBLIC PROC RETURNS [c: CHARACTER] = { RETURN[(IF hasADM THEN AdmTTY.GetChar ELSE LfTTY.GetChar)[ttyHandle]]}; SetCursor: PUBLIC PROC [c: OthelloDefs.Cursor] = { cursor: ARRAY OthelloDefs.Cursor OF UserTerminal.CursorArray = [ pointer: [ 100000B, 140000B, 160000B, 170000B, 174000B, 176000B, 177000B, 170000B, 154000B, 114000B, 006000B, 006000B, 003000B, 003000B, 001400B, 001400B], ftp: [ 000177B, 076077B, 040037B, 040017B, 070007B, 043703B, 040401B, 040400B, 000400B, 100436B, 140421B, 160421B, 170036B, 174020B, 176020B, 177020B]]; IF ~hasADM THEN UserTerminal.SetCursorPattern[cursor[c]]}; FlipCursor: PUBLIC PROC = { c: UserTerminal.CursorArray; IF ~hasADM THEN { c ← UserTerminal.GetCursorPattern[]; FOR i: CARDINAL IN [0..LENGTH[c]) DO c[i] ← Inline.BITNOT[c[i]] ENDLOOP; UserTerminal.SetCursorPattern[c]} ELSE { string: STRING = " FTP "L; WriteString[string]; FOR i: CARDINAL DECREASING IN [0..string.length) DO EraseTTYChar[string[i]] ENDLOOP}}; NewLine: PUBLIC PROC = {WriteChar[Ascii.CR]}; ResetAbort: PUBLIC PROC = { (IF hasADM THEN AdmTTY.ResetUserAbort ELSE LfTTY.ResetUserAbort)[ttyHandle]}; WriteChar: PUBLIC PROC [c: CHARACTER] = { (IF hasADM THEN AdmTTY.PutChar ELSE LfTTY.PutChar)[ttyHandle, c]}; WriteLine: PUBLIC PROC [s: LONG STRING] = {WriteString[s]; NewLine[]}; WriteString: PUBLIC PROC [s: LONG STRING] = { i: CARDINAL; IF s # NIL THEN FOR i ← 0, i + 1 WHILE i < s.length DO IF s[i] = '\\ AND s[i + 1] = 'r THEN { NewLine[]; i ← i + 1} ELSE WriteChar[s[i]]; ENDLOOP}; END..