Regis.mod 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. IMPLEMENTATION MODULE Regis;
  2. IMPORT ASCII;
  3. FROM STextIO IMPORT WriteChar, WriteString;
  4. FROM NumberIO IMPORT WriteCard, WriteInt;
  5. IMPORT IO, termios, FIO;
  6. VAR
  7. savedTerm : termios.TERMIOS;
  8. flushFlag : INTEGER;
  9. haveTerm : BOOLEAN;
  10. PROCEDURE Pair(x, y : CARDINAL); (* [x,y] *)
  11. BEGIN
  12. WriteChar("["); WriteCard(x, 1);
  13. WriteChar(","); WriteCard(y, 1);
  14. WriteChar("]");
  15. END Pair;
  16. PROCEDURE Signed(n : INTEGER); (* +n / -n *)
  17. BEGIN
  18. IF n < 0 THEN WriteInt(n, 1);
  19. ELSE WriteChar("+"); WriteCard(VAL(CARDINAL, n), 1);
  20. END;
  21. END Signed;
  22. PROCEDURE PairRel(dx, dy : INTEGER); (* [+dx,-dy] *)
  23. BEGIN
  24. WriteChar("["); Signed(dx);
  25. WriteChar(","); Signed(dy);
  26. WriteChar("]");
  27. END PairRel;
  28. PROCEDURE Enter; (* DCS 1 p *)
  29. BEGIN
  30. WriteChar(ASCII.esc); WriteChar("P"); WriteString("1p");
  31. END Enter;
  32. PROCEDURE EnterResume; (* DCS p *)
  33. BEGIN
  34. WriteChar(ASCII.esc); WriteChar("P"); WriteChar("p");
  35. END EnterResume;
  36. PROCEDURE Exit; (* ST *)
  37. BEGIN
  38. WriteChar(ASCII.esc); WriteChar("\");
  39. END Exit;
  40. PROCEDURE ScreenErase;
  41. BEGIN WriteChar("S"); WriteString("(E)"); END ScreenErase;
  42. PROCEDURE AddressWindow(x0, y0, x1, y1 : CARDINAL);
  43. BEGIN
  44. WriteChar("S"); WriteString("(A");
  45. Pair(x0, y0); Pair(x1, y1);
  46. WriteChar(")");
  47. END AddressWindow;
  48. PROCEDURE MoveTo(x, y : CARDINAL);
  49. BEGIN WriteChar("P"); Pair(x, y); END MoveTo;
  50. PROCEDURE MoveRel(dx, dy : INTEGER);
  51. BEGIN WriteChar("P"); PairRel(dx, dy); END MoveRel;
  52. PROCEDURE LineTo(x, y : CARDINAL);
  53. BEGIN WriteChar("V"); Pair(x, y); END LineTo;
  54. PROCEDURE LineRel(dx, dy : INTEGER);
  55. BEGIN WriteChar("V"); PairRel(dx, dy); END LineRel;
  56. PROCEDURE Dot;
  57. BEGIN WriteChar("V"); WriteString("[]"); END Dot;
  58. PROCEDURE Rect(x0, y0, x1, y1 : CARDINAL);
  59. BEGIN
  60. WriteChar("P"); Pair(x0, y0);
  61. WriteChar("V"); Pair(x1, y0);
  62. WriteChar("V"); Pair(x1, y1);
  63. WriteChar("V"); Pair(x0, y1);
  64. WriteChar("V"); Pair(x0, y0);
  65. END Rect;
  66. PROCEDURE Circle(edgeX, edgeY : CARDINAL);
  67. BEGIN WriteChar("C"); Pair(edgeX, edgeY); END Circle;
  68. PROCEDURE CircleCenter(cx, cy : CARDINAL);
  69. BEGIN WriteChar("C"); WriteString("(C)"); Pair(cx, cy); END CircleCenter;
  70. PROCEDURE Arc(degrees : INTEGER; x, y : CARDINAL);
  71. BEGIN
  72. WriteChar("C"); WriteString("(A"); WriteInt(degrees, 1);
  73. WriteChar(")"); Pair(x, y);
  74. END Arc;
  75. PROCEDURE FillTriangle(x1, y1, x2, y2 : CARDINAL);
  76. BEGIN
  77. WriteChar("F"); WriteString("(V");
  78. Pair(x1, y1); Pair(x2, y2);
  79. WriteChar(")");
  80. END FillTriangle;
  81. PROCEDURE TextOut(s : ARRAY OF CHAR);
  82. BEGIN WriteChar("T"); WriteChar("'"); WriteString(s); WriteChar("'"); END TextOut;
  83. PROCEDURE TextSize(n : CARDINAL);
  84. BEGIN WriteChar("T"); WriteString("(S"); WriteCard(n, 1); WriteChar(")"); END TextSize;
  85. PROCEDURE TextSizeWH(w, h : CARDINAL);
  86. BEGIN
  87. WriteChar("T"); WriteString("(S");
  88. Pair(w, h); WriteChar(")");
  89. END TextSizeWH;
  90. PROCEDURE TextDir(deg : CARDINAL);
  91. BEGIN WriteChar("T"); WriteString("(D"); WriteCard(deg, 1); WriteChar(")"); END TextDir;
  92. PROCEDURE TextSlant(deg : CARDINAL);
  93. BEGIN WriteChar("T"); WriteString("(I"); WriteCard(deg, 1); WriteChar(")"); END TextSlant;
  94. PROCEDURE UseColor(reg : CARDINAL);
  95. BEGIN WriteChar("W"); WriteString("(I"); WriteCard(reg, 1); WriteChar(")"); END UseColor;
  96. PROCEDURE ColorName(c : CHAR);
  97. BEGIN
  98. WriteChar("W"); WriteString("(I(");
  99. WriteChar(c); WriteString("))");
  100. END ColorName;
  101. PROCEDURE SetRGB(reg, r, g, b : CARDINAL);
  102. BEGIN
  103. WriteChar("S"); WriteString("(M"); WriteCard(reg, 1);
  104. WriteString("(R"); WriteCard(r, 1);
  105. WriteChar("G"); WriteCard(g, 1);
  106. WriteChar("B"); WriteCard(b, 1);
  107. WriteString("))");
  108. END SetRGB;
  109. PROCEDURE SetHLS(reg, h, l, s : CARDINAL);
  110. BEGIN
  111. WriteChar("S"); WriteString("(M"); WriteCard(reg, 1);
  112. WriteString("(H"); WriteCard(h, 1);
  113. WriteChar("L"); WriteCard(l, 1);
  114. WriteChar("S"); WriteCard(s, 1);
  115. WriteString("))");
  116. END SetHLS;
  117. PROCEDURE BgRegister(reg : CARDINAL);
  118. BEGIN WriteChar("S"); WriteString("(I"); WriteCard(reg, 1); WriteChar(")"); END BgRegister;
  119. PROCEDURE WriteOverlay; BEGIN WriteChar("W"); WriteString("(V)"); END WriteOverlay;
  120. PROCEDURE WriteReplace; BEGIN WriteChar("W"); WriteString("(R)"); END WriteReplace;
  121. PROCEDURE WriteComplement; BEGIN WriteChar("W"); WriteString("(C)"); END WriteComplement;
  122. PROCEDURE WriteErase; BEGIN WriteChar("W"); WriteString("(E)"); END WriteErase;
  123. PROCEDURE Pattern(n : CARDINAL);
  124. BEGIN WriteChar("W"); WriteString("(P"); WriteCard(n, 1); WriteChar(")"); END Pattern;
  125. PROCEDURE PatternBits(s : ARRAY OF CHAR);
  126. BEGIN WriteChar("W"); WriteString("(P"); WriteString(s); WriteChar(")"); END PatternBits;
  127. PROCEDURE LineWidth(n : CARDINAL);
  128. BEGIN WriteChar("W"); WriteString("(L"); WriteCard(n, 1); WriteChar(")"); END LineWidth;
  129. PROCEDURE PVMult(n : CARDINAL);
  130. BEGIN WriteChar("W"); WriteString("(M"); WriteCard(n, 1); WriteChar(")"); END PVMult;
  131. PROCEDURE ShadeOn; BEGIN WriteChar("W"); WriteString("(S1)"); END ShadeOn;
  132. PROCEDURE ShadeOff; BEGIN WriteChar("W"); WriteString("(S0)"); END ShadeOff;
  133. PROCEDURE ShadeRefY(y : CARDINAL);
  134. BEGIN WriteChar("W"); WriteString("(S[,"); WriteCard(y, 1); WriteString("])"); END ShadeRefY;
  135. PROCEDURE MacroDef(name : CHAR);
  136. BEGIN WriteChar("@"); WriteChar(":"); WriteChar(name); END MacroDef;
  137. PROCEDURE MacroEnd;
  138. BEGIN WriteChar("@"); WriteChar(";"); END MacroEnd;
  139. PROCEDURE MacroRun(name : CHAR);
  140. BEGIN WriteChar("@"); WriteChar(name); END MacroRun;
  141. PROCEDURE MacroClearAll;
  142. BEGIN WriteChar("@"); WriteChar("."); END MacroClearAll;
  143. PROCEDURE ReportPosition;
  144. BEGIN WriteChar("R"); WriteString("(P)"); END ReportPosition;
  145. PROCEDURE ReportError;
  146. BEGIN WriteChar("R"); WriteString("(E)"); END ReportError;
  147. PROCEDURE Unbuffered;
  148. BEGIN
  149. flushFlag := termios.tcsflush();
  150. savedTerm := termios.InitTermios();
  151. haveTerm := termios.tcgetattr(FIO.StdIn, savedTerm) # -1;
  152. IO.UnBufferedMode(0, TRUE);
  153. IO.UnBufferedMode(1, TRUE);
  154. END Unbuffered;
  155. PROCEDURE Buffered;
  156. VAR res : INTEGER;
  157. BEGIN
  158. IO.BufferedMode(0, TRUE);
  159. IO.BufferedMode(1, TRUE);
  160. IF haveTerm THEN
  161. haveTerm := FALSE;
  162. res := termios.tcsetattr(FIO.StdIn, flushFlag, savedTerm);
  163. END;
  164. END Buffered;
  165. END Regis.