VT100/52 Escape-Sequenzen
Von Carsten
Um eine Terminalemulation zu programmieren, müssen unterschiedlichste Standards der Zeichen- und Steuerungskodierung untersucht werden. Einer der gebräuchlichsten und von den meisten Terminals unterstützen Standards ist der sog. VT100-Standard. Ich möchte versuchen, in diesem Eintrag die Behandlung der sog. Escape Sequenzen zu erklären, mit denen unter anderem die Cursorposition und die Farbeinstellung eines Terminals verändert wird.
Update: Einige Codes geändert.
Das namensgebende Merkmal dieser speziellen Zeichenfolgen, die ein Terminal aussendet, um den angeschlossenen Bildschirm zu füllen, ist das beginnende Escape. Das Escape-Zeichen (oft ESC abgekürzt) steht immer am Anfang einer Escape Sequenz, die aus mehreren Zeichen bestehen kann. Der Standard VT100 kann sogar mehrere Anweisungen in einer Sequenz unterbringen.
Die Erkennung und Verarbeitung einer Escape Sequenz in VT100 kann in den folgenden Schritten erfolgen:
- Keine Escape Sequenz in Bearbeitung, das Zeichen wird ausgegeben. Weiter in Zustand 1.
- Escape Sequenz gestartet (ESC empfangen). Nächstes Zeichen auswerten. Wenn [, weiter in Zustand 4. Ansonsten weiter in Zustand 3.
- Zeichen als Einzelzeichen-Escape-Code auswerten. Weiter in Zustand 1.
- ESC [ empfangen, Parameter sammeln bis zum nächsten nicht-numerischen Zeichen (ausser ;) und Kommandos auswerten. Weiter in Zustand 1. Das Format ist: ESC
[n;n;n;n;...;nx
, wobei n=numerisch und x=Buchstabe ist, mit einem optionalen?
nach dem[
.
Durch die neuen Methoden der Klasse java.lang.String
ist das getrennte Bearbeiten der einzelnen Kommandos in Zustand 4 recht einfach. Die Methode split(";")
trennt die Zeichenkette an den Kommando-Trennern auf und man kann durch die einzelnen Stücke iterieren. Leider gibt es im Netz keine leicht zu findende Quelle für alle Kommandos, daher habe ich mich bemüht, auf der nächsten Seite die gebräuchlichsten Kommandos und Codes zu sammeln.
Die folgende Tabelle habe ich selbst aus einigen Quellen im Netz zusammengesucht. Sie ist nicht vollständig und kann fehlerhaft sein. Wenn jemand Fehler bemerkt, meldet sie bitte bei mir!
Bezeichnung | Code | Erklärung |
---|---|---|
ESC | 27 | Escape |
LF | 10 | Line Feed |
LF2 | 11 | line feed 2 ??? |
LF3 | 12 | line feed 3 ??? |
CR | 13 | Carriage Return |
TAB | 9 | Tab |
BS | 8 | Backspace |
UP | “[A” | 1 Zeile hoch |
DW | “[B” | 1 Zeile runter |
RT | “[C” | 1 Spalte nach rechts |
LT | “[D” | 1 Spalte nach links |
HOME | “[H” | Nach oben links gehen |
POS(X, Y) | “[Y"Y##X | Springe in Spalte, Zeile |
CLS | “[2J” | CLear Screen (Bildschirm löschen, nach oben links) |
CLRHOME | “[1J” | Lösche von Cursor bis oben links |
CLREND | “[J” | Lösche von Cursor bis unten rechts |
CLREOL | “[K” | Lösche Zeile vom Cursor an |
CLRLINE | “[2K” | Lösche aktuelle Zeile |
CLRBOL | “[1K” | Lösche vom Cursor bis Anfang der Zeile |
INSLINE | “[L” | Zeile einfügen |
DELLINE | “[M” | Entferne Zeile |
INVVIDEO | “[7” | Farben umkehren (Inverse Video) |
NORMVIDEO | “[0” | Reset der Farben (Normal Video) |
CURSAVE | “[s” | Speicher Cursorposition |
CURREST | “[u” | Stelle Cursorposition wieder her |
WRAPON | “[7h” | Zeilenumbruch an |
WRAPOFF | “[7l” | Zeilenumbruch aus |
Die Farbcodes waren etwas schwerer zu finden, aber ich hoffe, die folgende Tabelle entspricht der Wahrheit. Die Farben werden in diesem Format geändert: ESC [X
, wobei X der entsprechende Farbcode ist (für grüne Schrift z.B. ESC [32
).
Vordergrund | Hintergrund | Farbe |
---|---|---|
30 | 40 | schwarz |
31 | 41 | rot |
32 | 42 | grün |
33 | 43 | gelb |
34 | 44 | blau |
35 | 45 | purpur |
36 | 46 | zyan |
37 | 47 | weiß |