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
Nächste ÜberarbeitungBeide Seiten der Revision
z9001:software:os:geraetetreiber [2015/04/27 13:35] – [OS] volkerpz9001:software:os:geraetetreiber [2015/04/28 12:54] – [ASGN-Kommando] volkerp
Zeile 1: Zeile 1:
 ====== Gerätetreiber ====== ====== Gerätetreiber ======
  
-[[z9001:literatur:treiber]]+FIXME
  
-==== Einbinden von Gerätetreibern in das Betriebssystem (OSdes KC 85/1 ====+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 kurz erläuterte Konzept ist das Betriebssystem CP/M.+Literatur:
  
-:!sollen Gerätetreiber auch für OS 1.1 nutzbar sein, muss man auf einen Bug des Systems Rücksicht nehmen!+  * [[z9001:literatur:treiber]] 
 +  * "Betriebssystem Z9001" Beschreibung + Quelltext des OS 
 +  * und weitere Quellen
  
 +===== logische und physische Geräte =====
  
-==== I/O-Byte-Konzept ====+Das OS verwaltet logische und physische Geräte. Logische Geräte sind z.B. die Zeichenausgabe auf Drucker (LIST:).  
 +Welcher Drucker angeschlossen ist, spielt auf Anwenderprogrammebene keine Rolle, die zu druckenden Zeichen werden immer an "LIST:" ausgegeben. 
  
-Das OS-KC85/1 verwaltet eine Tabelle mit mal 4 Plätzen für Adressen von Gerätetreiberroutinen (Tafel 5). Jeweils eine Zeile dieser Tabelle wird dabei einem der 4 logischen E/A-Kanäle+Das OS kann bis zu physische Druckertreiber verwalten, von denen genau einer aktiv ist. Welcher Drucker bzw. physischer Treiber das ist, wird mit dem Kommando ASGN festgelegt (s.u.).
  
-CONST: (Console\\   +Analog zum logischen Gerät "Drucker" gibt es 3 weitere logische Gerätedie Konsole (CON, Tastatur + Bildschirm, d.h. Zeichenein- und -ausgabe)), Punch (nur Zeichenausgabe, ursprünglich auf Lochband), Reader (nur Zeicheneingabe, ursprünglich von Lochband). 
-READER: (zusätzlicher Eingabekanal\\   +
-PUNCH: (zusätzlicher Ausgabekanal\\   +
-List: (logKanal für Drucker)+
  
-zugeordnet, d. h. für jeden log. E/A-Kanal können 4 Treiberroutinen gleichzeitig resident sein. Welche dabei im gegebenen Moment ausgewählt wird, bestimmt die Belegung des I/O-Bytes (HS-Adr. 0004, im CP/M üblicherweise Adr. 0003).+Zur Kommunikation mit diesen Geräten gibt es Systemfunktionen über CALL 5:
  
-Das OS selbst beinhaltet zwei residente Treiberroutinen:+CALL 5, C = Rufnmmer
  
-CRT Consoltreiber \\   +^Rufnr. ^ Name ^ Funktion ^ 
-BAT Batch-Treiber+| 01 | CONSI      | Eingabe eines Zeichens von CONST              | 
 +| 02 | CONSO      | Ausgabe eines Zeichens zu CONST               | 
 +| 03 | READI      | Eingabe eines Zeichens von READ               | 
 +| 04 | PUNO       | Ausgabe eines Zeichens zu PUNCH               | 
 +| 05 | LISTO      | Ausgabe eines Zeichens zu LIST                | 
 +| 09 | PRNST      | Ausgabe einer Zeichenkette zu CONST           | 
 +| 10 | RCONB      | Eingabe einer Zeichenkette von CONST          | 
 +| 11 | CSTS       | Abfrage Status CONST                          |
  
-CRT ist der Treiber für die Standard-Console, dhfür das Fernsehgerät als Sichtgerät und die eingebaute Tastatur.+In BASIC können diese Geräte über Kanäle #1..#4 angesprochen werden (allggeht das nur mit verändertem Lutz-Elßner-Basic)!
  
-BAT ist ein Treiber, der das log. Gerät Console (CONST:) auf die Kanäle READER: (Eingabe) und LIST: (Ausgabe) aufteilt, also nur verwendbar ist, falls auch für READER: und LIST: entsprechende Treiber eingebunden wurden.+===== Das I/O-Byte =====
  
-Alle anderen Plätze der Tabelle sind nach einem Kaltstart des OS (RESET oder POWER ON) mit dem Wert 0FFFFH belegt und zeigen dem OS damit einen nicht existenten Treiber anSollen eigene Treiberroutinen - wie z. B. die in Tafel 1 bis 4 - eingebracht werden, so kann das durch direktes Eintragen der Treiberadresse in den entsprechenden Tabellenplatz und zugehöriges Stellen des I/O-Bytes erfolgenAber auch hierfür bietet das OS ein leistungsfähiges Hilfsmittel - das ASGN (Assign)-Kommando - anDiese Form des Einbindens von E/A-Treibern sollte ia. bevorzugt werdenda die konkreten Anordnungen von Zuordnungstabelle (Tafel 5) und I/O-Byte im Speicher damit für den Nutzer transparent bleiben (d. h., evtl. Veränderungen wirken sich nicht auf das Anwenderprogramm aus).+Das I/O-Byte dient zur Verbindung von logischen und physischen Geräten. Für 
 +jedes der 4 logischen Geräte sind 4 physische Geräte wählbarDie Zuschaltung 
 +eines dieser Geräte erfolgt über Änderung des I/O-Bytes. Zuvor müssen alle zu 
 +verwendenden Treiber zugewiesen und initialisiert werdenDas I/O-Byte ist in 4 
 +Bereiche zu je 2 Bits unterteiltJeder Bereichder einem logischen Gerät 
 +zugeordnet ist, kann einen Wert von 0 bis 3 beinhalten und damit logisches und 
 +physisches Gerät verbinden.
  
  
-==== ASGN-Kommando ====+ 
 +Aufbau des I/O-Bytes (HS-Adr. 0004, im CP/M üblicherweise Adr. 0003): 
 + Bit         7 6  5 4    3 2   1 0 
 + Log. Gerät LIST PUNCH READER CONST 
 + 
 +Das OS selbst beinhaltet zwei residente Treiberroutinen:  
 + 
 +  * CRT Consoltreiber  
 +  * BAT Batch-Treiber  
 + 
 +CRT ist der Treiber für die Standard-Console, d. h. für das Fernsehgerät als Sichtgerät und die eingebaute Tastatur.  
 + 
 +BAT ist ein Treiber, der das log. Gerät Console (CONST:) auf die Kanäle READER: (Eingabe) und LIST: (Ausgabe) aufteilt, also nur verwendbar ist, falls auch für READER: und LIST: entsprechende Treiber eingebunden wurden.  
 + 
 +Alle anderen Plätze der Tabelle sind nach einem Kaltstart des OS (RESET oder POWER ON) mit dem Wert 0FFFFH belegt und zeigen dem OS damit einen nicht existenten Treiber an. Sollen eigene Treiberroutinen eingebracht werden, so kann das durch direktes Eintragen der Treiberadresse in den entsprechenden Tabellenplatz und zugehöriges Stellen des I/O-Bytes erfolgen.  
 + 
 +Vom Monitor werden folgende physische Geräte realisiert: 
 + 
 +<code> 
 +  log. Gerät    phys. Treiber 
 +  CONST: 1 - CRT, 2 - BAT 
 +  LIST: 1 - CRT 
 +</code> 
 + 
 +<code> 
 +System-Treiber, * ist aktiv, fehlende Treiber sind mit RET kurzgeschlosssen 
 +; physische Gerätenummer  
 +; log. Gerät 0 1 2 3 
 +; -------------------------------------------- 
 +; CONST:  (0) CRT* BAT 
 +; READER: (2) * 
 +; PUNCH:  (4) * 
 +; LIST:   (6) * CRT 
 +</code> 
 + 
 +nach Reset ist IOByte = 01h, d.h.  
 + 
 +<code> 
 +CONST: = CRT 
 +READER: =  
 +PUNCH: =  
 +LIST: = 
 +</code> 
 + 
 +Es sind jetzt folgende Zuweisungen möglich: 
 + 
 +LIST: = CRT - Druckausgaben erfolgen auf den Bildschirm parallel zur normalen Ausgabe 
 + 
 +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 
 + 
 + 
 +Die Treiberadressen der jeweiligen physischen Geräte liegen auf den Adressen 
 +EFC9H bis EFE8H. s.u. Adreßtabelle der Gerätetreiber. 
 + 
 + 
 +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: 
 + 
 +<code> 
 +; physische Gerätenummer  
 +; log. Gerät 0 1 2 3 
 +; -------------------------------------------- 
 +; CONST:  (0) TTY[C] CRT[C] BAT[C] AUC 
 +; READER: (2) TTY[R] RDR UR1 UR2 
 +; PUNCH:  (4) TTY[P] PUN UP1 UP2 
 +; LIST:   (6) TTY[L] CRT[L] LST UL 
 +</code> 
 + 
 + 
 +===== ASGN-Kommando =====
  
 **ASGN** ist ein residentes Kommando des OS (von insgesamt 3). Die Aufrufform ist **ASGN** ist ein residentes Kommando des OS (von insgesamt 3). Die Aufrufform ist
Zeile 52: Zeile 137:
 Wird eine solche Anweisung gegeben, so vollzieht sich im OS ein umfangreicher Mechanismus: 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: +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.+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). 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).
Zeile 60: Zeile 145:
 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 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.+  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: 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? \\ +  * Welchem log. Gerät darf die Treiberroutine zugeordnet werden?  
-Die Startadresse des Treiberteils \\ +  Die Startadresse des Treiberteils  
-Auf welchem Platz der Zuordnungstabelle (Tafel 5) soll der Eintrag erfolgen (physisches Gerät 0...3)? \\ +  Auf welchem Platz der Zuordnungstabelle (Tafel 5) soll der Eintrag erfolgen (physisches Gerät 0...3)?  
-Die Adresse des symbolischen Gerätenamens (8-Byte-String).+  Die Adresse des symbolischen Gerätenamens (8-Byte-String).
  
-Zu beachten ist, daß 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.+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). Ein physisches Gerät mit der Nr. 1 kann auch immer dem LIST-Kanal zugeordnet werden (Beispiel: residenter CRT-Treiber).
Zeile 81: Zeile 166:
 DE: Adresse der Zeichenkette (symbolischer Gerätename) DE: Adresse der Zeichenkette (symbolischer Gerätename)
  
