zjlink: Dateitransfer via Nullmodem

Hintergrund

Ich habe nach Wegen gesucht meinen alten PC-AT 80286 mit neuer Software zu versorgen. Er verfügt zwar über ein 5,25"- und ein 3,5"-Floppy-Laufwerk, aber selbige sind bei neuen Rechnern nicht mehr anzutreffen. Im Nachhinein betrachtet wäre die Anschaffung eines USB-Floppy-Laufwerks für ca. 15 Euro keine so schlechte Investition gewesen, aber ich bin mir sicher, dass die damals teurer waren, falls es überhaupt schon welche gab. Jedenfalls hatte ich mich für die Verwendung des COM-Ports in Verbindung mit einem Nullmodem-Kabel entschieden.

Um ein solches Kabel zu nutzen braucht man passende Software auf beiden Seiten. Erschwerend kam hinzu, dass auf dem 286er MS-DOS 5.0 und auf dem anderen Rechner Windows XP lief. Das Pärchen INTERLNK.EXE/INTERSVR.EXE gibt es erst mit MS-DOS 6.0 und das früher sehr gelobte LapLink ist nicht kostenlos erhältlich. Deshalb entschloss ich mich dazu ein eigenes Programm zu schreiben. Das geschah zeitweise tatsächlich an beiden PCs gleichzeitig (ein Turbo C hatte ich zum Glück schon drauf), nachdem die Grundfunktion dann vorhanden war konnte ich die geänderten Quellcode-Anteile auf den jeweils anderen Rechner übertragen. :-)

Update: LapLink scheint inzwischen doch kostenlos verfügbar zu sein: https://winworldpc.com/product/laplink/.

Funktionsweise

Das Programm kann in einem Server-Modus und in einem Client-Modus laufen, wobei die Dateien vom Client zum Server übertragen werden. Während der Übertragung wird ein Fortschrittsbalken angezeigt. Die Baudraten können beliebig gewählt werden, jedoch kann es sein, dass die Hardware nicht alle Werte unterstützt; mit der "Normreihe" 9600, 14400, 19200, 38400, etc. ist man auf der sicheren Seite.

Auf der MS-DOS-Seite wollte ich zuerst BIOS-Routinen benutzen (Interrupt 14h), aber das hat nicht geklappt. Stattdessen habe ich direkt Kontakt mit dem 8250 UART-Baustein aufgenommen. Die Seite, die mir damals sehr geholfen hatte, ist mittlerweile nicht mehr verfügbar, aber mit den Suchworten "8250 UART programming" findet man einiges. Kurz gesagt schreibe ich über selbst gesetzte Zeiger direkt in die Register des Bausteins (ist ja unter MS-DOS problemlos möglich). Leider habe ich es nicht hinbekommen den FIFO und die Interrupts zu nutzen (da fehlen mir Grundkenntnisse aus der DOS-Steinzeit), weshalb ich das UART polle. Das hat den großen Nachteil, dass die CPU während des Empfangs nichts anderes tun darf, weil sonst Daten verloren gehen. Das heißt insbesondere auch nicht die empfangenen Daten in eine Datei weg schreiben. Ich habe dann aus der Not eine Tugend gemacht und ein Übertragungsprotokoll definiert:

  1. Der Sender schreibt einen Block (z.B. 1024 Zeichen)
    Der Empfänger liest diese immer sofort aus dem UART in einen Puffer
  2. Der Sender berechnet eine Checksumme über den Block und sendet diese
  3. Der Empfänger prüft die Daten anhand der Checksumme
  4. Wenn die Daten OK sind werden sie in die Datei geschrieben (was beliebig lange dauert)
  5. Der Empfänger signalisiert dem Sender ob die Daten in Ordnung waren oder nicht

Sind die Daten in Ordnung fährt der Sender mit dem nächsten Block fort, andernfalls sendet er den gleichen Block erneut. Da der Sender nicht fortfährt, bis der Empfänger sich in Punkt 5 äußert, bleibt dem Empfänger beliebig viel Zeit um die Daten abzuspeichern.

Über diese blockweise Datenübertragung habe ich ein Anwendungsprotokoll gesetzt, das Dateinamen und Längenangaben überträgt. Damit ist zum einen das Senden mehrerer Dateien in einer Sitzung möglich, zum anderen weiß der Empfänger, wie viel zu lesen ist, was den Einsatz blockierender Lesefunktionen erlaubt und eine Fortschrittsanzeige ermöglicht.

Update: In meinem neueren Projekt pc-serial-loader verwende ich mittlerweile doch die BIOS-Routinen, u.a. weil der Loader-Anteil in Assembler geschrieben ist. Ein wesentlicher Nachteil dieses Ansatzes ist die Begrenzung der Übertragungsgeschwindigkeit auf maximal 9600 Baud.

Downloads

Die DOS-Binaries sind mit Turbo C 2.01 compiliert. Dieses gibt es kostenlos im ehemaligen Borland Museum, das jetzt bei Embarcadero gehostet wird.
Antique Software: Turbo C version 2.01.

Datum Version Datei Beschreibung
2008-10-28 1.0 zjlink-1.0.win32.zip Binaries für Win32
zjlink-1.0.dos.zip Binaries für MS-DOS
zjlink-1.0.src.zip Quellcode

Zurück zur Hauptseite