Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
z9001:software:os:geraetetreiber [2015/04/29 14:18] – [Aufbau] volkerpz9001:software:os:geraetetreiber [2023/06/13 14:47] (aktuell) – [ZM] volkerp
Zeile 1: Zeile 1:
 ====== Gerätetreiber ====== ====== Gerätetreiber ======
- 
-FIXME 
  
 Das OS des KC85/1 unterstützt leistungsfähig das Einbinden neuer Gerätetreiberroutinen für die sog. zeichenorientierten logischen Ein- /Ausgabekanäle. Vorbild für das im folgenden erläuterte Konzept ist das Betriebssystem CP/M.  Das OS des KC85/1 unterstützt leistungsfähig das Einbinden neuer Gerätetreiberroutinen für die sog. zeichenorientierten logischen Ein- /Ausgabekanäle. Vorbild für das im folgenden erläuterte Konzept ist das Betriebssystem CP/M. 
Zeile 10: Zeile 8:
   * "Betriebssystem Z9001" Beschreibung + Quelltext des OS   * "Betriebssystem Z9001" Beschreibung + Quelltext des OS
   * und weitere Quellen   * und weitere Quellen
 +
 +**Kritik** (vp) Leider ist das I/O-Konzept nicht bis zum Ende durchdacht und implementiert: 
 +  * Das I/O-Byte liegt auf einer anderen Adresse als in CP/M üblich
 +  * Es gibt keine Systemaufrufe (über CALL 5), um die Treiber direkt anzusprechen. Die Systemaufrufe nutzen nur die Treiberfunktionen Zeichenein- und -ausgabe
 +  * Die Einbindung der Treiber ins I/O-Byte und Übergabe der Zeichenkettenadressen erfolgt nur beim Laden des Treibers, nicht über einen späteren Funktionsaufruf des Treibers
 +  * Die Zuweisung des Treibers auf eine physische Gerätenummer kann nicht frei gewählt werden. Das macht der Treiber intern, das ist aber nirgends ersichtlich. Auch bei ASGN wird das nicht angezeigt.
 +  * Die Adresse des aktiven Treibers ist nur über die interne Systemfunktion EXIO ermittelbar.
 +  * Beim Warmstart (nach STOP) wird das I/O-Byte auf den Standardwert 01h zurückgesetzt.
 +  * Im OS 1.1 ist BAT nicht nutzbar.
 +  * Die Zeichenketten der nicht initialisierten phys. Treiber zeigen auf Adresse LOGDV (0FC24h). Dort steht 01 00, das ist zufälligerweise ein gültiger String, aber eigentlich müsste nur auf ein Nullbyte (leerer String) verwiesen werden.
 +  * Obwohl als Zusatz zum Monitor mitgeliefert, missachtet der ZM das Assign-Konzept des OS fast vollständig (s.u.)
 +  * So wie ASGN arbeitet und zu nutzen ist, hätte auf das Konzept des I/O-Byte und der 4 verschiedenen physischen Treiber verzichtet werden können. Mit jedem Aufruf von ASGN wird einfach der übergebene Treiber aktiv, egal, welche physische Nummer er tatsächlich hat.
 +
  
 ===== 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 "LIST:" ausgegeben+
  
-Das OS kann bis zu 4 physische Druckertreiber verwalten, von denen genau einer aktiv ist. Welcher Drucker bzw. physischer Treiber das ist, wird mit dem Kommando ASGN festgelegt (s.u.).+Logische Geräte sind z.Bdie Zeichenausgabe auf Drucker.  
 +Welcher Drucker angeschlossen ist, spielt auf Anwenderprogrammebene keine Rolle, die zu druckenden Zeichen werden immer an das logische Geräte LIST: ausgegeben
  
-Analog zum logischen Gerät "Drucker" gibt es 3 weitere logische Geräte: die Konsole (CON, Tastatur + Bildschirm, d.h. Zeichenein- und -ausgabe)), Punch (nur Zeichenausgabe, ursprünglich auf Lochband), Reader (nur Zeicheneingabe, ursprünglich von Lochband). +Es gibt folgende vier logische Geräte:  
 +  * CONST: Konsole (Tastatur + Bildschirm, d.h. Zeichenein- und -ausgabe),  
 +  * READER: (nur Zeicheneingabe, ursprünglich von Lochband), 
 +  * PUNCH: (nur Zeichenausgabe, ursprünglich auf Lochband),  
 +  * 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 34: Zeile 49:
 | 11 | CSTS       | Abfrage Status CONST                          | | 11 | CSTS       | Abfrage Status CONST                          |
  
