2
0

VT100.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. /* voc 2.1.0 [2019/11/01]. Bootstrapping compiler for address size 8, alignment 8. xrtspaSF */
  2. #define SHORTINT INT8
  3. #define INTEGER INT16
  4. #define LONGINT INT32
  5. #define SET UINT32
  6. #include "SYSTEM.h"
  7. #include "Out.h"
  8. #include "Strings.h"
  9. export CHAR VT100_CSI[5];
  10. static CHAR VT100_tmpstr[32];
  11. export void VT100_CHA (INT16 n);
  12. export void VT100_CNL (INT16 n);
  13. export void VT100_CPL (INT16 n);
  14. export void VT100_CUB (INT16 n);
  15. export void VT100_CUD (INT16 n);
  16. export void VT100_CUF (INT16 n);
  17. export void VT100_CUP (INT16 n, INT16 m);
  18. export void VT100_CUU (INT16 n);
  19. export void VT100_DECTCEMh (void);
  20. export void VT100_DECTCEMl (void);
  21. export void VT100_DSR (INT16 n);
  22. export void VT100_ED (INT16 n);
  23. export void VT100_EL (INT16 n);
  24. static void VT100_EscSeq (INT16 n, CHAR *letter, ADDRESS letter__len);
  25. static void VT100_EscSeq0 (CHAR *letter, ADDRESS letter__len);
  26. static void VT100_EscSeq2 (INT16 n, INT16 m, CHAR *letter, ADDRESS letter__len);
  27. static void VT100_EscSeqSwapped (INT16 n, CHAR *letter, ADDRESS letter__len);
  28. export void VT100_HVP (INT16 n, INT16 m);
  29. export void VT100_IntToStr (INT32 int_, CHAR *str, ADDRESS str__len);
  30. export void VT100_RCP (void);
  31. static void VT100_Reverse0 (CHAR *str, ADDRESS str__len, INT16 start, INT16 end);
  32. export void VT100_SCP (void);
  33. export void VT100_SD (INT16 n);
  34. export void VT100_SGR (INT16 n);
  35. export void VT100_SGR2 (INT16 n, INT16 m);
  36. export void VT100_SU (INT16 n);
  37. export void VT100_SetAttr (CHAR *attr, ADDRESS attr__len);
  38. static void VT100_Reverse0 (CHAR *str, ADDRESS str__len, INT16 start, INT16 end)
  39. {
  40. CHAR h;
  41. while (start < end) {
  42. h = str[__X(start, str__len)];
  43. str[__X(start, str__len)] = str[__X(end, str__len)];
  44. str[__X(end, str__len)] = h;
  45. start += 1;
  46. end -= 1;
  47. }
  48. }
  49. void VT100_IntToStr (INT32 int_, CHAR *str, ADDRESS str__len)
  50. {
  51. CHAR b[21];
  52. INT16 s, e;
  53. INT8 maxLength;
  54. maxLength = 11;
  55. if (int_ == (-2147483647-1)) {
  56. __MOVE("-2147483648", b, 12);
  57. e = 11;
  58. } else {
  59. if (int_ < 0) {
  60. b[0] = '-';
  61. int_ = -int_;
  62. s = 1;
  63. } else {
  64. s = 0;
  65. }
  66. e = s;
  67. do {
  68. b[__X(e, 21)] = __CHR((int)__MOD(int_, 10) + 48);
  69. int_ = __DIV(int_, 10);
  70. e += 1;
  71. } while (!(int_ == 0));
  72. b[__X(e, 21)] = 0x00;
  73. VT100_Reverse0((void*)b, 21, s, e - 1);
  74. }
  75. __COPY(b, str, str__len);
  76. }
  77. static void VT100_EscSeq0 (CHAR *letter, ADDRESS letter__len)
  78. {
  79. CHAR cmd[9];
  80. __DUP(letter, letter__len, CHAR);
  81. __COPY(VT100_CSI, cmd, 9);
  82. Strings_Append(letter, letter__len, (void*)cmd, 9);
  83. Out_String(cmd, 9);
  84. __DEL(letter);
  85. }
  86. static void VT100_EscSeq (INT16 n, CHAR *letter, ADDRESS letter__len)
  87. {
  88. CHAR nstr[2];
  89. CHAR cmd[7];
  90. __DUP(letter, letter__len, CHAR);
  91. VT100_IntToStr(n, (void*)nstr, 2);
  92. __COPY(VT100_CSI, cmd, 7);
  93. Strings_Append(nstr, 2, (void*)cmd, 7);
  94. Strings_Append(letter, letter__len, (void*)cmd, 7);
  95. Out_String(cmd, 7);
  96. __DEL(letter);
  97. }
  98. static void VT100_EscSeqSwapped (INT16 n, CHAR *letter, ADDRESS letter__len)
  99. {
  100. CHAR nstr[2];
  101. CHAR cmd[7];
  102. __DUP(letter, letter__len, CHAR);
  103. VT100_IntToStr(n, (void*)nstr, 2);
  104. __COPY(VT100_CSI, cmd, 7);
  105. Strings_Append(letter, letter__len, (void*)cmd, 7);
  106. Strings_Append(nstr, 2, (void*)cmd, 7);
  107. Out_String(cmd, 7);
  108. __DEL(letter);
  109. }
  110. static void VT100_EscSeq2 (INT16 n, INT16 m, CHAR *letter, ADDRESS letter__len)
  111. {
  112. CHAR nstr[5], mstr[5];
  113. CHAR cmd[12];
  114. __DUP(letter, letter__len, CHAR);
  115. VT100_IntToStr(n, (void*)nstr, 5);
  116. VT100_IntToStr(m, (void*)mstr, 5);
  117. __COPY(VT100_CSI, cmd, 12);
  118. Strings_Append(nstr, 5, (void*)cmd, 12);
  119. Strings_Append((CHAR*)";", 2, (void*)cmd, 12);
  120. Strings_Append(mstr, 5, (void*)cmd, 12);
  121. Strings_Append(letter, letter__len, (void*)cmd, 12);
  122. Out_String(cmd, 12);
  123. __DEL(letter);
  124. }
  125. void VT100_CUU (INT16 n)
  126. {
  127. VT100_EscSeq(n, (CHAR*)"A", 2);
  128. }
  129. void VT100_CUD (INT16 n)
  130. {
  131. VT100_EscSeq(n, (CHAR*)"B", 2);
  132. }
  133. void VT100_CUF (INT16 n)
  134. {
  135. VT100_EscSeq(n, (CHAR*)"C", 2);
  136. }
  137. void VT100_CUB (INT16 n)
  138. {
  139. VT100_EscSeq(n, (CHAR*)"D", 2);
  140. }
  141. void VT100_CNL (INT16 n)
  142. {
  143. VT100_EscSeq(n, (CHAR*)"E", 2);
  144. }
  145. void VT100_CPL (INT16 n)
  146. {
  147. VT100_EscSeq(n, (CHAR*)"F", 2);
  148. }
  149. void VT100_CHA (INT16 n)
  150. {
  151. VT100_EscSeq(n, (CHAR*)"G", 2);
  152. }
  153. void VT100_CUP (INT16 n, INT16 m)
  154. {
  155. VT100_EscSeq2(n, m, (CHAR*)"H", 2);
  156. }
  157. void VT100_ED (INT16 n)
  158. {
  159. VT100_EscSeq(n, (CHAR*)"J", 2);
  160. }
  161. void VT100_EL (INT16 n)
  162. {
  163. VT100_EscSeq(n, (CHAR*)"K", 2);
  164. }
  165. void VT100_SU (INT16 n)
  166. {
  167. VT100_EscSeq(n, (CHAR*)"S", 2);
  168. }
  169. void VT100_SD (INT16 n)
  170. {
  171. VT100_EscSeq(n, (CHAR*)"T", 2);
  172. }
  173. void VT100_HVP (INT16 n, INT16 m)
  174. {
  175. VT100_EscSeq2(n, m, (CHAR*)"f", 2);
  176. }
  177. void VT100_SGR (INT16 n)
  178. {
  179. VT100_EscSeq(n, (CHAR*)"m", 2);
  180. }
  181. void VT100_SGR2 (INT16 n, INT16 m)
  182. {
  183. VT100_EscSeq2(n, m, (CHAR*)"m", 2);
  184. }
  185. void VT100_DSR (INT16 n)
  186. {
  187. VT100_EscSeq(6, (CHAR*)"n", 2);
  188. }
  189. void VT100_SCP (void)
  190. {
  191. VT100_EscSeq0((CHAR*)"s", 2);
  192. }
  193. void VT100_RCP (void)
  194. {
  195. VT100_EscSeq0((CHAR*)"u", 2);
  196. }
  197. void VT100_DECTCEMl (void)
  198. {
  199. VT100_EscSeq0((CHAR*)"\?25l", 5);
  200. }
  201. void VT100_DECTCEMh (void)
  202. {
  203. VT100_EscSeq0((CHAR*)"\?25h", 5);
  204. }
  205. void VT100_SetAttr (CHAR *attr, ADDRESS attr__len)
  206. {
  207. CHAR tmpstr[16];
  208. __DUP(attr, attr__len, CHAR);
  209. __COPY(VT100_CSI, tmpstr, 16);
  210. Strings_Append(attr, attr__len, (void*)tmpstr, 16);
  211. Out_String(tmpstr, 16);
  212. __DEL(attr);
  213. }
  214. export void *VT100__init(void)
  215. {
  216. __DEFMOD;
  217. __MODULE_IMPORT(Out);
  218. __MODULE_IMPORT(Strings);
  219. __REGMOD("VT100", 0);
  220. __REGCMD("DECTCEMh", VT100_DECTCEMh);
  221. __REGCMD("DECTCEMl", VT100_DECTCEMl);
  222. __REGCMD("RCP", VT100_RCP);
  223. __REGCMD("SCP", VT100_SCP);
  224. /* BEGIN */
  225. __COPY("\033", VT100_CSI, 5);
  226. Strings_Append((CHAR*)"[", 2, (void*)VT100_CSI, 5);
  227. __ENDMOD;
  228. }