Dies ist eine alte Version des Dokuments!


Gerätetreiber

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.

:!: sollen Gerätetreiber auch für OS 1.1 nutzbar sein, muss man auf einen Bug des Systems Rücksicht nehmen!

Das OS-KC85/1 verwaltet eine Tabelle mit 4 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

CONST: (Console)
READER: (zusätzlicher Eingabekanal)
PUNCH: (zusätzlicher Ausgabekanal)
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).

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 - 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 erfolgen. Aber auch hierfür bietet das OS ein leistungsfähiges Hilfsmittel - das ASGN (Assign)-Kommando - an. Diese Form des Einbindens von E/A-Treibern sollte i. a. bevorzugt werden, da 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).

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

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:

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 „LX86“ in das OS eingebunden werden kann. Mit der Anweisung

ASGN LIST:=LX86

wird die Routine V24 (Tafel 4) eingebunden 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.

Was erwartet das Betriebssystem?

Das OS des Z9001 ist basierend auf CP/M entwickelt worden und hat dessen Treiberkonzept übernommen. So gibt es 4 logische Geräte, die von den 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 Eigenschaften erfüllen:

1. Treiberadresse muss in der Adresstabelle für Gerätetreiber eingetragen sein (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:

1. Initialisieren/Rücksetzen des Gerätes (A=0FFh) 2. Abfrage Status (A=0) 3. Ausgabe Zeichen (A=0, Zeichen in C)

Das Ganze ist in der Betriebssystembeschreibung ausführlicher erklärt. Ebenfalls gibt es in mp 10/87 S. 311 ff. Erläuterungen zum Gerätetreiber-Handling des Z9001.

Hinweis: Die Robotron-Treiber umgehen den Mechanismus von ASGN und tragen sich selbst in die internen Gerätetreiberlisten ein; ein Robotron-Druckertreiber wird also ganz normal im OS geladen; NICHT mit ASGN.

für KRT wurden von mir CRT-Treiber entwickelt. Es gab keine Vorbilder wie bei den Druckertreibern.

:!: Schlechtes Vorbild!!!

Es wird nicht alles umgesetzt, so fehlt die Initialisierung und die Anzeige der Treibernamen etc.

Im Zusatzmonitor sind verschiedene Gerätetreiber enthalten. s. auch Artikel über 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<logisches Gerät>=<physisches Gerät> dient der Zuweisung eines 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, bei AL=V auf dem Bildschirm.

OS

;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
02C0 	SYSR: 	BER 40H 	;reserviert für Systemerweiterung

;Adreßtabelle der Gerätetreiber
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
;Zeichenkettenadreßtabelle
EFE9 	TXCON: 	DA PHYDV+2 	;Adresse einer Zeichenkette des aktuellen CONST-Gerätes,
				;Zeichenkette wird im ASGN-Kommando ausgegeben
EFEB 	TXRDR: 	DA PHYDV 	;
EFED 	TXPUN: 	DA PHYDV 	;entsprechend TXCON
EFEF 	TXLST: 	DA PHYDV 	;

3. Zusätzliche Treiber

Der Monitor des Z 9001 bietet dem Anwender über das ASGN-Kommando die Möglichkeit, den logischen Geräten jeweils 4 physische Geräte mit beliebigen Treiberroutinen zuzuweisen. Um die Zusammenarbeit mit allen anderen Systemkomponenten zu gewährleisten, sind dabei besondere Randbedingungen zu beachten.

Treibereingangsparameter:

  1. A Kommando (siehe 3.2.) (für CONST, READER, LIST)
  2. C Zeichen (bei Kommando AUSGABE)
  3. DE Adresse bei Cursorkommandos

Treiberausgangsparameter:

  1. A Zeichen (bei Kommando EINGABE)
  2. CY Fehlerstatus
  3. HL,DE Adresse bei Cursorkommandos

Hinweis:

Vordergrundregister müssen bei Eintritt in das Treiberprogramm nicht gerettet 
werden (erfolgt bereits im BOS)

3.1. Treiberinitialisierung

Die Initialisierung sollte grundsätzlich über das ASGN-Kommando erfolgen. Eine automatische Initialisierung über die Nutzung des Kommandos (siehe 2.1.2.) und Direktzugriff auf entsprechende Systemzellen ist zu vermeiden.

Der Aufruf der Initialisierung im ASGN-Kommando erfolgt in der gleichen Weise wie der Start eines Anwenderprogrammes. Dabei kann es sich sowohl um ein transientes Kommando, als auch um ein Programm auf Kassette handeln. Ladbare Treiberprogramme auf Kassette werden durch das ASGNKommando selbständig eingelesen und zur Initialisierung gestartet. Derartige Programme sind in der Initialisierung mittels geeigneter RELOCATING-Routinen an das Ende des logischen RAM-Bereiches zu verschieben. Notwendiger Arbeitsspeicher ist gleichfalls dort einzurichten. Nach dem Verschieben ist der Zeiger des logischen RAM-Endes EOR (36H) auf eine Adresse vor dem Treiberprogramm zu stellen. Für jede Treiberroutine eines physischen Gerätes stehen im System-RAM (ab 280H) 4 Bytes Speicher zur Verfügung.

Die Treiberinitialisierung muß der ASGN-Routine folgende Parameter übergeben:

  1. CY Fehlerstatus nach Initialisierung
  2. H logische Gerätenummer

0 CONST

	2 READER
	4 PUNCH
	6 LIST
- L physische Gerätenummer (0, 1 .... 3)
- BC Adresse der E/A-Routine
- DE Adresse einer Zeichenkette (wird nach der Zuweisung durch ASGN angezeigt)

Beispiel:

;PROM-Transientkommandoprogramm zur Initialisierung eines Druckers als TTY-Gerät
	JMP	INIT
	DB	"DRUCKER "
	DA	0
INIT:	LD	HL,(EOR)	;Adresse end of RAM (36H)
	LD	DE,RAME-RAMA	;benötigter Arbeitsspeicher
	SBC	HL,DE
	LD	(EOR),HL	;neue log. RAM-Ende
	INC	HL
	LD	(RTTYL),HL	;Zeiger auf Arbeitsspeicher (2B0H)
;Hardwareinitialisierung
	....
	LD	H,6		;log. Gerätenummer (LIST)
	LD	L,0		;phy. Gerätenummer (TTY)
	LD	BC,OUTZ		;Adresse der Zeichenausgabe
	LD	DE,TEXT
	OR	A		;kein Fehler
	RET
;
FEHL:	SCF			;Fehler
	RET
;
;Zeichenausgabe
OUTZ:	....
;
;RAM-Definitionen
RAMA:	....
	....
RAME:	EQU #

Hinweis:

  1. TTY-Treiber (L=0) können beliebigen logischen Geräten zugewiesen werden
  2. CRT-Treiber (L=1) können CONST und LIST zugewiesen werden
  3. alle anderen nur dem im H-Register angegebenen logischen Gerät (sonst

Fehlermeldung im ASGN-Kommando)

3.2. Besonderheiten der Treiber für CONST

An die Treiber der für CONST möglichen Geräte (TTY, CRT, BAT, UC) werden besondere Anforderungen gestellt, da sie Routinen zur Eingabe, Ausgabe, Statusabfrage und Cursorsteuerung beinhalten müssen. Dem Treiber wird die zu erfüllende Aufgabe durch spezielle Kommandocodes im A - Register übergeben.

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

Hinweis:

  1. werden verschiedene Kommandos durch den Anwender nicht benötigt, kann dafür

ein Sprung zum Fehlerausgang des Treibers programmiert werden

  1. korrespondierende System- und Direktrufe sind dann nicht mehr verwendbar

Beispiel:

;Eingangsverteiler für CRT-Treiber mit allen Funktionen
	INC	A
	JPZ	RESET	;lnitialisieren/Rücksetzen Gerät
	DEC	A
	JPZ	STAT	;Status
	DEC	A
	JPZ	EING	;Eingabe
	DEC	A
	JPZ	AUSG	;Ausgabe
	DEC	A
	JPZ	LCUR	;Löschen Cursor
	DEC	A
	JPZ	ACUR	;Anzeige Cursor
	DEC	A
	JPZ	ADRLC	;Abfrage log. und phy. Cursoradresse
	DEC	A
	JPZ	SLOGC	;Setzen Cursor auf log. Adresse
	DEC	A
	JPZ	ADRPC	;Abfrage phy. Cursoradresse
	DEC	A
	JPZ	SPHYC	;Setzen Cursor auf phy. Adresse
FEHL:	SCF		;unzulässiges Kommando
	RET		;Fehlerausgang

3.3. Besonderheiten der Treiber für READER und LIST

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.

  • z9001/software/os/geraetetreiber.1430141749.txt.gz
  • Zuletzt geändert: 2015/04/27 13:35
  • von volkerp