Kopplung des Rechners KC87
an den Parallelport eines PCs über das PIO-Interface



Vorbemerkung:   Der mitgelieferte HTML-Text wurde an die Form der hier angebotenen Webseiten angepaßt.



0. Gliederung

1. Das Anliegen der Kopplung
2. PIO-Interface am KC87 , Pinbelegung des Steckverbinders , Betriebsmodi, Programmierung
3. Parallelport des PC , Pinbelegung des Steckverbinders , Programmierung des Parallelports
4. Kabelverdrahtung am Parallelport-Stecker
5. Inbetriebnahme, Test der Kopplung
6. PC- Grundprogramme zur Kommunikation mit dem KC87
7. Festlegung der Kommunikation zwischen KC87 und PC als Server
8. Das KC87-Programm zur Kommunikation mit dem PC als Server
9. Erweiterungsmöglichkeiten


1. Das Anliegen der Kopplung

Die Rechner der KC-Typen sind bei Sammlern beliebt und begehrt.
Hier ist die Kopplung eines KC87 mit einem PC über das verfügbare parallele Z80-PIO-Interface beschrieben.
Wer keine zugehörige Peripherie der damaligen Kategorie besitzt oder wenig damit arbeiten möchte/kann, kann mit einem Kabel einen PC anschließen und damit einen Fileserver usw. damit realisieren.
Mit einem KC87 kann man vom/zum PC Programme und Daten übertragen und Dateien anlegen/übertragen.

2. PIO-Interface am KC87

Das Manual dazu liegt hier.

Pinbelegung des Steckverbinders lt. Bedienungsanleitung...,Anhang 2 :
( - bedeutet: Signal hier nicht benutzt. )

Kontakt Reihe A Reihe B Reihe C
1 00 , Masse 00 , Masse -
2 B0 B1 B2
3 B3 B4 B5
4 B6 B7 BRDY
5 5P , +5V BSTB -


Betriebsmodi, Programmierung
Mit den verfügbaren Signalen sind Byteeingabe, Byteausgabe und Bit-Operationen möglich.

Die Auswahl des Modus für die Kopplung ist durch folgende Prämissen geprägt:
  a.) Die Bedienschritte nach dem Einschalten des KC87 sollen minimal sein, im einfachsten Fall steht kein Magnetbandgerät zur Verfügung.
  b.) Die Befehlsabfolge zur Kommunikation soll minimal sein.
  c.) Keine Bedienerhandlungen am PC
  d.) Die Kommunikation muß kollisionsfrei erfolgen.
Zeitaufwand spielt hier bei der Kommunikation bewußt keine Rolle.

Variante 1 (hier im folgenden beschrieben) :
Es werden für die Kopplung sowohl der Betriebsmodus Byteausgabe als auch der Betriebsmodus Byteeingabe benutzt.
Vorteil: Es lassen sich a.) und b.) einigermassen einrichten.
Folgende Nachteile des KC-Userinterface sind hier zu beachten und betreffen c.) und d.) :
 - Es steht kein Reset-Signal für den PC zur Verfügung.
 - Es steht kein Signal für die Daten-Richtung für den PC zur Verfügung

Variante 2 (wird extra später getestet) :
Für die Kopplung wird der Bit-Modus benutzt.
Vorteil: Es läßt sich ein vollkommener Handshake-Betrieb mit Richtungs-Signal und Reset-Signal realisieren, betrifft c.) und d.)
Nachteil: Serialisierung der Daten, damit hoher KC-Programmaufwand bzw. viele Anfangs-Bedienschritte, betrifft a.) und b.)

Es wird im weiteren nur die Variante 1 ausgeführt.

Im einfachsten Fall wird die PIO für unsere Zwecke mit BASIC-Befehlen angesprochen. Diese sind:
Bedeutung:
x   Ausdruck mit dem Wert 0...255 
  Byte-Ausgabe Byte-Eingabe
Betriebsmodus einstellen OUT 139, 15 OUT 139, 79
laufende Operation OUT 137, x INP(137)


3. Parallelport des PCs

