mp 10/87 S. 311 ff.

Für den Z9001 gibt es ein CP/M-ähnliches Verfahren für Gerätetreiber. Darüber gab es einen umfassenden Artikel, den ich hier (nebst reassemblierter Software) bereitstelle. Mir ist nur das hier vorgestellte Treiberpaket bekannt, welches den offiziellen Weg über das ASGN-Kommando (s.u.) zur Treibereinbindung nutzt. Andere Treiber, wie auch die Druckertreiber von Robotron, umgehen diesen Mechanismus und verankern sich direkt in den Systemzellen. (vp)

Im Megamodul und in der Mega-Flash-Software ist das hier beschriebene Paket als TR_SAMML (Treiber-Sammlung) enthalten.

Dr. Frank Schwarzenberg, Mikroprozessortechnik, 10/1987, S. 311-315, Datei z9001_interfaces.zip, Originalartikel mp87-10.pdf

Für Geräte der Leistungsklasse des KC 85/1, die bereits in der DDR eine große Verbreitung erfahren haben, werden i. a. keine peripheren Geräte mitgeliefert. Häufig besteht deshalb der Wunsch, bereits vorhandene Geräte wie Drucker, Lochbandleser und -stanzer, Teletypes, Fernschreiber o. ä. an den Kleincomputer anzuschließen. Von Robotron wird bisher nur der Anschluß spezieller Drucker (K6311, K6303) unterstützt. In dem Beitrag werden Möglichkeiten dargestellt, wie ohne spezielle Zusatzmodule und mit geringstem Hardwareaufwand in vielen Fällen ein Anschluß der o. g. Geräte durch Nutzen des User-Ports des KC85/1 realisier- bar ist. Die Problematik des Einbindens eigener Gerätetreiber in das Betriebssystem des KC 85/ 1 wird ausführlich erläutert. Die in dem Beitrag angeführten Programmbeispiele sind erprobt und ermöglichen u. a. das Betreiben solcher Drucker wie EPSON LX86 (V24/DTR-Protokoll) oder K6303 (TD40) am KC85/1 ohne Druckermodul.

Bild 1 zeigt den für den Anwender frei verfügbaren User-Port des KC 85/1. Er ist über eine 15polige EFS-Buchse an der rechten Seite des Gerätes dem Nutzer zugänglich und besteht aus einem PIO-Port und einem CTC-Kanal. Diese Peripherieschaltkreise sind über folgende E/A-Adressen ansprechbar:

PIO-Daten: 89H
PIO-Control: 8BH
CTC1: 81H

Bei der Nutzung dieser Schnittstelle müssen unbedingt die zulässigen Pegel und Lastbedingungen von PIO und CTC beachtet werden, da diese Anschlüsse im KC 85/1 nicht gegen Überlastung bzw. Zerstörung geschützt sind.

Aus Bild 1 geht hervor, daß dem Anwender am User-Port 8 freiprogrammierbare Leitungen und jeweils zwei Ein- und Ausgabeleitungen mit speziellem Verhalten zur Verfügung stehen. Diese Belegung erlaubt bei konsequenter Ausnutzung die Realisierung so gängiger Standard-Interfaces wie SIF-1000, V24(RS 232C) und CENTRONICS derart, daß viele Geräte mit diesen Schnittstellen direkt an den User-Port angeschlossen werden können. Die notwendigen Hardware-Arbeiten beschränken sich - wie die folgenden Beispiele zeigen - auf das Anfertigen eines Kabels und evtl. erforderliche Pegelanpassungen (V24). Es sei darauf hingewiesen, daß die Beschreibung der Standard-Interfaces nur soweit erfolgt, wie das für den konkreten Geräteanschluß notwendig ist, und somit keinen allgemeingültigen Charakter besitzt.

SIF-1000 ist ein in der DDR noch weit verbreitetes Standard-Interface. Lochbandleser und -stanzer (z. B. daro 1215) sowie ältere Druckertypen (z.B. SD 1156) sind mit diesem Interface ausgestattet. Bevor man ein derartiges Gerät anschließt, sind folgende gerätespezifischen Parameter zu prüfen:

  • Pegelverhältnisse (TTL, KME3 (12V), KME 20 etc.) und Lastbedingungen

Geräte mit TTL oder KME3-Pegel ermöglichen häufig, den direkten Anschluß an den User-Port. Bei KME3 genügt meist das „Klemmen“ der vom Gerät kommenden Signale über Dioden gegen +5 V. Die vom User-Port abgehenden TTL-Signale werden meist von den Geräten sicher erkannt. Dies sollte jedoch anhand der Gerätebeschreibungen im konkreten Fall überprüft werden.

  • Paritätsprüfung

