Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
z9001:software:os:geraetetreiber [2015/11/12 09:50] – [logische und physische Geräte] volkerp | z9001:software:os:geraetetreiber [2025/03/23 11:34] (aktuell) – [BAT-Treiber] volkerp | ||
---|---|---|---|
Zeile 24: | Zeile 24: | ||
===== logische und physische Geräte ===== | ===== logische und physische Geräte ===== | ||
- | Das OS verwaltet logische und physische Geräte. Logische Geräte sind z.B. die Zeichenausgabe auf Drucker (LIST:). | + | Das OS verwaltet logische und physische Geräte. |
- | Welcher Drucker angeschlossen ist, spielt auf Anwenderprogrammebene keine Rolle, die zu druckenden Zeichen werden immer an " | + | |
- | Das OS kann bis zu 4 physische Druckertreiber verwalten, von denen genau einer aktiv ist. Welcher Drucker | + | Logische Geräte sind z.B. die Zeichenausgabe auf Drucker. |
+ | Welcher Drucker | ||
- | Analog zum logischen Gerät " | + | Es gibt folgende vier logische Geräte: |
+ | * CONST: | ||
+ | * READER: | ||
+ | * PUNCH: | ||
+ | * LIST: Drucker (nur Zeichenausgabe). | ||
Zur Kommunikation mit diesen Geräten gibt es Systemfunktionen über CALL 5: | Zur Kommunikation mit diesen Geräten gibt es Systemfunktionen über CALL 5: | ||
Zeile 46: | Zeile 50: | ||
In BASIC können diese Geräte über Kanäle #1..#4 angesprochen werden (allg. geht das nur mit verändertem Lutz-Elßner-Basic, | In BASIC können diese Geräte über Kanäle #1..#4 angesprochen werden (allg. geht das nur mit verändertem Lutz-Elßner-Basic, | ||
+ | |||
+ | Für jedes logische Gerät können bis zu 4 physische Gerätetreiber geladen und im Speicher vorgehalten werden. | ||
+ | Mit dem Systemkommando ASGN (s.u.) oder durch Setzen des I/O-Bytes (s.u.) erfolgt die Zuweisung, welcher physische Gerätetreiber aktuell einem logischen Gerät zugeordnet ist. | ||
+ | |||
+ | Mit | ||
+ | ASGN LIST:=LX86 | ||
+ | wird beispielsweise der physische Druckertreiber " | ||
+ | |||
+ | |||
+ | ===== ASGN-Kommando ===== | ||
+ | |||
+ | **ASGN** ist ein residentes Kommando des OS (von insgesamt 3). Die Aufrufform ist | ||
+ | |||
+ | ASGN [log. Gerät = phys. Gerät] | ||
+ | |||
+ | ASGN ohne Parameter gibt die aktuelle Belegung auf dem Bildschirm aus, z. B. | ||
+ | |||
+ | CONST: | ||
+ | READER: | ||
+ | PUNCH:= | ||
+ | LIST:= | ||
+ | |||
+ | sofern noch keine zusätzlichen Treiber eingebunden worden sind. Die möglichen logischen Geräte wurden bereits erläutert, als phys. Geräte sind *CRT*, *BAT* oder Namen eigener Treiberroutinen möglich (max. 8 Buchstaben oder Zahlen). | ||
+ | |||
+ | Beispiel: ASGN LIST:=LX86 | ||
+ | |||
+ | Wird eine solche Anweisung gegeben, so vollzieht sich im OS ein umfangreicher Mechanismus: | ||
+ | |||
+ | Zuerst wird eine Treiberroutine namens " | ||
+ | |||
+ | start tape. | ||
+ | |||
+ | Nach dem Einlesen wird der Treiber an der im FCB spezifizierten Startadresse gestartet. Im allgemeinen sollte die Treiberroutine an das aktuelle Speicherende (RAM) platziert werden (über Zelle 36H zu ermitteln). | ||
+ | |||
+ | Dem OS müssen bei der Initialisierung einige Informationen übermittelt werden: | ||
+ | |||
+ | * Welchem log. Gerät darf die Treiberroutine zugeordnet werden? | ||
+ | * Die Startadresse des Treiberteils | ||
+ | * Auf welchem Platz der Zuordnungstabelle (s.u.) soll der Eintrag erfolgen (physisches Gerät 0...3)? | ||
+ | * Die Adresse des symbolischen Gerätenamens (8-Byte-String). | ||
+ | |||
+ | Zu beachten ist, dass physische Geräte mit der Nr. 0 jedem log. E/A-Kanal zugeordnet werden können (also auch der Console) und entsprechend aufgebaut sein müssen. | ||
+ | |||
+ | Ein physisches Gerät mit der Nr. 1 kann auch immer dem LIST-Kanal zugeordnet werden (Beispiel: residenter CRT-Treiber). | ||
+ | |||
+ | Beispielsweise wird ein Druckertreiber mit der Bezeichnung " | ||
+ | |||
+ | ASGN LIST:=LX86 | ||
+ | |||
+ | wird die Treiber-Routine eingebunden (ggf. von Kassette geladen) und das I/O-Byte entsprechend gestellt. Es erfolgt die Ausschrift | ||
+ | |||
+ | CONST: | ||
+ | READER: | ||
+ | PUNCH: | ||
+ | LIST:=LX86. | ||
+ | |||
+ | Der Drucker kann jetzt mit CTRL/P zum Bildschirm parallel geschaltet werden (auch im BASIC) oder über den LIST-Kanal (Ruf-Nr. 5) direkt angesprochen werden. | ||
+ | |||
+ | :!: Die meisten Treiber umgehen den Aufruf über ASGN. Statt | ||
+ | ASGN LIST:=LX86 | ||
+ | wird der Druckertreiber dann mit | ||
+ | LX86 | ||
+ | geladen. | ||
+ | |||
+ | Ein guter Treiber (s.u.) sollte beide Varianten ermöglichen! | ||
+ | |||
===== Das I/O-Byte ===== | ===== Das I/O-Byte ===== | ||
- | Das I/O-Byte dient zur Verbindung | + | Das I/O-Byte dient zur Verbindung |
- | jedes der 4 logischen Geräte | + | jedes logische Gerät |
eines dieser Geräte erfolgt über Änderung des I/O-Bytes. Zuvor müssen alle zu | eines dieser Geräte erfolgt über Änderung des I/O-Bytes. Zuvor müssen alle zu | ||
verwendenden Treiber zugewiesen und initialisiert werden. Das I/O-Byte ist in 4 | verwendenden Treiber zugewiesen und initialisiert werden. Das I/O-Byte ist in 4 | ||
Zeile 63: | Zeile 133: | ||
Log. Gerät LIST PUNCH READER CONST | Log. Gerät LIST PUNCH READER CONST | ||
- | Das OS selbst beinhaltet zwei residente Treiberroutinen: | + | Das OS selbst beinhaltet zwei residente |
* CRT Consoltreiber | * CRT Consoltreiber | ||
Zeile 84: | Zeile 154: | ||
< | < | ||
- | System-Treiber, | + | System-Treiber, |
; physische Gerätenummer | ; physische Gerätenummer | ||
; log. Gerät 0 1 2 3 | ; log. Gerät 0 1 2 3 | ||
Zeile 109: | Zeile 179: | ||
Wenn Treiber für Reader und Punch installiert sind, ist noch erlaubt: | Wenn Treiber für Reader und Punch installiert sind, ist noch erlaubt: | ||
- | CONST: = BAT - Consoleneingabe vom Reader-Gerat, Konsolenausgabe erfolgt auf das Punch-Gerät | + | CONST: = BAT - Consoleneingabe vom Reader-Gerät, Konsolenausgabe erfolgt auf das Punch-Gerät |
Die Treiberadressen der jeweiligen physischen Geräte liegen auf den Adressen | Die Treiberadressen der jeweiligen physischen Geräte liegen auf den Adressen | ||
- | EFC9H bis EFE8H. s.u. Adreßtabelle | + | EFC9H bis EFE8H. s.u. Adresstabelle |
- | Hinweis: Es gibt symbolische Namen für die physischen Geräte, diese spielen i.allg. keine Rolle, | + | **Hinweis**: Es gibt symbolische Namen für die physischen Geräte, diese spielen i. Allg. keine Rolle, |
werden aber in der Literatur (und im Zusatzmonitor ZM) genutzt: | werden aber in der Literatur (und im Zusatzmonitor ZM) genutzt: | ||
Zeile 129: | Zeile 199: | ||
</ | </ | ||
- | |||
- | ===== ASGN-Kommando ===== | ||
- | |||
- | **ASGN** ist ein residentes Kommando des OS (von insgesamt 3). Die Aufrufform ist | ||
- | |||
- | ASGN [log. Gerät = phys. Gerät] | ||
- | |||
- | ASGN ohne Parameter gibt die aktuelle Belegung auf dem Bildschirm aus, z. B. | ||
- | |||
- | CONST: | ||
- | READER: | ||
- | PUNCH:= | ||
- | LIST:= | ||
- | |||
- | sofern noch keine zusätzlichen Treiber eingebunden worden sind. Die möglichen logischen Geräte wurden bereits erläutert, als phys. Geräte sind *CRT*, *BAT* oder Namen eigener Treiberroutinen möglich (max. 8 Buchstaben oder Zahlen). | ||
- | |||
- | Beispiel: ASGN LIST:=LX86 | ||
- | |||
- | Wird eine solche Anweisung gegeben, so vollzieht sich im OS ein umfangreicher Mechanismus: | ||
- | |||
- | Zuerst wird eine Treiberroutine namens " | ||
- | | ||
- | Suche auf allen Adressen mit Low-Byte = 0 nach einer Bytefolge der Form: C3 ll hh (= JP hhllH) - Die folgenden 8 Bytes werden mit der angegebenen Zeichenkette (hier " | ||
- | |||
- | Diese Tabelle wird mit einem Nullbyte abgeschlossen und kann mit weiteren Strukturen dieser Form fortgesetzt werden. Zwei aufeinander folgende Nullbytes beenden diese Sprungtabelle (vgl. Beispiel Tafel 6). | ||
- | |||
- | Ist die Suche erfolgreich, | ||
- | |||
- | start tape. | ||
- | |||
- | Nach dem Einlesen wird die Routine an der im FCB (1. Block) spezifizierten Startadresse gestartet. Im allgemeinen sollte die Treiberroutine an das aktuelle Speicherende (RAM) plaziert werden (über Zelle 36H zu ermitteln). Dem OS müssen nun noch einige Informationen übermittelt werden: | ||
- | |||
- | * Welchem log. Gerät darf die Treiberroutine zugeordnet werden? | ||
- | * Die Startadresse des Treiberteils | ||
- | * Auf welchem Platz der Zuordnungstabelle (s.u.) soll der Eintrag erfolgen (physisches Gerät 0...3)? | ||
- | * Die Adresse des symbolischen Gerätenamens (8-Byte-String). | ||
- | |||
- | Zu beachten ist, dass physische Geräte mit der Nr. 0 jedem log. E/A-Kanal zugeordnet werden können (also auch der Console) und entsprechend aufgebaut sein müssen. | ||
- | |||
- | Ein physisches Gerät mit der Nr. 1 kann auch immer dem LIST-Kanal zugeordnet werden (Beispiel: residenter CRT-Treiber). | ||
- | |||
- | Beispielsweise wird ein Druckertreiber mit der Bezeichnung " | ||
- | |||
- | ASGN LIST:=LX86 | ||
- | |||
- | wird die Treiber-Routine eingebunden (ggf. von Kassette geladen) und das I/O-Byte entsprechend gestellt. Es erfolgt die Ausschrift | ||
- | |||
- | CONST: | ||
- | READER: | ||
- | PUNCH: | ||
- | LIST:=LX86. | ||
- | |||
- | Der Drucker kann jetzt mit CTRL/P zum Bildschirm parallel geschaltet werden (auch im BASIC) oder über den LIST-Kanal (Ruf-Nr. 5) direkt angesprochen werden. | ||
- | |||
- | Die meisten Treiber umgehen den Aufruf über ASGN. Statt | ||
- | |||
- | ASGN LIST:=LX86 | ||
- | |||
- | wird der Druckertreiber dann mit | ||
- | |||
- | LX86 | ||
- | |||
- | geladen. | ||
- | |||
- | Ein guter Treiber sollte beide Varianten ermöglichen! | ||
Zeile 436: | Zeile 441: | ||
</ | </ | ||
+ | |||
+ | ====== BAT-Treiber ====== | ||
+ | |||
+ | Der BAT-Treiber ist ein im OS integrierter CONST-Treiber, | ||
+ | |||
+ | * Konsoleingabe erfolgt über das aktuelle READER-Gerät | ||
+ | * Konsolausgabe erfolgt über das aktuelle LIST-Gerät | ||
+ | * READER und LIST müssen zuvor zugewiesen werden | ||
+ | |||
+ | Soll ein READER-Gerät Im Zusammenhang mit dem BATCH-Mode von CONST betrieben werden, so | ||
+ | müssen im Treiber für das READER-Gerät (RDR, UR1, UR2) die Kommandos Eingabe, Statusabfrage | ||
+ | und Initialisierung programmiert sein. Bei Treibern für das LIST-Gerät müssen die Kommandos | ||
+ | Ausgabe, Statusabfrage und Initialisierung In jedem Falle programmiert werden. | ||
+ | |||
+ | Zuweisung | ||
+ | ASGN CONST:=BAT (Enter) | ||
+ | |||
+ | Die Treiber-Kommandos werden dabei wie folgt weitergeleitet: | ||
+ | |||
+ | Kommando | ||
+ | A=1 -> READER\\ | ||
+ | A=FF -> erst READER init, wenn fehlerfrei, dann LIST init\\ | ||
+ | sonst -> | ||
+ | |||
+ | d.h., dass der List-Treiber die CONST-Treiber-Kommandos theoretisch alle implementieren müsste (bis auf A=1)! | ||
+ | |||
+ | |||
+ | ====== DEVICE-Kommando ====== | ||
+ | |||
+ | 2020 habe ich das Kommando DEVICE programmiert (im Mega-Flash-Paket enthalten), um die Beschränkungen von ASGN zu umgehen. Mit DEVICE erfolgt die Anzeige der Gerätetreiber-Tabelle und des I/O-Bytes. Geräte können aktiviert werden. Treiber können beliebig in der Gerätetreiber-Tabelle zugewiesen werden. | ||
+ | |||
+ | < | ||
+ | device Anzeige Gerätetreiber-Tabelle | ||
+ | device log.gerät: | ||
+ | error4 kein gültiger Treiber hinterlegt | ||
+ | device log.gerät: | ||
+ | device log.gerät: | ||
+ | dabei ist Zuweisung an beliebiges logisches Gerät möglich | ||
+ | </ | ||
+ | |||
+ | **Beispiel**: | ||
+ | |||
+ | < | ||
+ | |||
+ | > | ||
+ | Z9001 MONITOR V2.0 (ZM30) | ||
+ | => | ||
+ | => | ||
+ | => | ||
+ | > | ||
+ | |||
+ | CONST :CRT | ||
+ | READER: | ||
+ | PUNCH :TAPEP | ||
+ | LIST : | ||
+ | > | ||
+ | |||
+ | IOBYTE:29 0 | ||
+ | CONST :01 3CE1 F8F1* F7B4 F8F1 | ||
+ | READER:02 F8F1 30A0 311C* F8F1 | ||
+ | PUNCH :02 F8F1 3058 3128* 30C3 | ||
+ | LIST :00 F8F1* F8F1 30C3 3058 | ||
+ | >DEVICE LIST: | ||
+ | </ | ||
Zeile 454: | Zeile 523: | ||
* Die Treiber für TAPE sind keine zeichenorientierten Treiber und manipulieren gehörig das System (s. Sourcecode) | * Die Treiber für TAPE sind keine zeichenorientierten Treiber und manipulieren gehörig das System (s. Sourcecode) | ||
* Positiv, aber eben nicht zum OS-Konzept passend, ist, dass die Benutzung des I/O-Bytes logischer und mehr an CP/M angelehnt ist | * Positiv, aber eben nicht zum OS-Konzept passend, ist, dass die Benutzung des I/O-Bytes logischer und mehr an CP/M angelehnt ist | ||
+ | |||
+ | Hinweis: Im Mega-Flash sind modifizierte Versionen enthalten, die sich an die Vorgaben halten und mit anderen Programmen zusammenarbeiten. | ||
Im [[z9001: | Im [[z9001: |