Commodore C64/C128 mit PC verbinden, Teil 2

Im ersten Teil dieses Projekts habe ich demonstriert, wie man physikalisch einen Commodore C64 oder C128 Computer mittels serieller Verbindung mit einem modernen PC verbindet, der über einen USB-Anschluss verfügt. Texte manuell hin und her zu senden war ja schon ganz nett, schlussendlich aber doch nur Spielerei. Jetzt geht es darum, einen sinnvollen Anwendungsfall zu finden.

Dazu verbinden wir wieder beide Computer, wie im Teil 1 ausführlich beschrieben. Auf dem PC starten wir PuTTY, auf dem C64/C128 starten wir ein kleines Basic-Programm:

100 OPEN 2,2,0,CHR$(6)+CHR$(16):REM OPEN THE RS-232 CHANNEL
105 REM
110 GET#2,A$:REM TURN ON THE RECEIVER CHANNEL (TOSS A NULL)
190 REM
200 REM MAIN LOOP
210 GET B$:REM GET FROM COMPUTER KEYBOARD
220 IF B$<>"" THEN PRINT#2,B$;:REM IF A KEY PRESSED, SEND TO TERMINAL
230 GET#2,C$:REM GET A KEY FROM THE TERMINAL
240 PRINT B$;C$;:REM PRINT ALL INPUTS TO COMPUTER SCREEN
250 SR=ST: IF SR=0 OR SR=8 THEN 200: REM CHECK STATUS, IF GOOD THEN CONTINUE
290 REM
300 REM ERROR REPORTING
310 PRINT "ERROR: ";
320 IF SR AND 1 THEN PRINT "PARITY"
330 IF SR AND 2 THEN PRINT "FRAME"
340 IF SR AND 4 THEN PRINT "RECEIVER BUFFER FULL"
350 IF SR AND 128 THEN PRINT "BREAK"
360 IF (PEEK(673) AND 1) THEN 360:REM WAIT UNTIL ALL CHARS TRANSMITTED
370 CLOSE 2: END

Ich empfehle an dieser Stelle dringend, den C64 Programmer´s Reference Guide auf Seite 349 aufzuschlagen. Mit dem OPEN-Befehl in Zeile 100 wird die RS-232-Schnittstelle geöffnet sowie parametrisiert. Die Parametrisierung geschieht über das Control Register und das Command-Register, zwei 8-Bit-Werte, die in Form von CHR$()-Ausdrücken an vierter Stelle des OPEN-Befehls stehen.

Der obige Dezimalwert „6“ (Binär 0000 0110) ergibt sich aus

0 = 1 Stop Bit; 00 = 8 Data Bits; 0 = unused; 0110 = 300 Baud

Der obige Dezimalwert „16“ (Binär 0001 000) ergibt sich aus

000 = No Parity; 1 = Half Duplex; 000 = Unused; 0 = 3-Line Handshake

Hinweis: Würde man anstatt 0 = 3-Line Handshake aber 1 = X-Line Handshake wählen, funktioniert der Datentransfer zwischen PC und Commodore Computer nicht mehr. Eine Erklärung dazu habe ich nicht wirklich, auch gibt die mir verfügbare Dokumentation dazu nichts her. Ich vermute, dass die Kontroll-Leitungen RTS/CTS auf Hardware-Ebene vom Betriebssystem gesteuert werden und sich mit den Einstellungen in PuTTY als auch in Commodore Basic in die Quere kommen.

Startet man dieses Programm, dann wird jedes eingegebene Zeichen vom PC zum C64/C128 gesendet und am Bildschirm ausgegeben (in der Variablen C$). Umgekehrt wird jedes eingegebene Zeichen vom C64/C128 (Variable B$) an den PC gesendet und auf beiden Seiten ausgegeben.

Dies geschieht so lange, bis das Basic-Programm vom Anwender abgebrochen wird bzw. die RS-232-Schnittstelle einen Fehler zurück liefert. Der Fehlercode befindet sich in der Variablen ST („Status“), siehe Zeile 250.

In Zeile 360 wird vor Schließen der RS-232-Schnittstelle die Speicheradresse 673 (0x2A1) ausgelesen. Diese Speicheradresse enthält, vereinfacht gesagt, den Zustand des zweiten CIA-Chips im Commodore Computer, der für die RS-232-Schnittstelle zuständig ist. Wenn Bit 1 dieser Adresse gesetzt ist, dann empfängt der CIA-Chip, also die RS-232-Schnittstelle, noch Daten (vom PC).