Bei SIF-1000-Geräten wird das 8. Datenbit oft als Paritätsbit verwendet. Das hier angegebene Beispiel einer reinen Software-Realisierung des SIF-1000- Signalspiels nutzt das 8. PIO-Bit für die Erzeugung des RUF-Signales. Ein Paritätsbit kann somit nicht gebildet werden. Die meisten Geräte gestatten aber das Abschalten der Paritätsprüfung.

  • Nutzung der KOMmando- bzw. STATus-Signale

Die begrenzte Anzahl der Datenleitungen am User-Port gestattet nicht die Bildung der KOM- bzw. Auswertung der STAT-Signale des SIF-1000 ohne Zusatzhardware. In den meisten der hier interessierenden Anwendungsfälle kann auf die dynamische Nutzung dieser Leitungen verzichtet werden. Für die Datenübertragung müssen die Kommando-Signale normalerweise die folgende Belegung haben (sofern sie vom Gerät überhaupt ausgewertet werden):KOM-1: 1 KOM-2: 0 KOM-3: 0Diese Belegung kann - falls erforderlich - fest verdrahtet werden.

Über die max. 3 Statusleitungen werden u. U. bestimmte Gerätebedingungen wie Lochband- oder Papierende bzw. Gerätefehler gemeldet. Auf die Auswertung dieser Bedingungen kann unter Berücksichtigung der hier interessierenden Anwendung verzichtet werden. Bild 2 zeigt das für SIF-1000 typische Signalverhalten. Über die Begleitsignale *RUF* und *END* wird ein sog. vollständiges Hand-shake realisiert.

Bei Beachtung der genannten Einschränkungen kann der Anschluß eines SIF-1000- Gerätes an den User-Port mit folgender Signal-Zuordnung erfolgen:

User-Port SIF-1000-Gerät
PIO-0 /DAT-1
PIO-1 /DAT-2
PIO-2 /DAT-3
PIO-3 /DAT-4
PIO-4 /DAT-5
PIO-5 /DAT-6
PIO-6 /DAT-7
PIO-7 /RUF
CTC-CNT/TRG /END

Die PIO-Signale RDY und /STRB werden hier nicht verwendet, da sie das für RUF und END geforderte Signalverhalten ohne Zwischenschalten von Zusatzelektronik nicht realisieren.

Für die Auswertung des END-Signals wurde der Zähler-Eingang des CTC-Kanales benutzt. Damit sind die in Tafel 1 und 2 angeführten Routinen zur softwaremäßigen Realisierung des Geräteanschlusses ohne Interruptbetrieb ausführbar.

Die angegebenen Treiber bilden das in Bild 2 dargestellte Signalverhalten für die Signale /DAT-1 bis /DAT-7, /RUF und /END nach. Um ein „Klemmen“ des Systems bei nicht angeschlossenem Gerät oder anderen Fehlern zu verhindern, wurde eine Abfrage der STOP-Taste mit integriert, wodurch ein Zwangsaustritt aus den Routinen jederzeit möglich ist.

Die SIF-E-Routine wurde insofern verkürzt, als auf die Rückflanke des END-E- Signals nicht mehr gewartet wird. Das hat sich als vorteilhaft bei der Nutzung des Handlesers ZfK 4944-170/03 herausgestellt.

Tafel 1 Treiberroutine für SIF-1000-Ausgabe
-------------------------------------------
 
 
;==========================================================
;                                                         |
;  SIF-1000 Ein-/Ausgabe ueber User-Port                  |
;  -------------------------------------                  |
;  Voraussetzungen                                        |
;- RUF wird ueber PIO-Bit 7 gebildet ==> nur 7 Datenbits  |
;  und keine Paritaet moeglich!                           |
;- Die Flanken von END-A werden mit dem CTC-KANAL erfasst |
;- keine KOM-Ausgabe                                      |
;- keine STAT-Auswertung                                  |
;                                                         |
;==========================================================
;                                                         |
;  Ausgabe eines Zeichens an SIF-A                        |
;  -------------------------------                        |
;- Zeichen im C-Register                                  |
;- Return: Carry=1 ==> Stop-Taste	                  |
;                                                         |
;==========================================================
;
SIFA:	LD	A,47H		;DI,Zaehler,neg.Flanke,TC,RESET
	OUT 	(81H),A		;INIT CTC-1
	OUT 	(81H),A		;TC=47H (willkuerlich)
	LD 	A,0FH		;PIO1/B-BYTEAUSGABE
	OUT 	(8BH),A
	LD	A,C
	CPL			;Bei SIF-1000 Daten low active
	SET 	7,A		;ohne RUF-A
	OUT 	(89H),A		;Zeichen ausgeben
	NOP
	NOP			;Einschwingen lassen
	RES 	7,A		;RUF-A
	OUT	(89H),A		;Zeichen gueltig
C01:	CALL 	STPRQ		;STOP-Taste?
	JP	NC,C03		;nein
C04:	CPL	a
	OUT	(89H),A		;RUF-A zuruecknehmen
	RET
