Im Herzen des JOYCE

Teil 3: Vorgetäuschte Hardware

Im heutigen Teil unseres Streifzugs durch die "Tiefen" des JOYCE-BIOS geht es um ein Programmsegment, das die Kommunikation des CP/M-Betriebssystems mit dem Bildschirm ermöglicht. Die Hauptaufgabe dieses Teils des BIOS besteht darin, dem Anwenderprogramm vorzutäuschen, es kommuniziere mit einem Zenith Z19/Z29-Terminal, daher auch der Name TERMINAL-EMULATOR (TE).

Bei der Emulation des Z19/Z29-Terminals kommt es hauptsächlich darauf an, daß die Steuersequenzen (ESCape-Sequenzen) für den Bildschirm einem Standard angepaßt werden, der es erlaubt, Anwenderprogramme, die nichts von der Hardware des JOYCE wissen, auch auf diesem Rechner zu installieren. Dabei ist die Emulation (= Nachbildung) keine hundertprozentige, ermöglicht aber dem Anwender die Auswahl diverser Bidschirmtypen für die Installation seiner Programme.

Für die direkten Aufrufe der Systemroutinen ist die Emulator-Funktion jedoch nur insoweit interessant, als dadurch dem Programmierer die Möglichkeit gegeben wird, mit dem Bildschirmtreiber in Verbindung zu treten. Zuvor jedoch noch einmal die Bedingungen, unter denen die im folgenden erläuterten Systemeinsprünge vom Anwender benutzt werden können:
  1. Alle hier aufgeführten Einsprungadressen beziehen sich auf die CP/M-Plus-Version 1.4 (System-File J14GCPM3.EMS).
  2. Da sich die hier beschriebenen Systemroutinen in der Systembank (Speicherbank #0) befinden, muß vor dem Aufruf die Speicherbank umgeschaltet werden. Dies geschieht am einfachsten über die BIOS-Funktion #30 mit
    CALL 0FC5A
    DEFW ROUTINE
    wobei ROUTINE die Adresse der gewünschten Systemroutine ist.
  3. Die Bezeichnungen für die hier aufgeführten Programmeinsprünge wurden mangels offizieller Dokumentation, entsprechend der Bezeichnungen für die ROM-Routinen der CPC-Computer, gewählt. Ein Vergleich der Systemroutinen beider Computer zeigt weitgehende Übereinstimmungen der einzelnen Funktionen.

Aufteilung

Prinzipiell lassen sich die Routinen des Terminal-Emulators in folgende Gruppen unterteilen:
→ Initialisierung
→ Zeichenausgabe
→ Bearbeitung der ESCape-Sequenzen
→ Cursorsteuerung/Fensterverwaltung
→ Statusausgabe
Da der Abschnitt Statusausgabe sehr umfangreich ist, werden wir ihm einen extra Beitrag widmen, in dem neben der Erläuterung der vorhandenen Funktionen auch das Erzeugen eigener Statusmeldungen gezeigt werden soll. Die Initialisierung beinhaltet das Löschen des Bildschirms, die Auswahl von Farbe, Zeichensatz und Ausgabeattribut.
Im einzelnen kann der Anwender dazu folgende Routinen aufrufen:
TE RESET $0540
initialisiert den Bildschirm und setzt diverse Default-Werte für:
→ Zeichensatz (deutsch)
→ Bildschirmfarbe (hell auf schwarz)
→ Cursor-Koordinaten (0,0)
→ Bildschirmgröße (32 x 90)
Es empfiehlt sich, diese Routine immer dann aufzurufen, wenn man einen definierten Zustand des Bildschirms, zum Beispiel nach Direktzugriffen auf den Bildschirmspeicher oder Manipulationen des Roller-RAM (dient der Adressierung des Bildschirmspeichers), benötigt.
TE ASK $06F7
übergibt die aktuellen Fenster- und Cursor-Koordinaten
TE SET MODE $073D
wählt einen neuen Bildschirmmodus aus. Diese Routine besteht nur aus Gründen der Kompatibilität und bewirkt eine Umschaltung auf die Bildschirmgröße 32 Zeilen mal 90 Zeichen (32 x 90) bei Wahl der Modi 0 und 1. Modus 2 bewirkt lediglich ein Löschen des Bildschirms.
TE SET CHAR ATTRIBUTE $08E4
ermöglicht die Neueinstellung der Ausgabeattribute und löscht das vorhandene Attribut. Zulässige Attribute sind:
→ normale Ausgabe
→ normale Ausgabe, unterstrichen
→ invertierte Ausgabe
→ invertierte Ausgabe, unterstrichen
Für die Farbeinstellung bietet der Terminal-Emulator vier Routinen, die dem Nutzer die Umschaltung von schwarz/grün auf grün/schwarz (und umgekehrt) ermöglichen. Für die Erzeugung der Farben gibt es drei Farbwerte, die über eine Farbnummer angesprochen und verändert werden können:
Farbe 0 = Border (Rand)
Farbe 1 = Paper (Hintergrund)
Farbe 2 = Pen (Schrift)
Die Berechnung des endgültigen Farbwerts ist recht kompliziert, braucht aber den Nutzer normalerweise nicht zu interessieren, da der JOYCE sowieso nur zwei Farben kennt. Mit den folgenden Routinen TE SET PAPER und TE SET PEN läßt sich relativ einfach wie Umschaltung dieser Farben erreichen:
TE SET PAPER $08EE
legt die Hintergrundfarbe fest. Hier läßt sich ein heller Hintergrund jedoch nur erreichen, wenn der Farbcode für PAPER einen größeren Wert annimmt als der Farbcode für PEN. Wird Bit 6 im Farbcode gesetzt, überdeckt die Hintergrundfarbe auch die Schriftfarbe, was bedeutet, daß der Bildschirm dabei dunkel beziehungsweise hell getastet wird.
TE SET PEN $08F6
legt die Schriftfarbe fest. Eine Änderung der Schriftfarbe hat automatisch auch eine Änderung der Hintergrundfarbe zur Folge. Wird der Farbwert für die PEN-Farbe größer als der Wert für PAPER, ist die Schriftfarbe hell, der Hintergrund dunkel. Ist der PEN-Farbwert kleiner, wird der Hintergrund hell, die Schriftfarbe dunkel.
Der Default-Wert für die PAPER-Farbe ist nach der Initialisierung $01, der Farbwert für die PEN-Farbe ist auf $3F gesetzt.
TE SET INK $0901
ermöglicht beim JOYCE nur die Einstellung von PAPER- und PEN-Farben, alle anderen Farbnummern werden ignoriert.
TE SET BORDER $090C
erlaubt beim JOYCE nur ein Umschalten der Farben (siehe TE SET PAPER).
TE SET SPEED $090F
definiert die Zeitwerte (Einheit 1/50 Sekunde) für den Farbwechsel. Beim JOYCE läßt sich hier nur ein Blinken des kompletten Bildschirms erreichen.
TE SET LANGUAGE $0912
schaltet auf den gewünschten Zeichensatz um. Die hier möglichen Zeichensätze sind in Tabelle 1 aufgelistet.

NummerZeichensatz
0amerikanisch
1französisch
2deutsch
3englisch
4dänisch
5schwedisch
6italienisch
7spanisch
Tabelle 1: Die verfügbaren Zeichensätze des JOYCE

Beim Aufruf dieser Routine erfolgt keine Überprüfung, ob die gewünschte Zeichensatznummer zulässig ist!
In den Bereich "Verschiedenes" gehören die beiden folgenden Aufrufe:
TE JUMP (DE) $09AF
führt einen Sprung zu der im DE-Register spezifizierten Adresse durch.
TE JUMP (HL) $09B1
führt einen Sprung zu der im HL-Register spezifizierten Adresse durch (entspricht dem Z80-Befehl JP (HL)).

Zeichenausgabe

Für die Zeichenausgabe hält der Terminal-Emulator nur zwei Routinen bereit, die sich jedoch in einigen Punkten wesentlich unterscheiden:
TE TXT OUTPUT $0548
ermöglicht die Ausgabe eines Zeichens und die Bearbeitung der Steuersequenzen (ESCape-Sequenzen). Diese Routine ist die sicherste Methode, Zeichen an den Bildschirmtreiber zu senden. Bei der Zeichenausgabe wird die Schreibmarke (Cursor) automatisch weiterbewegt.
TE WRITE CHAR $07A9
kann ebenfalls zur Zeichenaüsgabe aufgerufen werden. Hierbei werden Steuercodes allerdings als normale Ausgabezeichen interpretiert. Eine Verwendung dieser Routine ist besonders nützlich, wenn man Zeichen mit einem ASCII-Code < $20 ausgeben will, da diese normalerweise ein vorangestelltes ESC-Zeichen (ASCII-Code $1B) benötigen.
Auch bei diesem Aufruf wird der Cursor automatisch weiterbewegt, der Anwender muß jedoch selbst dafür sorgen, daß der Cursor an der neuen Position wieder eingeschaltet wird (siehe TE CUR ENABLE).
Zur Bearbeitung der Steuerzeichen läßt sich folgende Empfehlung geben: Bis auf wenige Ausnahmen sollten Steuercode-Sequenzen, die in der Regel mit dem ESC-Zeichen (ASCII $1B) eingeleitet werden, über die Ausgabe-Routine TE TXT OUTPUT abgewickelt werden. Das ist damit begründet, daß für viele dieser Steuersequenzen die Cursorposition und eventuell auch die Koordinaten des aktuellen Darstellungsfensters benötigt werden. Während der Ausführung von TE TXT OUTPUT werden diese Daten automatisch in die Prozessor-Register übernommen, und es erscheint mir daher unnötig, dies noch einmal extern vom Anwenderprogramm zu programmieren. Allerdings kann man einige spezielle Funktionen, wie zum Beispiel die Farbumschaltung (siehe oben) oder die Definition des Darstellungsfensters etc., auch direkt aufrufen. Für den direkten Aufruf eignen sich außerdem folgende Steuerfunktionen:
ESC x $0736
begrenzt das Darstellungsfeld des Bildschirms auf 24 Zeilen zu je 80 Zeichen.
ESC y $0733
hebt den 24x80-Modus auf und setzt die Bildschirmgröße auf 32 Zeilen zu 90 Zeichen.
ESC v $07F8
schaltet die AUTO-CR/LF Funktion ein.
Am Ende einer Zeile wird der Cursor automatisch an den Beginn der nächsten Zeile gesetzt.
ESC w $07FC
schaltet den AUTO-CR/LF Modus wieder aus.
ESC E $0878
löscht den Bildschirm, der Cursor bleibt an seiner Position.
ESC r $08D2
schaltet den Unterstreichungs-Modus ein.
ESC u $08D7
schaltet den Unterstreichungs-Modus aus.
ESC p $08DC
schaltet die inverse Zeichenausgabe ein.
ESC q $08E1
schaltet die inverse Zeichenausgabe aus.
Diese vier Funktionen lassen sich ebenso über die oben genannte Routine TE SET CHAR ATTRIBUTE ein- und ausschalten.

ESC-SequenzEinsprungadresse
ESC A$0801
ESC D$0805
ESC B$0809
ESC C$080C
ESC I$080F
ESC H$0846
ESC Y z s$084E
ESC d$0864
ESC J$0883
ESC I$089A
ESC o$08A2
ESC L$08B0
ESC M$08B5
ESC N$08C9
SteuercodeEinsprungadresse
BEL($07)$07E0
BS ($08)$081F
CR ($0C)$0832
LF ($0A)$0836
Tabelle 2: Direkteinsprünge zur Bearbeitung der Steuercode-Sequenzen

Die Größe des Darstellungsfensters, normalerweise durch die Steuersequenz ESC X oz ls h b definiert (vergleiche Handbuch), läßt sich auch direkt festlegen:
TE SET WINDOW $0783
bestimmt die Größe des Darstellungsfensters. Der sonst bei Verwendung der ESC-Sequenz benötigte Offset von $20 ist beim direkten Aufruf der Routine nicht erforderlich. Liegen die übergebenen Koordinaten außerhalb des Bildschirms, werden automatisch Maximalwerte benutzt. Leider kann das BIOS des JOYCE nur jeweils ein einziges Fenster verwalten. Wenn Sie also mit mehreren Fenstern gleichzeitig arbeiten möchten, müssen Sie die Verwaltung selbst übernehmen.

Der Cursor

Da die Bewegungen des Cursors ebenfalls über ESCape-Steuersequenzen beziehungsweise automatisch bei der Ausgabe eines Zeichens erfolgt, sollte man hier, außer für spezielle Anwendungen, ruhig auf die vom BIOS angebotenen Routinen, speziell TE TXT OUTPUT zurückgreifen.

Sollte es dennoch notwendig sein, die Cursorbewegungen selbst zu programmieren, sei darauf hingewiesen, daß die Schreibmarke jeweils an der alten Position ausgeschaltet (TE CUR DISABLE) und an der neuen Position wieder eingeschaltet (TE CUR ENABLE) werden muß. Außerdem werden für alle Cursorroutinen die aktuellen Koordinaten des Cursors im HL-Register erwartet.

TE CUR ENABLE $06AD
aktiviert den Cursor-Event (Interrupt), sprich diese Routine ermöglicht das Einschalten des Cursors. Ob er wirklich eingeschaltet werden kann, ist vom sogenannten Cursor-Flag abhängig.

TE CUR DISABLE $06B5
deaktiviert den Cursor über die Routine TE PLACE/REMOVE CURSOR.

TE DRAW/UNDRAW CURSOR $06C6
schaltet den Cursor in Abhängigkeit vom Cursor-Flag ein oder aus (Event-Routine).
TE PLACE/REMOVE CURSOR $06D0
zeichnet beziehungsweise löscht den Cursor. Er wird übrigens durch einfaches Invertieren der entsprechenden Zeichenmatrix im Bildschirmspeicher erzeugt. Damit ist eine Änderung der Cursorgröße oder -form nicht so ohne weiteres möglich.

ESC e $06DF
setzt das Cursor-Flag auf $FF (on)

ESC f $06DC
setzt das Cursor-Flag auf $00 (off)
Da die Routinen zum Bewegen des Cursors und zum Löschen von Zeilen und Bildschirmausschnitten weitgehend den ESC-Steuersequenzen entsprechen, will ich auf eine detaillierte Erläuterung der Funktionen hier verzichten. Eine ausführliche Erklärung der Sequenzen finden Sie im Benutzerhandbuch, Anhang 3.
Die zweite Tabelle gibt Auskunft über die entsprechenden Einsprungadressen dieser Routinen. Wie schon erwähnt, muß beim Aufruf im HL-Register die aktuelle (oder neue) Cursorposition übergeben werden. Die aktuelle Cursorposition wird vom Terminal-Emulator übrigens in den Adressen $2826 (Spalte) und $2827 (Zeile) aufbewahrt. Damit können wir diesen Beitrag über die allgemeinen Funktionen des Terminal-Emulators abschließen.
Tabelle 3 faßt noch einmal alle hier besprochenen Routinen und ihre Übergabe-Parameter zusammen, die Beispiellistings zeigen, wie Sie diese Funktionen aufrufen und verwenden können.
Tabelle 3: Die Funktionen des Terminal-Emulators im Überblick
Wie anfangs schon angedeutet, wird unser nächstes Thema die Ausgabe und Verwaltung der Statusmeldungen sein. Sie werden feststellen, daß der JOYCE noch viel Interessantes zu bieten hat.
Wie jeden Monat können Sie auch diesmal wieder alle Porgramme auf unserer Databox wiederfinden.
Die Dateien im einzelnen: SETBG.COM, SETBG.PAS - Umschalten der Farben
DIREKT.BAS - direkte Zeichenausgabe
ZSTEST.COM, ZSTEST.ASM - BEISPIELPROGRAMM

(Norbert Finke/rs)
[2. Teil] [Inhalt] [4. Teil]

Eingescanned von Werner Cirsovius
März 2003
© DMV Verlag