Hier nun mein Anwendungsfall: Ich habe auf dem Commodore-Computer eine binäre Datei („sequential file“) namens „pv250113.seq“, in dieser sind Messwerte meiner Photovoltaikanlage vom 13.01.2025 gespeichert:

2025-01-13 08:00:00 0
2025-01-13 08:10:00 18
2025-01-13 08:30:00 68
2025-01-13 08:40:00 280
2025-01-13 09:00:00 820
2025-01-13 09:10:00 1033
2025-01-13 09:30:00 1285
2025-01-13 09:40:00 1601
2025-01-13 10:00:00 1482
2025-01-13 10:10:00 1513

Die erste Spalte ist das Datum, gefolgt vom Zeitstempel, gefolgt vom Ertrag in KW. Um 10:10 Uhr hatte damit die PV-Anlage 1513 KW erzeugt.

Diese Datei soll nun zur Weiterverarbeitung auf den PC übertragen werden. Dazu dient ein kurzes Basic-Programm:

10 REM USE SERIAL LINK TO
20 REM COPY FILE FROM C128 TO PC
30 REM ******************************
90 REM OPEN RS-232 INTERFACE
100 OPEN 2,2,0,CHR$(6)+CHR$(16):REM OPEN THE RS-232 CHANNEL
110 GET#2,A$:REM TURN ON THE RECEIVER CHANNEL (TOSS A NULL)
1000 REM READ PV SEQ FILE AND PRINT
1010 REM TO RS-232 CHANNEL
1100 REM ***
1200 Z$=CHR$(0):REM FOR UNREADABLE CHRS
1300 REM OPEN SEQ FILE READ-ONLY
1400 OPEN 5,9,0,"PV250113,S,R"
1450 PRINT "DATE";TAB(11);"TIME";TAB(20);"KW"
1480 REM ANSI CONTROL SEQ. INTRODUCER
1482 REM IS DEC 27
1490 PRINT#2,CHR$(27);"[2J"
1500 PRINT#2,"DATE";CHR$(9);"TIME";CHR$(9);"KW"
1600 REM MAIN LOOP
1610 FOR L=0 TO 1
1700 GET#5,IN$
2200 L=ABS(ST):REM L IS > 0 ON ERROR
2205 PRINT IN$;
2210 PRINT#2,IN$;
2300 NEXT L
2400 CLOSE 5: PRINT#2,CHR$(13)
3000 CLOSE 2: END

Interessant ist Zeile 1490. Hier wird dem empfangenen „Terminal“ (dem PC) ein ANSI Control Sequence Indicator (CSI) mit einem Steuerbefehl mitgegeben. Eingeleitet wird diese durch ESC (Escape, dezimal 27), gefolgt von der Zeichenkette „[2J“. „ESC [“ wird dabei als CSI bezeichnet. Interpretiert PuTTY diesen Steuerbefehl richtig, so wird der Bildschirm gelöscht.

Startet man das Programm auf dem Commodore Computer, so wird die sequentielle Datei mit den Messwerten geöffnet und die Daten daraus Byte für Byte (auf der physikalischen Leitung Bit für Bit) an den PC gesendet. Dort erscheinen die Messwerte im PuTTY Terminal-Fenster:

Man kann die Messwerte nun per Cut-and-Paste weiterverarbeiten. Alternativ, besonders bei langen Dateien, läßt man PuTTY die „printable characters“ in eine Datei mitloggen. Damit sind die Daten vom Commodore Computer „elegant“ auf den PC übertragen:

Das Tabulator-Zeichen (TAB, CHR$(9)) aus dem Basic-Programm, Zeile 1500, wird zwar am Bildschirm korrekt dargestellt, nicht aber in der Log-Datei!

An alle, die nach dem Lesen dieses Projekts gerne kommentieren würden, dass der Datentransfer per virtuellem Laufwerk („SD2IEC“) doch viel einfacher geht: Mag sein. Wer es einfach will, soll sich ein anderes Hobby suchen, als mit alten Computern zu arbeiten 😉

„Why the heck did you do this?“ Man: „Because I can!“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert


Der Zeitraum für die reCAPTCHA-Überprüfung ist abgelaufen. Bitte laden Sie die Seite neu.