C03: 	IN	A,(81H)
	CP 	47H		;END-A?
	JR	Z,C01		;nein,warten
	LD	A,57H		;s.o.,aber pos. Flanke
	OUT 	(81H),A
	OUT	(81H),A		;TC=57H
	LD 	A,0FFH		;/RUF-A
	OUT	(89H),A
C02:	CALL 	STPRQ		;STOP-Taste?
	JR	C,C04		;ja
	IN	A,(81H)
	CP 	57H		;/END-A?
	JR 	Z,C02		;nein, warten
	OR	A
	RET
Tafel 2 Treiberroutine für SIF-1000-Eingabe
-------------------------------------------
 
 
;==========================================================
;                                                         |
;  Eingabe eines Zeichens von SIF-E                       |
;  --------------------------------                       |
;- Return: Zeichen in A                                   |
;- Carry=1 ==> STOP-Taste	                          |
;                                                         |
;==========================================================
;
SIFE:	LD 	A,47H		;Zaehler, neg.Flanke
	OUT 	(81H),A
	OUT 	(81H),A		;TC
	LD 	A,0CFH		;BIT-E/A
	OUT 	(80H),A
	LD 	A,7FH 		;nur Bit7 Ausgabe (RUF-E)
	OUT 	(8BH),A
	OUT 	(89H),A		;RUF-E ausgeben
CI1: 	CALL	STPRQ		;STOP-Taste?
	JR	C,C04		;ja, s.Tafel 1
	IN	A,(81H)
	CP	47H		;END-E?
	JR	Z,CI1		;NEIN
	IN 	A,(89H)		;DATEN
	CPL
	OUT	(89H),A		;/RUF-E
	AND	7FH
	RET
;
STPRQ:	CALL 	0FD33H
	EI
	SUB	03		;STOP-Taste?
	OR	A		;wegen CY
	RET	NZ		;nein
	LD	(25H),A		;loeschen
	SCF			;STOP-Taste anzeigen 
	RET
;
;User-Port-Belegung fuer SIF-1000-Anschluss
;
;		A	B	C
;	---------------------------
;	1 	0 	0	/END
;	2	/DAT1	/DAT2	/DAT3
;	3	/DAT4 	/DAT5 	/DATE
;	4	/DAT7 	/RUF	-
;	5	(+5V)--> +5V	-
;

Es wird eine stark abgerüstete, aber weit verbreitete Form dieser weltweit wohl am meisten genutzten

Geräteschnittstelle betrachtet. Detailliertere Informationen zu dem Standard können u. a. /2/ entnommen werden. Computer- Peripheriegeräte mit dieser Schnittstelle arbeiten in der Regel mit einem asynchronen Übertragungsprotokoll nach Bild 3. Dieses Übertragungsprotokoll erlaubt eine große Flexibilität bzgl. bestimmter Parameter:

  • Zahl der Datenbits pro Übertragungseinheit (meist 5..8) - Baudrate (Bit/s): übliche Werte sind 19200, *9600*, 4800, 2400, *1200*,… - keine, gerade oder ungerade Parität - 1, 1,5 oder 2 STOP-Bits

Peripherieschaltkreise wie der U880-SIO-Schaltkreis ermöglichen die Realisierung dieses Übertragungsprotokolls mit minimalem Aufwand. Sämtliche oben angeführten Parameter sind durch entsprechende Programmierung- des Schaltkreises einstellbar. Im allgemeinen sollte für den Aufbau einer seriellen Schnittstelle dieser Art ein solcher (oder ähnlicher) Schaltkreis Verwendung finden. Ein entsprechender Zusatzmodul für den KC 85/1 ist im ZfK Rossendorf entwickelt worden (IFFS und V24).

Wie nachfolgend gezeigt wird, ist in vielen Fällen aber auch ohne Zusatzmodul ein Anschluß solcher Geräte möglich, die mit der sog. DTR-Prozedur arbeiten können. Das bedeutet, daß die Daten zum Gerät seriell übertragen werden und zur Synchronisierung der Übertragungsgeschwindigkeit ein statisches Signal (DTR-Data Terminal Ready) vom Gerät geliefert wird. Der Hardware-Aufwand für den Geräteanschluß (Pegelanpassung) kann unter bestimmten Bedingungen minimal ausfallen (s. u.). Die in Tafel 4 gezeigte Routine übernimmt die serielle Ausgabe eines Bytes über den User-Port entspr. dem in Bild 3 dargestellten Protokoll bei folgenden möglichen Parametern:

  • 5 bis 8 Datenbits, ein eventuelles Paritätsbit ist als Datenbit an die Routine zu übergeben.
  • Folgende Baudraten sind einstellbar:
Baudrate Bitzeit/µs TC (Tafel 4)
19200 52 4
9600 104 12
4800 208 28
2400 416 60
1200 833 126
600 1666 255

