-- Copyright (C) 1983 by Xerox Corporation. All rights reserved.
-- OscarLF.mesa, HGM, 18-Apr-83 14:17:16
DIRECTORY
Ascii USING [BS, CR],
Inline USING [BITNOT],
OthelloDefs USING [Cursor],
OthelloForgot USING [],
TTY USING [
BlinkDisplay, Create, GetChar, Handle, PutChar, ResetUserAbort,
UserAbort],
UserTerminal USING [
CursorArray, GetCursorPattern, SetCursorPattern];
OscarLF: PROGRAM
IMPORTS
Inline, TTY, UserTerminal
EXPORTS OthelloDefs, OthelloForgot =
BEGIN
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- TTY Interface Stuff
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ttyHandle: TTY.Handle = TTY.Create["Othello"L];
BlinkDisplay: PUBLIC PROC = {TTY.BlinkDisplay[ttyHandle]};
CheckUserAbort: PUBLIC PROC = {
IF TTY.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[TTY.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]];
UserTerminal.SetCursorPattern[cursor[c]]};
FlipCursor: PUBLIC PROC = {
c: UserTerminal.CursorArray ← UserTerminal.GetCursorPattern[];
FOR i: CARDINAL IN [0..LENGTH[c]) DO c[i] ← Inline.BITNOT[c[i]] ENDLOOP;
UserTerminal.SetCursorPattern[c] };
NewLine: PUBLIC PROC = {WriteChar[Ascii.CR]};
ResetAbort: PUBLIC PROC = {TTY.ResetUserAbort[ttyHandle]};
WriteChar: PUBLIC PROC [c: CHARACTER] = {TTY.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..