3.4 ** Standard-Devices
3.4.1 * Allgemein
Anhand der vordefinierte Devices soll deren Gebrauch erläutert und ein Blick in den Aufbau getan werden. Schließlich werden wir, ergänzt durch die Angaben im Tabellenteil, auch etwas über die Hilfssysteme des QL erfahren. Sie existieren im eigentlichen Betriebssystem zur Unterstützung insbesondere der Aufgaben beim Datentransport.Wie schon in den Zugriffsebenen ist auch hier, nicht mehr so dicht an den nach außen hin arbeitenden programen, die physische von der logischen Ebene strikt getrennt. Die physisch vorhandenen Teile sind ausschließlich vermittels der Device-Handler miteinander verbunden und bleiben für die eigentlichen programe verborgen. Die Arbeit der Dinge, die zuvor als Gruppe der "Hilfsmittel" definiert wurde, soll nun, nachdem Aufbau und Arbeitsweise dieser Handler bekannt ist, nicht mehr interessieren. Wir werden uns nur noch mit der "logischen" Seite beschäftigen, d.h. mit der Wirkung dieser Handler, wie sie letzlich zur programierung von Belang ist.
Bedient wird sie zunächst einmal mit Hilfe einer Vielzahl von "QDOS-Traps", Aufrufen der Processor-Traps, die durch ein Codebyte gesteuert besondere Routinen ausführen. Alle Kanäle der Standard-Devices erlauben folgende Trap-Aufrufe zum Einrichten und Aufgeben der Kanäle, sowie einem einfachen (byte-)seriellen Datentransport:
Trap #2
IO.OPEN 1 Kanal öffnen IO.CLOSE 2 Kanal schließen
Trap #3
Die Trap io.smul steht im SMSQ/E zur Verfügung. Für jedes QL-System sowie die "einfache" Variante des SMSQ kann sie mit der "SIMSER"-Erweiterung nachgesetzt werden. Diese liefert zugleich auch die STX- und SRX-Typen von SER in einer gegenüber der Vorlage von einigen Fehlern befreiten Form.
IO.PEND 0 Prüfung auf vorhandene Daten IO.FBYTE 1 ein Byte holen IO.FLINE 2 eine Zeile bis LF holen IO.FSTRG 3 eine Anzahl Bytes holen IO.SBYTE 5 ein Byte senden iob.smul 6 wie 7, jedoch ohne TRA-Umsetzung (SMSQ/E, SIMSER) IO.SSTRG 7 geschlossene Anzahl Bytes Senden Dabei ist LF mit dem Wert 10 das einzige Steuerzeichen. Es schließt Ein- oder Ausgabezeilen ab (Traps 3/2, 3/4) und hat Vorrang vor der Längenangabe. Statt <LF> steht in diesem Zusammenhang <NL> ("Newline"), da es im QL die Folge <CR><LF> zum Aufsuchen des Anfangs einer neuen Zeile ersetzt.
3.4.2 * Device Handler
Das einfachere der Hilfssysteme im QL ist das IOSS (input & output subsystem). Es bedient Geräte, die nicht mit Directories arbeiten, somit keine Files verwalten können.Die jeweils erste Zeile gibt nach den Devicenamen die Adresse der Handler im MGG-Rom an.
3.4.2.1 PIPE auf 3218 - $0C92
Eine Struktur zur Verwaltung von Daten, die im memory der Reihe nach abgelegt und in derselben Reihenfolge gelesen werden können. Das ist die Nachbildung eines FIFO-memorys (first in - first out).Definition :
DC.W 4,'PIPE',1,' _',0Neben oben Erwähnten gibt es hierzu keine weiteren Trap-Aufrufe.
Der Parameter gibt die Größe des ggf. einzurichtenden buffermemorys einer Ausgabe-Pipe an. Fehlt dieser Parameter, wird stattdessen eine Eingabe-Pipe zur Übergabe der Daten an andere Kanäle mit dem Kanal verbunden, dessen Kennung in D3 übergeben wurde. Hier ist also bei der IO.OPEN-Trap (2/1) ein weiterer Schüsselcode in Gestalt einer Kanal-ID erlaubt.Die Benennung nach {1,2} scheint ein wenig verwirrend:
Eine "Ausgabe"-PIPE nimmt die Ausgabe eines anderen Kanals auf.Es gibt im QL kein Device, das die andere buffer-Struktur, den so vielseitig einsetzbaren LIFO-memory (last in first out), verfügbar macht, als Stack in allen Rechnern bekannt. Darum wurde gerade solch ein Device im Beispiel zur Darstellung eines Handlers definiert. - Im SMSQ/E gibt es etwas Ähnliches für Strings, dort eher irreführend "HISTORY" benannt, und nicht zu verwechseln mit der "command line history" von Boris Jakubith, die als Erweiterung des CON-Handlers in das System geladen werden kann.
3.4.2.2 NET auf 4366 - $110E, N mit TK2
Dies sind die engsten Gerätedefinitionen im QL, insofern, als sie nur in einer Richtung wirken.Sie arbeiten nach einem besonderen Protokoll, da dem Datenverkehr in beiden Richtungen nur eine Zweidrahtleitung zur Verfügung steht, und sie bedienen sich eigener Hardwareteile. Diese programe sind angeblich nie ganz fertig geworden.
Mit TK2 in Rom-Version sind sie aber mit großem Gewinn umfassend nutzbar.Definition:
DC.B 0,3,'NET',0NETI_xx empfängt, NETO_xx sendet Daten an den Knotenpunkt der Nummer xx im Netzwerk. Auf das Netzwerk "ist nicht anders zuzugreifen, als mittels des angegebenen Handlers". Diese lapidare Bemerkung in {1} ist das Einzige, was die hauptsächlichen Quellen dazu hergeben. Näheres ist den Hinweisen zur Verwendung der Hardwareregister zu entnehmen.
DC.W 2
DC.W 2,'OI'
DC.W ' _',0Der TK2 bietet wesentliche Erweiterungen der Übertragung auf dem Netzwerk. So sind auch alle I/O-Traps verwendbar. Es kann also auf der Empfängerseite beispielsweise ein window aufgemacht werden, selbst die Graphik-Aufrufe sind darin nutzbar. Ausgenommen sind nur SD.EXTOP (3/9), durchaus plausibel, da sich die Routine dazu nicht im ausführenden Gerät befindet, und SD.FOUNT (3/37) aus ähnlichem Grunde.
Schließlich sind Sicherheitsmaßnahmen eingeführt worden, mit denen der Datenverkehr sehr zuverlässig abläuft. Nach 5 s bereits beginnt die Abfrage auf BREAK, falls der Empfänger die Daten nicht abnimmt. Einen (sehr seltenen) Fehler kann es beim Schließen eines nur noch einseitig vorhandenen Netzwerkkanals geben. Näheres dazu im Teil 7. Die Beschreibungen der Übertragungsprotokolle nach dem Original und mit den Änderungen durch TK2 finden sich im entsprechenden Kapitel zur Hardware.
3.4.2.3 SER auf 2762 - $0ACA, PRT TK2, gebuffertes SER-Device
Dies ermöglicht den seriellen Datenaustausch mit außen angeschlossenen Geräten. Das kann für die Ausgabe etwa ein Drucker sein, oder vielleicht ein Modem (Modulator / Demodulator) zur Datenübermittlung auf Telephonleitungen.Definition :
DC.B 0,3,'SER',0PRT ist etwas eigenwillig teilweise wie ein Directory Device definiert.
DC.W 4
DC.W -1,1
DC.W 4,'OEMS'
DC.W 2,'IH'
DC.W 3,'RZC'Auch hierfür sind weder weitere Trap-Aufrufe vorgesehen noch erforderlich. Beim Öffnen mehrerer Kanäle mit unterschiedlichem Übertragungsprotokoll ist Vorsicht geboten, da die Einstellung sich sofort und auch auf andere zugleich offene Kanäle eines jeden der beiden SER-Devices gleichermaßen auswirkt, wo immer das Einstellungen in Hardware oder Systemvariablen betrifft. Auch Sendungen gebufferter Daten sind betroffen. Dies entspricht dem Geschehen nach TRA und BAUD aus Basic.
Vorsicht bei manchen MINERVAe! Dort wurde das Protokoll geändert und die Hardware wird nachlässig bedient. Dabei sind verschiedenartige Fehler zu erwarten, die sich jedoch zumeist durch Ausführung der betr. Routinen im Supervisor-Modus vermeiden lassen. Mehr in der Bug-Sammlung. Und immerhin scheint die Standardeinstellung in Ordung zu sein (SERnRH).
3.4.2.4 SCR Bildschirmwindow (screen)
Ein solches Device bedient die Bildschirmausgabe und hat umfangreiche Einrichtungen zu deren Gestaltung. Es kann selbst keine Eingabedaten holen.Definition:
DC.B 0,'SCR',0Hier gelten also nicht die oben angeführten Trap-Aufrufe für die Aufnahme von Daten (3/0 bis 3).
DC.W 4
DC.W ' _',$01C0
DC.W ' X',$00B4
DC.W ' A',$0020
DC.W ' X',$0010Beim Schreiben in ein window wird NL besonders behandelt. Auch wird ein solches Zeichen automatisch für die Ausgabe vorgemerkt, wenn die Cursorposition dessen rechten Rand erreicht hat. In diesem Moment trägt der Handler eine Markierung im Kanal-Definitionsblock ein. Dann wird, wenn erforderlich, in der neuen Zeile weitergeschrieben werden. Zugleich gibt in solchem Falle die Trap IO.SBYTE den Fehler ERR.OR zurück. Wird der Cursor unterdrückt, bleibt so ein NL-Signal dennoch gültig. Seine Ausgabe kann durch jeden Aufruf erzwungen werden, der den Cursor bewegt, oder durch eines folgender Ereignisse {MGG, MINERVA}:
Es wird ein weiteres Byte gesendet.Schließlich bildet jedes window ein eigenes scalierbares Graphiksystem. Darin können Punkte, Linien, Bögen und Ellipsen gezeichnet werden, alle bezogen auf die besonderen Graphik-Koordinaten mit demselben Wertebereich, wie er für Fließkommazahlen gilt.
Die Zeichengröße wird verändert.
Der Cursor wird aktiviert.
Die Cursorposition wird erfragt.Es ist eine einfache Routine zum Ausfüllen eines Feldes mit der aktuellen Linienfarbe vorhanden, die auch durch ein frei definierbares program ersetzt werden kann. Es wird anstelle der Rom-Routine ausgeführt, wenn seine Adresse im Kanal-Definitionsblock an der Stelle SD.FUSE steht.
Ist FILL aktiv, werden gerade oder konkav umrandete Flächen im innern ausgefüllt, sobald sich ein Linienzug schließt, oder dazu nur noch eine einzige gerade Linie fehlt.
Zusätzliche Aufrufe für window sind:
SD.EXTOP 9 frei definierbare Operation auf Handler-Ebene SD.PXENQ 10 windowgröße und Cursorpsition in Pixelmaßen SD.CHENQ 11 dto., im Zeichenraster SD.BORDR 12 setzt die Farbe der Umrandung SD.WDEF 13 bestimmt windowabmessungen SD.CURE 14 gibt den Cursor frei SD.CURS 15 unterdrückt die Cursoranzeige SD.SCROL 24 schiebt den windowinhalt nach unten SD.SCRTP 25 dto., Teilbereich über der Cursorzeile SD.SCRBT 26 dto., unterhalb der Cursorzeile SD.PAN 27 schiebt windowinhalt nach rechts SD.PANLN 30 dto., nur in der Cursorzeile SD.PANRT 31 dto., rechts vom Cursor SD.CLEAR 32 windowinhalt löschen SD.CLRTP 33 dto., Teil über der Cursorzeile SD.CLRBT 34 dto., unterhalb SD.CLRLN 35 dto., Cursorzeile SD.CLRRT 36 dto., dort ab Cursorposition SD.RECOL 38 window umfärben SD.SETPA 39 PAPER-Farbe festlegen SD.SETST 40 STRIP dto. SD.SETIN 41 INK dto. SD.FILL 46 BLOCK-Befehl ausführen SD.SETMD 44 OVER-Status festlegen
Der Zeichenausgabe dienen die Trap-Aufrufe
SD.FOUNT 37 Eintragen oder Wiederherstellen eines Zeichensatzes SD.SETFL 42 Im 8-Farbenbild Blinken schalten SD.SETUL 43 Unterstreichung schalten SD.SETSZ 45 Zeichengröße und -Abstand setzen
Die zur Graphik gehörigen Aufrufe sind
SD.POINT 48 Einen Punkt zeichnen SD.LINE 49 Zwei Punkte geradlinig verbinden SD.ARC 50 Ein Kreissegment zeichnen SD.ELIPS 51 Kreis oder Ellipse zeichnen SD.SCALE 52 Scalierung und Ursprung festlegen SD.FLOOD 53 "FILL"-Status schalten SD.GCUR 54 Graphik-Cursor bewegen Ein allgemeiner Hinweis:
Befindet sich ein Aufruf erst einmal in einer Bildschirm-Trap, führt ihn nur sein vorgesehenes Ende oder ein Fehler dort hinaus. Die Jobverwaltung liegt solange still, CTRL/C wirkt nicht, auch nicht CTRL/F5, und irgendwelche Notfall-Handler können nicht eingreifen. Mit dem Pointer Interface (das "nackte" System wurde nicht untersucht) sind währenddessen auch alle Interrupts abgeschaltet.
Besonders die in SD.EXTOP definierten Aufrufe müssen darum sehr sorgfältig geprüft werden. Hat die Beachtung einer Wartezeit besonderen Vorrang, kann der Datentransport byteweise eine Prüfung zwischendurch ermöglichen.
3.4.2.5 CON 3392 - $0D40
Hiermit wird ein SCR-Kanal definiert, um die Verbindung zur Tastatur als Eingabeeinheit erweitert. Ihm sind somit alle Möglichkeiten der SCR-Kanäle mitgegeben - auch die eben erwähnte Blockade.Definition wie SCR, zusätzlich:
DC.W ' _',$0080 für den TastaturbufferEin solcher Kanal erscheint mit den Funktionen eines Terminals: Aufnahme von Daten aus der Tastatur, Echo-Ausgabe auf den Bildschirm und Weiterleitung in den Computer. Hierzu wird dem Definitionsblock ein buffer in Gestalt einer vom Handler verwalteten Queue (auf Offset 104, rsp 100 bis JM) mitgegeben, deren Größe in dem zusätzlichen letzten Parameter der Definition enthalten ist. Mit Vorsicht ist sie auch umleitbar.
Zusätzlich gibt es für die Ein- und Ausgabe
IO.EDLIN 4 Zeileneditor mit Textvorgabe
Verlassen des Editors mit ENTER oder Cursor senkrecht.Veränderte Funktion hat
IO.FLINE 2 Zeileneditor
Der Cursor wird aktiviert, die eingegebenen Zeichen werden synchron abgebildet, mit den Cursortasten kann in der üblichen Weise editiert werden.