Für die Berechnung der Befehlslaufzeiten wurde dabei eine Systemtakt-Frequenz von 2,5 MHz veranschlagt. Niedrigere Baudraten sind leicht durch Einfügen von Dummy-Befehlen in die Warteschleife WT1 (s.Tafel 4) zu erreichen.

  • Parität:

Das Paritätsbit wird der Routine als Datenbit übergeben. Die Anzahl der Datenbits (DN in Tafel 4) muß entsprechend definiert werden. Da nur max. 8 Datenbits von der Routine verarbeitet werden, können mit Parität max. sieben Datenbits gesendet werden.

Beispiel: 7 Datenbits und ungerade Parität

DN 	EQU 8 		;7+1
	.
	.
	LD A,C 		;ZEICHEN NACH A
	AND 7FH
	RES 7,C
	JP PO,UPAR 	;UNGERADE PARITAET
	SET 7,C
JPAR: 	CALL V24 	;AUFRUF DER ROUTINE NACH TAFEL 2
	.
	.

Ein Zwangsausgang über die STOP-Taste wurde wiederum vorgesehen.

Man beachte, daß die gezeigte Routine das unterste (d. h. physikalische) Übertragungsprotokoll realisiert. Druckerspezifische Anpassungen (Sonderzeichen, Steuerzeichen o. a.) sollten an dieser Stelle nicht erfolgen, sondern - sofern überhaupt erforderlich - von einem übergeordneten Treiberprogramm ausgeführt werden. Die dargestellte Routine ist allerdings direkt für den Betrieb eines TD40 (K6303) oder auch des EPSON LX86 (PC-1715-Variante) am KC 85/1 geeignet.

Den notwendigen Pegelanpassungen muß hier besondere Aufmerksamkeit gewidmet werden. Standardmäßig finden beim RS232C die Treiberschaltkreise 75150, 75188 o. ä. und die Empfängerschaltkreise 75154, 75189 o. ä. Verwendung. Damit ist eine normgerechte Pegelanpassung durchführbar, allerdings werden für die Treiberschaltkreise +/-12 V bzw. +/-9 V benötigt, die am User-Port leider nicht zur Verfügung stehen. Hier sollte im konkreten Fall geprüft werden, wie die Empfängerschaltkreise im Gerät beschaltet sind. Die angegebenen Typen gestatten

nämlich eine Verschiebung der Triggerschwelle. Bild 4 zeigt eine Beschaltung der Empfängerschaltkreise, die eine sichere Ansteuerung mit einem Signalpegel von 0 bzw. +5 V erlaubt (z. B. im LX86 und K6303 gegeben). Damit entfällt die Notwendigkeit einer negativen Spannung, und eine Pegelanpassung nach Bild 5 ist der gesamte Hardware-Aufwand für den Druckeranschluß. Die Kabellänge sollte dann allerdings 2 bis 3 m nicht überschreiten.

Tafel 4 Treiberroutine für V24/DTR
----------------------------------
 
 
;==========================================================
;                                                         |
; V24-Ausgabe ueber User-Port                             |
;                                                         |
;- DTR-Prozedur                                           |
;- Beispielprogremm fuer serielle Ausgabe ueber           |
;  einen PIO-Port                                         |
;- Einstellbare Parameter:                                |
;  . Anzahl der Datenbits: DN (max.8)                     |
;  . Baudrate: 19200,9600,4800,2400,1200,600              |
;    TC =          4   12   28   60  126 255              |
;                                                         |
;- Serielle Ausgabe ueber PIO-Bit 0                       |
;- Bereitschaftsabfrage (DTR) ueber PIO-Bit 7             |
;- Zeichen in C                                           |
;                                                         |
;==========================================================
;
DN	EQU 	8		;z.B. 8 Datenbits
TC	EQU 	12		;z.B. 9600 Baud
;
V24:	LD 	A,0CFH		;BIT-E/A
	OUT	(8BH),A
	LD 	A,80H		;nur Bit 7 Eing.
	OUT 	(8BH),A
LO0:	CALL 	STPRQ		;Stop-Taste
	JR 	NC,LO1		;nein
	LD	(15H),A		;LIST: abschalten
	RET
LO1:	IN 	A,(89H)
	ADD 	A,A		;Drucker bereit?
	JR	C,LO0		;nein, warten
LO3: 	LD 	A,C		;Zeichen nach A
;
;PARALLEL-SERIEN WANDLUNG UND AUSGABE
;
PSOUT:	LD 	E,TC		;Zeitkonstante
	LD 	B,DN+1		;1 Startbit, DN-Datenbit
	DI			;keine Unterbrechung zulassen
	OR	A		;CY=0
	RLA			;Start-Bit
LO4:	OUT	(89H),A		;Bit ausgeben
	CALL	WAIT		;eine Bit-Zeit warten
	RRA			;naechstes Bit
	DJNZ	LO4
	OR	1		;Stopbit
	OUT 	(89H),A
	EI			;Unterbrechung. wieder zulassen