Am PC wird der Parallelport, an dem sonst ein Drucker angeschlossen ist, im "bidirektionalen" Betrieb benutzt.
Dazu muß im PC-Setup-Programm beim Menüpunkt des Parallelinterfaces der Betriebsmodus "EPP" eingestellt sein.

Pinbelegung des PC-Steckverbinders
Es werden im folgenden die Pins der 25-poligen Buchse des Parallelports und des 25-poligen Steckers am Kabel mit P1 , P2 , P3 ...... bis P25 bezeichnet. Die sonst üblicherweise angegeben Namen für den Druckeranschluß werden nicht verwendet, weil diese für diesen Fall keine Bedeutungen haben.

Programmierung des Parallelports
Die Programmierung des PC-Parallelports ist in vielen Fallen im Internet und Büchern beschrieben, leider manchmal etwas diffus und ungenau, weshalb hier eine Zusammenfassung für unseren Fall vorgenommen wird.
Es wird der Fall des 1. Parallelports im PC angenommen.
Die Programmierung geschieht über folgende Ports/IO-Adressen:
378H Datenbyte bidirektional Eingabe und Ausgabe
379H Status-Bits Eingang in den PC
37AH Steuer-(/Control-) Bits Ausgang aus dem PC

Die Zuordnung der Bits dieser Register zu den Pins am Steckverbinder ist für diese Kopplung wie folgt festgelegt, wobei bedeutet:
    Pnn  eine 1 entspricht High-Pegel ,
            eine 0 entspricht Low-Pegel am Steckverbinder.
   /Pnn  eine 1 entspricht Low -Pegel ,
            eine 0 entspricht High-Pegel am Steckverbinder, d.h. hier ist ein Negator auf dem Mainboard/der Interfacekarte dazwischengeschaltet.
    x      Das Bit darf nicht verändert werden .
    y      Das Bit wird/kann programmiert (werden), Es gibt dazu keinen Kabelanschluß.
    -       Wird hier nicht benutzt.

Die hier angegebenen Signalnamen sind der Kopplung PC-KC87 entsprechend festgelegt und entsprechen den Signalnamen des PIO-Interfaces.
Port 378H:
Bit 7 6 5 4 3 2 1 0
Pin-Zuordnung P9 P8 P7 P6 P5 P4 P3 P2
Bedeutung B7 B6 B5 B4 B3 B2 B1 B0
Bedeutung:
Bit0 bis Bit7 = B0 bis B7 sind die Datenbits des PIO-Interfaces.


Port 379H:
Bit 7 6 5 4 3 2 1 0
Pin-Zuordnung /P11 P10 P12 P13 P15 x x
x
Bedeutung - BRDY - - - x x x

Bedeutung:
Bit6 teilt vom KC87 folgendes mit:
Bei Ausgabe aus dem KC87:
       Bit6 = 1 entspricht BRDY = high, die Datenbits sind gültig
       Bit6 = 0 entspricht BRDY = low , Grundzustand
Bei Eingabe in den KC87:
       Bit6 = 1 entspricht BRDY = high, d.h. der PC soll die Datenbits belegen
       Bit6 = 0 entspricht BRDY = low , Grundzustand


Port 37AH:
Bit 7 6 5 4 3 2 1 0
Pin-Zuordnung x x y y /P17 P16 /P14 /P1
Bedeutung - - BIDI - - - /BSTB -
Bedeutung:
       Bit5 = BIDI legt PC-seitig die Richtung des Datentransportes für das Register 378H fest. Es gilt:
       Bit5 = BIDI = 0 Ausgabe aus dem PC zum KC87, es kann auf 378H geschrieben werden
       Bit5 = BIDI = 1 Eingabe in den PC vom KC87,      es kann von 378H gelesen werden

Bit1 teilt dem KC87 folgendes mit:
Bei Eingabe in den PC
       Bit1 = 0 liefert dem KC87 BSTB = high, Grundzustand bei Eingabe in den PC
       Bit1 = 1 liefert dem KC87 BSTB = low , die Daten wurden gerade übernommen
