IMPLEMENTATION MODULE VT52; IMPORT ASCII; FROM STextIO IMPORT WriteChar, WriteString; IMPORT IO, termios, FIO; VAR savedTerm : termios.TERMIOS; flushFlag : INTEGER; haveTerm : BOOLEAN; PROCEDURE Esc(c : CHAR); BEGIN WriteChar(ASCII.esc); WriteChar(c); END Esc; PROCEDURE EnterAnsi; BEGIN Esc("<"); END EnterAnsi; PROCEDURE SetAltKeypad; BEGIN Esc("="); END SetAltKeypad; PROCEDURE SetNumKeypad; BEGIN Esc(">"); END SetNumKeypad; PROCEDURE SetGraphics; BEGIN Esc("F"); END SetGraphics; PROCEDURE SetAscii; BEGIN Esc("G"); END SetAscii; PROCEDURE CursorUp; BEGIN Esc("A"); END CursorUp; PROCEDURE CursorDown; BEGIN Esc("B"); END CursorDown; PROCEDURE CursorRight; BEGIN Esc("C"); END CursorRight; PROCEDURE CursorLeft; BEGIN Esc("D"); END CursorLeft; PROCEDURE CursorHome; BEGIN Esc("H"); END CursorHome; PROCEDURE CursorPosition(row, col : CARDINAL); BEGIN WriteChar(ASCII.esc); WriteChar("Y"); WriteChar(CHR(row + 31)); WriteChar(CHR(col + 31)); END CursorPosition; PROCEDURE ReverseFeed; BEGIN Esc("I"); END ReverseFeed; PROCEDURE ClearToEndOfLine; BEGIN Esc("K"); END ClearToEndOfLine; PROCEDURE ClearToEndOfScreen; BEGIN Esc("J"); END ClearToEndOfScreen; PROCEDURE Identify; BEGIN Esc("Z"); END Identify; PROCEDURE IdentifyResponse; BEGIN WriteChar(ASCII.esc); WriteChar("/"); WriteChar("Z"); END IdentifyResponse; (* Terminal input mode (cf. Editor/Tests/T17.mod): Unbuffered saves the termios state and disables line buffering so device replies can be read char by char; Buffered restores it. *) PROCEDURE Unbuffered; BEGIN flushFlag := termios.tcsflush(); savedTerm := termios.InitTermios(); haveTerm := termios.tcgetattr(FIO.StdIn, savedTerm) # -1; IO.UnBufferedMode(0, TRUE); IO.UnBufferedMode(1, TRUE); END Unbuffered; PROCEDURE Buffered; VAR res : INTEGER; BEGIN IO.BufferedMode(0, TRUE); IO.BufferedMode(1, TRUE); IF haveTerm THEN haveTerm := FALSE; res := termios.tcsetattr(FIO.StdIn, flushFlag, savedTerm); END; END Buffered; END VT52.