WAIT:	PUSH	DE
WT1:	DEC	E
	JR	NZ,WT1
	POP	DE 
	RET
 
;
;	User-Port-Belegung V24-Ausgabe
;
;		A	B	C
;	---------------------------
;	1	0	0	-
;	2	TxD	-	-
;	3	-	-	-
;	4	-	DTR*	-
;	5	(+5V)	-	-
;
;	* DTR-Signal des Druckers

Das CENTRONICS-Interface ist eine bitparallele bidirektionale Datenschnittstelle, die insbesondere als Druckerinterface z. Z. weltweit starke Verbreitung findet. Alle modernen Drucker für Heim- und Personalcomputer bieten in der Regel auch eine Ausrüstungsvariante für diese Schnittstelle.

Bild 6 zeigt das Signalverhalten. Da die Pegel TTL-Pegel sind, eignet sich dieses Interface besonders gut für den Betrieb am User-Port des KC 85/1. Bestimmte Einschränkungen müssen allerdings wegen der begrenzten Zahl der Datenleitungen wieder getroffen werden. Will man gänzlich ohne Zusatzhardware auskommen, so bietet sich eine Zuordnung der Signale des User-Ports zu den CENTRONICS-Signalen in folgender Form an:

User-Port CENTRONICS-Druckerschnittstelle
PIO-0 DATA-1
PIO-1 DATA-2
PI0-2 DATA-3
P10-3 DATA-4
P10-4 DATA-5
P10-5 DATA-6
P10-6 DATA-7
P10-7 /STROBE
CTC-CNT/TRG /ACK

Es ist zu erkennen, daß bei dieser Zuordnung das PIO-Bit 7 für die Erzeugung des CENTRONICS-/STROBE-Signals verwendet wird und somit nur 7 Datenbit übertragen werden können. Die meisten modernen Matrix-Drucker ermöglichen auch bei 7 Datenbits alle verfügbaren Druckmodi (einschließlich Grafik). Bei geschickter Ausnutzung des Signalverhaltens der RDY-/STRB-Leitungen kann das RDY-Signal auch als CENTRONICS-/STROBE-Signal verwendet werden. Die damit erreichbare Länge des /STROBE-Signals liegt dabei aber immer unter dem normalerweise erforderlichen Wert von mindestens 1 µs. Bei einigen Druckern funktioniert das zuverlässig (Schneider NLQ 401, Seikosha GP100), andere Drucker haben damit Probleme (K6313). Die oben angeführte Zuordnung sichert das Standard-Signalverhalten und ist ohne jede Zusatzhardware einsetzbar.

Auf eine Auswertung der Papierendemeldung vom Drucker (PE) muß aus den genannten Gründen auch hier verzichtet werden.

Tafel 3 zeigt die entsprechende Treiberroutine für den Anschluß eines CENTRONICS-Druckers an den User-Port des KC 85/1.

Tafel 3 Treiberroutine für CENTRONICS-Drucker
---------------------------------------------
 
 
;==========================================================
;                                                         |
; CENTRONICS-Druckerschnittstelle ueber User-Port         |
;                                                         |
;- 7 Datenbits verfuegbar                                 |
;- PIO-Bit7 wird zur Bildung des CBNTRONICS-/STROBE-      |
;  Signals verwendet.                                     |
;- /ACKNLG vom Drucker wird ueber den CTC-Kanal erfasst.  |
;                                                         |
;- Zeichen in Reg. C                                      |
;- Return: Carry=1 bei Stop-Taste                         |
;                                                         |
;==========================================================
;
CENTR: 	LD 	A,0CFH
	OUT 	(8BH),A		;Bit-Mode
	OR	A		;alles Ausgabe
	OUT 	(8BH),A
	LD	A,57H		;Zaehler,pos. Planke
	OUT	(81H),A
	OUT	(81H),A		;INIT CTC-1
	LD	A,C
	LD 	B,80H
	OR 	B		;/STROBE=HIGH
	OUT 	(89H),A		;Zeichen ohne Strobe
	XOR 	B		;/STROBE=LOW
	OUT 	(89H),A		;Daten gueltig
	OR	B		;/STROBE=HIGH
	OUT 	(89H),A
CNTR1: 	CALL 	STPRQ		;STOP-Taste?
	RET C
	IN	A,(81H)
	CP 	57H		;/ACKNLG?
	JR	Z,CNTR1		;nein, warten
	XOR A
	RET
;
;
;
;
;
;User-Port-Belegung fuer CENTRONICS-Anschluss
;
;		A	B	C
;	---------------------------
;	1 	0 	0	/ACC
;	2	DAT1	DAT2	DAT3
;	3	DAT4	DAT5	DAT6
;	4	DAT7 	/STROBE	-
;	5	(+5V)==> +5V	-

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.

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

Tafel 5 I/O-Byte und Zuordnungstabelle im OS-KC85/1

        \ phys.Ger.
