FabGL
ESP32 Display Controller and Graphics Library
terminfo.cpp
1 /*
2  Created by Fabrizio Di Vittorio (fdivitto2013@gmail.com) - <http://www.fabgl.com>
3  Copyright (c) 2019-2020 Fabrizio Di Vittorio.
4  All rights reserved.
5 
6  This file is part of FabGL Library.
7 
8  FabGL is free software: you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation, either version 3 of the License, or
11  (at your option) any later version.
12 
13  FabGL is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  GNU General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with FabGL. If not, see <http://www.gnu.org/licenses/>.
20  */
21 
22 
23 #include "terminfo.h"
24 
25 
26 
27 namespace fabgl {
28 
29 
30 
31 const TermInfoKbdConv kbdConv_Generic[] = {
32  // Cursor Up => CTRL-E, WordStar Up
33  { VK_UP, "\x05" },
34 
35  // Cursor Down => CTRL-X, WordStar Down
36  { VK_DOWN, "\x18" },
37 
38  // Cursor Left => CTRL-S, WordStar Left
39  { VK_LEFT, "\x13" },
40 
41  // Cursor Right => CTRL-D, WordStar right
42  { VK_RIGHT, "\x04" },
43 
44  // Home => CTRL-Q S, WordStar Home
45  { VK_HOME, "\x11" "S" },
46 
47  // End => CTRL-Q D, WordStar End
48  { VK_END, "\x11" "D" },
49 
50  // PageUp => CTRL-C, WordStar PageUp
51  { VK_PAGEUP, "\x12" },
52 
53  // PageDown => CTRL-R, WordStar PageDown
54  { VK_PAGEDOWN, "\x03" },
55 
56  // Backspace => CTRL-H, CP/M delete char left (but WordStar just moves cursor left)
57  { VK_BACKSPACE, "\x08" },
58 
59  // Delete => CTRL-G, WordStar delete char right
60  { VK_DELETE, "\x07" },
61 
62  // Last item marker
63  { VK_NONE, nullptr },
64 };
65 
66 
68 // Lear Siegler ADM-3A
69 
70 
71 // sorted by TermSeq name
72 const TermInfoVideoConv videoConv_ADM3A[] = {
73  // BS => Cursor Left
74  { "\x08", 1, { ConvCtrl::CursorLeft, ConvCtrl::END } },
75 
76  // VT => Cursor Up
77  { "\x0b", 1, { ConvCtrl::CursorUp, ConvCtrl::END} },
78 
79  // FF => Cursor Right
80  { "\x0c", 1, { ConvCtrl::CursorRight, ConvCtrl::END} },
81 
82  // ETB => Erase to end of screen
83  { "\x17", 1, { ConvCtrl::EraseToEndOfScreen, ConvCtrl::END} },
84 
85  // CAN => Erase to end of line
86  { "\x18", 1, { ConvCtrl::EraseToEndOfLine, ConvCtrl::END} },
87 
88  // SUB => Cursor home and Clear screen
89  { "\x1a", 1, { ConvCtrl::CursorHome, ConvCtrl::EraseToEndOfScreen, ConvCtrl::END} },
90 
91  // RS => Cursor Home
92  { "\x1e", 1, { ConvCtrl::CursorHome, ConvCtrl::END} },
93 
94  // 'ESC G 0' => Char Attribute: Normal video
95  { "\eG0", 3, { ConvCtrl::AttrNormal, ConvCtrl::END} },
96 
97  // 'ESC G 1' => Char Attribute: Blank
98  { "\eG1", 3, { ConvCtrl::AttrBlank, ConvCtrl::END} },
99 
100  // 'ESC G 2' => Char Attribute: Blink
101  { "\eG2", 3, { ConvCtrl::AttrBlink, ConvCtrl::END} },
102 
103  // 'ESC G 4' => Char Attribute: Reverse
104  { "\eG4", 3, { ConvCtrl::AttrReverse, ConvCtrl::END} },
105 
106  // 'ESC G 6' => Char Attribute: Reverse blinking
107  { "\eG6", 3, { ConvCtrl::AttrReverse, ConvCtrl::AttrBlink, ConvCtrl::END} },
108 
109  // 'ESC G 8' => Char Attribute: Underline
110  { "\eG8", 3, { ConvCtrl::AttrUnderline, ConvCtrl::END} },
111 
112  // 'ESC G :' => Char Attribute: Underline blinking
113  { "\eG:", 3, { ConvCtrl::AttrUnderline, ConvCtrl::AttrBlink, ConvCtrl::END} },
114 
115  // 'ESC G <' => Char Attribute: Underline reverse
116  { "\eG<", 3, { ConvCtrl::AttrUnderline, ConvCtrl::AttrReverse, ConvCtrl::END} },
117 
118  // 'ESC G >' => Char Attribute: Underline, reverse, bliking
119  { "\eG>", 3, { ConvCtrl::AttrUnderline, ConvCtrl::AttrReverse, ConvCtrl::AttrBlink, ConvCtrl::END} },
120 
121  // 'ESC G @' => Char Attribute: Reduce
122  { "\eG@", 3, { ConvCtrl::AttrReduce, ConvCtrl::END} },
123 
124  // 'ESC G B' => Char Attribute: Reduce blinking
125  { "\eGB", 3, { ConvCtrl::AttrReduce, ConvCtrl::AttrBlink, ConvCtrl::END} },
126 
127  // 'ESC G D' => Char Attribute: Reduce reverse
128  { "\eGD", 3, { ConvCtrl::AttrReduce, ConvCtrl::AttrReverse, ConvCtrl::END} },
129 
130  // 'ESC G F' => Char Attribute: Reduce reverse blinking
131  { "\eGF", 3, { ConvCtrl::AttrReduce, ConvCtrl::AttrReverse, ConvCtrl::AttrBlink, ConvCtrl::END} },
132 
133  // 'ESC G H' => Char Attribute: Reduce underline
134  { "\eGH", 3, { ConvCtrl::AttrReduce, ConvCtrl::AttrUnderline, ConvCtrl::END} },
135 
136  // 'ESC G J' => Char Attribute: Reduce underline blinking
137  { "\eGJ", 3, { ConvCtrl::AttrReduce, ConvCtrl::AttrUnderline, ConvCtrl::AttrBlink, ConvCtrl::END} },
138 
139  // 'ESC G L' => Char Attribute: Reduce underline reverse
140  { "\eGL", 3, { ConvCtrl::AttrReduce, ConvCtrl::AttrUnderline, ConvCtrl::AttrReverse, ConvCtrl::END} },
141 
142  // 'ESC G N' => Char Attribute: Reduce underline reverse blinking
143  { "\eGN", 3, { ConvCtrl::AttrReduce, ConvCtrl::AttrUnderline, ConvCtrl::AttrReverse, ConvCtrl::AttrBlink, ConvCtrl::END} },
144 
145  // 'ESC = y x' => Cursor Position (cursorX = x-31, cursorY = y-31)
146  { "\e=\xff\xff", 4, { ConvCtrl::CursorPos, ConvCtrl::END} },
147 
148  // Last item marker
149  { nullptr, 0, { } },
150 };
151 
152 
153 const TermInfo term_ADM3A = {
154  "",
155  videoConv_ADM3A,
156  kbdConv_Generic
157 };
158 
159 
160 
162 // Lear Siegler ADM-31
163 
164 
165 // sorted by TermSeq name
166 const TermInfoVideoConv videoConv_ADM31[] = {
167  // BS => Cursor Left
168  { "\x08", 1, { ConvCtrl::CursorLeft, ConvCtrl::END } },
169 
170  // VT => Cursor Up
171  { "\x0b", 1, { ConvCtrl::CursorUp, ConvCtrl::END} },
172 
173  // FF => Cursor Right
174  { "\x0c", 1, { ConvCtrl::CursorRight, ConvCtrl::END} },
175 
176  // SUB => Cursor home and Clear screen
177  { "\x1a", 1, { ConvCtrl::CursorHome, ConvCtrl::EraseToEndOfScreen, ConvCtrl::END} },
178 
179  // RS => Cursor Home
180  { "\x1e", 1, { ConvCtrl::CursorHome, ConvCtrl::END} },
181 
182  // US => New line
183  { "\x1f", 1, { ConvCtrl::CarriageReturn, ConvCtrl::LineFeed, ConvCtrl::END} },
184 
185  // 'ESC = y x' => Cursor Position (cursorX = x-31, cursorY = y-31)
186  { "\e=\xff\xff", 4, { ConvCtrl::CursorPos, ConvCtrl::END} },
187 
188  // 'ESC G 4' => Char Attribute: Reverse
189  { "\eG4", 3, { ConvCtrl::AttrReverse, ConvCtrl::END} },
190 
191  // 'ESC G 3' => Char Attribute: Underline
192  { "\eG3", 3, { ConvCtrl::AttrUnderline, ConvCtrl::END} },
193 
194  // 'ESC G 2' => Char Attribute: Blink
195  { "\eG2", 3, { ConvCtrl::AttrBlink, ConvCtrl::END} },
196 
197  // 'ESC G 0' => Char Attribute: Normal video
198  { "\eG0", 3, { ConvCtrl::AttrNormal, ConvCtrl::END} },
199 
200  // 'ESC )' => Char Attribute: Half intensity ON
201  { "\e)", 2, { ConvCtrl::AttrReduce, ConvCtrl::END} },
202 
203  // 'ESC (' => Char Attribute: Half intensity OFF
204  { "\e(", 2, { ConvCtrl::AttrReduceOff, ConvCtrl::END} },
205 
206  // 'ESC E' => Insert Line
207  { "\eE", 2, { ConvCtrl::InsertLine, ConvCtrl::END} },
208 
209  // 'ESC Q' => Insert Character
210  { "\eQ", 2, { ConvCtrl::InsertChar, ConvCtrl::END} },
211 
212  // 'ESC R' => Delete Line
213  { "\eR", 2, { ConvCtrl::DeleteLine, ConvCtrl::END} },
214 
215  // 'ESC W' => Delete Character
216  { "\eW", 2, { ConvCtrl::DeleteCharacter, ConvCtrl::END} },
217 
218  // 'ESC T' => Erase to end of line
219  { "\eT", 2, { ConvCtrl::EraseToEndOfLine, ConvCtrl::END} },
220 
221  // 'ESC Y' => Erase to end of screen
222  { "\eY", 2, { ConvCtrl::EraseToEndOfScreen, ConvCtrl::END} },
223 
224  // 'ESC *' => Cursor home and Clear screen
225  { "\e*", 2, { ConvCtrl::CursorHome, ConvCtrl::EraseToEndOfScreen, ConvCtrl::END} },
226 
227  // Last item marker
228  { nullptr, 0, { } },
229 };
230 
231 
232 const TermInfo term_ADM31 = {
233  "",
234  videoConv_ADM31,
235  kbdConv_Generic
236 };
237 
238 
239 
241 // Hazeltine 1500
242 
243 
244 // sorted by TermSeq name
245 const TermInfoVideoConv videoConv_Hazeltine1500[] = {
246  // '~ VT' => Cursor Down
247  { "~\x0b", 2, { ConvCtrl::LineFeed, ConvCtrl::END} },
248 
249  // '~ FF' => Cursor Up
250  { "~\x0c", 2, { ConvCtrl::CursorUp, ConvCtrl::END} },
251 
252  // DLE => Cursor Right
253  { "\x10", 1, { ConvCtrl::CursorRight, ConvCtrl::END} },
254 
255  // '~ SI' => Erase to end of line
256  { "~\x0f", 2, { ConvCtrl::EraseToEndOfLine, ConvCtrl::END} },
257 
258  // '~ DC1 x y' => Cursor Position (cursorX = x+1, cursorY = y+1)
259  { "~\x11\xff\xff", 4, { ConvCtrl::CursorPos2, ConvCtrl::END} },
260 
261  // '~ DC2' => Cursor Home
262  { "~\x12", 2, { ConvCtrl::CursorHome, ConvCtrl::END} },
263 
264  // '~ DC3' => Delete Line
265  { "~\x13", 2, { ConvCtrl::DeleteLine, ConvCtrl::END} },
266 
267  // '~ CAN' => Clear to end of Screen
268  { "~\x18", 2, { ConvCtrl::EraseToEndOfScreen, ConvCtrl::END} },
269 
270  // '~ ETB' => Clear to end of Screen
271  { "~\x17", 2, { ConvCtrl::EraseToEndOfScreen, ConvCtrl::END} },
272 
273  // '~ FS' => Cursor home and Clear screen
274  { "~\x1c", 2, { ConvCtrl::CursorHome, ConvCtrl::EraseToEndOfScreen, ConvCtrl::END} },
275 
276  // '~ SUB' => Insert Line
277  { "~\x1a", 2, { ConvCtrl::InsertLine, ConvCtrl::END} },
278 
279  // '~ EM' => Char Attribute: Half intensity ON
280  { "~\x19", 2, { ConvCtrl::AttrReduce, ConvCtrl::END} },
281 
282  // '~ US' => Char Attribute: Half intensity oFF
283  { "~\x1f", 2, { ConvCtrl::AttrReduceOff, ConvCtrl::END} },
284 
285  // Last item marker
286  { nullptr, 0, { } },
287 };
288 
289 
290 const TermInfo term_Hazeltine1500 = {
291  "",
292  videoConv_Hazeltine1500,
293  kbdConv_Generic
294 };
295 
296 
298 // Osborne I
299 
300 
301 // sorted by TermSeq name
302 const TermInfoVideoConv videoConv_Osborne[] = {
303  // BS => Cursor Left
304  { "\x08", 1, { ConvCtrl::CursorLeft, ConvCtrl::END } },
305 
306  // 'VT' => Cursor Up
307  { "\x0b", 1, { ConvCtrl::CursorUp, ConvCtrl::END} },
308 
309  // 'FF' => Cursor Right
310  { "\x0c", 1, { ConvCtrl::CursorRight, ConvCtrl::END} },
311 
312  // SUB => Cursor home and Clear screen
313  { "\x1a", 1, { ConvCtrl::CursorHome, ConvCtrl::EraseToEndOfScreen, ConvCtrl::END} },
314 
315  // RS => Cursor Home
316  { "\x1e", 1, { ConvCtrl::CursorHome, ConvCtrl::END} },
317 
318  // 'ESC )' => Char Attribute: Half intensity ON
319  { "\e)", 2, { ConvCtrl::AttrReduce, ConvCtrl::END} },
320 
321  // 'ESC (' => Char Attribute: Half intensity OFF
322  { "\e(", 2, { ConvCtrl::AttrReduceOff, ConvCtrl::END} },
323 
324  // 'ESC E' => Insert Line
325  { "\eE", 2, { ConvCtrl::InsertLine, ConvCtrl::END} },
326 
327  // 'ESC l' => Char Attribute: Underline
328  { "\el", 3, { ConvCtrl::AttrUnderline, ConvCtrl::END} },
329 
330  // 'ESC m' => Char Attribute: Underline OFF
331  { "\el", 3, { ConvCtrl::AttrUnderlineOff, ConvCtrl::END} },
332 
333  // 'ESC Q' => Insert Character
334  { "\eQ", 2, { ConvCtrl::InsertChar, ConvCtrl::END} },
335 
336  // 'ESC R' => Delete Line
337  { "\eR", 2, { ConvCtrl::DeleteLine, ConvCtrl::END} },
338 
339  // 'ESC T' => Erase to end of line
340  { "\eT", 2, { ConvCtrl::EraseToEndOfLine, ConvCtrl::END} },
341 
342  // 'ESC W' => Delete Character
343  { "\eW", 2, { ConvCtrl::DeleteCharacter, ConvCtrl::END} },
344 
345  // 'ESC = y x' => Cursor Position (cursorX = x-31, cursorY = y-31)
346  { "\e=\xff\xff", 4, { ConvCtrl::CursorPos, ConvCtrl::END} },
347 
348  // Last item marker
349  { nullptr, 0, { } },
350 };
351 
352 
353 const TermInfo term_Osborne = {
354  "",
355  videoConv_Osborne,
356  kbdConv_Generic
357 };
358 
359 
360 
362 // Kaypro
363 
364 
365 // sorted by TermSeq name
366 const TermInfoVideoConv videoConv_Kaypro[] = {
367 
368  // BS => Cursor Left
369  { "\x08", 1, { ConvCtrl::CursorLeft, ConvCtrl::END } },
370 
371  // 'FF' => Cursor Right
372  { "\x0c", 1, { ConvCtrl::CursorRight, ConvCtrl::END} },
373 
374  // 'VT' => Cursor Up
375  { "\x0b", 1, { ConvCtrl::CursorUp, ConvCtrl::END} },
376 
377  // ETB => Erase to end of screen
378  { "\x17", 1, { ConvCtrl::EraseToEndOfScreen, ConvCtrl::END} },
379 
380  // CAN => Erase to end of line
381  { "\x18", 1, { ConvCtrl::EraseToEndOfLine, ConvCtrl::END} },
382 
383  // SUB => Cursor home and Clear screen
384  { "\x1a", 1, { ConvCtrl::CursorHome, ConvCtrl::EraseToEndOfScreen, ConvCtrl::END} },
385 
386  // RS => Cursor Home
387  { "\x1e", 1, { ConvCtrl::CursorHome, ConvCtrl::END} },
388 
389  // 'ESC E' => Insert Line
390  { "\eE", 2, { ConvCtrl::InsertLine, ConvCtrl::END} },
391 
392  // 'ESC R' => Delete Line
393  { "\eR", 2, { ConvCtrl::DeleteLine, ConvCtrl::END} },
394 
395  // 'ESC = y x' => Cursor Position (cursorX = x-31, cursorY = y-31)
396  { "\e=\xff\xff", 4, { ConvCtrl::CursorPos, ConvCtrl::END} },
397 
398  // 'ESC B 0' => Char Attribute: Reverse
399  { "\eB0", 3, { ConvCtrl::AttrReverse, ConvCtrl::END} },
400 
401  // 'ESC C 0' => Char Attribute: Reverse Off
402  { "\eC0", 3, { ConvCtrl::AttrReverseOff, ConvCtrl::END} },
403 
404  // 'ESC B 1' => Char Attribute: Reduce
405  { "\eB1", 3, { ConvCtrl::AttrReduce, ConvCtrl::END} },
406 
407  // 'ESC C 1' => Char Attribute: Reduce Off
408  { "\eC1", 3, { ConvCtrl::AttrReduceOff, ConvCtrl::END} },
409 
410  // 'ESC B 2' => Char Attribute: Blink
411  { "\eB2", 3, { ConvCtrl::AttrBlink, ConvCtrl::END} },
412 
413  // 'ESC C 2' => Char Attribute: Blink Off
414  { "\eC2", 3, { ConvCtrl::AttrBlinkOff, ConvCtrl::END} },
415 
416  // 'ESC B 3' => Char Attribute: Underline
417  { "\eB3", 3, { ConvCtrl::AttrUnderline, ConvCtrl::END} },
418 
419  // 'ESC C 3' => Char Attribute: Underline Off
420  { "\eC3", 3, { ConvCtrl::AttrUnderlineOff, ConvCtrl::END} },
421 
422  // 'ESC B 4' => Cursor On
423  { "\eB4", 4, { ConvCtrl::CursorOn, ConvCtrl::END} },
424 
425  // 'ESC C 4' => Cursor Off
426  { "\eC4", 4, { ConvCtrl::CursorOff, ConvCtrl::END} },
427 
428  // 'ESC B 6' => Save Cursor
429  { "\eB6", 4, { ConvCtrl::SaveCursor, ConvCtrl::END} },
430 
431  // 'ESC C 6' => Restore Cursor
432  { "\eC6", 4, { ConvCtrl::RestoreCursor, ConvCtrl::END} },
433 
434  // Last item marker
435  { nullptr, 0, { } },
436 };
437 
438 
439 const TermInfo term_Kaypro = {
440  "",
441  videoConv_Kaypro,
442  kbdConv_Generic
443 };
444 
445 
446 
448 // VT52
449 
450 
451 // sorted by TermSeq name
452 const TermInfoVideoConv videoConv_VT52[] = {
453 
454  // Last item marker
455  { nullptr, 0, { } },
456 };
457 
458 
459 const TermInfo term_VT52 = {
460  "\e[?2l", // <= set VT52 mode
461  videoConv_VT52,
462  kbdConv_Generic
463 };
464 
465 
467 // ANSI Legacy
468 
469 
470 // sorted by TermSeq name
471 const TermInfoVideoConv videoConv_ANSILegacy[] = {
472 
473  // Last item marker
474  { nullptr, 0, { } },
475 };
476 
477 
478 const TermInfo term_ANSILegacy = {
479  "",
480  videoConv_ANSILegacy,
481  kbdConv_Generic
482 };
483 
484 
485 }
This file contains terminal emulation definitions.
Definition: canvas.cpp:31