Die Sache mit den 1200 Baud...
--------------------------------
Diesmal wollen wir uns ein wenig um ein
Problem kümmern, vor dem manche von
Ihnen bestimmt schon einmal standen, als
sie Ihr neues 1200-Baud-Modem ausprobie-
ren wollten, und stolz im Terminalpro-
gramm die Baudrate "1200" einstellten,
um anschließend entstäuscht zu werden,
als Sie nämlich einen Haufen wirre
Zeichen auf dem Bildschirm sahen. Dabei
steht doch groß und breit im Handbuch,
daß der C64 bis 2400 Baud serielle Daten
übertragen kann, und dann so etwas !!!
Jetzt einmal im Ernst : Tatsächlich ist
es so, daß wenn Sie versuchen, ein
1200-Baud-Modem mit Ihrem 64er zu
betreiben, es zu Übertragungsfehlern
kommen kann. Anfangs sieht ein
übertragener Text zwar noch ganz normal
aus, doch bei genauerem Hinsehen, werden
Sie feststellen, daß hier und da, etwa
alle 200 Zeichen, ein kleiner Schub von
wirren Buchstaben und Sonderzeichen im
Text erscheint. Und so soll es ja nun
wirklich nicht sein. Gerade beim
Übertragen von Programmen (z.B. mit
Hilfe des XModem-Protokolls) kann man
auf eine gewisse Genauigkeit der Über-
tragung absolut nicht verzichen. Bei
XMODEM erhalten Sie so etwa alle 2
Blocks (von XModemübertragungsblocks ist
hier die Rede) einen Prüfsummenfehler,
und die ganze Übertragung dauert
vielleicht noch länger, als wenn Sie mit
300 Baud gearbeitet hätten. Ich habe
mich nun einmal auf den Weg ins Innerste
des Betriebssystems unseres 64ers
gemacht, um herauszufinden, woran der
Fehler liegen könnte. Und tatsächlich
bin ich auch fündig geworden ! Ich habe
mir einmal die Routine, die einen Kanal
auf der RS232-Schnittstelle (also der
seriellen Schnittstelle) öffnet genauer
angeschaut. Zur besseren Erläuterung des
Ganzen sollten Sie wissen, wie der C64
mit der RS232 umgeht und wie er die
Baudraten auf ihr simuliert. Wenn Sie
einen RS232-Kanal öffnen (hierzu benutzt
man die Geräteadresse #2 im OPEN-Be-
fehl), dann passiert folgendes:
Erstens richtet der 64er zwei Puffer am
Ende des Basicspeichers ein, die jeweils
256 Bytes groß sind. Zweitens aktiviert
er einen Interrupt, den NMI (steht für
Non Maskable Interrupt - nicht maskier-
barer Interrupt). Der NMI ist quasi ein
Programm, daß in regelmäßigen Zeitab-
ständen vom Prozessor abgearbeitet wird.
Damit dies auch immer rechtzeitig und in
gleichmäßigen Abständen geschieht, hat
der C64 einen sogenannten "Timer" einge-
baut, der alle soundsoviel Millisekunden
den Prozessor unterbricht, ihn dazu ver-
anlaßt, seine aktuellen Registerwerte
zwischenzuspeichern und das NMI-Pro-
gramm abzuarbeiten. Nach dieser Abarbei-
tung springt er dann wieder zurück zu
seiner ersten Arbeit und macht dort wei-
ter, wo er vorher aufgehört hat. Wozu
jedoch das alles?
Nun, der NMI steuert die gesamte Daten-
übertragung über die RS232-Schnitt-
stelle. Sollten Sie Daten auf diese
Schnittstelle senden, so schreibt die
Senderoutine des Betriebssystems (es ist
die BSOUT-Routtine, bei $FFD2) diese
Daten in einen der oben genannten
Puffer. Der eine ist der Ein-, der
andere der Ausgabepuffer. Die Daten
kommen also in den Ausgabepuffer, wo sie
- vorläufig einmal - stehenbleiben. Wird
jetzt der NMI ausgelöst, so prüft
dieser, ob Daten im Ausgabepuffer ste-
hen. Ist das der Fall, so schickt er
diese auf die RS232-Schnittstelle.
Gleichzeitig sieht er nach, ob von der
RS232 nicht auch noch gerade Daten
eintreffen.
Sollte dies der Fall sein, so greift er
sich diese Daten ab und speichert sie im
Eingabepuffer. Nun können diese von dort
aus mit der Einleseroutine des Betriebs-
systems abgeholt werden (diesmal ist es
die BASIN-Routine bei $FFCF). Die Baud-
rate, die Sie bei OPEN angeben, bestimmt
nun den Zeitabstand, der zwischen zwei
NMI-Aufrufen besteht.
"Baud" oder "BPS" heißt ja nichts ande-
res als "Bits Per Second" - also wieviel
Bits in einer Sekunde übertragen werden.
Sind das 300 pro Sekunde (300 Baud), so
so wird der NMI 300 mal in einer Sekunde
aufgerufen. Jedesmal also, wenn ein Bit
übertragen wurde, oder abgesendet werden
muß.
Dieser Zeitabstand zwischen zwei NMIs
muß nun beim Öffnen des RS232-Kanals an
den NMI-Timer weitergegeben werden,
damit dieser auch weiß, wann er den
Prozesser zu unterbrechen hat (daher
auch der Name des NMIs - Interupt ist
englisch und heißt übersetzt "Unterbre-
chung"). Diese Zeitwerte sind für die
gängigsten Baudraten im Betriebssystem-
ROM des C64 gespeichert.
Das heißt also, daß wenn Sie einen
RS232-Kanal, mit zum Beispiel 300 Baud,
öffnen, der 64er sich aus seiner ROM-
Tabelle den Zeitwert holt, der für
diese Übertragungsgeschwindigkeit nötig
ist, und ihn in den Timer übergibt.
So wird ebenfalls bei 1200 Baud verfah-
ren, doch stoßen Sie dann auf den oben
beschriebenen Fehler. Sie ahnen ver-
mutlich schon, woran es liegt:
Der gespeicherte Timerwert für 1200
Baud ist ganz einfach FALSCH. Ich habe
einmal nachgerechnet und herausge-
funden, daß mit dem gespeicherten Wert
etwa eine Übertragungsgeschwindigkeit
von 1198 Bits pro Sekunde simuliert
wird. Und genau diese 2 fehlenden Bits
führen zu den uns bekannten Fehlüber-
tragungen, da der Computer auf der an-
deren Seite des Kabels von uns ja erwar-
tet, daß wir mit vollen 1200 Baud sen-
den. Wie können wir nun diesen Fehler
beseitigen, so daß es für uns keine
Probleme mehr in dieser Hinsicht gibt?
Nun, da gibt es drei Möglichkeiten, die
ich im Folgenden durchgehen werde und
die alle ihre Vor- und Nachteile haben.
Fangen wir also an:
Da wäre zuerst einmal die einfache,
softwaremäßge Methode. Wie Sie viel-
leicht wissen, kann man einen RS232-Ka-
nal in BASIC folgendermaßen öffnen:
OPEN 1,2,0,CHR$(6)+chr$(0)
Mit diesem Befehl habe ich nun einen
RS232-Kanal, mit der logischen
Filenummer 1 und mit folgenden Parame-
tern geöffnet: 300 Baud, 8 Datenbits, 1
Stopbit, 3-Draht Handshake, Vollduplex,
Keine Parität. Kurz geschrieben auch:
300bd, 8n1. Sollten Sie sich hierbei
noch nicht so gut auskennen, so möchte
ich dies nun erläutern: Beim Öffnen
eines RS232-Kanals ist es zunächst
einmal wichtig, daß Sie im OPEN-Befehl
die Sekundäradresse 2 angeben, damit
OPEN auch weiß, das hier die RS232
gemeint ist, und nicht etwa die Floppy
oder der Drucker. Dann müssen Sie
sozusagen als "Filenamen" zwei Steuer-
bytes an die OPEN-Routine übergeben.
Diese heißen Kontroll- und Befehlsre-
gister, und werden in der hier beschrie-
benen Reihenfolge angegeben. Da hier
zwei Strings zusammen den Namen bilden,
werden die einzelnen Registerbytes mit
mit einem "+"-Zeichen zusammengefügt.
Mit der CHR$-Funktion lassen sich solche
Bytewerte DIREKT übergeben und müssen
nicht noch extra in Buchstaben gewandelt
werden. Die beiden Register werden fol-
gendermaßen berechnet: Zuerst einmal das
Kontollregister. Es gibt die Baudrate,
die Anzahl der Datenbits und die Anzahl
der Stopbits an. Diese sind folgender-
maßen aufgeteilt:
Bit 0-3 : Baudrate
Bit 5-6 : Datenbits
Bit 7 : Stopbits
Die einzelnen Werte lassen sich nach
folgenden Tabellen berechnen:
a) Baud-Rate :
==============
Bit 3 2 1 0 dez. Wert Baudrate
--------------------------------------
0 0 0 0 0 User-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
b) Anzahl der Datenbits :
=========================
Bit 6 5 dez. Wert Anzahl Datenbits
----------------------------------------
0 0 0 8 Bits
0 1 32 7 Bits
1 0 64 6 Bits
1 1 96 5 Bits
c) Anzahl der Stopbits :
========================
Bit 7 dez. Wert Anzahl Stopbits
========================================
0 0 1 Stopbit
1 128 2 Stopbits
Möchten Sie nun den Wert Ihres Kontroll-
bytes ermitteln, so wählen Sie einfach
Ihre Parameter aus den obigen 3 Tabellen
und addieren Sie jeweils die angegebenen
Dezimalwerte. Das Ergebnis ist der Wert
Ihres Kontrollbytes.
Nun noch die Angaben für das Befehlsre-
gister. Dieses ist ebenfalls in Bits un-
terteilt, die verschiedene Funktionen
haben, nämlich:
Bit 0 : Handshake
Bit 4 : Duplex-Modus
Bit 5-7 : Parität
Und hier die 3 Tabellen mit den ent-
sprechenden Werten:
a) Handshake :
==============
Bit 0 dezimal Handshake
----------------------------------------
0 0 3-Draht-Handshake
1 1 X-Draht-Handshake
Hier wird meistens der 3-Draht-Handshake
verlangt, sollten Sie ein "normales"
Modem, oder Akustikkoppler besitzen.
X-Draht wird für eine andere Art der
RS232-Schnittstelle benutzt.
b) Duplex :
===========
Bit 4 dezimal Duplex
-----------------------------------
0 0 Vollduplex
1 16 Halbduplex
c) Parität :
============
Bit 7 6 5 dez. Parität
----------------------------------------
0 0 0 0 keine Parität, kein 8.
Datenbit
0 0 1 32 ungerade Parität
0 1 1 96 gerade Parität
1 0 1 160 keine Parität, 8.
Datenbit immer 1
1 1 1 224 keine Parität, 8.
Datenbit immer 0
Verfahren Sie zur Ermittlung des Byte-
wertes bitte ebenso wie beim Kontroll-
register.
Nachdem Sie nun wissen sollten, wie man
einen Kanal auf der RS232 öffnet, möchte
ich nun zu unserem eigentlichen Thema
kommen, nämlich, wie wir den Fehler mit
den 1200 Baud umgehen können. Hier bie
tet sich die Möglichkeit der sogenannten
"User-Baud-Rate" an. Es handelt sich
dabei um die Möglichkeit, eine eigene,
beliebige Baudrate an das Betriebssystem
zu übergeben. Sie haben diesen Modus
bestimmt schon in der obigen Tabelle für
Baudraten entdeckt. Geben Sie also nun
für die Baudrate ganz einfach den Wert 0
an, so können Sie Ihre eigene Baudrate
definieren, indem Sie dem OPEN-Befehl
noch zwei weitere Bytes anhängen. Diese
enthalten die Werte, die dem Timer über-
geben werden sollen, damit dieser die
angegebene Baudrate simulieren kann.
Zunächst einmal benötigen wir den Grund-
wert für den Timer. Dieser berechnet
sich nach folgender Formel:
Timerwert = 492662 / Baudrate - 101
Anschließend müssen Sie den erhaltenen
Wert noch in LOW- und HIGH-Byte umrech-
nen, was folgendermaßen geschieht:
HIByte = INT(Timerwert / 256)
LOByte = INT(Timerwert) - 256 * HIByte
In unserem Fall, für 1200 Baud, sieht
das also folgendermaßen aus:
Timerwert = 492662/1200-101 = 309.55
HI = INT(309.55/256) = 1
LO = 309-256*1 = 53
Öffnen wir doch nun einmal einen RS232-
Kanal mit folgenden Parametern, wobei
wir die Baudrate als "User-Baud-Rate"
übergeben:
Parameter:
1200 Baud
8 Datenbits
1 Stopbit
3-Draht-Handshake
Vollduplex
Keine Parität
OPEN 1,2,0,CHR$(0)+CHR$(0)+CHR$(53)
+CHR$(1)
Sie sehen, diesmal ist der "Filename" 4
Zeichen lang, wobei die letzten 2 Bytes
LO- und HI-Byte der User-Baud-Rate an-
geben. Sollten Sie jetzt einmal versu-
chen mit Ihrem 1200-Baud-Modem zu arbei-
ten, so werden Sie keine Schwierigkeiten
haben, zu kommunizieren, da wir ja jetzt
die richtige Baudrate eingestellt haben.
Soweit die erste Möglichkeit, den Be-
triebssystemfehler zu umgehen. In der
nächsten Ausgabe erfahren Sie dann, wie
Sie auch mit Ihren schon vorhandenen
Terminalprogrammen die 1200 Baud reali-
sieren können.