Magic Disk 64

home to index to html: MD8908-KURSE-DFUE_TEIL_1-1_-_DIE_SACHE_MIT_DEN_1200_BAUD....html
 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.                          
Valid HTML 4.0 Transitional Valid CSS!