-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, s. [[z9001:basic#die_erweiterung_von_lutz_elssner|]])! 
 + 
 +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 "LX86" aktiv dem logischen Gerät LIST: zugeordnet. Alle Druck-Ausgaben werden ab jetzt an den Druckertreiber "LX86" weitergereicht. 
 + 
 + 
 +===== 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:=CRT  
 +  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 "LX86" im Speicher (von oben nach unten) entsprechend den  Aufrufregeln für transiente Kommandos gesucht. Ist die Suche erfolgreich, so wird die Steuerung zum Treiber übergeben (Initialisierungsroutine des Treibers), andernfalls wird angenommen, dass eine Treiberroutine vom Band nachgeladen werden soll, und es erfolgt die Ausschrift 
 + 
 +  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 "LX86" wie folgt in das OS eingebunden: Mit der Anweisung 
 + 
 +  ASGN LIST:=LX86 
 + 
 +wird die Treiber-Routine eingebunden (ggf. von Kassette geladen) und das I/O-Byte entsprechend gestellt. Es erfolgt die Ausschrift 
 + 
 +  CONST:=CRT  
 +  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 von logischen und physischen Geräten. Für +Das I/O-Byte dient zur Verbindung der vier logischen mit physischen Geräten. Für 
-jedes der 4 logischen Geräte sind 4 physische Geräte wählbar. Die Zuschaltung+jedes logische Gerät sind 4 physische Geräte wählbar. Die Zuschaltung
 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 52: 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 physische Treiberroutinen: 
  
   * CRT Consoltreiber    * CRT Consoltreiber 
Zeile 66: Zeile 147:
  
 <code> <code>
-  log. Gerät    phys. Treiber +  log. Gerät    Gerätenummer - phys. Treiber 
-  CONST: 1 - CRT2 - BAT+  CONST: 1 - CRT 
 +                2 - BAT
   LIST: 1 - CRT   LIST: 1 - CRT
 </code> </code>
  
 <code> <code>
-System-Treiber, * ist aktiv, fehlende Treiber sind mit RET kurzgeschlosssen+System-Treiber, * ist aktiv, fehlende Treiber sind mit RET kurzgeschlossen
 ; physische Gerätenummer  ; physische Gerätenummer 
 ; log. Gerät 0 1 2 3 ; log. Gerät 0 1 2 3
Zeile 97: 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 der Gerätetreiber.+EFC9H bis EFE8H. s.u. Adresstabelle der Gerätetreiber.
  
  
-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 117: Zeile 199:
 </code> </code>
  
- 
-===== 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:=CRT  
-  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 "LX86" im Speicher (von oben nach unten) entsprechend den  Aufrufregeln für transiente Kommandos gesucht: 
-     
-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 "LX86") verglichen. 
- 
-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, so wird die Steuerung zur Adresse hhllH übergeben (Initialisierungsroutine des Treibers), andernfalls wird angenommen, daß eine Treiberroutine vom Band nachgeladen werden soll, und es erfolgt die Ausschrift 
- 
-  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 "LX86" wie folgt in das OS eingebunden: Mit der Anweisung 
- 
-  ASGN LIST:=LX86 
- 
-wird die Treiber-Routine eingebunden (ggf. von Kassette geladen) und das I/O-Byte entsprechend gestellt. Es erfolgt die Ausschrift 
- 
-  CONST:=CRT  
-  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 424: Zeile 441:
 </code> </code>
  
 +====== 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.
 +
 +<code>
 +device Anzeige Gerätetreiber-Tabelle
 +device log.gerät:=0..3 Zuweisen log. Gerät mit physischer Gerätenummer + Init.
 + error4 kein gültiger Treiber hinterlegt
 +device log.gerät:=treiber Zuweisen Treiber, ggf. Laden (analog ASGN)
 +device log.gerät:=treiber 0..3 Zuweisen Treiber, dabei physische Gerätenummer vorgeben
 + dabei ist Zuweisung an beliebiges logisches Gerät möglich
 +</code>
 +
 +**Beispiel**: Anzeige der Tabelle nach Aufruf des Zusatzmonitors ZM30. Dieser installiert Treiber in der Gerätetreiber-Tabelle. Über das ZM-eigene  A-Kommando oder über DEVICE gerät:=0..3 können diese aktiviert werden
 +
 +<code>
 +
 +>ZM30 Laden+Starten Zusatzmonitor ZM
 + Z9001 MONITOR V2.0 (ZM30)  1986 Programmeldung
 +=>AR=T Zuweisung Reader:=Tape
 +=>AP=T Zuweisung Punch:=Tape
 +=>B ZM Beenden
 +>ASGN System-Kommando Assign. Anzeige der Gerätezuweisungen
 +
 +CONST :CRT
 +READER:TAPER
 +PUNCH :TAPEP
 +LIST  :
 +>DEVICE Kommando DEVICE. Anzeige I/O-Tabelle
 +
 +IOBYTE:29 0             3
 +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:=1 Aktivierung List zugewiesenes Gerät Kanal 1
 +</code>
  
  
Zeile 436: Zeile 490:
  
   * Der ZM enthält ein eigenes ASGN-Kommando 'A'. Hier wird nicht alles wie im OS umgesetzt, so fehlen etwa Treibernamen. Obwohl nach Verlassen des ZM zugewiesene Treiber weiterhin aktiv sind, ist dies nicht bei ASGN erkennbar.   * Der ZM enthält ein eigenes ASGN-Kommando 'A'. Hier wird nicht alles wie im OS umgesetzt, so fehlen etwa Treibernamen. Obwohl nach Verlassen des ZM zugewiesene Treiber weiterhin aktiv sind, ist dies nicht bei ASGN erkennbar.
 +  * Die Gerätenamen beim Kommando A entsprechen nicht denen des OS
   * Der ZM überschreibt die komplette Adresstabelle der Gerätetreiber (ab 0EFC9h). Eigene vorher eingetragene Treiber werden damit aus dem System geworfen!   * Der ZM überschreibt die komplette Adresstabelle der Gerätetreiber (ab 0EFC9h). Eigene vorher eingetragene Treiber werden damit aus dem System geworfen!
 +  * Die Treiber unterstützen keine Treiber-Kommandos (Initialisierung, Statusabfrage etc.)
 +  * Die Zuweisungsbeschränkung des CRT-Treibers wird nicht beachtet
   * 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
  
 +Hinweis: Im Mega-Flash sind modifizierte Versionen enthalten, die sich an die Vorgaben halten und mit anderen Programmen zusammenarbeiten.
  
 Im [[z9001:software:zm]] sind verschiedene Gerätetreiber enthalten. Im [[z9001:software:zm]] sind verschiedene Gerätetreiber enthalten.
Zeile 449: Zeile 508:
 vorhandenen Gerätes zu einem logischen Gerät. Folgende Zuordnungen sind vorhandenen Gerätes zu einem logischen Gerät. Folgende Zuordnungen sind
 angebbar: angebbar:
- 
  
 ^ CONSOLE ^ READER ^ PUNCH ^ LIST ^ ^ CONSOLE ^ READER ^ PUNCH ^ LIST ^
Zeile 457: Zeile 515:
 | AC=U für User-Konsole | AR=U für User-Read-Gerät | AP=U für V24-Ausgabegerät (TD40) | AL=U für SIF-1000-Ausgabegerät | | AC=U für User-Konsole | AR=U für User-Read-Gerät | AP=U für V24-Ausgabegerät (TD40) | AL=U für SIF-1000-Ausgabegerät |
  
- 
-Nach Anlauf des Monitors gilt die Zuordnung AC=V, AR=C, AP=C und AL=C (alles auf Konsole).\\ 
-Soll z.B. ein über den freien PIO-Port angeschlossener V24-Drucker verwendet 
-werden, so muss vorher AL=L gegeben werden. AC=C bewirkt, dass jeder 
-Tastendruck mit einem Ton quittiert wird. 
- 
-Für den BATCH-Modus muss ein SIF-1000-Lesegerät an den PIO-Port angeschlossen 
-werden. Ferner sind die Zuweisungen AR=P und AL=C (oder V) vorher unbedingt 
-erforderlich! Nach AC=B werden jetzt alle Eingaben nicht mehr von der Tastatur, 
-sondern vom angeschlossenen Lesegerät angefordert. Protokolliert wird infolge 
-der Zuweisung AL=C nach wie vor auf dem Bildschirm. Eine Zuweisung AL=L oder U 
-ist in diesem Fall nicht möglich, da an den PIO-Port zusätzlich zum Lesegerät 
-kein LIST-Gerät anschließbar ist. Sollte der Druckermodul gesteckt sein, so wird 
-bei AC=C auf dem Drucker protokolliert, bei AL=V auf dem Bildschirm. 
  • z9001/software/os/geraetetreiber.1430317133.txt.gz
  • Zuletzt geändert: 2015/04/29 14:18
  • von volkerp