Der C 128 am Telefon
Über Akustikkoppler oder Modem mit Mailboxen in Verbindung treten. Das kann der Commodore 128 auch!
Im C 64-Modus behandelt der Commodore 128 den User-Port und damit die RS232-Schnittstelle wie gewohnt. Gute Bekannte wie das Datenfernübertragungs-Programm »Proterm 64« (64'er Sonderheft 7/1985) versehen einwandfrei ihren Dienst. Wie aber verhält sich der User-Port im 128-Modus?
Der User-Port des C 128 wird vorwiegend für den Druckeranschluß oder für den Anschluß eines Akustikkopplers genutzt. Dazu wird entweder eine parallele oder serielle Schnittstelle am User-Port simuliert. Um Daten mit dem Telefon zu übertragen, ist meist die serielle RS 232-Schnittstelle erforderlich. Mit dieser Schnittstelle werden acht Byte nicht gleichzeitig nebeneinander, sondern Bit für Bit hintereinander gesendet. Dadurch wird zwar die Geschwindigkeit wesentlich geringer als bei der parallelen Datenübertragung, aber man kommt mit viel weniger Leitungen aus. Und gerade im Telefon-Verkehr ist die serielle Übertragung die einzig mögliche.
Der Commodore 128 ist von Haus aus im Betriebssystem mit der erforderlichen Software zum Betrieb einer seriellen RS232-Schnittstelle ausgerüstet. Die RS232-Schnittstelle selbst muß noch mit einem Modul hardwaremäßig am User-Port simuliert werden. Dazu gibt es in der 64'er, Ausgabe 3/85 einen kleinen Bausatz für 25 Mark, der den Normpegel am User-Port (TTL-Pegel von +5V) auf den RS232-Pegel (±3V bis ±15V) umwandelt.
Die RS232-Schnittstelle hat im C 128 die Geräteadresse 2 bekommen. Dadurch wird diese Schnittstelle wie ein Floppy-Laufwerk oder ein Drucker angesprochen.
Eröffnet man beim Commodore 128 ein User-Port-File mit der OPEN-Anweisung, so legt der C 128 zwei Daten-Buffer von je 256 Byte an. In den Eingabebuffer, der ab der Adresse $0C00 Hex liegt, werden alle über die RS232-Schnittstelle hereinkommenden Daten gesammelt. Der Ausgabebuffer ab der Adresse $0D00 nimmt die an die RS232-Schnittstelle auszugebenden Daten auf.
Um die Datenübertragung zu organisieren gibt es zwei spezielle Register: das Kontrollregister und das Befehlsregister. Diese werden automatisch mit der Eröffnung des logischen Files (Geräteadresse 2) definiert.
Das Befehlsregister bestimmt die Übertragungsart, die Parität und die Art der Verbindung (Handshake). Im Kontrollregister wird die Baud-Rate definiert und die Anzahl der Daten- und Stop-Bits.
Die Datenübertragungsrate beträgt bei den meisten C 64-Mailboxen 300 Baud bei sieben Daten-Bits und einem Stop-Bit. Das Stop-Bit kennzeichnet das Übertragungsende von Daten-Bits. Die Baud-Rate darf beim C 128 den Wert von 2400 nicht übersteigen, da die interne Software des C 128-Betriebssytems nicht schneller arbeitet.
Alle Parameter werden in der OPEN-Anweisung übergeben. Die Syntax für den OPEN-Befehl lautet: »OPEN Filenummer, Geräteadresse, Sekundäradresse, Kontrollregister, Befehlsregister«. Eine Eröffnung des Datenkanals mit allen Parametern sieht beispielsweise folgendermaßen aus:
»OPEN 2,2,0,CHR$ (6+32+0)+ CHR$(0+0+0)«
Damit haben wir folgende Parameter programmiert:
- logisches File 2 öffnen
- Geräteadresse 2 ansprechen
- Sekundäradresse 0 setzen
- 300 Baud Übertragung
- 7 Daten-Bits
- 1 Stop-Bit
- 3-Draht-Leitung
- Vollduplex
- keine Parität (kein 8. Daten-Bit)
Wie man sieht, wird das Befehls- und Kontrollregister mit dem OPEN-Befehl definiert. Dazu haben wir nach der Adreß-Definition zwei Byte mit Hilfe der CHR$-Anweisung übergeben.
Einige Bits dieser beiden Register haben wichtige Funktionen. Die ersten vier Bit des Kontrollregisters bestimmen die Baud-Rate, Bit 5 und 6 die Anzahl der Datenbits und Bit 7 die Anzahl der Stop-Bits (siehe Tabelle 1).
| Bit | 3 | 2 | 1 | 0 | dezimal | Baud-Rate |
|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | Anwender-Baud-Rate, | |
| 0 | 0 | 0 | 1 | 1 | 50 | |
| 0 | 0 | 1 | 0 | 2 | 75 | |
| 0 | 0 | 1 | 1 | 3 | 110 | |
| 0 | 1 | 0 | 0 | 4 | 134.5 | |
| 0 | 1 | 0 | 1 | 5 | 150 | |
| 0 | 1 | 1 | 0 | 6 | 300 | |
| 0 | 1 | 1 | 1 | 7 | 600 | |
| 1 | 0 | 0 | 0 | 8 | 1200 | |
| 1 | 0 | 0 | 1 | 9 | 1800 | |
| 1 | 0 | 1 | 0 | 10 | 2400 | |
| 1 | 0 | 1 | 1 | 11 | 3600 | |
| 1 | 1 | 0 | 0 | 12 | 4800 | |
| 1 | 1 | 0 | 1 | 13 | 7200 | |
| 1 | 1 | 1 | 0 | 14 | 9600 | |
| 1 | 1 | 1 | 1 | 15 | 19200 | |
| Bit | 6 | 5 | dezimal | Anzahl der Datenbits | ||
| 0 | 0 | 0 | 8 Bit | |||
| 0 | 1 | 32 | 7 Bit | |||
| 1 | 0 | 64 | 6 Bit | |||
| 1 | 1 | 96 | 5 Bit | |||
| Bit | 7 | dezimal | Anzahl der Stoppbits | |||
| 0 | 0 | 1 Stoppbit | ||||
| 1 | 128 | 2 Stoppbit |
Das zweite Byte wird in das Befehlsregister geschrieben und bestimmt mit Bit 0 die Art des Handshake-Betriebs. Die darauffolgenden drei Bit sind von untergeordneter Bedeutung. Mit Bit 4 wird die Übertragungsart und über die Bits 5,6 und 7 die Parität bestimmt (siehe Tabelle 2).
| Bit | 0 | dezimal | Handshake | ||
|---|---|---|---|---|---|
| 0 | 0 | 3-Draht-Handshake | |||
| 1 | 1 | X-Draht-Handshake | |||
| Bit | 4 | dezimal | Übertragungsart | ||
| 0 | 0 | Vollduplex | |||
| 1 | 16 | Halbduplex | |||
| Bit | 7 | 6 | 5 | 0 | Paritätsprüfung |
| X | X | 0 | 0 | keine Paritätsprüfung kein 8. Datenbit |
|
| 0 | 0 | 1 | 32 | ungerade Parität | |
| 0 | 1 | 1 | 96 | gerade Parität | |
| 1 | 0 | 1 | 160 | 8. Datenbit immer 1 keine Paritätsprüfung |
|
| 1 | 1 | 1 | 224 | 8. Datenbit immer 0 |
Selbstverständlich können bei der Datenübertragung mit der RS 232-Schnittstelle Fehler vorkommen. Dafür gibt es das sogenannte Status-Register, das allerdings nach dem Auslesen sofort gelöscht wird. Man sollte diese Statusvariable ST immer in einer Variablen ablegen. Die Bedeutung der einzelnen Bits der Statusvariablen ST sind der Tabelle 3 zu entnehmen.
| Bit | Beschreibung |
|---|---|
| 0 | Paritätsfehler |
| 1 | Rahmenfehler |
| 2 | Empfängerbuffer voll |
| 3 | Empfängerbuffer leer |
| 4 | CTS (Clear To Send) Signal fehlt |
| 5 | unbenutzt |
| 6 | DSR (Data Set Ready) Signal fehlt |
| 7 | Break-Signal empfangen |
Das Kontrollregister, das Befehlsregister und die Statusvariable kann man auch direkt aus der Zeropage auslesen. Für die RS232-Schnittstelle sind die Adressen $0A0F Hex bis $0A1B Hex wichtig (siehe Tabelle 4).
| Hex | Dezimal | Bedeutung |
|---|---|---|
| 0A0F: | 2575 | RS-232 NMI Status Register |
| 0A10: | 2576 | RS-232 Kontrollregister |
| 0A11: | 2577 | RS-232 Kommandoregister |
| 0A12: | 2578 – 2579 | RS-232 Benutzer Baud-Rate |
| 0A14: | 2580 | RS-232 Statusregister |
| 0A15: | 2581 | RS-232 Anzahl der zu sendenden Bits |
| 0A16: | 2582 – 2583 | RS-232 Baud-Rate: Full Bit Time (in µs) |
| 0A18: | 2584 | RS-232 Index auf den Anfang des Eingabepuffers |
| 0A19: | 2585 | RS-232 Index auf das Ende des Eingabepuffers |
| 0A1A: | 2586 | RS-232 Index auf den Anfang des Ausgabepuffers |
| 0A1B: | 2587 | RS-232 Index auf das Ende des Ausgabepuffers |
Daß ein Programm für die RS232-Schnittstelle nicht umfangreich sein muß, beweist unser kleines C 128-Terminalprogramm (siehe Listing). Mit ihm kann mit jeder Mailbox kommuniziert werden.
Leider ist der Basic 7.0 Interpreter etwas langsamer als der Dateneingang über die RS232-Schnittstelle. Wenn kontinuierlich Daten hereinkommen, läuft der Datenpuffer nach einiger Zeit über, weil der Computer mit dem Auslesen nicht mehr nachkommt. Die Folge ist, daß der Text plötzlich unleserlich wird. Erst wenn der Partnercomputer eine Pause macht, kann die Basic-Routine nach einem Moment wieder »vernünftigen« Text liefern.
Wesentlich mehr Komfort und Geschwindigkeit bringen in Maschinensprache geschriebene Terminalprogramme. Da nur kleine Änderungen der Speicheradressierung vorzunehmen sind, wird sicherlich demnächst mit mehreren Datenfernübertragungsprogrammen zu rechnen sein, die auch im C 128-Modus des Commodore 128 laufen. Nur steht diesen dann wesentlich mehr Speicherplatz für die Protokollführung zur Verfügung. Dann kann man sich mit dem C 128 Programme übertragen lassen, für die der Speicher des C 64 zu klein war.
(zu)Quelle: Commodore 128 Intern von Data Becker, ISBN 3-89011-098-3
Das Commodore 128 Handbuch von Markt&Technik Verlag, ISBN 3-89090-171-9
1 open 2,2,0,chr$(6+32+0)+chr$(0+0+0):get#2,a$
2 printchr$(14);"{clr}{down} Datenfernuebertragung mit dem C 128{down}"
3 geta$:ifa$=""then7
4 c%=0:d%=asc(a$):ifd%<91andd%>64thenc%=32
5 ifd%=20thend%=8
6 d%=d%+c%:print#2,chr$(d%);
7 get#2,b$:ifb$=""then3
8 c%=0:d%=asc(b$):ifd%<91andd%>64thenc%=128
9 ifd%>96thend%=d%-32
10 if d%=8thend%=20
11 d%=d%+c%:printchr$(d%);:goto3