back : next : content =

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
 
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
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.

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,' _',0
Neben 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',0
DC.W 2
DC.W 2,'OI'
DC.W ' _',0
NETI_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.

Der 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',0
DC.W 4
DC.W -1,1
DC.W 4,'OEMS'
DC.W 2,'IH'
DC.W 3,'RZC'
PRT ist etwas eigenwillig teilweise wie ein Directory Device definiert.

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',0
DC.W 4
DC.W ' _',$01C0
DC.W ' X',$00B4
DC.W ' A',$0020
DC.W ' X',$0010
Hier gelten also nicht die oben angeführten Trap-Aufrufe für die Aufnahme von Daten (3/0 bis 3).

Beim 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.
Die Zeichengröße wird verändert.
Der Cursor wird aktiviert.
Die Cursorposition wird erfragt.
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.

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 Tastaturbuffer

Ein 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.
 
 

  top : back : next : content 

= (count)