VT-100 Terminal Emulation
« | 17 May 2020 | »Wer kennt eigentlich noch ANSI.SYS
, den alten DOS
Treiber, ohne den diverse ASCII
Spiele nicht funktionierten?
Ich habe früher nie verstanden warum es diese Escape-Codes gibt, doch heute, mit Linux Konsolen und den neuen Windows 10 Features lerne ich diesen Uralt-Standard schätzen…
Historisches
Texte in Farben auf den Schirm zu bringen war früher wie heute “Hexenwerk”.
Unter DOS konnte man einfach in das Speichersegment B800h
schreiben, denn
dort lagen in CGA
und VGA Grafikkarten die
Bytes für Text und Farbcode hintereinander. Zuerst schrieb man das ASCII
Zeichen in die Zelle mit gerader Adresse und ein Byte weiter dann das
“Attribut” mit 4 Bits für Hintergrund und 4 Bits für Text-Farbe.
Die Hintergrundfarbe war je nach Grafik-Modus oft nur mit 3-Bit ausgestattet und das letzte (höchste) Bit schaltete ein automatisches Blinken des Textes aus und ein.
Den blinkenden Cursor konnte man entweder per BIOS-Aufruf (ah=2, int 10h
)
oder ein paar Bitänderungen in IO-Registern
auf eine bestimmte Position des 80 Zeichen x 25 Zeilen Schirmes setzen.
Die Sache hatte nur einen Haken: Es war “zu” hardware-nah. Man konnte zwar alles über das BIOS jagen, aber auch diese Aufrufe waren vom Grafikkarten-Standard abhängig.
Mein Toschiba T300
nutzte z.B. das Segment 0xB000
für die Farbausgabe, wo auf IBM-PCs
früher der Monochrom-Bereich angelegt war, und sein BIOS war leider ebenso
nicht PC-konform.
Die Lösung: Man schafft eine OS-Schnittstelle, mit der Kontroll-Zeichen, die überall gleich sind, in die nativen grafischen Aufrufe übersetzt werden.
VT100
Das VT100 war ein Terminal aus den
späten 70ern … und mehr weiß ich darüber nicht.
Aber es war wohl eines der ersten, das “ANSI Escape Codes” benutzt hat,
um Textgrafik darstellen zu können.
Und eben die Technik nutzt jedes Linux/Unix heute für seine “farbigen”
Konsolenausgaben, wie auch ANSI.SYS
unter DOS und seit neuem kann es
sogar Windows 10 (25 Jahre zu spät!).
Man nutzt den ASCII Code ESC
numerisch 27 (entspricht auch der Escape-Taste
auf dem Keyboard) um eine solche Sequenz einzuleiten.
Die folgenden Zeichen sind dann Kommandos und Parameter für z.B.:
- das Setzen von Text- und Hintergrundfarbe
- das Bewegen des Cursors zu neuen Positionen
- das Ein/Ausschalten des blinkenden Cursors
- das Löschen des gesamten Bildschirms
- u. v. m.
Will man also ein “Hallo Welt” farbig auf die Konsole schreiben, nutzt man:
"\x1b[1;33;44m Hello \x1b[0;32;47m World "
um ein
zu sehen. Die drei Parameter werden mit [
eingeleitet, mit Semikolons ;
getrennt und bedeuten:
- Attribut der Textfarbe (0=dunkel, 1=hell)
- Textfarbe 30 - 37 für die Farben:
- 30: schwarz / dunkel-grau
- 31: rot / hellrot
- 32: grün / hellgrün
- 33: orange / gelb
- 34: blau / hellblau
- 35: magenta
- 36: cyan /
- 37: grau / weiß
- Hintergrundfarbe 40 - 47
Die gleiche Belegung wie Textfarbe + 10
Und terminiert bzw. identifiziert wird mit einem finalen m
.
Den Cursor bewegt man per \x1b[80;25H
zur rechten unteren Ecke eines
80x25 Systems.
Also: "\x1b[" + x + ";" + y + "H"
wobei wir mit 1 zu zählen beginnen (und nicht bei Null).
Die gesamte Konsolenausgabe löschen kann man mit: \x1b[2J
Wobei man vorher die Text- und Hintergrundfarbe setzen sollte, denn die
gelöschte Konsole wird mit den aktuellen Farbinfos geflutet.
Fazit
Im GATE Projekt kümmert sich der system/terminals.h
Header um ein Interface
zu realen und virtuellen Konsolen. Während die WINAPI
Implementierung auch
native Funktionen
einsetzt um Farben und Cursor zu manipulieren, läuft unter
POSIX und
unter Windows per Flag auf Wunsch im Hintergrund stets eine einfache
Übersetzung nach VT-100 Escape Sequenzen.
(Erweiterte Funktionen sind vorläufig nicht von Nöten.)
Und ich finde diesen Standard zwar “etwas seltsam” in der Art wie er definiert ist, aber letztendlich mag ich ihn.
Besonders wenn man per serieller Schnittstelle verbunden ist, lassen sich durch VT-100 Codes auch hilfreiche Text-UIs übertragen und anzeigen.
PuTTY, MobaXterm und viele andere Tools unterstützen diesen Standard unter Windows und unter Linux ist er sowieso Pflicht.