Im Herzen des JOYCE

Teil 4: Der Zustand des Rechners

Wenn wir über den Zustand unseres Computers sprechen, hat dies natürlich weniger mit dem materiellen Zustand, sprich dem 'Alter' des Rechners zu tun, sondern vielmehr mit dem operationeilen Zustand, auch als 'STATUS' bezeichnet. Dem Nutzer wird dieser Status über sogenannte Statusmeldungen mitgeteilt, damit er über eine vorhandene Fehlerquelle oder die eventuellen 'Unzulänglichkeiten' seines Rechners informiert ist. Wichtige Änderungen im Status werden meist automatisch angezeigt (zum Beispiel Fehler), andere Informationen können über die Tastatur oder aus Programmen heraus abgerufen werden.

Im heutigen Teil unseres Streifzugs durch die BIOS-Tiefen der PCW-Rechner befassen wir uns mit den Möglichkeiten des JOYCE, uns seinen 'Status' mitzuteilen. Diese Mitteilungen erfolgen entweder über die Statuszeile (die untere Bildschirmzeile) oder direkt auf dem Bildschirm, wenn die Statuszeile ausgeschaltet ist. Der Terminal-Emulator, der die Kommunikation mit dem Anwender-Programm steuert, hält auch hierfür die entsprechenden Routinen bereit. Bevor wir uns jedoch diesen Routinen zuwenden, benötigen wir noch einige Kenntnisse über den Aufbau solcher Meldungen.