Bei Ausgabe aus dem PC
       Bit1 = 0 liefert dem KC87 BSTB = high, Grundzustand bei Ausgabe aus dem PC
       Bit1 = 1 liefert dem KC87 BSTB = low , die Datenbits sind gültig


4. Kabelverdrahtung am Parallelport-Stecker

Entsprechend obiger Festlegungen ist das Kabel wie folgt zu beschalten:
PIN am PC-Stecker Farbe der Leitung
(als Beispiel)
PIO-Signalname Pin am KC87-Stecker
(hängt davon ab, ob der originale Steckverbinder
genommen werden kann oder nicht!!!)
2 rot B0
3 orange B1
4 gelb B2
5 grün B3
6 blau B4
7 lila B5
8 grau B6
9 schwarz B7
10 rosa BRDY
14 weiß BSTB
18 bis 24 und 25
(alle Pins 18 bis 24 auch überbrückt)
braun GND
(s. Anmerkung a) blaugrün +5V
Anmerkung a:
Diese +5V könnten an einen der freien Eingänge des Parallelports so geschaltet werden, daß der PC testen kann, ob der KC87 eingeschaltet ist.
Hinzu kommt, daß dem PC kein RESET-Signal des KC87 zur Verfügung steht. Es bestünde zumindest mit Nutzung der +5V die Möglichkeit, durch Aus- und Einschalten des KC87 das PC-Serverprogramm, das i.A. ohne PC-Bedienerhandlungen arbeiten soll, zu synchronisieren.



5. Inbetriebnahme, Test der Kopplung

Es ist generell darauf zu achten, daß die Eingabe-/Ausgabe-Operationen beider Partner genau aufeinander abgestimmt erfolgen müssen, nie sollten beide eine Ausgabe gleichzeitig betreiben.
(Bemerkung: Bevor man das Verbindungskabel herstellt, kann man mit 4 Leitungen wenigstens ein Daten-Bit zum Test verwenden.)

Die Inbetriebnahme der Kopplung und der Funktionstest geschieht mit möglichst einfachen Mitteln, z.B. unter MS-DOS mit dem Low-Level-Debugger DEBUG.EXE. Aufgrund der Handshake-Methode kann man 'statisch' arbeiten und sich bei der Eingabe der Kommandos sehr viel Zeit lassen.
Man startet am PC das Programm mit
        DEBUG
Eine Übersicht der Kommandos erhält man durch Eingabe von DEBUG ?. Es werden nur die Kommandos 'I' und 'O' benötigt.

Im Internet ist mehrfach das Manual zur Z80-PIO-Programmierung zu bekommen.
Für die Durchführung des Handshakeverfahrens sollte man die Diagramme im Manual verwenden.
Am KC87 ist der Datenport über die Adresse 137 (89H) und der Steuerport über die Adresse 139 (8BH) zu erreichen.


5.1. Test der Übertragung vom KC87 zum PC

Am PC kontrolliert man das Bit BIDI , ob es auf 'Eingabe' gestellt ist:
        I 37A                                
(Bemerkung: Achtung , DEBUG erwartet Hexzahlen ohne das angehängte 'H', siehe "Steuerung des Parallelports" unter 3.)

In der ausgegebenen Zahl muß das Bit5 gesetzt sein. Sollte dies nicht der Fall sein, muß die ausgegebene Zahl um das Bit5 ergänzt (xxx) wieder ausgegeben werden (danach kontrollieren!):
        O 37A xxx
Nun wird dem KC87 durch den PC über Port 37AH das Signal BSTB=high, entspricht Bit1=0 als Grundzustand mitgeteilt.
Am KC87 muß zuerst Port B für die Ausgabe zugelassen werden, weil nach dem Einschalten dieser auf Eingabe eingestellt ist. Man gibt durch direkte Tastatureingabe am KC87 das folgende Kommando ein:
        OUT 139, 15
Man prüfe am PC, ob der Grundzustand von BRDY=low , also Bit6=0 ist, durch das Kommando
        I 379
