Serielles Interface

Die Hardware

Die Hardware ist im Prinzip ein Serielles Interface, mit welchem der C64 mit einem PC via USB verbunden werden kann. Dabei handelt es sich um ein UP9600 Interface, mit dem eine Übertragungsrate von 9600 Baud erreicht werden kann.

2400 Baud Edition

Das Interface besteht im Grunde nur aus einem Bauteil: Dem CP2102. Dieser Chip wandelt das Serielle Signal des C64 nach USB. Am PC stellt dieser Chip eine virtuelle serielle Schnittstelle dar.

Diesen kann man als Break-Out Board günstig um die 2€ bekommen.

Am Userport des C64 ist das TX Signal an den Pins B + C und das RX Signal an dem Pin M. Nun müssen die TX und RX Pins des Userports mit den entsprechenden Pins des CP2102 über kreuz verbunden werden. D.H. es müssen am C64 Userport die Pins B und C (RX) mit dem TX Pin am CP2102 verbunden werden und der Userport Pin M (TX) muss mit dem RX Pin des CP2102 verbunden werden. Außerdem muss natürlich noch die GND Leitung des Userports mit der des CP2102 verbunden werden.

Normalerweise wird das CP2102 Breakout Board über den USB Port mit Spannung versorgt. Optional kann die Leitung der Versorgungsspannung getrennt werden und statt dessen kann der CP2102 mit den 5V des Userports versorgt werden.

Userport PinCP2102 Pin
B + C (RX)TX
M (TX)RX

9600 Baud Edition

Das Interface besteht genauso wie die 2400 Baud Edition erstmal aus dem CP2102. Damit man am Userport des C64 Daten mit 9600 Baud übertragen kann, benötigt man eine Schaltung mit dem Namen „UP9600“. Dazu müssen lediglich einige weitere Verbindungen am Userport gegenüber der 2400 Baud Edition gemacht werden. Auch hier müssen die RX und TX Pins des Userports mit den entsprechenden Pins des CP2102 über kreuz verbunden werden:

Userport PinCP2102 Pin
B + C + 7 (RX)TX
M + 5 (TX)RX
L + 6 (Brücke)

Es Müssen Also die Userport Pins B + C + 7 (RX) mit dem CP2102 Pin TX verbunden werden und die Userport Pins M + 5 müssen mit dem CP2102 Pin RX verbunden werden. Zusätzlich müssen die Userport Pins L und 6 miteinander verbunden werden. Die GND Pins müssen natürlich auch verbunden werden.

Mit dieser Schaltung ist eine Übertragung mit einer Geschwindigkeit von 9600 Baud möglich. Natürlich wird dafür noch der „UP9600“ Software Treiber benötigt. Diese Unterstützt aber Novaterm 9.6c bereits.

Allerdings wird man schnell merken, dass es häufig zu Übertragungsfehlern kommt. Die Übertragungsfehler resultieren wahrscheinlich aus der Tatsache, dass die Übertragung von 9600 Baud über den Userport den C64 an seine technischen Grenzen bringt.

Daher empfiehlt es sich bei dieser Übertragungsrate das „Hardware Flow Control“ zu verwenden. Durch Verwenden einer Kontrollleitung wartet der Sender falls die Übertragung für den Empfänger zu schnell passiert. Für das Hardware Flow Controll müssen wir die RTS und CTS Leitungen mit dem Userport verbinden. Auch die RTS und CTS Pins des Userports müssen mit den entsprechenden Pins des CP2102 über kreuz verbunden werden:

Userport PinCP2102 Pin
D (RTS)CTS
K (CTS)RTS

Leider ist es am C64 so, dass die RTS und CTS Signale am Userport invertiert sind gegenüber den entsprechenden Signalen an einem Standard RS232 Interface. Daher müssen diese Signale auf dem Weg invertiert werden. Dazu habe ich einen 74HC04 Hex Inverter verwendet.

Dabei wird jeweils die RTS Leitung an den Eingang des Inverters angeschlossen. Also Userport Pin D (RTS) -> Inverter Eingang -> Inverter Ausgang -> CP2102 Pin CTS. Genauso umgekehrt: CP2102 Pin RTS -> Inverter Eingang -> Inverter Ausgang -> Userport Pin CTS.

Die Logic des CP2102 arbeitet mit 3V, allerdings ist der CP2102 5V tolerant. D.H. wir können die 5V Signale des C64 direkt an den CP2102 anschließen. Allerdings habe ich mal gelesen, dass das nicht so gut für den CIA des C64 gut ist. Deswegen habe ich noch einen Pegelwandler zwischen den Userport und dem CP2102 für die Leitungen RX, TX, RTS und CTS verwendet.


