Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
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] volkerp | z9001:software:os:geraetetreiber [2015/04/29 14:18] – [Aufbau] volkerp | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Gerätetreiber ====== | ====== Gerätetreiber ====== | ||
- | [[z9001: | + | FIXME |
- | ==== Einbinden von Gerätetreibern in das Betriebssystem (OS) des KC 85/1 ==== | + | Das OS des KC85/1 unterstützt leistungsfähig das Einbinden neuer Gerätetreiberroutinen für die sog. zeichenorientierten logischen Ein- / |
- | Das OS des KC85/1 unterstützt leistungsfähig das Einbinden neuer Gerätetreiberroutinen für die sog. zeichenorientierten logischen Ein- / | + | 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]] |
+ | * " | ||
+ | * und weitere Quellen | ||
+ | ===== logische und physische Geräte ===== | ||
- | ==== I/ | + | 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 " | ||
- | Das OS-KC85/1 verwaltet eine Tabelle mit 4 mal 4 Plätzen für Adressen | + | Das OS kann bis zu 4 physische Druckertreiber verwalten, |
- | CONST: (Console) \\ | + | Analog zum logischen Gerät " |
- | READER: | + | |
- | PUNCH: | + | |
- | List: (log. Kanal 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, | + | 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)! |
- | 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 | + | Das I/O-Byte dient zur Verbindung von logischen und physischen Geräten. Für |
+ | jedes der 4 logischen Geräte | ||
+ | eines dieser Geräte erfolgt über Änderung | ||
+ | verwendenden Treiber zugewiesen und initialisiert werden. Das I/O-Byte ist in 4 | ||
+ | Bereiche zu je 2 Bits unterteilt. Jeder Bereich, der einem logischen Gerät | ||
+ | zugeordnet ist, kann einen Wert von 0 bis 3 beinhalten | ||
+ | physisches Gerät verbinden. | ||
- | ==== ASGN-Kommando ==== | ||
- | **ASGN** ist ein residentes Kommando | + | Aufbau |
+ | Bit 7 6 5 4 3 2 1 0 | ||
+ | Log. Gerät LIST PUNCH READER CONST | ||
- | ASGN [log. Gerät = phys. Gerät] | + | Das OS selbst beinhaltet zwei residente Treiberroutinen: |
- | ASGN ohne Parameter gibt die aktuelle Belegung auf dem Bildschirm aus, z. B. | + | * CRT Consoltreiber |
+ | * BAT Batch-Treiber | ||
- | CONST:=CRT | + | CRT ist der Treiber für die Standard-Console, |
- | READER:= | + | |
- | PUNCH:= | + | |
- | LIST:= | + | |
- | sofern noch keine zusätzlichen | + | BAT ist ein Treiber, |
- | Beispiel: ASGN LIST:=LX86 | + | 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. |
- | Wird eine solche Anweisung gegeben, so vollzieht sich im OS ein umfangreicher Mechanismus: | + | Vom Monitor werden folgende physische Geräte realisiert: |
- | Zuerst wird eine Treiberroutine namens " | + | < |
+ | log. Gerät | ||
+ | CONST: 1 - CRT, 2 - BAT | ||
+ | LIST: 1 - CRT | ||
+ | </ | ||
- | - Suche auf allen Adressen | + | < |
+ | System-Treiber, * ist aktiv, fehlende Treiber sind mit RET kurzgeschlosssen | ||
+ | ; physische Gerätenummer | ||
+ | ; log. Gerät 0 1 2 3 | ||
+ | ; -------------------------------------------- | ||
+ | ; CONST: | ||
+ | ; READER: (2) * | ||
+ | ; PUNCH: | ||
+ | ; LIST: | ||
+ | </ | ||
- | 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). | + | nach Reset ist IOByte = 01h, d.h. |
- | Ist die Suche erfolgreich, | + | < |
+ | CONST: = CRT | ||
+ | READER: = | ||
+ | PUNCH: = | ||
+ | LIST: = | ||
+ | </ | ||
- | start tape. | + | Es sind jetzt folgende Zuweisungen möglich: |
- | 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: | + | LIST: = CRT - Druckausgaben erfolgen auf den Bildschirm parallel zur normalen Ausgabe |
- | - Welchem log. Gerät darf die Treiberroutine zugeordnet werden? \\ | + | Wenn Treiber für Reader und Punch installiert sind, ist noch erlaubt: |
- | - Die Startadresse des Treiberteils \\ | + | |
- | - 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). | + | |
- | 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. | + | CONST: = BAT - Consoleneingabe vom Reader-Gerat, Konsolenausgabe erfolgt auf das Punch-Gerät |
- | Ein physisches Gerät mit der Nr. 1 kann auch immer dem LIST-Kanal zugeordnet werden (Beispiel: residenter CRT-Treiber). | ||
- | Die Parameterübergabe erfolgt über die folgenden Register: | + | Die Treiberadressen der jeweiligen physischen Geräte liegen auf den Adressen |
+ | EFC9H bis EFE8H. s.u. Adreßtabelle der Gerätetreiber. | ||
- | H: log. Gerätenr. kennzeichnet den log. Kanal, dem die Treiberroutine zugeordnet werden kann. \\ | ||
- | 0 - CONST: 2 - READER: 4 - PUNCH: 6 - LIST: \\ | ||
- | L: phys. Gerät (0,...,3) \\ | ||
- | BC: Adresse der Treiberroutine \\ | ||
- | 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 " | + | 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: | ||
- | ASGN LIST:=LX86 | + | < |
+ | ; physische Gerätenummer | ||
+ | ; log. Gerät 0 1 2 3 | ||
+ | ; -------------------------------------------- | ||
+ | ; CONST: | ||
+ | ; READER: (2) TTY[R] RDR UR1 UR2 | ||
+ | ; PUNCH: | ||
+ | ; LIST: (6) TTY[L] CRT[L] LST UL | ||
+ | </ | ||
- | wird die Routine V24 (Tafel 4) eingebunden und das I/O-Byte entsprechend gestellt. Es erfolgt die Ausschrift | ||
- | CONST:=CRT | + | ===== ASGN-Kommando ===== |
- | READER:= | + | |
- | PUNCH:= | + | |
- | LIST:=LX86. | + | |
- | Der Drucker kann jetzt mit CTRL/P zum Bildschirm parallel geschaltet werden | + | **ASGN** ist ein residentes Kommando des OS (von insgesamt 3). Die Aufrufform ist |
+ | ASGN [log. Gerät = phys. Gerät] | ||
- | ===== Druckertreiber ===== | + | ASGN ohne Parameter gibt die aktuelle Belegung auf dem Bildschirm aus, z. B. |
- | Was erwartet das Betriebssystem? | + | CONST:=CRT |
+ | READER:= | ||
+ | PUNCH:= | ||
+ | LIST:= | ||
- | Das OS des Z9001 ist basierend auf CP/M entwickelt | + | sofern noch keine zusätzlichen Treiber eingebunden |
- | Treiberkonzept übernommen. So gibt es 4 logische | + | |
- | Anwendungsprogrammen genutzt werden können: CONST, READER, PUNCH, LIST. Diesen | + | |
- | logischen Geräten werden nun physische Gerätetreiber zugeordnet. Das erfolgt | + | |
- | mittels Kommando ASGN. Üblicherweise wird CONST der Tastatur und dem Bildschirm | + | |
- | zugeordnet und LIST dem Drucker. | + | |
- | Damit ein physischer Gerätetreiber so zugeordnet werden kann, muss er einige | + | Beispiel: ASGN LIST:=LX86 |
- | Eigenschaften erfüllen: | + | |
- | 1. Treiberadresse muss in der Adresstabelle für Gerätetreiber eingetragen sein | + | Wird eine solche Anweisung gegeben, so vollzieht sich im OS ein umfangreicher Mechanismus: |
- | (0EFC9H-0EFE8H) | + | |
- | 2. der Treiber muss eine 8 Byte lange Bezeichnung bereitstellen | + | |
- | 3. der Treiber muss die Systemkommandos für Gerätetreiber umsetzen. | + | |
- | Für einen Druckertreiber reichen folgende Systemkommandos aus: | + | 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 " | ||
- | 1. Initialisieren/ | + | Diese Tabelle wird mit einem Nullbyte abgeschlossen und kann mit weiteren Strukturen dieser Form fortgesetzt werden. Zwei aufeinander folgende Nullbytes beenden diese Sprungtabelle |
- | 2. Abfrage Status (A=0) | + | |
- | 3. Ausgabe Zeichen (A=0, Zeichen in C) | + | |
- | Das Ganze ist in der Betriebssystembeschreibung ausführlicher erklärt. Ebenfalls | + | Ist die Suche erfolgreich, |
- | gibt es in mp 10/87 S. 311 ff. Erläuterungen zum Gerätetreiber-Handling | + | |
- | Z9001. | + | |
- | Hinweis: Die Robotron-Treiber umgehen den Mechanismus von ASGN und tragen sich | + | start tape. |
- | selbst in die internen Gerätetreiberlisten ein; ein Robotron-Druckertreiber wird | + | |
- | also ganz normal im OS geladen; NICHT mit ASGN. | + | |
+ | 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: | ||
- | ===== CRT-Teiber ===== | + | * 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). | ||
- | für KRT wurden von mir CRT-Treiber entwickelt. Es gab keine Vorbilder wie bei den Druckertreibern. | + | 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). | ||
- | ===== ZM ===== | + | Beispielsweise wird ein Druckertreiber mit der Bezeichnung " |
- | :!: Schlechtes Vorbild!!! | + | ASGN LIST:=LX86 |
- | Es wird nicht alles umgesetzt, so fehlt die Initialisierung | + | wird die Treiber-Routine eingebunden (ggf. von Kassette geladen) |
- | Im Zusatzmonitor sind verschiedene Gerätetreiber enthalten. s. auch Artikel über | + | CONST: |
- | mp 10/87 S. 311 ff.. Den logischen Geräten Console, Reader, Punch, List können | + | |
- | verschiedene physische Treiber zugeordnet werden. Im ZM sind physische Treiber | + | |
- | für Tastatur mit Beep, SIF-1000 Lochbandleser und -stanzer, V24-Drucker und | + | |
- | Kassettenzugriff enthalten. | + | |
- | Das Kommando A< | + | 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. |
- | vorhandenen Gerätes zu einem logischen Gerät. Folgende Zuordnungen sind | + | |
- | angebbar: | + | |
+ | Die meisten Treiber umgehen den Aufruf über ASGN. Statt | ||
+ | ASGN LIST:=LX86 | ||
- | CONSOLE | + | wird der Druckertreiber dann mit |
- | READER | + | LX86 |
- | PUNCH | + | geladen. |
- | LIST | + | Ein guter Treiber sollte beide Varianten ermöglichen! |
- | AC=C für Konsole (mit Tastatur-Beep) | + | ===== Aufbau |
- | AC=V für Konsole (ohne Tastatur-Beep) | + | |
- | AC=B für BATCH AR=T für Kassette (Tape) | + | |
- | AC=U für User-Konsole | + | |
- | Nach Anlauf des Monitors gilt die Zuordnung AC=V, AR=C, AP=C und AL=C (alles auf Konsole). | + | Ein Treiber-Programm besteht aus mehreren Teilen |
- | | + | * OS-Kommandorahmen (enthält den Kommando-Namen, |
- | | + | * Kommando-Verteiler für die Treiber-Kommandos wie Eingabe, Statusabfrage und Initialisierung |
- | Tastendruck mit einem Ton quittiert wird. | + | * die interne Logik zur Umsetzung der Treiber-Kommandos (z.B. mit Sonderbehandlung von Steuerzeichen) |
+ | * die physischen Treiber zur Ansteuerung des Gerätes | ||
+ | * die Initialisierung der Systemzellen und die Parameterbereitstellung für ASGN | ||
- | Für den BATCH-Modus muss ein SIF-1000-Lesegerät an den PIO-Port angeschlossen | + | Treibereingangsparameter: |
- | werden. Ferner sind die Zuweisungen AR=P und AL=C (oder V) vorher unbedingt | + | * A Kommando |
- | erforderlich! Nach AC=B werden jetzt alle Eingaben nicht mehr von der Tastatur, | + | * C Zeichen (bei Kommando AUSGABE) |
- | sondern vom angeschlossenen Lesegerät angefordert. Protokolliert wird infolge | + | * DE Adresse bei Cursorkommandos |
- | der Zuweisung AL=C nach wie vor auf dem Bildschirm. Eine Zuweisung AL=L oder U | + | Treiberausgangsparameter: |
- | ist in diesem Fall nicht möglich, da an den PIO-Port zusätzlich zum Lesegerät | + | * A Zeichen (bei Kommando EINGABE) |
- | kein LIST-Gerät anschließbar ist. Sollte der Druckermodul gesteckt sein, so wird | + | * CY Fehlerstatus |
- | bei AC=C auf dem Drucker protokolliert, bei AL=V auf dem Bildschirm. | + | * HL,DE Adresse |
+ | Hinweis: Vordergrundregister müssen bei Eintritt in das Treiberprogramm nicht gerettet werden (erfolgt bereits im BOS) | ||
+ | Hinweis: | ||
+ | * TTY-Treiber (L=0) können beliebigen logischen Geräten 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 Fehlermeldung im ASGN-Kommando) | ||
- | ====== OS ====== | + | **Treiber-Kommandos** |
- | < | + | ^ Code ^ Funktion ^ Eingang ^ Return ^ |
- | ;der folgende Speicherbereich ist durch den Nutzer für eigene Treiber verwendbar | + | | 00 | Abfrage Status | | A Status\\ 0 kein Zeichen bei Eingabegerät, |
- | 0280 RTTYC BER 4 ;RAM TTY-Treiber für CONST | + | | 01 | Eingabe Zeichen | | A Zeichen | |
- | 0284 RCRTC: BER 4 ; | + | | 02 | Ausgabe Zeichen | C Zeichen | | |
- | 0288 RBATC: BER 4 ;RAM BAT-Treiber für CONST | + | | 03 | Cursor löschen | | | |
- | 028C RUC: BER 4 ;RAM UC-Treiber für CONST | + | | 04 | Cursor anzeigen | | HL physische Cursoradresse | |
- | 0290 PTTYR: BER 4 ;RAM TTY-Treiber für READER | + | | 05 | Abfrage logische und physische Cursoradresse | | HL physische Cursoradresse\\ DE logische Cursoradresse | |
- | 0294 RRDR: BER 4 ;RAM RDR-Treiber für READER | + | | 06 | Setzen Cursor auf logische Adresse | DE logische Cursoradresse | | |
- | 0298 RUR1: BER 4 ;RAM UR1-Treiber für READER | + | | 07 | Abfrage physische Cursoradresse | | HL physische Cursoradresse | |
- | 029C RUR2: BER 4 ;RAM UR2-Treiber für READER | + | | 08 | Setzen Cursor auf physische Adresse | DE physische Cursoradresse | | |
- | 02A0 RTTYP: BER 4 ;RAM TTY-Treiber für PUNCH | + | | FF | Initialisieren/ |
- | 02A4 RPUN: BER 4 ;RAM PUN-Treiber für PUNCH | + | |
- | 02A8 RUP1: BER 4 ;RAM UP1-Treiber für PUNCH | + | |
- | 02AC RUP2: BER 4 ;RAM UP2-Treiber für PUNCH | + | |
- | 02B0 RTTYL: BER 4 ;RAM TTY-Treiber für LIST | + | |
- | 02B4 RCRTL: BER 4 ;RAM CRT-Treiber für LIST | + | |
- | 02B8 RLST: BER 4 ;RAM LST-Treiber für LIST | + | |
- | 02BC RUL: BER 4 ;RAM UL-Treiber für LIST | + | |
- | 02C0 SYSR: BER 40H ; | + | |
- | ; | + | Hinweis: |
- | EFC9 ATTYC: DA -1 ;Adresse TTY-Treiber für CONST | + | * werden verschiedene Kommandos durch den Anwender nicht benötigt, kann dafür ein Sprung zum Fehlerausgang |
- | EFCB ACRTC: DA CRT ;Adresse CRT-Treiber für CONST | + | * korrespondierende System- und Direktrufe sind dann nicht mehr verwendbar |
- | EFCD ABATC: DA BAT ;Adresse BAT-Treiber für CONST | + | |
- | EFCF AUC: DA -1 ;Adresse UC-Treiber für CONST | + | |
- | EFD1 ATTYR: DA -1 ;Adresse TTY-Treiber für READER | + | |
- | EFD3 ARDR: DA -1 ;Adresse RDR-Treiber für READER | + | |
- | EFD5 AUR1: DA -1 ;Adresse UR1-Treiber für READER | + | |
- | EFD7 AUR2: DA -1 ;Adresse UR2-Treiber für READER | + | |
- | EFD9 ATTYP: DA -1 ;Adresse TTY-Treiber für PUNCH | + | |
- | EFDB APUN: DA -1 ;Adresse PUN-Treiber für PUNCH | + | |
- | EFDD AUP1: DA -1 ;Adresse UP1-Treiber für PUNCH | + | |
- | EFDF AUP2: DA -1 ;Adresse UP2-Treiber für PUNCH | + | |
- | EFE1 ATTYL: DA -1 ;Adresse TTY-Treiber für LIST | + | |
- | EFE3 ACRTL: DA CRT ;Adresse CRT-Treiber für LIST | + | |
- | EFE5 ALST: DA -1 ;Adresse LST-Treiber für LIST | + | |
- | EFE7 AUL: DA -1 ;Adresse UL-Treiber für LIST | + | |
- | ; | + | |
- | EFE9 TXCON: DA PHYDV+2 ;Adresse einer Zeichenkette | + | |
- | ; | + | |
- | EFEB TXRDR: DA PHYDV ; | + | |
- | EFED TXPUN: DA PHYDV ; | + | |
- | EFEF TXLST: DA PHYDV ; | + | |
- | </ | + | |
+ | **Treiberinitialisierung** | ||
- | 3. Zusätzliche Treiber | + | Dem OS (bzw. dem ASGN-Kommando) müssen |
- | + | ||
- | Der Monitor des Z 9001 bietet | + | |
- | Möglichkeit, | + | |
- | Treiberroutinen zuzuweisen. Um die Zusammenarbeit mit allen anderen | + | |
- | Systemkomponenten zu gewährleisten, | + | |
- | beachten. | + | |
- | + | ||
- | Treibereingangsparameter: | + | |
- | - A Kommando (siehe 3.2.) (für CONST, READER, LIST) | + | |
- | - C Zeichen (bei Kommando AUSGABE) | + | |
- | - DE Adresse bei Cursorkommandos | + | |
- | Treiberausgangsparameter: | + | |
- | - A Zeichen (bei Kommando EINGABE) | + | |
- | - CY Fehlerstatus | + | |
- | - HL,DE Adresse bei Cursorkommandos | + | |
- | Hinweis: | + | |
- | Vordergrundregister | + | |
- | werden | + | |
- | 3.1. Treiberinitialisierung | + | * Welchem log. Gerät darf die Treiberroutine zugeordnet werden? |
+ | * Die Startadresse des Treiberteils | ||
+ | * Auf welchem Platz der Zuordnungstabelle soll der Eintrag erfolgen (physisches Gerät 0...3)? | ||
+ | * Die Adresse des symbolischen Gerätenamens (8-Byte-String). | ||
Die Initialisierung sollte grundsätzlich über das ASGN-Kommando erfolgen. Eine | Die Initialisierung sollte grundsätzlich über das ASGN-Kommando erfolgen. Eine | ||
- | automatische Initialisierung über die Nutzung des Kommandos | + | automatische Initialisierung über die Nutzung des Kommandos und |
Direktzugriff auf entsprechende Systemzellen ist zu vermeiden. | Direktzugriff auf entsprechende Systemzellen ist zu vermeiden. | ||
Zeile 270: | Zeile 253: | ||
Treiberroutine eines physischen Gerätes stehen im System-RAM (ab 280H) 4 Bytes | Treiberroutine eines physischen Gerätes stehen im System-RAM (ab 280H) 4 Bytes | ||
Speicher zur Verfügung. | Speicher zur Verfügung. | ||
+ | |||
Die Treiberinitialisierung muß der ASGN-Routine folgende Parameter übergeben: | Die Treiberinitialisierung muß der ASGN-Routine folgende Parameter übergeben: | ||
+ | < | ||
- CY Fehlerstatus nach Initialisierung | - CY Fehlerstatus nach Initialisierung | ||
- H logische Gerätenummer | - H logische Gerätenummer | ||
Zeile 279: | Zeile 264: | ||
6 LIST | 6 LIST | ||
- L physische Gerätenummer (0, 1 .... 3) | - L physische Gerätenummer (0, 1 .... 3) | ||
- | - BC Adresse der E/A-Routine | + | - BC Adresse der Treiberroutine |
- | - DE Adresse einer Zeichenkette (wird nach der Zuweisung durch ASGN angezeigt) | + | - DE Adresse einer Zeichenkette (symbolischer Gerätename, |
+ | </ | ||
+ | |||
+ | :!: sollen Gerätetreiber auch für OS 1.1 nutzbar sein, muss man auf einen Bug des Systems Rücksicht nehmen! | ||
Beispiel: | Beispiel: | ||
+ | |||
+ | < | ||
; | ; | ||
JMP INIT | JMP INIT | ||
Zeile 298: | Zeile 289: | ||
LD BC, | LD BC, | ||
LD DE, | LD DE, | ||
- | OR A ;kein Fehler | + | or a ; CY=0, kein Fehler |
- | RET | + | ; |
+ | 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 | ||
; | ; | ||
FEHL: | FEHL: | ||
Zeile 311: | Zeile 308: | ||
.... | .... | ||
RAME: EQU # | RAME: EQU # | ||
- | Hinweis: | + | </ |
- | - TTY-Treiber (L=0) können beliebigen logischen Geräten 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 | + | |
- | Fehlermeldung im ASGN-Kommando) | + | |
+ | Beim eigenständigen Eintragen der Treiber unter Umgehung des ASGN-Kommandos gilt: | ||
- | 3.2. Besonderheiten der Treiber für CONST | + | - Treiberadresse muss in der Adresstabelle für Gerätetreiber eingetragen sein (0EFC9H-0EFE8H) |
+ | - der Treiber muss eine 8 Byte lange Bezeichnung bereitstellen | ||
+ | - der Treiber muss die Systemkommandos für Gerätetreiber umsetzen. | ||
+ | |||
+ | **Treiber für LIST (Druckertreiber)** | ||
+ | |||
+ | Für einen Druckertreiber reichen folgende Treiber-Kommandos aus: | ||
+ | |||
+ | * Initialisieren/ | ||
+ | * Abfrage Status (A=0, Rückgabe 0 bei nicht bereit, sonst <> 0) | ||
+ | * Ausgabe Zeichen (A=2, Zeichen in C) | ||
+ | |||
+ | **Treiber für READER** | ||
+ | |||
+ | Für einen Treiber für READER reichen folgende Treiber-Kommandos aus: | ||
+ | |||
+ | * Initialisieren/ | ||
+ | * Abfrage Status (A=0, Rückgabe 0, wenn kein Zeichen einzulesen ist, sonst <> 0) | ||
+ | * Eingabe Zeichen (A=1, Rückgabe Zeichen in A) | ||
+ | |||
+ | **Treiber für CONST** | ||
An die Treiber der für CONST möglichen Geräte (TTY, CRT, BAT, UC) werden | An die Treiber der für CONST möglichen Geräte (TTY, CRT, BAT, UC) werden | ||
Zeile 325: | Zeile 339: | ||
erfüllende Aufgabe durch spezielle Kommandocodes im A - Register übergeben. | erfüllende Aufgabe durch spezielle Kommandocodes im A - Register übergeben. | ||
- | Kommandocodetabelle: | + | **Kommandocodetabelle** |
- | Code Funktion | + | |
- | ---------------------------------------------------------------------------------------------------------------------------------- | + | |
- | 00 Abfrage Status | + | |
- | Return: | + | |
- | A Status | + | |
- | 0 kein Zeichen bei Eingabegerä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/ | + | |
- | + | ||
- | + | ||
- | Hinweis: | + | |
- | - werden verschiedene Kommandos durch den Anwender nicht benötigt, kann dafür | + | |
- | ein Sprung zum Fehlerausgang des Treibers programmiert werden | + | |
- | - korrespondierende System- und Direktrufe sind dann nicht mehr verwendbar | + | |
Beispiel: | Beispiel: | ||
+ | < | ||
; | ; | ||
INC A | INC A | ||
Zeile 389: | Zeile 366: | ||
FEHL: | FEHL: | ||
RET ; | RET ; | ||
+ | </ | ||
- | 3.3. Besonderheiten der Treiber für READER und LIST | ||
- | Soll ein READER-Gerät Im Zusammenhang mit dem BATCH-Mode von CONST betrieben | + | ===== Speicherzellen ===== |
- | 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. | + | |
+ | Im Betriebssystem sind einige Speicherzellen für Treiber freigehalten. | ||
+ | Anwenderprogramme dürfen daher den Bereich 280h..2BFh auch nicht nutzen, sondern erst ab 300h! | ||
+ | < | ||
+ | |||
+ | 0004 IOBYT: DB 1 ;I/O-Byte zur Zuweisung log.Gerät phys. Gerät | ||
+ | |||
+ | ;der folgende Speicherbereich ist durch den Nutzer für eigene Treiber verwendbar | ||
+ | 0280 RTTYC BER 4 ;RAM TTY-Treiber für CONST | ||
+ | 0284 RCRTC: BER 4 ;RAM CRT-Treiber für CONST | ||
+ | 0288 RBATC: BER 4 ;RAM BAT-Treiber für CONST | ||
+ | 028C RUC: BER 4 ;RAM UC-Treiber für CONST | ||
+ | 0290 PTTYR: BER 4 ;RAM TTY-Treiber für READER | ||
+ | 0294 RRDR: BER 4 ;RAM RDR-Treiber für READER | ||
+ | 0298 RUR1: BER 4 ;RAM UR1-Treiber für READER | ||
+ | 029C RUR2: BER 4 ;RAM UR2-Treiber für READER | ||
+ | 02A0 RTTYP: BER 4 ;RAM TTY-Treiber für PUNCH | ||
+ | 02A4 RPUN: BER 4 ;RAM PUN-Treiber für PUNCH | ||
+ | 02A8 RUP1: BER 4 ;RAM UP1-Treiber für PUNCH | ||
+ | 02AC RUP2: BER 4 ;RAM UP2-Treiber für PUNCH | ||
+ | 02B0 RTTYL: BER 4 ;RAM TTY-Treiber für LIST | ||
+ | 02B4 RCRTL: BER 4 ;RAM CRT-Treiber für LIST | ||
+ | 02B8 RLST: BER 4 ;RAM LST-Treiber für LIST | ||
+ | 02BC RUL: BER 4 ;RAM UL-Treiber für LIST | ||
+ | |||
+ | |||
+ | ; | ||
+ | EFC9 ATTYC: DA -1 ;Adresse TTY-Treiber für CONST | ||
+ | EFCB ACRTC: DA CRT ;Adresse CRT-Treiber für CONST | ||
+ | EFCD ABATC: DA BAT ;Adresse BAT-Treiber für CONST | ||
+ | EFCF AUC: DA -1 ;Adresse UC-Treiber für CONST | ||
+ | EFD1 ATTYR: DA -1 ;Adresse TTY-Treiber für READER | ||
+ | EFD3 ARDR: DA -1 ;Adresse RDR-Treiber für READER | ||
+ | EFD5 AUR1: DA -1 ;Adresse UR1-Treiber für READER | ||
+ | EFD7 AUR2: DA -1 ;Adresse UR2-Treiber für READER | ||
+ | EFD9 ATTYP: DA -1 ;Adresse TTY-Treiber für PUNCH | ||
+ | EFDB APUN: DA -1 ;Adresse PUN-Treiber für PUNCH | ||
+ | EFDD AUP1: DA -1 ;Adresse UP1-Treiber für PUNCH | ||
+ | EFDF AUP2: DA -1 ;Adresse UP2-Treiber für PUNCH | ||
+ | EFE1 ATTYL: DA -1 ;Adresse TTY-Treiber für LIST | ||
+ | EFE3 ACRTL: DA CRT ;Adresse CRT-Treiber für LIST | ||
+ | EFE5 ALST: DA -1 ;Adresse LST-Treiber für LIST | ||
+ | EFE7 AUL: DA -1 ;Adresse UL-Treiber für LIST | ||
+ | |||
+ | ; | ||
+ | EFE9 TXCON: DA PHYDV+2 ;Adresse einer Zeichenkette des aktuellen CONST-Gerätes, | ||
+ | ; | ||
+ | EFEB TXRDR: DA PHYDV ; | ||
+ | EFED TXPUN: DA PHYDV ; | ||
+ | EFEF TXLST: DA PHYDV ; | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ====== CRT-Teiber ====== | ||
+ | |||
+ | für KRT wurden von mir CRT-Treiber entwickelt. Es gab keine Vorbilder wie bei den Druckertreibern. | ||
+ | |||
+ | |||
+ | ======= ZM ======= | ||
+ | |||
+ | :!: der ZM ist ein schlechtes Vorbild in Sachen Gerätetreiber! | ||
+ | |||
+ | * Der ZM enthält ein eigenes ASGN-Kommando ' | ||
+ | * Der ZM überschreibt die komplette Adresstabelle der Gerätetreiber (ab 0EFC9h). Eigene vorher eingetragene Treiber werden damit aus dem System geworfen! | ||
+ | * Die Treiber für TAPE sind keine zeichenorientierten Treiber und manipulieren gehörig das System (s. Sourcecode) | ||
+ | |||
+ | |||
+ | Im [[z9001: | ||
+ | Den logischen Geräten Console, Reader, Punch, List können | ||
+ | verschiedene physische Treiber zugeordnet werden. Im ZM sind physische Treiber | ||
+ | für Tastatur mit Beep, SIF-1000 Lochbandleser und -stanzer, V24-Drucker und | ||
+ | Kassettenzugriff enthalten. | ||
+ | |||
+ | Das Kommando A< | ||
+ | vorhandenen Gerätes zu einem logischen Gerät. Folgende Zuordnungen sind | ||
+ | angebbar: | ||
+ | |||
+ | |||
+ | ^ CONSOLE ^ READER ^ PUNCH ^ LIST ^ | ||
+ | | AC=C für Konsole (mit Tastatur-Beep) | AR=C für Konsole | AP=C für Konsole | AL=C für Konsole | | ||
+ | | AC=V für Konsole (ohne Tastatur-Beep) | AR=P für LB-Leser (SIF-1000) | AP=P für LB-Stanzer (SIF-1000) | AL=V für Konsole | | ||
+ | | AC=B für BATCH | AR=T für Kassette (Tape) | AP=T für Kassette | AL=L für V24-Drucker (TD40) | | ||
+ | | 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, |