log.Ger.|   0   |   1   |   2   |   3   |               Bit
--------|-------|-------|-------|-------|       ------
        | EFC9  | EFCB  | EFCD  | EFCF  |       |    |  0
CONST:  |       |       |       |       | <==   |0..3|
        | (TTY) | (CRT) | (BAT) | (UC)  |       |    |  1
--------|-------|-------|-------|-------|       |----|
        | EFD1  | EFD3  | EFD5  | EFD7  |       |    |  2
READER: |       |       |       |       | <==   |0..3|
        | (TTY) | (RDR) | (UR1) | (UR2) |       |    |  3
--------|-------|-------|-------|-------|       |----|
        | EFD9  | EFDB  | EFDD  | BFDF  |       |    |  4
PUNCH:  |       |       |       |       | <==   |0..3|
        | (TTY) | (PUN) | (UP1) | (UP2) |       |    |  5
--------|-------|-------|-------|-------|       |----|
        | EFE1  | EFE3  | EFE5  | EFE7  |       |    |  6
LIST:   |       |       |       |       | <==   |0..3|
        | (TTY) | (CRT) | (LST) | (UL1) |       |    |  7
-----------------------------------------       ------

Adresstabelle der physischen Treiberroutinen    I/O-Byte (HS-Adr.4)

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.

Tafel 6 Einbinden eines Druckertreibers in das OS-KC85/1
 
	Beispiel fuer das Einbinden einer Druckertreiberroutine
	=======================================================
 
	ORG	hh00H		;Low-Byte = 0!!
	jp	ILX86		;Init-Routine
STR:	defb	'LX86    '	;Name=LX86
	defw	0		;Ende-Kennzeichen
ILX86: 	ld	a,0cfh		;Port
	out	(8BH),a		;initialisieren
	ld	a,80H		;nur Bit 7 Eingabe
	out	(8BH),a
	.
	.			;hier evtl. 
	.			;Druckerinitialisierung 
	.			;etc. durchfuehren
	ld	hl,6*256+2	;LIST:, phys.Ger.2
;				 phys.Ger. 0 nicht sinnvoll, 
;				 da ASGN CONST:=LX86 moeglich 
;				 waere!
	ld	bc,V24		;Treiber nach Tafel 4
	ld	de,STR		;Adr. des symb. Namens
;	
;	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)
	or	a		;CY=0, wenn kein Fehler 
	ret
;
V24:	inc	a		;Drucker-Initialisierung?
	ret	z		;z.B. ignorieren
	dec	a		;Drucker-Status?
	jr	nz,lo0		;nein
	in	A,(89H)		;Status
	or	7FH		;z.B. so
	cpl			;zurueckgeben 
	ret
lo0:	weiter s. Tafel 4
	.
	.
	.

(VP: s. Datei z9001_interfaces.zip). Ein Anschauen des reassemblierten Quellcodes lohnt sich! Dr. Schwarzenberg hat - wie auch im ZM - außerordentlich intensiv das Z9001-OS einbezogen!

Tafel 7 zeigt den HEX-Dump eines kompletten Treiberpakets, das u. a. die vorgestellten Treiber enthält.

Tafel 7 HEX-Dump des Treiberpakets

