Handbuch zur DFÜ - Datenfernübertragung mit dem Commodore 64
Handbuch zur DFÜ - Datenfernübertragung mit dem Commodore 64 | |||
---|---|---|---|
Sprache | deutsch | ||
Autor(en) | Rüdiger Schäfer | ||
Verlag | Data Becker | ||
Jahr | 1984 | ||
ISBN | ISBN 3-89011-058-4 | ||
Neupreis | |||
Datenträger | |||
Seitenzahl | 173 | ||
letzte Auflage | 1 | ||
Genre | Programmieren | ||
Information |
Buchrückseite[Bearbeiten | Quelltext bearbeiten]
DAS STEHT DRIN:
Dieses Buch ist unentbehrlich für jeden C-64-Besitzer, der sich mit dem interessanten Gebiet der Datenfernübertragung beschäftigen will. Mit Spitzenprogrammen für alle, die einen Akustikkoppler besitzen.
Aus dem Inhalt:
- Grundlagen der Datenübermittlung
- Schnittstelle RS-232 (V.24) und ihre Programmierung
- Wie funktioniert ein Modem
- ASCII-Codes
- Datenübertragungsprozeduren
- Einstieg mit dem Akustikkoppler
- DATEX-P — Das Datennetz der Post
- Datenbanken und Mailboxen
- Öffentlich zugängliche Datenbanken und Mailboxen
und vieles mehr.
UND GESCHRIEBEN HAT DIESES BUCH:
Rüdiger Schäfer ist Organisationsprogrammierer und seit vielen Jahren Datenfernübertragungsexperte auf Großrechnern. Natürlich ist er auch begeisterter
Anwender des COMMODORE-64.
Inhaltsverzeichnis[Bearbeiten | Quelltext bearbeiten]
1. EINLEITUNG............................................. 1 1.1. GRUNDLAGEN DER DATENÜBERMITTLUNG....................... 3 1.2. SCHNITTSTELLE.......................................... 6 1.3. Modem ................................................. 8 1.4. ASCII-CODES............................................ 11 1.5. DATENÜBERTRAGUNGSPROZEDUREN............................ 15 1.6. DATENSICHERUNG AUF DEM ÜBERTRAGUNGSWEG................. 24 1.7. PROGRAMMIERUNG DER RS-232-SCHNITTSTELLE................ 26 2.1. EINSTIEG MIT DEM AKUSTIKKOPPLER........................ 37 2.2. PROGRAMMGESTALTUNG. ................................... 40 DFÜ PROGRAMM .......................................... 43 2.3. MASCHINENPROGRAMMIERUNG. . ............................ 46 DFÜ PROGRAMM 2......................................... 53 2.4. ÜBERTRAGUNGSZEICHEN IM DIALOG-BETRIEB.................. 68 3.1. DATEX-P DAS DATENNETZ DER POST......................... 72 3.2 DATEX-P 20............................................. 77 3.3 TEILNEHMERKENNUNG (NUI) UND PASSWORD FÜR DATEX-P....... 82 3.4. VERBINDUNGSAUFNAHME ZUR PAD............................ 84 3.5 DAS-KOMMUNIKATIONS-PAKET............................... 89 DFÜ PROGRAMM 3......................................... 94 4.1. DATENBANKEN UND MAILBOXEN.............................. 113 4.2.0 ÖFFENTLICH ZUGÄNGLICHE DATENBANKEN UND MAILBOXEN....... 117 4.2.1 TEDAS.................................................. 118 4.2.2 WDR-COMPUTER-CLUB...................................... 121 4.2.3 OTIS................................................... 123 4.2.4 MCS.................................................... 126 4.2.5 SYMIC.................................................. 129 4.2.6 TECOS.................................................. 131 4.2.7 TAUNUS MAILBOX......................................... 133 4.2.8 EVD.................................................... 134 4.2.9 COMPUTER CENTER........................................ 136 4.2.10 C-64 BOX............................................... 137 4.2.11 EPSON.................................................. 138 4.2.12 DEKATES................................................ 139 4.2.13 SOFTWARE EXPRESS....................................... 141 4.2.14 RMI.................................................... 142 4.3.0 SCHWEIZ................................................ 144 4.3.1 ENGLAND................................................ 146 4.3.2 WEITERE DATENBANKEN.................................... 149 5. DIE EIGENE MAILBOX..................................... 150 MAILBOX PROGRAMM 1..................................... 154 MAILBOX PROGRAMM 2..................................... 158 GLOSSAR 1.............................................. 166 GLOSSAR 2.............................................. 170
Leseprobe[Bearbeiten | Quelltext bearbeiten]
(1. Auflage - Seite 26ff: Kapitel "1.7. PROGRAMMIERUNG DER RS-232-SCHNITTSTELLE")
Wer das Benutzer-Handbuch oder Programmier-Handbuch schon einmal intensiv durchgelesen hat, wird bestimmt schon den Namen RS-232-Interface oder USER-PORT gelesen haben. Dieses RS-232-Interface ist die Brücke zur Außenwelt für den C-64. Genauer gesagt ist es der USER-PORT, denn dieser Port ist direkt an den Chip 6526 CIA angeschlossen, der wiederum mit Hilfe von Software gesteuert werden kann. Die Steuerung des Interfaces kann entweder durch BASIC oder über Kernal-Routinen (bei Maschinenspracheprogrammierung) geregelt werden.
Um gleich einer Verwechslung aus dem Weg zu gehen, RS-232 ist gleichbedeuted mit V.24, wie schon in Kapitel 1.2. erwähnt. Wir brauchen uns also nur das RS-232/V.24 Interface Steckmodul zu kaufen und auf den USER-PORT zu setzen.
Das Interface besitzt die Gerätenummer 2. Um also die Schnittstelle anzusprechen, machen wir das wie gewöhnlich mit einer OPEN-Anweisung.
OPEN 1lfn,2,0
Mit Hilfe dieser OPEN-Anweisung können wir auch noch verschiedene andere Befehle an die Schnittstelle senden. Das geschieht mit Hilfe eines Steuer- und Befehlsregisters.
OPEN lfn,2,0,"(Steuerregister) (Befehlsregister)"
STEUERREGISTER:
Mit dem Steuerregister, welches ein 1-Byte-Zeichen ist,
lassen sich folgende Kriterien festlegen:
- Anzahl der Stoppbits
- Wortlänge
- Baudrate
Das erste Bit des 7 Bit-Steuerregisters definiert die Anzahl der Stopbits.
0 | = | 1 STOP BIT |
1 | = | 2 STOP BITS |
Wie wir ja schon wissen, verwenden wir beim C-64 die asynchrone Übertragung, also das Start-Stop Verfahren. Nach jedem Zeichen werden ein oder zwei Stopbit angehängt. Hier können wir also die Anzahl der Stop-Bits festlegen. Unter normalen Voraussetzungen verwenden wir immer ein Stop-Bit.
Die nächsten beiden Bits legen die Wortlänge des zu übermittelnden Zeichens fest. Wie wir ja schon gesehen haben, gibt es verschiedene Code-Rahmen mit unterschiedlicher Anzahl Bits. Durch diese 2 Bits läßt sich festlegen, welchen Code-Rahmen wir verwenden wollen.
0 | 0 | = | 8 Bits ( EBCDIC CODE fuer IBM-Computer) |
0 | 1 | = | 7 Bits ( CCITT Nr.5, DIN 66003, USASCII) |
1 | 0 | = | 6 Bits ( TRANSCODE ) |
1 | 1 | = | 5 Bits (TTS-Code,CCITT Nr.2,TELETYPE) |
Vergleichen Sie bitte hierzu noch einmal das Kapitel 1.4. ASCII-Codes. Im Normalfall verwenden wir aber den 7-Bit-Code.
Das nächste Bit ist unbenutzt und wird immer mit einer 0 belegt.
Die letzten 4 Bits definieren die Baudrate (Bits/Sekunde), also die Übertragungsgeschwindigkeit, mit der wir die Zeichen übermitteln wollen. Bei den meisten Akustikkopplern sind das 300 Baud.
0 0 0 0 | = | Benutzer-Baudrate, selbst definierbar |
0 0 0 1 | = | 50 Baud |
0 0 1 0 | = | 75 Baud |
0 0 1 1 | = | 110 Baud |
0 1 0 0 | = | 134.5 Baud |
0 1 0 1 | = | 150 Baud |
0 1 1 0 | = | 300 Baud (bei Akustikkopplern) |
0 1 1 1 | = | 600 Baud |
1 0 0 0 | = | 1200 Baud |
1 0 0 1 | = | 1800 Baud |
1 0 1 0 | = | 2400 Baud |
1 0 1 1 | = | 3600 Baud (nicht implementiert) |
1 1 0 0 | = | 4800 Baud (s.o.) |
1 1 0 1 | = | 7200 Baud (s.o.) |
1 1 1 0 | = | 9600 Baud (s.o.) |
1 1 1 1 | = | 19200 Baud ( s.o. ) |
Wir wollen jetzt mal mit Hilfe des Steuerregisters folgende Parameter festlegen: 1 Stopbit, 7-Bit-Wortlänge für unseren ASCII-Code und eine Baudrate von 300 für einen Akustikkoppler.Das würde so aussehen:
0 | = 1 Stop-Bit |
0 0 1 | = 7 Bit Wortlänge |
0 0 1 0 | = nicht benutzt und bleibt auf 0 |
0 0 1 0 0 1 1 0 | = 300 Baud |
Die binäre Zahl 00100110 ergibt dezimal 38. Diese Parameter können wir dann mit der OPEN-Anweisung festlegen:
OPEN 1fn,2,0,CHR$(38)
BEFEHLSREGISTER:
Das Befehlsregister ist ebenfalls ein 1 Byte-Zeichen, mit
dessen Hilfe wir folgende Parameter festlegen können:
- Art der Paritätsprüfung (vergl. Kapitel 1.6.)
- Vollduplex oder Halbduplex (Art der Übertragung)
- Art des Handshake
Die ersten 3 Bits legen die Paritätsparameter fest:
0 0 0 | = Keine Paritätsprüfung |
0 0 1 | = Ungerade Paritätsprüfung (ODD PARITY CHECK) |
0 1 1 | = Gerade Paritätsprüfung (EVEN PARITY CHECK) |
1 0 1 | = Keine Paritätsprüfung, 8.Datenbit immer 1 |
1 1 1 | = Keine Paritätsprüfung, 8.Datenbit immer O |
Das nächste Datenbit legt die Übertragungsart fest, wobei Vollduplex und Halbduplex unterschieden werden. Vollduplex bedeutet, daß gleichzeitig Datentransfers in beiden Richtungen möglich ist. Halbduplex bedeutet hingegen, daß Daten zu einer Zeit nur in eine Richtung übertragen werden dürfen.
0 | = Vollduplex (FULL DUPLEX) |
1 | = Halbduplex (HALF DUPLEX) |
Die nächsten 3 Datenbits bleiben unbenutzt und werden mit einer 0 belegt.
Das letzte Bit legt die Handshake-Art fest. Was ist aber nun "Handshake"?
Handshake ist englisch und bedeutet soviel wie "Hände schütteln". Das ist die mehr bildhafte Erklärung, was es wirklich tut. Wir haben 2 Arten zur Auswahl, nämlich die 3-Draht-Handshake Art und die X-Draht-Handshake Art. Bei: der 3-Draht-Handshake Art sendet der Computer die Daten, ohne Rücksicht darauf, ob die Gegenstelle diese Daten in der Zwischenzeit schon abgearbeitet hat. Dabei kann es passieren, daß wenn die Gegenstation die Sendedaten nicht schnell genug aus dem Puffer holt, ein Pufferüberlauf stattfindet und Daten verloren gehen. Also eine äußerst unangenehme Situation. Der Name 3-Draht Handshake kommt daher, daß effektiv nur drei Leitungen des Interfaces benutzt werden.
Leichter haben wir es, wenn wir die X-Draht-Handshake Art verwenden. Dabei wird eine CTS-Leitung verwendet (CTS = Abk. für CLEAR TO SEND), die regelt, daß, wenn der Datenpuffer voll ist, die Datenübertragung .so lange gestoppt wird, bis eine weitere Übertragung ermöglicht wird, sprich der Puffer leer ist. Also im Gegensatz zur 3-Draht Art eine wesentlich sicherere Art, Daten zu übertragen.
0 | = 3-Draht-Handshake |
1 | = X-Draht-Handshake |
Somit wären die Parameter des Befehlsregisters auch erklärt. Wir wollen nun auch wieder hierfür ein Beispiel geben. Wir wollen eine ungerade Paritätsprüfung, Halbduplex-Betrieb und einen X-Draht-Handshake.
001 | = Ungerade Paritätsprüfung |
0011 | = Halbduplex-Betrieb |
0011000 | = Diese Bits stehen immer auf 0 ! |
00110001 | = X-Draht-Handshake |
Wir wollen auch hier wieder die binäre Zahl 00110001 in dezimal darstellen, was 49 ergibt.
Zusammen mit dem vorherigen Steuerregister wollen wir jetzt wieder die OPEN-Anweisung durchführen.
OPEN 1fn,2, CHR$(38)+CHR$(49)
Diese Register können Sie immer nach Ihren Gegebenheiten parameterisieren. Durch eine Menue-Programmierung könnte das wesentlich erleichtert werden.
Noch ein Wort zur Realisierung der eigenen Baudrate. Wenn Sie keine der vorgegebenen Übertragungsgeschwindigkeiten benutzen wollen, so können Sie das ja mit dem Steuerregister bekunden, indem Sie anstatt der Baudrate dort die entsprechenden Bits mit Nullen belegen. In dem Fall müssen Sie aber nach dem Steuer- u. Befehlsregister noch das Low-Byte und das High-Byte des Timerwertes angeben. Die Timer lösen in einem bestimmten Zeittakt einen nicht maskierbaren Interrupt aus, der abhängig von der Baudrate ist. Dieser Timerwert läßt sich folgendermaßen errechnen:
- Timerwert = 492662 / Baudrate - 101
Diesen Timerwert müssen Sie dann in den Lower-Byte und Higher-Byte zerlegen und an das Steuer- u. Befehlsregister anhängen. Ein Beispiel:
wir wollen die Baudrate von 200 implizieren. Der Timerwert kann dann folgendermaßen errechnet werden:
- Timerwert = 492662/200 - 101
- Timerwert = 2362,31
Das Higher-Byte wird dann folgendermaßen ermittelt:
- Higher-Byte = 2362,31/256 ‚abgerundet = 9
Daraus ergibt sich nun das Lower-Byte:
- Lower Byte = Timerwert - (Higher-Byte*256)
- also Lower Byte = 2362,31 - (9%256)ergibt58
Hängen wir nun diese Werte an das Steuer- u. Befehlsregister an:
OPEN 1fn,2,0,CHR$(32)+CHR$(33)+CHR$(58)+CHR$(9)
Als kleines Programm könnte das so aussehen:
INPUT" BAUDRATE :";A TW=492662/A - 101 TH=INT(T/256):TL=T - TH* 256 PRINT" LOWER BYTE ="; TL PRINT" HIGHER BYTE =";TH
Jetzt noch einige Hinweise, die bei der Durchführung der RS-232 Programmierung äußerst wichtig sind.
Die OPEN-Anweisung muß UNBEDINGT VOR der Erstellung von Variablen oder Feldern ausgeführt werden, da nach dem Öffnen des RS-232-Kanals automatisch ein CLR ausgeführt wird, was die Variablen löscht. Der Grund dafür liegt darin, daß das RS-232 Interface zwei Puffer benötigt, genauer zwei FIFO (first in, first out)-Puffer mit jeweils 256 Bytes, die sich am oberen Speicherende befinden. Nach der Open-Anweisung werden automatisch 512 Bytes für die RS-232 reserviert.
Sollte nicht genug Platz vorhanden sein, wird keine Fehlermeldung (OUT OF MEMORY) ausgegeben und so das Programmende zerstört. Alle schon erstellten Variablen und Felder werden gelöscht.
Ein CLR wird ebenfalls beim Schließen der RS-232 durchgeführt, wobei wieder die schon erstellten Felder und Variablen zerstört werden. Sie sollten die CLOSE-Anweisung erst zu allerletzt anwenden, wenn schon alle Daten anderweitig z.B. auf Diskette gespeichert sind.
Also seien Sie bitte vorsichtig und bringen Sie die OPEN-Anweisung an der erstmöglichen Stelle in Ihrem Programm unter, um kein Programm oder Variablen zu zerstören. Nach der Ausführung der CLOSE-Anweisung werden die beiden Puffer wieder automatisch gelöscht. Weiterhin darf nur immer ein RS-232 Kanal offen sein, denn durch eine zweite OPEN-Anweisung werden die Pufferzeiger zurückgestellt.
Um von dem RS-232 Kanal Daten einzulesen, verwenden wir im BASIC die GET#-Anweisung. Die INPUT#-Anweisung würde ich nicht empfehlen. Wenn GET# keine Daten mehr im Puffer findet, dann wird das Zeichen "" CHR$(0) ausgegeben. Wird INPUT# dagegen verwendet, wartet das System so lange, bis es ein nicht Nullzeichen empfängt und danach ein CR CHR$(13). Aus diesem Grund ist die Verwendung von GET# sicherer.
Um Daten in den RS 232 Kanal zu übertragen, verwenden wir die normale PRINT#-Anweisung, oder, falls wir alle Daten direkt zum Kanal senden wollen, die CMD-Anweisung. Das Schließen des Kanals geschieht durch CLOSE.
Wie Sie sehen, können Sie dieselben BASIC-Befehle benutzen, als wenn Sie zu einem anderen Gerät, etwa zu der Diskettenstation, Daten schicken wollen. Allerdings müssen wir uns im klaren sein, daß wir, wenn wir BASIC zur Datenübertragung benutzen, bei steigender Baudrate Schwierigkeiten mit der Zeit bekommen. Bei 300 Baud kommen rd. 42 Zeichen pro Sekunde in unserem Datenpuffer an, die abgearbeitet werden müssen. Das liegt bei BASIC noch im Bereich des möglichen.
Allerdings läßt sich in Maschinensprache viel eleganter programmieren.
Bei der Maschinenprogrammierung greifen wir auf die KERNAL-Routinen zurück, die uns die Programmierung wesentlich erleichtern. Ich setze mal voraus, daß Sie schon etwas Maschinenprogrammierung können und ein bißchen mit den KERNAL-Routinen gearbeitet haben. Wenn Sie sich bisher noch nicht damit beschäftigt haben und auch kein Interesse daran haben, brauchen Sie keine Angst zu haben. Im weiteren Verlauf des Buches gibt es lauffertige Maschinenprogramme mit einem Basiclader, so daß Sie keine Schwierigkeiten mit der Sprache bekommen.
Zur Eröffnung des RS 232 Kanals verwenden wir die OPEN ($FFCO)-Routine, mit den beiden Vorbereitungsroutinen SETLFS ($FFBA) und SETNAM ($FFBD). Bei der SETNAM- Routine verwenden wir anstelle eines Filenamens das Steuer- und Befehlsregister.
LDA #NAME2-NAME ; Länge des Namens LDY #H,NAME ; Higher Byte ins Y-Register LDX #L,NAME ; Lower Byte ins X-Register JSR SETNAM LDA #2 ; Logische Dateinummer in den Akku LDX #2 ; Gerätenummer ins X-Register LDY #255 ; Anstelle von 0 setzen wir 255 JSR SETLFS JSR OPEN NAME .BYTE 36 49 ; Steuer- und Befehlsregister NAME2
Das Lesen vom RS 232 Kanal geschieht durch die Kanaleröffnung CHKIN ($FFC6) und durch GETIN ($FFE4). Die Routine CHRIN ($FFCF) empfehle ich aus dem gleichen Grund nicht wie die Input-Routine.
Die Ausgabe über den Kanal kann man ebenfalls durch die Kanaleröffnung CHKOUT ($FFC9) und durch die anschließende Datenausgabe durch CHROUT ($FFD2) regeln.
Man schließt den Kanal durch den CLOSE ($FFC3)-Befehl. Noch ein Wort zum Status-Register. Das Register hat andere Bedeutungen als bei der normalen Datenübertragung. Die Bedeutungen sind folgende:
BIT | FEHLERBESCHREIBUNG |
0 | Paritätsfehler |
1 | Rahmenfehler |
2 | Empfängerpufferüberlauf |
3 | Empfängerpuffer leer |
4 | CTS(CLEAR TO SEND) Signal fehlt |
5 | keine Bedeutung |
6 | DSR(DATA SET READY) Signal fehlt |
7 | Break Signal empfangen |
Wenn man den Status öfters verwenden will, z.B. bei einer Fehlerauswertung, so muß zuerst der Inhalt von ST in eine andere Variable übertragen werden, da der Status nach dem Programmende gelöscht wird.