Die Betriebssystemfunktion des ST-BIOS werden in unserer neuen Serie für GFA-Basic zugänglich gemacht
Mit dieser Ausgabe wollen wir unsere neue Betriebssystemecke eröffnen. Sie soll Basic-Programmierern einen Teil der umfangreichen Betriebssystem-Bibliothek, die bei mittlerweile fast allen STRechnern fest eingebaut ist, zugänglich machen. Wir werden dabei die elementar wichtigen BIOS-, XBIOS- und die GEMDOS-Routinen erklären. Für (Lt, Basic unerhebliche Aufrufe wurden nicht aufgenommen, um nicht unnötig zu verwirren. Die Anwendung der Routinen soll im weitverbreiteten GFA-Basic erfolgen; Beispielprogramme werden jeweils mitgeliefert. Da GFABasic sehr übersichtliche, strukturierte Programme zu liefern vermag, sind diese leicht auch in andere Sprachen zu übertragen.
Unter dem Betriebssystem oder auch TOS versteht man ein fast 192 KByte langes Programm, das sich bei fast allen ST-Rechnern im ROM befindet, also nach Einschalten des Rechners sofort zur Verfügung steht. Es steuert alle ablaufenden Prozesse, also z. B. die Bearbeitung des Bildschirms und der Diskettenstation oder den Aufruf anderer zu ladender Programme wie GFA-Basic und Omikron-Basic.
Das TOS ist in diverse Programme unterteilt, die sich auch vom Basic-Anwender nutzen lassen und völlig neue Möglichkeiten eröffnen. Allerdings kann man diese Teilprogramme nicht wie einen einfachen Basic-Befehl einsetzen. Sie verstecken sich nämlich hinter diversen Zahlenwerten und werden deshalb von Anleitungen und Büchern meist großzügig übergangen. Auch wird der Programmierer oft mit schwer verständlichen Begriffen bombardiert. (Wohl kaum ein normal denkender Mensch kann sich etwas unter gmtbahb vorstellen.) Um diesem Mißstand abzuhelfen, haben wir uns entschlossen, die für Basic-Programmierer wichtigsten Betriebssystemroutinen zu erklären.
BIOS ist die englische Abkürzung von "Basical Input/Output System" (grundlegendes Ein-/ Ausgabeprogramm). Im folgenden wollen wir die Aufrufe dieses TOS-Teils beschreiben. Neben den BIOS-Nummern finden Sie die englische Abkürzung in Klammern.
BIOS1 (bconstat)
Diese Routine stellt bei ihrem Aufruf fest, ob das abgefragte Gerät ein Zeichen gesendet hat. (Beachten Sie bitte, daß beispielsweise auch die Tastatur ein "Gerät' darstellt!) Jedes dieser Geräte erhält eine Nummer, die Sie beim Aufruf in GFA-Basic anstelle der hier kursiv gedruckten Variablen Gerät benutzen müssen. Der Aufruf sieht dann so aus:
A% = BIOS (1, [Gerät] )
Gerät ist dabei durch einen der folgenden Werte zu ersetzen:
1 für die RS-232-Schnittstelle (Modem-Port) 2 für die Tastatur 3 für die MIDI-Schnittstelle
Die Variable A% enthält nach dem Aufruf entweder den Wert 0 oder -1. 0 bedeutet, daß das angesprochene Gerät kein Zeichen gesendet hat, das sich abfragen ließe, -1 dagegen, daß ein Wert eingelesen werden kann. Ein Beispiel für die Anwendung dieses Aufrufs könnte so aussehen:
A% = BIOS (1,1)
Bei A%o = -1 läßt sich von der seriellen Schnittstelle mindestens ein Zeichen einlesen, bei A% = 0 nicht. (Das Einlesen kann z. B. von BIOS2 erledigt werden.)
BIOS2 (bconin)
Über diesen Befehl wird ein Zeichen vom angegebenen Gerät eingelesen und dessen Zahlenwert automatisch in der Variablen A% gespeichert. Hier ist natürlich zu kontrollieren, ob das Gerät überhaupt sendebereit ist (s. BIOS1), sonst wartet der
Computer nämlich, daß das Zeichen endlich ankommt, und das kann ewig dauern.
Aufruf:
A% = BIOS (2, [Gerät] )
Gerät: 0 für die Druckerschnittstelle 1 für den RS-232-Modem-Port 2 für die Tastatur 3 für die MIDI-Schnittstelle
Anwendungsbeispiel:
PRINT CHR$ (BIOS (2,2))
Diese Befehlsfolge zeigt einen Tastendruck auf dem Bildschirm an.
BIOS3 (bconout)
Dies ist gewissermaßen die Umkehrfunktion zu BIOS2; der Wert von Zeichen wird an ein bestimmtes Gerät ausgegeben. Erst wenn dies geschehen ist, kehrt BIOS wieder ins Basic zurück. Bei Ausgaben an gepufferte Peripherie wie beispielsweise Drucker ist also Vorsicht geboten! Eine Überprüfung, ob das angesprochene Gerät empfangsbereit ist, kann mit BIOS8 erfolgen (dazu später mehr).
Aufruf
A% = BIOS (3, [Gerät, Zeichen j )
Gerät:
0 für die Druckerschnittstelle
1 für den Modem-Port
2 für den Bildschirm
3 für die MIDI-Schnittstelle
4 für den intelligenten Tastaturprozessor (Vorsicht!)
5 für den Bildschirm ohne Terminal-Emulation
Anwendungsbeispiel:
A% = BIOS (3, 3, 32)
Mit diesem Befehl wird der Wert 32 an den MIDI-Port ausgegeben, sofern dieser überhaupt dazu in der Lage ist (s. BIOS8).
BIOS4 (rwabs)
Dieser Befehl liest oder schreibt einzelne oder mehrere Sektoren von bzw. auf ein Diskettenlaufwerk. Damit der Rechner auch weiß, welche Daten er dazu nehmen soll, ist ein Puffer anzugeben. Dies ist nichts anderes als ein reservierter Speicherbereich, von dem sich lesen oder schreiben läßt. Da man in Basic aber nie genau weiß, welchen Bereich man problemlos belegen kann, definiert man am besten im Programm eine String-Variable und füllt diese zunächst mit Leerzeichen (Spaces). Soll nun auf Diskette geschrieben werden, füllt man die Variable mit den Werten, die sich später auf Disk befinden sollen. Für den Lesevorgang bleibt die Variable leer. Ihre Adresse (und somit die Pufferadresse) läßt sich bei GFA-Basic durch den Befehl VARPTR ermitteln.
Aufruf:
A% = BIOS (4, [RWFLAG, L: Pufferadresse, Anzahl der Sektoren, Startsektornummer, Laufwerk] )
RWFLAG: 2 zum Lesen 3 zum Schreiben
Laufwerk:
0 für Laufwerk A 1 für Laufwerk B Wichtig ist hier noch der Ausdruck L: vor der Pufferadresse. Er teilt GFA-Basic mit, daß es sich bei dieser Adresse um ein Longword handelt, also um einen Zahlenwert, der sich aus vier Bytes zusammensetzt und nicht aus zwei, wie man eigentlich annimmt.
Beispiel
A$ = Space$ (1024)
A% = BIOS (4, 2, L: VARPTR (A$), 2, 2, 0)
Mit diesen Befehlen werden die Sektoren 2 und 3 von Laufwerk A in den Speicherbereich von A$ geladen.
BIOS8 (bcostat)
Damit läßt sich feststellen, ob das betreffende Gerät bereit ist, Daten zu empfangen. A% enthält nach dem Aufruf entweder den Wert 0 oder -1. 0 bedeutet, daß das Gerät offline ist, also kei
ne Daten empfangen kann. Bei -1 ist alles klar; es kann losgehen.
Aufruf:
A% = BIOS (8, [Gerät])
Gerät:
0 für den Drucker-Port
1 für den Modem-Port
2 für die MIDI-Schnittstelle
Beispiel
IF BIOS (8, 0) = TRUE
LLIST
ENDIF
Auf diese Weise läßt sich das Listing des Programms über den Drucker ausgeben, wenn dieser online ist.
Damit hätten wir die für den Basic-Programmierer nützlichsten BIOS-Funktionen vorgestellt. Listing 1 verdeutlicht die Anwendung dieser Befehle. Mit dem Druckermaskenprogramm läßt sich eine Anpassung bei der Ausgabe von Texten oder ähnlichem selbst noch beim Druck softwaremäßig vornehmen. Wenn der Printer nach Start des Programms sofort mit der Arbeit beginnt, wird jedes Zeichen so ausgegeben, wie es im entsprechenden Text steht. Durch eine Änderung des Zeichensatzes kann man nun aber die Buchstaben und Steuerzeichen gegen andere austauschen. Dies läßt sich im Programm vornehmen, indem man die Zeichen oder die jeweiligen ASCIIWerte ersetzt. (Diese Unterscheidung wurde eingeführt, da einige Steuerzeichen, nämlich die Werte 0 bis 32, nicht sichtbar sind.) Beim Ausdruck werden nun alle Zeichen automatisch übersetzt, und der geänderte Zeichensatz wird anstelle des normalen, für den der Text vorgesehen war, zu Papier gebracht.
Es ist natürlich jedem freigestellt, das Programm für eigene Zwecke abzuändern. So ließe sich das Ganze z. B. auch auf String-Basis aufbauen, damit man für ein Zeichen mehrere drucken kann. Nächstes Mal wollen wir uns mit den XBIOS-Routinen des ST beschäftigen.