Jede Statusmeldung setzt sich aus mehreren Textfragmenten zusammen, die ebenso wie die Statusmeldungen selbst, durch eine entsprechende Text-Nummer gekennzeichnet sind.
Erst beim Aufruf werden diese Textfragmente, zusammen mit eventuell benötigten Kontrollinformationen, Zahlenwerten und so weiter, zu einer verständlichen Statusmeldung zusammengefügt.
Von den insgesammt 70 Text-Nummern werden nur 25 (siehe Tabelle 1) für den direkten Aufruf der Statusmeldungen benutzt, weitere 45 definieren die Textfragmente, die zur Erzeugung dieser Meldungen benötigt werden.
- Laufwerks-Status:
0LW: Laufwerk nicht bereit - Wiederholen, Ignorieren oder Abbrechen?
1LW: Diskette schreibgeschützt - Wiederholen, Ignorieren oder Abbrechen?
2LW: Spur n Suche ohne Erfolg - Wiederholen, Ignorieren oder Abbrechen?
3LW: Spur n, Sektor n Datenfehler - Wiederholen, Ignorieren oder Abbrechen?
4LW: Spur n, Sektor n keine Daten - Wiederholen, Ignorieren oder Abbrechen?
5LW: Spur n, Sektor n Adresseintrag fehlt -Wiederholen, Ignorieren oder Abbrechen?
6LW: ungültiges Format - Wiederholen, Ignorieren oder Abbrechen?
7LW: unbekannter Fehler - Wiederholen, Ignorieren oder Abbrechen?
8LW: Diskette wurde gewechselt - Wiederholen, Ignorieren oder Abbrechen?
9LW: falsche Diskette - Wiederholen, Ignorieren oder Abbrechen?
Die Angabe des Laufwerks (LW:) erfolgt nur, wenn zwei oder mehr Laufwerke vorhanden sind)
- System-Status:
10CP/M Plus Amstrad Consumer Electronics plc v 1.4, 61K TPA, (zusätzliche Info ist abhängig von der vorhandenen Hardware)
16Bitte Diskette für LW: einlegen, dann irgendeine Taste drücken (Meldung erscheint, wenn nur ein LW vorhanden ist und ein zweites LW vom System 'emuliert' wird)
17GERÄT: nicht bereit - Wiederholen, Ignorieren oder Abbrechen?
19Laufwerk ist LW: (Meldung erscheint, wenn nur 1 LW vorhanden und die Statuszeile eingeschaltet ist)
- Drucker-Status:
20Drucker: Aktiv
21Drucker: On Line
22Drucker: Off Line
23Drucker: Papier zu Ende
24Drucker: Papier einlegen
25Drucker: Andruck offen
26Drucker: FEHLER - Unterlauf
27Drucker: FEHLER - Drucker RAM
28Drucker: FEHLER - Unzul. Befehl
29Drucker: FEHLER - Druck-Fehler
30Drucker: kein Drucker
Die Statuszeile für Drucker-Meldungen wird durch die folgenden Meldungen erweitert, die beim Aufruf über das D-Register definiert werden:
- in Zeile n / Seitenanfang
- LF
- FF
- Entwurf/Korrespondenz
- PE ignor:Aus/PE ignor:Ein
- Hex:Aus/Hex:Ein
- Reset
Tabelle 1: Zuordnung der Text-Nummern
Ein Beispiel:
Die Statusmeldung mit der Aufrufnummer 0 (siehe Tabelle 1) ist in der Tabelle der Statusmeldungen ($1920 - $1C1F in Speicherbank #0) wie folgt abgespeichert:
FE 03 BC C1 FF Für die komplette Meldung werden also nur fünf Bytes benötigt, die beim Aufruf die jeweils benötigten Textfragmente zur eigentlichen Meldung zusammenfügen. Durch die Verwendung von Steuercodes innerhalb dieser Textfragmente ist es möglich, Zahlen, Gerätenamen, etcetera ebenfalls in die Statusmeldung einzufügen.

Gesteuerte Status-Ausgabe

Mit entsprechenden Kenntnissen über Bedeutung und Verwendung dieser Steuerzeichen lassen sich somit ohne Schwierigkeiten Tabellen zur Ausgabe 'eigener' Statusmeldungen aufbauen. Dazu muß der Adresseintrag der BIOS-Statustabelle (in Adresse $09CA) auf die eigene Tabelle umgeleitet werden. Dies setzt jedoch voraus, daß die eigene Statustabelle in der sogenannten COMMON-Memory (Adressbereich $C000-$FFFF) liegt, damit sie auch von den Systemroutinen erreicht werden kann.
Tabelle 2 faßt die benutzbaren Steuerzeichen zusammen, hier eine kurze Erläuterung:
Code:Bedeutung:
$F3der ASCII-Code des nächsten Ausgabe-Zeichens ist > 127 ($7F)
$F4zusätzliche Leerzeichen ausgeben
$F5fügt Text aus der Statustabelle in die Statusmeldung ein (Auswahl durch D (b0/b1), siehe Text)
$F6Ausgabe-Attribute auf 'normal' setzen
$F7Ausgabe-Attribute auf 'invers' setzen (C b7 muß '1'sein, siehe Text)
$F8formatierte Ausgabe einer Dezimalzahl (000..999, HL = Zahl)
$F9Text einfügen (ohne Leerstellen, z.B. Gerätenamen)
$FAunformatierte Ausgabe einer Dezimalzahl (0..65535, DE = Zahl)
$FBunformatierte Ausgabe einer Dezimalzahl (0..255, E = Zahl)
$FCunformatierte Ausgabe einer Dezimalzahl (0..255, D = Zahl)
$FDLaufwerks-Bezeichner (LW:) ausgeben
$FELaufwerks-Bezeichner (LW:) ausgeben (nur bei 2 und mehr LW)
$FFText-Ende (EOT)
Alle weiteren Codes mit ASCII-Werten > 127 ($7F) werden als Text-Nummer interpretiert indem das MSB (Bit 7) gelöscht wird.
Tabelle 2: Steuercodes für die Erzeugung von Statusmeldungen
Das Zeichen $F3 bedeutet, daß das nächste Ausgabe-Zeichen für die Meldung einen ASCII-Wert > 127 hat und als solches ausgegeben werden soll. Normalerweise werden alle Zeichen > 127 als Steuerzeichen betrachtet, mit $F3 wird es möglich, auch Sonderzeichen/Grafikzeichen in die Statusmeldung einzufügen. Beispiel: F3 A4 fügt das Copyright- Zeichen (ASCII-Code $A4) in die Statusmeldung ein.
Das Zeichen $F4 fügt Leerzeichen in die Ausgabe-Meldung ein. Die Anzahl der Leerstellen wird mit dem nächsten Zeichen festgelegt. Beispiel: F4 08 fügt acht Leerzeichen in die Statusmeldung ein. $F5 ermöglicht die Auswahl von drei verschiedenen Textfragmenten aus der Statustabelle in Abhängigkeit von den Bits 0 & 1 des D-Registers.
Beispiel: F5 12 43 25 19
Abhängig vom Inhalt des D-Registers (b1/b0) werden folgende Textfragmente in die Statusmeldung eingefügt:
D(b1/b0)=00:Text-Nummer 18($12)
D(b1/b0)=01:Text-Nummer 67($43)
D(b1/b0)=10:Text-Nummer 37($25)
Das D-Register wird bei jeder Prüfung um zwei Bits nach rechts rotiert, so daß maximal vier Auswahlfelder zur Verfügung stehen.
Nach der Ausgabe des Textfragments werden automatisch die nächsten drei, dem Steuerzeichen folgenden Text-Nummern übersprungen und die Ausgabe mit dem Fragment #25 ($19) fortgesetzt. Hieraus folgt, daß die Bit-Folge elf im D-Register für diese Ausgabeform nicht zulässig ist, denn sonst würde Meldung #25 doppelt ausgegeben.
Die Zeichen $F6 und $F7 ermöglichen ein Umschalten des Ausgabeattributes auf farbinvertierte Ausgabe ($F7) und normale Ausgabe ($F6).
Für die Umschaltung auf invertierte Ausgabe muß zusätzlich das Bit sieben des C-Registers gesetzt sein. Der Inhalt des C-Registers wird bei jeder Prüfung um eine Position nach links rotiert, so daß es möglich ist, aus bis zu acht Menue-Feldern ein einzelnes Feld invers zu setzen (wie zum Beispiel beim Drucker-Status).
Beispiel: F7 41 F6 gibt den Buchstaben 'A' innerhalb der Statusmeldung invertiert aus, wenn das MSB des C-Registers auf '1' gesetzt ist.
Das Steuerzeichen $F8 wandelt die im Register HL spezifizierte Binärzahl in eine Dezimalzahl um und fügt sie formatiert, das bedeutet mit vorangestellten Nullen, in die Statusmeldung ein. Hier sind nur dreistellige Zahlenwerte zulässig (000..999).
Beispiel: HL = $0014 , das Zeichen $F8 würde diese Zahl in 020 umwandeln und ausgeben.
Um einen beliebigen Text in die Statusmeldung einzufügen, benutzt man das Steuerzeichen $F9. Es werden jeweils sechs Zeichen eingefügt, die über das HL-Register addressiert werden. Leerstellen, die im Textstring enthalten sind, werden nicht mit ausgegeben, beim JOYCE wird dieses Steuerzeichen für die Ausgabe der Gerätenamen (CEN, LPT SIO, ...) benutzt.
$FA, $FB und $FC werden wieder zur Zahlenumwandlung benutzt, wobei hier die auszugebende Zahl im DE-Register übergeben wird (siehe Tabelle 2). Die Ausgabe erfolgt unformatiert, also ohne vorangestellte Nullen.
Beispiel: FB wandelt die im E-Register enthaltene Binärzahl in eine Dezimalzahl um und fügt sie in die Statusmeldung ein.
Die Zeichen $FD und $FE geben einen Laufwerks-Bezeichner (A:, B:, ...) aus. Der Unterschied zwischen beiden Zeichen besteht darin, daß $FE nur dann eine Ausgabe veranlaßt, wenn mehr als ein Laufwerk vorhanden ist, $FD gibt das Laufwerk unabhängig von der Anzahl der vorhandenen Laufwerke aus.
$FF wird dazu benutzt, das Ende des Textfragments/der Statusmeldung zu kennzeichnen. Alle weiteren Zeichen, die einen ASCII-Wert > 127 aufweisen, werden als neue Text-Nummer interpretiert, die eventuell in eine Statusmeldung oder ein anderes Textfragment eingefügt werden soll. Dazu wird einfach das MSB gelöscht, und man erhält die neue Text-Nummer. Auf diese Weise lassen sich eine große Anzahl verschiedener Meldungen bei relativ geringem Speicherplatz-Bedarf zusammenfassen. Dekodieren wir nun die fünf Bytes der oben angegebenen Statusmeldung #0, so erhalten wir folgendes Ergebnis:
$FE gibt den Lauferks-Bezeichner des aktuellen Laufwerks aus, wenn mehrere Laufwerke vorhanden sind, zum Beispiel:
A:
$C3 fügt das Textfragment #67 ($43) in die Meldung ein:
Laufwerk
$BC fügt das Textfragment #60 ($3C) in die Meldung ein:
nicht bereit
$C1 fügt das Textfragment #65 ($41) in die Meldung ein:
- Wiederholen, Ignorieren oder Abbrechen?
$FF bezeichnet das Ende der Statusmeldung und beendet die Ausgabe.

Routinen zur Bearbeitung

Damit Sie diese Informationen auch verwerten und 'eigene' Statustexte erzeugen können, folgt hier eine Beschreibung der vom Terminal-Emulator für die Bearbeitung von Statusmeldungen angebotenen System-Routinen (vergleich Tabelle 3):
Tabelle 3: Die Statusmeldungen im Überblick
TE STL INIT $0ABC
wird während der System-Initialisierung aufgerufen und setzt das Statuszeilen-Flag auf $FF (=ON).
TE STL OFF (ESC 0) $0AC2
löscht die Statuszeile und setzt das Statuszeilen-Flag auf 0 (=OFF).
TE STL ON (ESC 1) $0AC5
löscht die Statuszeile und setzt das Statuszeilen-Flag auf $FF (=ON).
TE STL PRINT MSG $0AD2
wird vom BIOS zur Ausgabe von Statusmeldungen benutzt und gibt den Status entweder auf der Statuszeile (wenn eingeschaltet) oder direkt am Bildschirm aus.
Statusausgabe beenden $0AF2
schließt die BIOS-Statusausgabe ab und schickt ein CR/LF an den Bildschirm, wenn die Ausgabe nicht auf der Statuszeile erfolgte.
TE SHOW DRIVE $0AFD
zeigt an, welches Laufwerk vom System unterstützt wird (A: oder B:), wenn nur ein Laufwerk vorhanden ist. Um eine Anzeige zu erhalten, muß die Statuszeile eingeschaltet sein.
Statuszeile löschen $0B17
löscht die Statuszeile, wenn sie eingeschaltet ist.
TE STL SET DRIVNUM $0B20
legt die Laufwerksnummer für TE SHOW DRIVE fest.
TE STL ASK $0B25
gibt das Statuszeilen-Flag zurück ($00/$FF).
TE STL PREPARE $0B2A
Vorbereitung und Aufruf der Statusausgabe auf der Statuszeile.
TE STL CLEAR $0B4D
löscht die Statuszeile (keine Prüfung, ob die Statuszeile eingeschaltet ist). Die Routinen für die Ausgabe des Drucker-Status unterscheiden sich etwas von denen, die vom BIOS benutzt werden. Wenn das BIOS eine Statusmeldung ausgibt, wird die Statuszeile einfach überschrieben, der Hintergrund ist verloren. Bei der Ausgabe der Statusmeldungen für den Drucker wird der Hintergrund gesichert und nach Abschluß der Statusbearbeitung widerhergestellt, es gehen also keine Bildschirm-Informationen verloren.
Will man diese Routinen für die eigene Status-Ausgabe benutzen, benötigt man jedoch zusätzliche, detailierte Kenntnisse der Interrupt-Programmierung, so daß dies nur dem erfahrenen Programmierer vorbehalten bleibt. Für eigene Versuche seien sie dennoch hier aufgeführt:
TE PTR STL PREPARE $0B6B
sichert die aktuelle Bildschirmzeile und blendet die Drucker-Statuszeile ein. Das aktuelle Ausgabeattribute und der aktuelle Cursor-Ticker (=Interrupt-Zähler) werden über DE zurückgegeben.
TE PTR MSG PREPARE $0B7D
bereitet, ähnlich der Funktion TE STL PREPARE (siehe oben), die Statusausgabe für den Drucker vor und ruft die Ausgabe-Routine auf.
TE PTR STL RESTORE $0BA1
schließt die Drucker-Statusausgabe ab und stellt den ursprünglichen Statuszeilen-Inhalt wieder her.
Damit zunächst genug über die Statusausgabe. Das Programm SMENU (siehe Listing) demonstriert, wie Sie Ihre neuen Betriebssystem-Kenntnisse anwenden können. Das Wechseln der Cursor- und Auswahlfelder erfolgt hierbei mit den Cursor-(Pfeil-)Tasten. Wie wäre es denn zum Beispiel mit einem Programm zur Einstellung der SIO-Parameter oder zur Änderung der Schriftarten des Druckers über die Statuszeile? Viel Spaß beim Programmieren!

(Norbert Finke/rs)

Hinweis:
1. Alle im Beitrag aufgeführten und verwendeten Adressen beziehen sich auf die BIOS-Version 1.4 (CP/M-Systemdatei J14GCPM3.EMS).
2. In Ermangelung offizieller Dokumentation wurden die Bezeichnungen (Namen) der beschriebenen Routinen, in Anlehnung an die ROM-Routinen der CPC-Computer, vom Autor 'erfunden'.
3. Da sämtliche hier erläuterten Routinen in der System-Speicherbank (Bank #0) liegen, muß vor dem Aufruf die Speicherbank umgeschaltet werden. Dazu läßt sich die BIOS-Funktion #30 (USERF) verwenden, die mit
CALL 0FC5AH
DEFW routine
aufgerufen werden kann. 'routine' bezeichnet dabei die Adresse der gewünschten System-Routine in der Speicherbank #0.
Alle Standard-Register werden bei der Umschaltung der Speicherbänke gesichert, so daß sie für die Übergabe von Parametern verwendet werden können.

[Part 3] [Overview] [Part 5]


Scanned by Werner Cirsovius
March 2003
© DMV Verlag