Jetzt, wenn dies stimmt, kann man am KC87 ein Zeichen z.B. 'A' ausgeben, durch das Kommando:
        OUT 137,41
Nun prüft man am PC, ob das Signal BRDY=high ist, das ist in Port 379H, Bit6=1 :
Man gibt am PC das folgende Kommando ein:
        I 379
Wenn in der ausgegebenen Zahl zu sehen ist, daß Bit6=1 ist, kann man das Datenbyte am PC einlesen:
        I 378
Die angezeigte Zahl muß:
        41
lauten, der Hex-Code für das Zeichen 'A' .
Die Übernahme des Zeichens bestätigt man am PC durch BSTB=low, das ist Port 37AH, Bit1=1. Nun prüft man (ggf. wiederholt, kommt aber praktisch im Handbetrieb nicht vor) am PC, ob der KC87 das Signal BRDY=low gesetzt hat, das ist in Port 379H, Bit6=0.
Ist dies der Fall, so setzt man am PC das Signal BSTB=high, das ist Port 37AH, Bit1=0. Damit ist der volle Handshake-Zyklus abgeschlossen.


5.2. Test der Übertragung vom PC zum KC87

Zuerst ist der KC-PIO-Port auf Eingabe zu stellen:
        OUT 139, 79
Am PC kontrolliert man das Bit BIDI , ob es auf 'Ausgabe' gestellt und gleichzeitig das Signal BSTB=high eingestellt ist:
        I 37A
In der ausgegebenen Zahl muß das Bit5=0 und das Bit1=0 sein. Sollte dies nicht der Fall sein, muß die ausgegebene Zahl ggf. um das Bit5=0 und Bit1=0 geändert (xxx) wieder ausgegeben werden (danach kontrollieren!):
        O 37A xxx

Nun wird der KC87 auf die Eingabe eines Zeichens durch folgendes Kommando eingestellt:
        X=INP(137)
Am PC muß nun geprüft werden, ob das Signal BRDY=high gestellt wurde, das ist Port 379H, Bit6=1. Ist dies der Fall, kann man am PC eine Zahl, z.B. 42 ( hexadezimaler Code für das Zeichen 'B') ausgeben:
        O 378 42
Die Gültigkeit des Datenbytes wird dem KC87 durch BSTB=low, Port 37A, Bit1=1 angezeigt. Anschließend muß vom PC wieder das Signal BSTB=high also Port 37A, Bit1=0 gesetzt werden ( Zeitdifferenz im Programm noch feststellen!).
Der KC87 hat das Byte eingelesen, wenn BRDY=low, Port 379H, Bit6=0 gesetzt wurde. Damit ist der volle Handshake-Zyklus abgeschlossen.
Nun kann man sich am KC87 anzeigen lassen, was eingelesen wurde:
        PRINT X
Auf dem Bildschirm muß die Zahl
        66       (Code für B)
erscheinen.


6. PC-Grundprogramme zur Kommunikation mit dem KC87

Die Realisierung der Kommunikation wird durch Programmierung auf der Basis des Betriebssystems Linux durchgeführt. Für MSDOS kann man die gleichen Programmquellen vereinfacht verwenden. Eine Windows-Programmierung ist möglich, wird hier nicht gezeigt.
Es wurden dabei Grundprogramme erstellt, die z.B. bei Skript-Programmierung zu komplexen Abläufen verwendet werden können.

Weil Eingabe-/Ausgabe-Ports programmiert werden, laufen die Programme nur mit root-Rechten.

Diese Grundprogramme sind:
Programmname: Wirkung:
kcpreset Einstellung des PC auf Eingabe
kcpstatus Feststellung des Statussignals BRDY,
Ausgabe des Statuswertes auf stdout
kcbyin Eingabe eines Zeichens (ein Byte) in den PC,
Ausgabe des Zeichens auf stdout
kcbyout Abfrage des Zeichens von stdin,
Ausgabe dieses Zeichens (ein Byte) vom PC
kcstrin Eingabe einer Zeichenkette (String) in den PC,
Ausgabe der Zeichenkette auf stdout
kcstrout Abfrage einer Zeichenkette von stdin,
Ausgabe dieser Zeichenkette aus dem PC,
LF (Code 0AH) als Abschlußzeichen (ist nicht Bestandteil der Zeichenkette).
kcfout  (dateiname) Ausgabe einer codierten BASIC-Datei vom PC zum KC87
kcfin  (dateiname) Eingabe einer codierten BASIC-Datei vom KC87 in den PC

