VT100.mod 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. IMPLEMENTATION MODULE VT100;
  2. IMPORT ASCII;
  3. FROM STextIO IMPORT WriteString, WriteChar;
  4. FROM NumberIO IMPORT WriteCard;
  5. IMPORT IO, termios, FIO;
  6. VAR
  7. savedTerm : termios.TERMIOS;
  8. flushFlag : INTEGER;
  9. haveTerm : BOOLEAN;
  10. (* helper: ESC [ *)
  11. PROCEDURE CSI;
  12. BEGIN
  13. WriteChar(ASCII.esc);
  14. WriteChar("[");
  15. END CSI;
  16. PROCEDURE CSIPriv; (* ESC [ ? *)
  17. BEGIN
  18. WriteChar(ASCII.esc);
  19. WriteString("[?");
  20. END CSIPriv;
  21. (* SGR *)
  22. PROCEDURE ResetAttributes;
  23. BEGIN CSI; WriteString("0m"); END ResetAttributes;
  24. PROCEDURE Bold;
  25. BEGIN CSI; WriteString("1m"); END Bold;
  26. PROCEDURE Underline;
  27. BEGIN CSI; WriteString("4m"); END Underline;
  28. PROCEDURE Blink;
  29. BEGIN CSI; WriteString("5m"); END Blink;
  30. PROCEDURE Reverse;
  31. BEGIN CSI; WriteString("7m"); END Reverse;
  32. (* Cursor *)
  33. PROCEDURE CursorHome;
  34. BEGIN CSI; WriteChar("H"); END CursorHome;
  35. PROCEDURE CursorPosition(line, col : CARDINAL);
  36. BEGIN
  37. CSI; WriteCard(line, 1); WriteChar(";"); WriteCard(col, 1); WriteChar("H");
  38. END CursorPosition;
  39. PROCEDURE HVPosition(line, col : CARDINAL);
  40. BEGIN
  41. CSI; WriteCard(line, 1); WriteChar(";"); WriteCard(col, 1); WriteChar("f");
  42. END HVPosition;
  43. PROCEDURE CursorUp(n : CARDINAL);
  44. BEGIN CSI; WriteCard(n, 1); WriteChar("A"); END CursorUp;
  45. PROCEDURE CursorDown(n : CARDINAL);
  46. BEGIN CSI; WriteCard(n, 1); WriteChar("B"); END CursorDown;
  47. PROCEDURE CursorRight(n : CARDINAL);
  48. BEGIN CSI; WriteCard(n, 1); WriteChar("C"); END CursorRight;
  49. PROCEDURE CursorLeft(n : CARDINAL);
  50. BEGIN CSI; WriteCard(n, 1); WriteChar("D"); END CursorLeft;
  51. PROCEDURE Index;
  52. BEGIN WriteChar(ASCII.esc); WriteChar("D"); END Index;
  53. PROCEDURE ReverseIndex;
  54. BEGIN WriteChar(ASCII.esc); WriteChar("M"); END ReverseIndex;
  55. PROCEDURE NextLine;
  56. BEGIN WriteChar(ASCII.esc); WriteChar("E"); END NextLine;
  57. PROCEDURE SaveCursor;
  58. BEGIN WriteChar(ASCII.esc); WriteChar("7"); END SaveCursor;
  59. PROCEDURE RestoreCursor;
  60. BEGIN WriteChar(ASCII.esc); WriteChar("8"); END RestoreCursor;
  61. (* Erase *)
  62. PROCEDURE ClearLineRight;
  63. BEGIN CSI; WriteChar("K"); END ClearLineRight;
  64. PROCEDURE ClearLineLeft;
  65. BEGIN CSI; WriteString("1K"); END ClearLineLeft;
  66. PROCEDURE ClearLine;
  67. BEGIN CSI; WriteString("2K"); END ClearLine;
  68. PROCEDURE ClearScreenDown;
  69. BEGIN CSI; WriteChar("J"); END ClearScreenDown;
  70. PROCEDURE ClearScreenUp;
  71. BEGIN CSI; WriteString("1J"); END ClearScreenUp;
  72. PROCEDURE ClearScreen;
  73. BEGIN CSI; WriteString("2J"); END ClearScreen;
  74. PROCEDURE SetScrollRegion(top, bottom : CARDINAL);
  75. BEGIN
  76. CSI; WriteCard(top, 1); WriteChar(";"); WriteCard(bottom, 1); WriteChar("r");
  77. END SetScrollRegion;
  78. (* Tabs *)
  79. PROCEDURE TabSet;
  80. BEGIN WriteChar(ASCII.esc); WriteChar("H"); END TabSet;
  81. PROCEDURE TabClear;
  82. BEGIN CSI; WriteChar("g"); END TabClear;
  83. PROCEDURE TabClearAll;
  84. BEGIN CSI; WriteString("3g"); END TabClearAll;
  85. (* Double-size / alignment *)
  86. PROCEDURE DoubleHeightTop;
  87. BEGIN WriteChar(ASCII.esc); WriteString("#3"); END DoubleHeightTop;
  88. PROCEDURE DoubleHeightBottom;
  89. BEGIN WriteChar(ASCII.esc); WriteString("#4"); END DoubleHeightBottom;
  90. PROCEDURE SingleWidth;
  91. BEGIN WriteChar(ASCII.esc); WriteString("#5"); END SingleWidth;
  92. PROCEDURE DoubleWidth;
  93. BEGIN WriteChar(ASCII.esc); WriteString("#6"); END DoubleWidth;
  94. PROCEDURE ScreenAlign;
  95. BEGIN WriteChar(ASCII.esc); WriteString("#8"); END ScreenAlign;
  96. (* Modes *)
  97. PROCEDURE SetNewLine; BEGIN CSI; WriteString("20h"); END SetNewLine;
  98. PROCEDURE ResetNewLine; BEGIN CSI; WriteString("20l"); END ResetNewLine;
  99. PROCEDURE SetAppCursorKeys; BEGIN CSIPriv; WriteString("1h"); END SetAppCursorKeys;
  100. PROCEDURE SetCursorKeys; BEGIN CSIPriv; WriteString("1l"); END SetCursorKeys;
  101. PROCEDURE SetANSI; BEGIN CSIPriv; WriteString("2h"); END SetANSI;
  102. PROCEDURE SetVT52; BEGIN CSIPriv; WriteString("2l"); END SetVT52;
  103. PROCEDURE Set132Columns; BEGIN CSIPriv; WriteString("3h"); END Set132Columns;
  104. PROCEDURE Set80Columns; BEGIN CSIPriv; WriteString("3l"); END Set80Columns;
  105. PROCEDURE SetSmoothScroll; BEGIN CSIPriv; WriteString("4h"); END SetSmoothScroll;
  106. PROCEDURE SetJumpScroll; BEGIN CSIPriv; WriteString("4l"); END SetJumpScroll;
  107. PROCEDURE SetReverseScreen; BEGIN CSIPriv; WriteString("5h"); END SetReverseScreen;
  108. PROCEDURE SetNormalScreen; BEGIN CSIPriv; WriteString("5l"); END SetNormalScreen;
  109. PROCEDURE SetRelativeOrigin; BEGIN CSIPriv; WriteString("6h"); END SetRelativeOrigin;
  110. PROCEDURE SetAbsoluteOrigin; BEGIN CSIPriv; WriteString("6l"); END SetAbsoluteOrigin;
  111. PROCEDURE SetAutoWrap; BEGIN CSIPriv; WriteString("7h"); END SetAutoWrap;
  112. PROCEDURE ResetAutoWrap; BEGIN CSIPriv; WriteString("7l"); END ResetAutoWrap;
  113. PROCEDURE SetAutoRepeat; BEGIN CSIPriv; WriteString("8h"); END SetAutoRepeat;
  114. PROCEDURE ResetAutoRepeat; BEGIN CSIPriv; WriteString("8l"); END ResetAutoRepeat;
  115. PROCEDURE SetInterlace; BEGIN CSIPriv; WriteString("9h"); END SetInterlace;
  116. PROCEDURE ResetInterlace; BEGIN CSIPriv; WriteString("9l"); END ResetInterlace;
  117. (* Keypad *)
  118. PROCEDURE SetAltKeypad;
  119. BEGIN WriteChar(ASCII.esc); WriteChar("="); END SetAltKeypad;
  120. PROCEDURE SetNumKeypad;
  121. BEGIN WriteChar(ASCII.esc); WriteChar(">"); END SetNumKeypad;
  122. (* Charsets *)
  123. PROCEDURE SetUK_G0; BEGIN WriteChar(ASCII.esc); WriteString("(A"); END SetUK_G0;
  124. PROCEDURE SetUS_G0; BEGIN WriteChar(ASCII.esc); WriteString("(B"); END SetUS_G0;
  125. PROCEDURE SetGraphics_G0; BEGIN WriteChar(ASCII.esc); WriteString("(0"); END SetGraphics_G0;
  126. PROCEDURE SetAlt_G0; BEGIN WriteChar(ASCII.esc); WriteString("(1"); END SetAlt_G0;
  127. PROCEDURE SetAltGraph_G0; BEGIN WriteChar(ASCII.esc); WriteString("(2"); END SetAltGraph_G0;
  128. PROCEDURE SetUK_G1; BEGIN WriteChar(ASCII.esc); WriteString(")A"); END SetUK_G1;
  129. PROCEDURE SetUS_G1; BEGIN WriteChar(ASCII.esc); WriteString(")B"); END SetUS_G1;
  130. PROCEDURE SetGraphics_G1; BEGIN WriteChar(ASCII.esc); WriteString(")0"); END SetGraphics_G1;
  131. PROCEDURE SetAlt_G1; BEGIN WriteChar(ASCII.esc); WriteString(")1"); END SetAlt_G1;
  132. PROCEDURE SetAltGraph_G1; BEGIN WriteChar(ASCII.esc); WriteString(")2"); END SetAltGraph_G1;
  133. PROCEDURE Shift2; BEGIN WriteChar(ASCII.esc); WriteChar("N"); END Shift2;
  134. PROCEDURE Shift3; BEGIN WriteChar(ASCII.esc); WriteChar("O"); END Shift3;
  135. (* Reports / reset *)
  136. PROCEDURE RequestDeviceStatus;
  137. BEGIN CSI; WriteString("5n"); END RequestDeviceStatus;
  138. PROCEDURE RequestCursorPosition;
  139. BEGIN CSI; WriteString("6n"); END RequestCursorPosition;
  140. PROCEDURE Identify;
  141. BEGIN CSI; WriteChar("c"); END Identify;
  142. PROCEDURE Identify2;
  143. BEGIN CSI; WriteString("0c"); END Identify2;
  144. PROCEDURE ResetTerminal;
  145. BEGIN WriteChar(ASCII.esc); WriteChar("c"); END ResetTerminal;
  146. (* LEDs / tests *)
  147. PROCEDURE LedsOff; BEGIN CSI; WriteString("0q"); END LedsOff;
  148. PROCEDURE Led1; BEGIN CSI; WriteString("1q"); END Led1;
  149. PROCEDURE Led2; BEGIN CSI; WriteString("2q"); END Led2;
  150. PROCEDURE Led3; BEGIN CSI; WriteString("3q"); END Led3;
  151. PROCEDURE Led4; BEGIN CSI; WriteString("4q"); END Led4;
  152. PROCEDURE TestPowerUp; BEGIN CSI; WriteString("2;1y"); END TestPowerUp;
  153. PROCEDURE TestLoopback; BEGIN CSI; WriteString("2;2y"); END TestLoopback;
  154. PROCEDURE TestPowerRepeat; BEGIN CSI; WriteString("2;9y"); END TestPowerRepeat;
  155. PROCEDURE TestLoopRepeat; BEGIN CSI; WriteString("2;10y"); END TestLoopRepeat;
  156. (* Terminal input mode (cf. Editor/Tests/T17.mod): Unbuffered
  157. saves the termios state and disables line buffering so device
  158. replies can be read char by char; Buffered restores it. *)
  159. PROCEDURE Unbuffered;
  160. BEGIN
  161. flushFlag := termios.tcsflush();
  162. savedTerm := termios.InitTermios();
  163. haveTerm := termios.tcgetattr(FIO.StdIn, savedTerm) # -1;
  164. IO.UnBufferedMode(0, TRUE);
  165. IO.UnBufferedMode(1, TRUE);
  166. END Unbuffered;
  167. PROCEDURE Buffered;
  168. VAR res : INTEGER;
  169. BEGIN
  170. IO.BufferedMode(0, TRUE);
  171. IO.BufferedMode(1, TRUE);
  172. IF haveTerm THEN
  173. haveTerm := FALSE;
  174. res := termios.tcsetattr(FIO.StdIn, flushFlag, savedTerm);
  175. END;
  176. END Buffered;
  177. END VT100.