0300h: C3 51 03 53 49 46 45 20 20 20 20 00 C3 5B 03 53 ; ÃQ.SIFE    .Ã[.S
0310h: 49 46 41 20 20 20 20 00 C3 64 03 43 45 4E 54 52 ; IFA    .Ãd.CENTR
0320h: 20 20 20 00 C3 6D 03 4C 58 38 36 20 20 20 20 00 ;    .Ãm.LX86    .
0330h: C3 74 03 54 44 34 30 20 20 20 20 00 C3 49 03 42 ; Ãt.TD40    .ÃI.B
0340h: 45 45 50 20 20 20 20 00 00 01 59 04 21 03 00 18 ; EEP    ...Y.!...
0350h: 44 01 3E 04 21 02 02 16 7F 18 2E 01 06 04 2E 03 ; D.>.!..........
0360h: 16 00 18 1C 01 DC 03 2E 01 16 00 18 13 01 A8 03 ; .....Ü........¨.
0370h: 3E 0C 18 05 01 A8 03 3E 7E 32 C3 03 2E 02 16 FE ; >....¨.>~2Ã....þ
0380h: 3A 33 00 67 D6 04 3E 01 D8 3E CF D3 8B 7A D3 8B ; :3.gÖ.>.Ø>ÏÓ‹zÓ‹
0390h: 2F D3 89 16 03 B7 E3 23 23 E3 C9 CD 33 FD FB D6 ; /Ó‰..·ã##ãÉÍ3ýûÖ
03a0h: 03 B7 C0 32 25 00 37 C9 3C C8 3D 20 06 DB 89 F6 ; .·À2%.7É<È= .Û‰ö
03b0h: 7F 2F C9 CD 9B 03 30 04 32 15 00 C9 DB 89 87 38 ; /ÉÍ›.0.2..ÉÛ‰‡8
03c0h: F2 79 1E 7E 06 09 F3 B7 17 D3 89 CD D6 03 1F 10 ; òy.~..ó·.Ó‰ÍÖ...
03d0h: F8 F6 01 D3 89 FB D5 1D 20 FD D1 C9 3C C8 3D 2F ; øö.Ó‰ûÕ. ýÑÉ<È=/
03e0h: C8 3E 57 D3 81 D3 81 79 F6 80 FE FF 20 02 00 00 ; È>WӁӁyö€þÿ ...
03f0h: D3 89 E6 7F D3 89 F6 80 D3 89 CD 9B 03 D8 DB 81 ; Ó‰æÓ‰ö€Ó‰Í›.Øہ
0400h: FE 57 28 F6 AF C9 3E 47 D3 81 D3 81 79 2F CB FF ; þW(ö¯É>GӁӁy/Ëÿ
0410h: D3 89 00 00 CB BF D3 89 CD 9B 03 30 04 2F D3 89 ; Ӊ..˿Ӊ͛.0./Ӊ
0420h: C9 DB 81 FE 47 28 F1 3E 57 D3 81 D3 81 3E FF D3 ; ÉہþG(ñ>WӁӁ>ÿÓ
0430h: 89 CD 9B 03 38 E7 DB 81 FE 57 28 F5 B7 C9 3E 47 ; ‰Í›.8çہþW(õ·É>G
0440h: D3 81 D3 81 D3 89 CD 9B 03 38 D2 DB 81 FE 47 28 ; ӁӁӉ͛.8ÒہþG(
0450h: F5 DB 89 2F D3 89 E6 7F C9 CD F1 F8 F5 3A 2F 00 ; õÛ‰/Ó‰æÉÍñøõ:/.
0460h: 3D CC 66 04 F1 C9 C5 06 00 0E 14 3E 07 D3 80 3E ; =Ìf.ñÉÅ....>.Ó€>
0470h: 96 D3 80 DB 88 CB FF D3 88 10 FE 0D 20 FB CB BF ; –Ó€ÛˆËÿÓˆ.þ. ûË¿
0480h: D3 88 3E 03 D3 80 C1 C9 0E 09 11 03 05 CD 05 00 ; Óˆ>.Ó€ÁÉ.....Í..
0490h: 2A 36 00 01 88 01 B7 ED 42 2E 00 E5 2B 22 36 00 ; *6..ˆ.·íB..å+"6.
04a0h: C5 E5 06 10 11 00 00 4B 29 7B 8B 27 5F 7A 8A 27 ; Åå.....K){‹'_zŠ'
04b0h: 57 79 89 4F 10 F2 79 B7 EB 28 03 CD F0 04 CD EB ; Wy‰O.òy·ë(.Íð.Íë
04c0h: 04 11 1D 05 0E 09 CD 05 00 E1 C1 23 EB 21 00 03 ; ......Í..áÁ#ë!..
04d0h: ED B0 E1 DD 21 20 05 16 03 5C 06 00 DD 4E 00 0C ; í°áÝ! ...\..ÝN..
04e0h: 0D C8 09 7E 92 83 77 DD 23 18 F1 7C CD F0 04 7D ; .È.~’ƒwÝ#.ñ|Íð.}
04f0h: F5 0F 0F 0F 0F CD F9 04 F1 E6 0F C6 30 0E 02 5F ; õ....Íù.ñæ.Æ0.._
0500h: C3 05 00 0D 0A 54 6F 70 20 6F 66 20 52 41 4D 20 ; Ã....Top of RAM 
0510h: 6E 6F 77 20 28 64 65 63 2E 29 3A 20 00 0D 0A 00 ; now (dec.): ....
0520h: 02 0C 0C 0C 0C 0C 0D 08 0A 09 09 07 05 19 21 18 ; ..............!.
0530h: 2F 1E 19 15 1B 00 00 00                         ; /.......

Das Programm wird normal (nicht mit ASGN) geladen. Es enthält einen Mechanismus, der das eigentliche Treiberpaket an das aktuelle RAM-Ende verschiebt und eine entsprechende Adreßmodifikation vornimmt. Das Programm ist damit für jede RAM-Konfiguration geeignet und muß nicht speziell angepaßt werden. Die aktuelle obere Speichergrenze wird für BASIC-Anwender dezimal ausgegeben. Dieser Wert sollte nach Start des BASIC-Interpreters als obere Grenze eingegeben werden, um das Treiberpaket vor Überschreiben zu schützen.

Die gewünschten Treiber müssen vorher mit ASGN-Anweisung aktiviert werden. Dabei sind die folgenden Zuordnungen möglich:

 
 		physische Gerätenummer 
 log. Gerät	0	1	2	3
 --------------------------------------------
 CONST:  (0)	-	(CRT) 	(BAT) 	BEEP
 READER: (2) 	-	-	SIFE	-
 PUNCH:  (4)	-	CENTR 	LX86 	SIFA 
 				TD40	
 LIST:	  (6)	-	CENTR 	LX86 	SIFA 
 				TD40	

BEEP: Erzeugt einen „sauberen“ (im Gegensatz zu CTRL/Q) Tastatur-Quittungston, der die Eingabesicherheit der Tastatur verbessert.
SIFE: SIF1000-Eingabe, 7 Datenbits parallel
SIFA: SIF1000-Ausgabe, 7 Datenbits parallel
CENTR: 7-Bit-CENTRONICS-Druckerinterface
TD40: V24/DTR, 8 Bit, keine Parität, 1200 Baud
LX86: V24/DTR, 8 Bit, keine Parität, 9600 Baud

Das Programm kann z.B. mit dem von Robotron vertriebenen Zusatzmonitor ZM eingegeben werden (S-Kommando). Mit dem P(unch)-Kommando kann es dann (nach vorheriger Zuweisung AR=T) auf Band gebracht werden:
P300,537,488.

Man beachte die Startadresse (488H).

Der erwähnte Zusatzmonitor enthält bereits einige der hier vorgestellten Treiberroutinen (SIFA/E, TD40, BEEP). Zu beachten ist, daß es bei den Treibern SIFA und TD40 des ZM u.U. Probleme mit der CTRL/P-Funktion (Hardcopy) geben kann (1. Version des ZM und Version 1.2 d es OS-KC85/1). Deshalb sei an dieser Stelle auf die erforderlichen Korrekturen für eine saubere Arbeitsweise der ZM-Treiber hingewiesen:

Treiber relative Adresse Befehl alt HEX Befehl neu HEX
SIFA 0062H ld a,e 7B ld a,c 79H
TD40 00C3H res 7,e CB BB res 7,c CB B9
00E0H sub e 93 sub c 91
00E8H cp e BB cp c B9
00FCH ld a,e 7B ld a,c 79
0102H ld c,154 0E 9A ld e,154 1E 9A
0117H ld b,c 41 ld b,e 43

Der ZM nutzt nicht die ASGN-Anweisung. Mit RESET oder POWER ON wird die Zuordnungstabelle (Tafel 5) mit den entsprechenden Adressen geladen, da alle Treiber resident sind. Die Auswahl der ZM-Treiber muß deshalb mit dem ZM-Kommando A(ssign) erfolgen (Stellen des I/O-Bytes).

/1/ Mikroprozessorsystem der 2. Leistungsklasse, Beschreibungen der Bausteine CPU 880, PIO, SIO, CTC und DMA. VEB Mikroelektronik „Karl Marx“ Erfurt
/2/ Wilhelm, C.: Datenübertragung. Berlin: Militärverlag der DDR, 1976
/3/ Schwarzenberg, F.; Wobst, R.: Anschluß der Schreibmaschine S6005 an KC85/1: Mikroprozessortechnik, Berlin 1 (1987)10, S. 315
/4/ Dokumentation des Betriebssystems OS- KC85/1, VEB Robotron Vertrieb Berlin

s.a. z9001_interfaces.zip

  • Bild 1 User-Port des KC-85/1
  • Bild 2 Signalverhalten beim SIF-1000-Interface
  • Bild 3 V24 - asynchrones Übertragungsprotokoll
  • Bild 4 V24 - Treiber und Empfängerschaltkreise im „failsafe“ Mode
  • Bild 5 Pegelanpassung User-Port &lt;→ V24 bei Beschaltung der Empfänger nach Bild 4
  • Bild 6 CENTRONICS-Signalverhalten
  • Tafel 1 Treiberroutine für SIF-1000-Ausgabe
  • Tafel 2 Treiberroutine für SIF-1000-Eingabe
  • Tafel 3 Treiberroutine für CENTRONICS-Drucker
  • Tafel 4 Treiberroutine für V24/DTR Tafel 5 I/O-Byte und Zuordnungstabelle im OS-KC85/1
  • Tafel 6 Einbinden eines Druckertreibers in das OS-KC85/1
  • Tafel 7 HEX-Dump des Treiberpakets

Dr.-Ing. Frank Schwarzenberg studierte von 1970 bis 1974 an der TU Dresden in der Fachrichtung Informationstechnik. Von 1970 bis 1974 absolvierte er am VIK Dubne einen Arbeitsaufenthalt. 1980 erfolgte die Promotion zum Thema Rechnerkopplung zur Erfassung kernphysikalischer Experimentdaten. Seit 1982 ist unser Autor am ZfK Rossendorf tätig. Sein Arbeitsgebiet ist die Hard- und Softwareentwicklung für Klein- und Mikrorechentechnik (8-/16-Bit-Systeme).

  • z9001/literatur/treiber.txt
  • Zuletzt geändert: 2020/03/31 14:50
  • von volkerp