Als Antwort liefern alle Programme den Statuswert nach der Operation.
Die Ausführung und Beschreibung ist den ANSI-C Quelldateien:
kcpreset.c 231 Bytes 13. 02. 2008
kcpstatus.c 263 Bytes 13. 02. 2008
kcbyin.c 310 Bytes 13. 02. 2008
kcbyout.c 337 Bytes 13. 02. 2008
kcstrin.c 290 Bytes 13. 02. 2008
kcstrout.c 317 Bytes 13. 02. 2008
kcfout.c 676 Bytes 13. 02. 2008
kcfin.c 904 Bytes 13. 02. 2008
pio-par-lib.c 6,529 Bytes 13. 02. 2008
zu entnehmen.


7. Festlegung der Kommunikation zwischen KC87 und PC als Server

Der PC soll als Server dienen und nur auf Anforderung durch den KC87 tätig werden. Deshalb muß die Kommunikation des PC im Grundzustand 'Eingabe-Modus' starten und danach kann der KC87 Anforderungen stellen. Der PC sollte immer so schnell wie möglich in den 'Eingabe-Modus' übergehen.
Als Basisverzeichnis wird hier
        root/pc-kc87
verwendet, was aber für andere Fälle nicht zwingend ist. Alle anderen Pfadangaben erfolgen dazu relativ. Es gibt für die Kommunikation folgende Komman­dozeichenketten und deren Reihenfolge bei der Kommunikation:

7.1. Anfordern des Namens für ein Verzeichnis, rekursiv :

KC87 sendet:
        C (rel.Pfad)

PC sendet:
        "(mit 'ls' erzeugte Zeilen)"
        "..." als Ende

Es werden nur Zeichenketten, abgeschlossen durch LF (Code 0AH) empfangen bzw. gesendet. Sollte das Zeichen CR (Code 0DH) auftreten, wird es vom Empfänger ignoriert. Als Ende fungiert hier die Zeichenkette "..." (3 Punkte). Sollte das angegebene Verzeichnis relativ zum Basis-Verzeichnis im PC nicht vorhanden sein, so wird es neu erstellt.
Bemerkung: Wenn als relativer Pfad eine leere Zeichenkette angegeben wird, so wird das Basisverzeichnis verwendet.

7.2. Einstellen des Datei-Verzeichnisses im PC relativ zum Basisverzeichnis für nachfolgende Datei-Operationen 'G'et und 'P'ut :

KC87 sendet:
        D (rel.Pfad)
Hier ist kein Endestring vorhanden.

Der PC sendet nichts.
Sollte das angegebene Verzeichnis relativ zum Basis-Verzeichnis nicht vorhanden sein, so wird es neu erstellt.

7.3. Ausgabe einer codierten BASIC-Datei vom PC auf den KC87

KC87 sendet:
        G (dateiname)

PC sendet:
        (Inhalt der codierten BASIC-Datei)

Bemerkung: dateiname ist der Dateiname einschließlich Erweiterung.

Die codierte BASIC-Datei ist eine Binärdatei und enthält neben der Byteanzahl den Speicherabzug des BASIC-Programmbereiches im KC87 ab Speicheradresse 400H. Dieser Bereich endet, wenn 3-mal das Null-Byte auftritt.
Die Datei hat folgenden Aufbau (LP=Low Part und HP=High Part):
1. Byte:         LP(Anzahl der Bytes des Speicherabzuges)
2. Byte:         HP(Anzahl der Bytes des Speicherabzuges)
... alle Bytes des Speicherabzuges ...


