Wir richten uns ein

E-Books


MS-DOS Kurs


7. Der Prompt-Befehl und ANSI.SYS

DDie Bildschirmsteuerung unter MS-DOS ist nicht besonders kompfortabel. Außer dem Piepton(Bell), dem Wagenrücklauf (Carrige Return/Linefeed) und dem Löschen des letzten Zeichens (Backspace) werden keine Steuerzeichen interpretiert. Deshalb kann ein zusätzliches Gerätesteuerprogramm (Treiber, englisch Device Driver) verwendet werden, das weitere Steuerbefehle verarbeitet. Man hält sich damit an einen Normvorschlag für Terminal-Steuerbefehle (Normvorschrift X 3.64: Additions Controls for Use with ASCII) der amerikanischen Standardisierungsbehörde ANSI (American National Standards Institute). Deshalb wird der Treiber auch kurz ANSI-Treiber genannt und wir finden ihn auf der Systemdiskette unter dem Namen ANSI.SYS. Um seine Dienste in Anspruch zu nehmen, muß er mit
device=ansi.sys
in die Konfigurationsdatei CONFIG.SYS (wie schon behandelt) eingetragen werden. Steht der ANSI-Treiber nicht im Hauptverzeichnis, so kann auch sein Pfad angegeben werden, beispielsweise
device=\dos\ansi.sys
Anschließend muß das System neu gestartet werden (<CTRL><ALT><DEL>, <STRG><ALT><ENTF> oder Reset Taste); nur so sind neue Treiber zu installieren. Ab sofort untersucht DOS alle zum Bildschirm ausgegebenen Zeichen auf Steuerfolgen. Da fast alle Tasten in ihrer eigentlichen Bedeutung (Buchstaben, Zahlen, Sonderzeichen) gebraucht werden, stehen nicht genug Steuerzeichen zur Verfügung. Deshalb werden Folgen von Zeichen verwendet, die stets durch das Zeichen Escape (ASCII-Code 1B hex. = 27 dezimal) und die öffende Klammer [ (ASCII-Code 5B hex.= 91 dezimal) eingeleitet werden. Daran erkennt der ANSI-Treiber, daß die folgenden Zeichen nicht als Zahlen, Buchstaben zu interpretieren sind. Das einleitende Escape steht auch für die Bezeichnung Escape-Sequenzen (Sequenz (engl.) = Folge, Ordnung). In der Tafel im Anhang finden Sie alle möglichen Befehlsfolgen, auch für die schon behandelten Befehle und Kommandos. Die entsprechede Folge muß nur noch auf den Bildschirm ausgegeben werden und bewirken das entsprechende Kommando. In einer Programmiersprache können die normalen Ausgabeanweisungen verwendet werden, also write in Pascal oder Printf in C. (später ein Beispiel dazu).
Auch im Betriebssystem gibt es Kommandos, die Ausgaben auf den Bildschirm bewirken. Erinnern Sie sich bitte an den letzten Abschnitt. Mit echo Dies ist eine wunderschöne Ausgabe
erhalten Sie eben diese Ausgabe auf dem Bildschirm. Leider läßt sich das Escape nicht darstellen; das Betätigen der Escape-Taste (<ESC>) bringt nicht den erhofften Effekt - DOS nutzt die Taste zum Abbrechen von Befehlen. Der ECHO-Befehl scheidet also aus. Mit TYPE lassen sich Dateien auf den Bildschirm ausgeben, aber diese müssen erst mit einem Texteditor erstellt werden, und dann gibt es die gleichen Probleme mit nichtdruckbaren Zeichen, wie Escape. Die Überschrift verrät es: Der PROMPT-Befehl kann hier Abhilfe leisten. Seine eigentliche Aufgabe besteht bekanntlich in der Einstellung der DOS-Bereitschaftsanzeige; der Nebeneffekt der Ausgabe auf den Bildschirm wird für die Escape-Sequenzen genutzt. Vorteilhaft vor allem, daß das Escape-Zeichen eine eigene Darstellung erhält, nämlich $e (Dollarzeichen und kleines e). Wie Sie der Tafel entnehmen können, wird mit ESC [2J der Bildschirm gelöscht. Die Leerzeichen werden nur zur besseren Lesbarkeit eingefügt und dürfen sich nicht im Kommando befinden, das folgendermaßen aussieht (die eckige Klammer erreichen Sie, wie beschrieben, mit <ALT> 91):
prompt$e[2J
Wenn Sie alles richtig gemacht haben, ist der Bildschirm jetzt gelöscht und der Cursor steht links oben in der Ecke. Auffallen wird, daß kein Prompt mehr zu sehen ist - ihn haben wir mit dieser Anweisung außer Kraft gesetzt. Um Laufwerk und Pfad wieder angezeigt zu bekommen, muß
Prompt$p$g
eingegeben werden. Vorläufig reicht aber auch einfach PROMPT, denn auf den Pfad können wir bei den folgenden Übungen verzichten. Hat der Befehl nicht die erhoffte Aktion ausgeführt, so überprüfen Sie bitte folgende Fehlerquellen: Steht der Treiber ANSI.SYS in der Konfigurationsdatei CONFIG.SYS (wie oben beschrieben)? Und haben sie weitere Programme geladen, die ihrerseits die Bildschirmausgabe kontrollieren ?
Zumeist ist es der Norton-Commander (den wir uns in Folge noch genauer ansehen werden), es können aber auch andere residente Programme wie Side-Kick oder Superkey daran Schuld sein. Entfernen Sie also zunächst einmal den Norton-Commander (Funktionstaste F 10) und probieren Sie es noch einmal.
Nun ist das Löschen des Bildschirms keine allzu hilfreiche Anwendung - dafür gibt es ja den CLS-Befehl. Deshalb wollen wir als nächstes einmal einen anderen Bildschrimmodus einstellen, nämlich mit nur 40 Zeichen auf einer Zeile, die man dann auch ohne Brille ganz gut lesen kann. Dazu haben Sie
prompt$e[=0h
zu schreiben. Auch hier muß der Prompt wieder hergestellt werden, indem PROMPT eingegeben wird. Inzwischen müßten Sie in der Lage sein, aus der Tafel festzustellen, wie in den normalen Bildschirmmodus zurückgeschaltet werden kann. Normal sind 25 Zeilen zu 80 Zeichen (80x25). Da es in DOS häufig mehere Wege zum Ziel gibt, können Sie das gleiche aber auch mit
mode 80
erreichen - in einem weiteren Abschnitt wird gezeigt, was es damit auf sich hat. Jetzt dürfte es keine Schwierigkeiten mehr bereiten, beliebige andere Einstellungen vorzunehmen, beispielsweise
prompt$e[7m
zur Einstellung einer inversen Darstellung. Ihnen wird auffallen, daß nicht sofort der ganze Bildschirm invers ist, sondern nur die Ausgaben ab aktueller Cursorposition.
Weitere Möglichkeiten ergeben sich, wenn Sie über einen Farbbildschirm verfügen. Das Auge freut sich sicherlich über gelbe Schrift auf blauem Grund, die mit
prompt$e[33;44m
eingestellt wird. Der Befehl kann gefahrlos auch auf einem Scharzweißbildschirm angewendet werden. Er erzeugt Graustufen und sieht - je nach Bildschirmkarte - ganz passabel aus. Eine Einstellung ganz besonderer Art wird von
prompt$e[31;41m
vorgenommen. Probieren Sie es dorch einmal aus. Die anschließende Eingabe müssen Sie blind vornehmen oder die Reset-Taste betätigen. Warum ? Rote Schrift auf rotem Grund ... ANSI.SYS ist aber nicht nur für den Bildschirm verantwortlich, sondern auch für die Tastatur; Bildschirm und Tastatur werden zusammen Konsole genannt, und ANSI.SYS ist ein Konsol-Treiber.
Was läßt sich an einer Tastatur ändern ? Nun, die Belegung der Tasten. Warum ? Erinnern sie sich der Suche des Backslashs (\), der auf vielen Tastaturen nur schwer zu erreichen ist. Oder aber denken Sie an die Möglichkeit, eine ganze Zeichenkette (etwa einen Programmnamen) auf nur eine Taste zu legen. Dazu müssen Sie den Code wissen, den diese Taste abgibt. Alle Tasten, die ein druckbares Zeichen darstellen, können Sie unter ihrem ASCII-Code erreichen. Sie benötigen dazu eine ASCII-Tabelle, die in kaum einer Dokomentation fehlt. Dort werden Sie das kleine u als eine dezimale 117 und das kleine x als 120 finden. Als erstes fällt einem sicherlich ein Beispiel ein; um also ein x für ein u zu erhalten, brauchen sie nur noch
prompt$e[117;120p
einzugeben (siehe auch Tafel). Wie Sie sich selbst überzeugen können, trifft die Einstellung jetzt nur für das kleine u zu, für den Großbuchstaben ist die gleiche Prozedur mit seinem Tastencode nötig. Wenn Sie dieses Beispiel nicht überzeugt, so möchte ich Ihnen auch eine sinnvolle Anwendung vorstellen. Wir wenden uns deshalb dem Backslash zu und legen ihn auf das Ausrufezeichen, das uns damit verlorengeht:
prompt$e[33;92p
Beachten Sie bitte, daß vor dem letzten Buchstaben (in diesem Falle das p zur Kennzeichnung der Umbelegung) kein Semikolon steht. Da kaum ein Zeichen entbehrlich ist, wäre es viel interessanter, die Funktionstasten zu belegen. Diese Steuertasten besitzen einen sogenannten erweiterten Tastaturcode. Er beginnt stets mit Null und es folgt ein weiteres Zeichen (SCAN-Code). Gleiches gilt auch für Buchstaben in Verbindung mit der ALT- oder Control-(Strg-)Taste. Für eine vollständige Tabelle fehlt uns der Platz - Ihnen bleibt nur der Bilck in die Systemliteratur. Trotzdem als kleine Hilfe die wichtigsten Belegungen:

<F1> bis <F10> Code: 0;59 bis 0;68
<F1> bis <F10> mit <SHIFT> Code: 0;84 bis 0;93
<F1> bis <F10> mit <CTRL> Code: 0;94 bis 0;103
<F1> bis <F10> mit <ALT> Code: 0;104 bis 0;113
<ALT><Q> Code: 0;16
<ALT><W> Code: 0;17
<ALT><D> Code: 0;32
<ALT><F> Code: 0;33

Sie sehen, daß die Codes nicht aufsteigend nach dem Alphabet, sondern nach der Anordnung auf der Tastatur vergeben worden sind. Die Abtrennung mit Semikolon wurde gewählt, da sie auch in den Escape-Sequenzen so gefordert sind. Damit Sie einen Vergleich haben, hier der Befehl um den Backslash auf die F1-Taste zu legen:
prompt$e[0;59;92p
Damit verliert die F1-Taste natürlich die bereits beschiebene Möglichkeit, einzelne Zeichen aus dem Tastaturpuffer zu holen. Und natürlich wird auch deutlich, daß sich solche eine Einstellung nicht mit dem Norton-Commander verträgt, der seine eigene Belegung der F1-Taste durchsetzen würde. Etwas sinnvoller lassen sich die Funktionstasten mit einem ganzen Kommando belegen, zum Beispiel mit dem DIR-Kommando, wiederum auf die Taste F1:
prompt$e[0;59;"dir";13p
Die dezimale 13 hinter dem Kommando ist ein Wagenrücklauf (Carrige Return) und bewirkt, wie das Betätigen der Enter-Taste, die sofortige Ausführung des Kommandos. Genausogut ist es auch möglich, auf die Eingabe weiterer Parameter von Hand zu warten. Das Kommando
prompt$e[0;60;"type"p
legt auf F2 den Befehl TYPE und wartet beim Betätigen der Taste auf die Eingabe eines Dateinamens. Das Belegen der Tasten mit Kommandos beschränkt sich nicht auf die Funktionstasten. Dazu nutzt man die Mehrfachbelegung der Tasten, also <CTRL><Buchstabe> oder <ALT><Buchstabe>.
Es stehen ausreichend Tasten für eigene Ideen zur Verfühgung. Versuchen Sie es mal mit dem Kommando FORMAT A: auf die Tasten <ALT><F>:
prompt$e;33"format a:";13p
oder mit dem Aufruf von dBase auf <ALT><D> mit
prompt$e;32;"dBase";13p
Aufmerksame Leser werden sicher auf die Idee kommen, nicht nur Systemkommandos, sondern auch sonst benötigte Zeichenketten fest auf Tasten zu legen, zum Beispiel "BEGIN" für Pascal-Programmierer, "LIST" für dBase oder "Mit freundlichen Grüßen" für eine beliebige Textverarbeitung. Hier werden Sie enttäuscht. Der ANSI-Treiber tut seine Arbeit nur auf der Ebene des Betriebssystems, innerhalb von Programmen stehen Ihnen die Belegungen nicht zur Verfühgung, da die meisten Programme eigene Ein-/Ausgaberoutinen benutzen (Ausnahmen bestätigen wie immer die Regel).
Es gibt allerdings Hilfsprogramme, die sogenannte Tastaturmacros, also die Belegung von Tasten mit Zeichenketten in sehr komfortabler Form gestatten. Dazu gehören SuperKey und Keyworks. Und noch ein Hinweis: Es steht nicht unbegrenzt Platz für Umbelegungen von Tasten zur Verfühgung. In DOS 3.x werden Sie im Schnitt auf 30, höchstens 64 Redefinitionen kommen. Aber das sollte ja ausreichend sein. Ist der dafür vorgesehene Puffer voll, werden die danach folgenden Angaben ohne Fehlermeldung ignoriert.
Haben Sie ein paar sinnvolle Belegungen gefunden, so schreiben Sie diese am besten in die AUTOEXEC.BAT, um sie nach jedem Systemstart wieder zur Verfühgung zu haben, denn selbstverständlich gehen sie verloren, wenn der Rechner abgeschaltet wird.
Zu guter Letzt sei noch einmal daran erinnert, daß die Ausgabe von Steuersequenzen mit der eigentlichen Aufgabe des PROMPT-Befehls nichts zu tun hat; er wird sozusagen zweckentfremdet benutzt. Der Vorteil liegt darin, daß wir nicht extra eine Programmiersprache bemühen müssen, sondern auf DOS-Kommandoebene arbeiten können. In einer Programmiersprache können die Steuerzeichen einfach mit dem Ausgabebefehl auf den Bildschirm ausgegeben werden. Die einizige Schwierigkeit besteht darin, daß der Programmierer wissen muß, wie die nichtdruckbaren Zeichen (vor allem ESCAPE) ausgegeben werden. Die Belegung der F1-Taste mit dem DIR-Befehl sei hier als Beispiel in Pascal und C gezeigt:

write(chr(27),'[0;59;"dir";13p'); (Pascal)
printf("%c[0;59;\"dir\";13p",27); (C)

Achten Sie aber darauf, daß der Compiler die Programmierschnittstelle von DOS (BDOS) verwendet und nicht (an ANSI.SYS vorbei) auf das ROM-BIOS zugreift. Für Turbo-Pascal heißt das, auf die Unit CRT zu verzichten.

(c) Jürgen Richter