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