[ Später erweitert:
Es wird, wenn keine codierte Datei existiert, nach einer gleichnamigen Datei mit der zusätzlichen Endung '.bas' gesucht, welches die normale BASIC-Quellcode-Darstellung enthält. Existiert diese, so wird sie in eine codierte Datei gewandelt und gesendet. ]


7.4. Eingabe einer codierten BASIC-Datei vom KC87 in den PC

KC87 sendet:
        P (filename)
danach sendet der KC87:
(Inhalt des codierten BASIC-Files)

[ Später erweitert:
Es wird nach Abschluß der Datei-Übertragung eine Datei mit der zusätzlichen Endung '.bas' mit dem normalen BASIC-Quellcode im PC erzeugt. ]


7.5. Zeilen einer Text-Datendatei als Zeichenkette vom PC auf den KC87 übertragen

KC87 sendet:
        A (dateiname)

PC sendet:
        "(Zeilen der Datei)"
        "..." als Ende

7.6. Zeichenketten mit Text/Daten vom KC87 auf den PC übertragen und in einer Datei ablegen

KC87 sendet:
        S (dateiname)"
        "(Zeichenketten)"
        "..." als ende



Das auf dem PC verwendete Server-Programm ist ein bash-Skript, als zyklisch arbeitendes Programm ohne Bedienerhandlung mit dem Namen
        pc-kc87-fileserver

Das Programm läuft wegen der Portzugriffe nur mit einem root-Recht und am besten ständig im Hintergrund. Dazu gehört die Datei
        pc-kc87.src

Eine im Arbeitsverzeichnis '/root/pc-kc87' existierende Datei mit dem Namen
        fende.txt
mit beliebigen Inhalt beendet das Server-Programm regulär.


8. Die Kommandos/Befehle des KC87 zur Kommunikation mit dem PC als Server

Es gibt z.B. folgende Möglichkeiten, die Kommunikation ablaufen zu lassen:

a) Man gibt alle Befehle in der Kommandophase des KC87 ein.
b) Man integriert den Teil des Programmes, der die Kommunikation regelt, als Bestandteil des Anwenderprogrammes. Dies ist sinnvoll für Daten-Eingabe und Daten-Ausgabe. Am günstigsten arbeitet man mit Zeichenketten. Es ist auch möglich, die Ausgabe des Programmes selbst als codierte BASIC-Datei im Anwenderprogramm zu integrieren. Programmierte Programm-Eingabe/-Verkettung geht nicht bzw. wäre eine Untersuchung wert, weil PEEK- und POKE-Operationen Überaschungen bescheren können..

Zu a.) :
Minimales Beispiel zum Einlesen eines codierten Basic-Programmes vom PC:

S$="(filename)":OUT 139,15:OUT 137,71
FOR I=1 TO LEN(S$):OUT 137,ASC(MID$(S$,I,1)):NEXT I:OUT 137,10
OUT 139,79:L=INP(137):H=INP(137):N=256*H+L
FOR I=1 TO N:A=INP(137):POKE 1023+I,A:NEXT I
Minimales Beispiel zum Ausgeben eines codierten Basic-Programmes vom KC87:

S$="(filename)":OUT 139,15:OUT 137,80
FOR I=1 TO LEN(S$):OUT 137,ASC(MID$(S$,I,1)):NEXT I:OUT 137,10:A=1025
FOR I=0 TO 1:N=256*PEEK(A+1)+PEEK(A):IF N<>0 THEN A=N ELSE I=1:NEXT I
N=A-1018:H=INT(N/256):L=N-256*H:OUT 137,L:OUT 137,H
FOR I=0 TO N:B=PEEK(1024+I):OUT 137,B:NEXT I
Zu b.)
Ein Rahmen-Beispiel für das Einlesen, Ausgeben und Verarbeiten von Daten, die auf dem PC als Datendateien gespeichert werden ist:
kc87pc.bas


9. Erweiterungsmöglichkeiten

Weitere Kommandos für die Kommunikation kann man einführen, wenn man im PC-Skript die Stelle weiter ausfüllt, an der

          #Template für Erweiterungen

beginnt.

Letzte Bearbeitung: 28. 12. 2018
33,087 Bytes

zur Startseite