Ich habe den TXB0104 als Pegelwandler verwendet. Dieser hat 4 Ein/Ausgänge und ist Bidirektional. Für diese Verwendung hätte auch ein Uni-Direktionaler Pegelwandler ausgereicht, da alle 4 Signale nur in eine Richtung gehen. Den Pegelwandler gibt es auch auf einem Break-Out Board.

Anbei die Schaltung für das gesamte Interface.

Der Spannungsversorgung für den CP2102 erfolgt nicht über USB, sondern über den C64. Daher wird das Interface am PC nur sichtbar, wenn der C64 eingeschaltet wird.

Hier noch Bilder des ersten Prototypen meines Interfaces.

Nun kann das Interface mit einem PC verbunden werden. Am C64 wird noch ein Terminal Programm benötigt. Ich habe die beste Erfahrung mit Novaterm 9.6c gemacht. Hier muss als Modemtyp UP9600 eingestellt werden. Die Übertragungsrate 9600 Baud und Hardware Flowcontrol muss eingeschaltet werden. Ohne Hardware Flowcontrol kommt es häufig zu Übertragungsfehlern bei 9600 Baud. 4800 Baud und 2400 Baud sollte hingegen auch ohne Hardware Flowcontrol funktionieren. Konfigurationsdetails in Novaterm:

Am PC wird ebenfalls ein Terminal Programm benötigt. Auch hier muss eine Übertragungsrate von 9600 Baud eingestellt werden. Außerdem muss Hardware Flowcontrol auch hier eingeschaltet sein.

Sind die Terminal Programme am C64 und PC bereit sollte es möglich sein Texteingaben zwischen PC und C64 in beide Richtungen zu übertragen.

Die Anwendung

Die Idee hinter dem Verbinden des C64 mit dem PC über das serielle Interface ist, dass ich gerne den C64 als ein Terminal für einen Linux PC nutzen wollte. Um ein Termial in Linux über die serielle Schnittstelle aufrufen zu können, benötigen wir das Programm agetty.

agetty --flow-control --local-line 9600 ttyUSB0 vt102

Der Befehl oben stellt ein Terminal auf der Seriellen Schnittstelle zur Verfügung und geht von einer Baudrate von 9600 Baud aus und von vorhandenem Hardware Flowcontrol. Der CP2102 entspricht bei mit dem Device ttyUSB0.

ich habe ein Skript mit den Namen „startgetty.sh“ erstellt:

#!/bin/sh
echo "delay for starting getty"
sleep 5
while [ true ]
do
    if [ -e /dev/ttyUSB0 ]; then
            sleep 2
            echo "starting getty now"
            agetty --flow-control --local-line 9600 ttyUSB0 vt102
            echo "getty exited. Restarting in 10 Seconds..."
            sleep 3
    else
        echo "no ttyUSB0"
        sleep 5
    fi
done

Dieses Skript prüft alle 5 Sekunden, ob ein Device „/dev/ttyUSB0“ vorhanden ist. Da der Serial-Adapter vom C64 mit Strom versorgt wird, ist dieses Device nur vorhanden, wenn der C64 eingeschalt ist.

Sobald der C64 eingeschaltet wird, wird durch das Skript dem Device ttyUSB0 ein Terminal mit Login Screen zur Verfügung gestellt.

Dieses Script wird durch einen Service gestartet:

[Unit]
Description=C64 serial terminal

[Service]
Type=simple
ExecStart=/bin/bash /usr/bin/startgetty.sh

[Install]
WantedBy=multi-user.target

Dieser Service wiederum wird von einer udev Regel gestartet und gestoppt:

ACTION=="add", SUBSYSTEM=="tty", ENV{ID_MODEL}=="CP2102_USB_to_UART_Bridge_Controller", RUN+="/bin/systemctl start usb0getty.service"
ACTION=="remove", SUBSYSTEM=="tty", ENV{ID_MODEL}=="CP2102_USB_to_UART_Bridge_Controller", RUN+="/bin/systemctl stop usb0getty.service"

Wird das Device ttyUSB0 hinzugefügt (also der C64 eingeschaltet), dann wird der Service und somit das Skript gestartet. Wird das Device ttyUSB0 entfernt (also der C64 ausgeschaltet), dann wird der Service und somit auch das Skript gestoppt.

Was man damit machen kann

Alles was in einer Linux Shell gemacht werden kann. Z.B. im Filesystem arbeiten oder ein System-Update ausführen:

Mit dem Programm links2 Webbrowser kann im Textmodus im Internet gesurft werden. Z.B. www.google.de oder www.forum64.de:

Mit mutt können auch Emails gelesen und geschrieben werden:

Mit dem Befehl curl wttr.in/ḾeineStadt wird die Wettervorhersage angezeigt:

Wikipedia im Terminal mit dem Tool wikit

Weitere Ideen

Eine weiter Idee ist direkt einen Raspberry Pi Zero auf die Interface Platine zu montieren.