-Tafel 6 gibt ein Beispiel an, wie die Treiberroutine nach Tafel 4 (V24/DTR) als Druckertreiber mit der Bezeichnung "LX86" in das OS eingebunden werden kann. Mit der Anweisung+Beispielsweise wird ein Druckertreiber mit der Bezeichnung "LX86" wie folgt in das OS eingebundenMit der Anweisung
  
   ASGN LIST:=LX86   ASGN LIST:=LX86
  
-wird die Routine V24 (Tafel 4eingebunden und das I/O-Byte entsprechend gestellt. Es erfolgt die Ausschrift+wird die Treiber-Routine eingebunden (ggf. von Kassette geladen) und das I/O-Byte entsprechend gestellt. Es erfolgt die Ausschrift
  
   CONST:=CRT    CONST:=CRT 
Zeile 93: Zeile 178:
  
 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. 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.
- 
  
 ===== Druckertreiber ===== ===== Druckertreiber =====
Zeile 241: Zeile 325:
  
 Treibereingangsparameter: Treibereingangsparameter:
- A Kommando (siehe 3.2.) (für CONST, READER, LIST) + A Kommando (siehe 3.2.) (für CONST, READER, LIST) 
- C Zeichen (bei Kommando AUSGABE) + C Zeichen (bei Kommando AUSGABE) 
- DE Adresse bei Cursorkommandos+ DE Adresse bei Cursorkommandos
 Treiberausgangsparameter: Treiberausgangsparameter:
- A Zeichen (bei Kommando EINGABE) + A Zeichen (bei Kommando EINGABE) 
- CY Fehlerstatus + CY Fehlerstatus 
- HL,DE Adresse bei Cursorkommandos + HL,DE Adresse bei Cursorkommandos 
-Hinweis: + 
- Vordergrundregister müssen bei Eintritt in das Treiberprogramm nicht gerettet  +Hinweis: Vordergrundregister müssen bei Eintritt in das Treiberprogramm nicht gerettet werden (erfolgt bereits im BOS)
- werden (erfolgt bereits im BOS)+
  
  
Zeile 272: Zeile 355:
  
 Die Treiberinitialisierung muß der ASGN-Routine folgende Parameter übergeben: Die Treiberinitialisierung muß der ASGN-Routine folgende Parameter übergeben:
 +<code>
  - CY Fehlerstatus nach Initialisierung  - CY Fehlerstatus nach Initialisierung
  - H logische Gerätenummer  - H logische Gerätenummer
Zeile 281: Zeile 365:
  - BC Adresse der E/A-Routine  - BC Adresse der E/A-Routine
  - DE Adresse einer Zeichenkette (wird nach der Zuweisung durch ASGN angezeigt)  - DE Adresse einer Zeichenkette (wird nach der Zuweisung durch ASGN angezeigt)
 +</code>
 Beispiel: Beispiel:
 +<code>
  ;PROM-Transientkommandoprogramm zur Initialisierung eines Druckers als TTY-Gerät  ;PROM-Transientkommandoprogramm zur Initialisierung eines Druckers als TTY-Gerät
  JMP INIT  JMP INIT
Zeile 311: Zeile 397:
  ....  ....
  RAME: EQU #  RAME: EQU #
 +</code>
 +
 Hinweis: Hinweis:
- TTY-Treiber (L=0) können beliebigen logischen Geräten zugewiesen werden + TTY-Treiber (L=0) können beliebigen logischen Geräten zugewiesen werden 
- CRT-Treiber (L=1) können CONST und LIST zugewiesen werden + CRT-Treiber (L=1) können CONST und LIST zugewiesen werden 
- alle anderen nur dem im H-Register angegebenen logischen Gerät (sonst  + alle anderen nur dem im H-Register angegebenen logischen Gerät (sonst Fehlermeldung im ASGN-Kommando)
-   Fehlermeldung im ASGN-Kommando)+
  
  
Zeile 326: Zeile 413:
  
 Kommandocodetabelle: Kommandocodetabelle:
-Code Funktion 
----------------------------------------------------------------------------------------------------------------------------------- 
-00 Abfrage Status 
- Return: 
- A Status 
- 0 kein Zeichen bei Eingabegerät, nicht bereit bei Ausgabegerät 
- sonst Zeichen liegt an bei Eingabegerät, 
- (im installierten CRT-Treiber wird der Zeichencode übergeben) 
-01 Eingabe Zeichen 
- Return: 
- A Zeichen 
-02 Ausgabe Zeichen 
- Eingang: 
- C Zeichen 
-03 Cursor löschen 
-04 Cursor anzeigen 
- Return: 
- HL physische Cursoradresse 
-05 Abfrage logische und physische Cursoradresse 
- Return: 
- HL physische Cursoradresse 
- DE logische Cursoradresse 
-06 Setzen Cursor auf logische Adresse 
- Eingang: 
- DE logische Cursoradresse 
-07 Abfrage physische Cursoradresse 
- Return: 
- HL physische Cursoradresse 
-08 Setzen Cursor auf physische Adresse 
- Eingang: 
- DE physische Cursoradresse 
-FF Initialisieren/Rücksetzen des Gerätes 
  
 +^ Code ^ Funktion ^ Eingang ^ Return ^
 +| 00 | Abfrage Status | | A Status\\ 0 kein Zeichen bei Eingabegerät,\\ nicht bereit bei Ausgabegerät\\ sonst Zeichen liegt an bei Eingabegerät,\\ (im installierten CRT-Treiber wird der Zeichencode übergeben) |
 +| 01 | Eingabe Zeichen | | A Zeichen |
 +| 02 | Ausgabe Zeichen | C Zeichen | |
 +| 03 | Cursor löschen | | |
 +| 04 | Cursor anzeigen | | HL physische Cursoradresse |
 +| 05 | Abfrage logische und physische Cursoradresse | | HL physische Cursoradresse\\ DE logische Cursoradresse |
 +| 06 | Setzen Cursor auf logische Adresse | DE logische Cursoradresse | |
 +| 07 | Abfrage physische Cursoradresse | | HL physische Cursoradresse |
 +| 08 | Setzen Cursor auf physische Adresse | DE physische Cursoradresse | |
 +| FF | Initialisieren/Rücksetzen des Gerätes | | |
  
 Hinweis: Hinweis:
- werden verschiedene Kommandos durch den Anwender nicht benötigt, kann dafür + werden verschiedene Kommandos durch den Anwender nicht benötigt, kann dafür ein Sprung zum Fehlerausgang des Treibers programmiert werden 
-   ein Sprung zum Fehlerausgang des Treibers programmiert werden + korrespondierende System- und Direktrufe sind dann nicht mehr verwendbar
- korrespondierende System- und Direktrufe sind dann nicht mehr verwendbar+
  
 Beispiel: Beispiel:
 +<code>
  ;Eingangsverteiler für CRT-Treiber mit allen Funktionen  ;Eingangsverteiler für CRT-Treiber mit allen Funktionen
  INC A  INC A
Zeile 389: Zeile 455:
  FEHL: SCF ;unzulässiges Kommando  FEHL: SCF ;unzulässiges Kommando
  RET ;Fehlerausgang  RET ;Fehlerausgang
 +</code>
  
 3.3. Besonderheiten der Treiber für READER und LIST 3.3. Besonderheiten der Treiber für READER und LIST
Zeile 398: Zeile 464:
 das LIST-Gerät müssen die Kommandos Ausgabe, Statusabfrage und Initialisierung das LIST-Gerät müssen die Kommandos Ausgabe, Statusabfrage und Initialisierung
 in jedem Falle programmiert werden. in jedem Falle programmiert werden.
 +
 +
 +====== Hinweise ======
 +
 +
 +:!: sollen Gerätetreiber auch für OS 1.1 nutzbar sein, muss man auf einen Bug des Systems Rücksicht nehmen!
 +
 +<code>
 +;Ende der Initialisierung. Bei OS 1.1. muss eine Return-Adresskorrektur erfolgen!
 +;Übergabe an ASGN:
 +;H = logische Gerätenummer
 +;L = physische Gerätenummer
 +;BC = Treiberadresse
 +;DE = Adr. des symb. Namens
 +
 + or a ; CY=0, kein Fehler
 + ex (sp), hl ; dieser Teil
 + inc hl ; ist nur bei OS Version 1.1
 + inc hl ; noetig (wegen eines Fehlers
 + ex (sp), hl ; in der ASGN-Routine)
 + ret
 +</code>
  
  
  • z9001/software/os/geraetetreiber.txt
  • Zuletzt geändert: 2023/06/13 14:47
  • von volkerp