VT-100 Terminal Emulation

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 Kommondos 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

Hello World

zu sehen. Die drei Parameter werden mit [ eingeleitet, mit Semikolons ; getrennt und bedeuten:

  1. Attribut der Textfarbe (0=dunkel, 1=hell)
  2. 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ß
  3. 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 Consolenausgabe 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.


Wenn sich eine triviale Erkenntnis mit Dummheit in der Interpretation paart, dann gibt es in der Regel Kollateralschäden in der Anwendung.
frei zitiert nach A. Van der Bellen
... also dann paaren wir mal eine komplexe Erkenntnis mit Klugheit in der Interpretation!