SHARP <--> PC, Version 1.05

          Inhaltsverzeichnis

          1. Einleitung
          2. Kurzbeschreibung des Programms
             2.1 Daten vom Sharp laden (CSAVE/PRINT #)
             2.2 Daten zum Sharp schicken (CLOAD/INPUT #)
             2.3 Daten auf Diskette speichern
             2.4 Daten von Diskette laden
             2.5 BASIC-Programm (ASCII-Text) von Diskette laden
             2.6 Programm LISTen
             2.7 Druckerport ändern
             2.8 Verzeichnis anzeigen
          3. Wichtige Hinweise
          4. Für den interessierten Benutzer
             4.1 Der PC und sein Timerlein
             4.2 Unterstützte Sharp-Dateien
             4.3 Programmpflege
          5. Eine kleine Referenz - Technische Informationen
             5.1 Das Interface zwischen Sharp und PC
             5.2 Das Übertragungsformat
                 5.2.1 Am Anfang war das Bit - oder "Von Nullen und Einsen"
                 5.2.2 Vom Bit zum Byte - oder "Nibble, wechsle dich"
                 5.2.3 Der Header - oder "Mit dem Kopf durch das Band"
                 5.2.4 Blöcke und Prüfsummen
          6. Schlußbemerkung

SHARP.EXE - Die Verbindung zwischen PC/AT und Sharp PC-1401/2/3

 1. Einleitung

          Wer hat sich noch nicht über die kleine Tastatur des Sharp  geär-
          gert, wenn er lange  Basic-Programm eintippen wollte oder  mußte?
          Mit  dem   Kassetteninterface   lassen  sich   zwar   die   Daten
          abspeichern, es hilft aber recht  wenig bei der Tipparbeit.  Doch
          die kann man sich jetzt um einiges erleichtern.

          Dieses Programm ist für alle, die einen Sharp-Pocketcomputer  der
          Serie PC-140x und  Zugriff auf einen  IBM-kompatiblen PC oder  AT
          haben. Es dient zur Dateiübertragung zwischen den beiden Rechner-
          typen. Damit kann man Programme auf dem PC mit seinem  Lieblings-
          editor schreiben und hinterher  über Kabel zum Sharp  übertragen.
          Oder umgekehrt lassen  sich Programme vom  Sharp zum PC  schicken
          und dort ausdrucken. Oder einfach auf der Festplatte oder Disket-
          te archivieren. Oder ...

          Voraussetzung ist ein kompatibler PC oder AT mit mindestens einer
          freien parallelen Schnittstelle und ein (selbstgelötetes)  Kabel.
          Ein Schaltungsvorschlag folgt weiter  unten in dieser  Dokumenta-
          tion.

          Eine kurze Bemerkung im voraus: ALLE Zahlenangaben in diesem Text
          sind Hexadezimalzahlen,  auch  wenn sie  nicht  ausdrücklich  als
          solche markiert  sind. Erscheinen  irgendwo dezimale  Zahlen,  so
          sind sie ausdrücklich als solche gekennzeichnet.

 2. Kurzbeschreibung des Programms

          Das Programm wird durch die  Eingabe von "SHARP" gestartet,  ohne
          irgendwelche Parameter  oder Optionen.  Es erscheint  sofort  das
          Haupt- und einzige Menü. Hier eine Kurzbeschreibung der einzelnen
          Menüpunkte:

 2.1 Daten vom Sharp laden (CSAVE/PRINT #)

          Mit diesem Befehl  werden Daten und  Programme vom  Sharp zum  PC
          übertragen. Das Programm erwartet danach noch einmal einen  Druck
          auf die RETURN-Taste und dann die Daten vom Sharp am Druckerport.
          Sind nach etwa fünf Sekunden  immer noch keine Daten  angekommen,
          so gibt's eine Fehlermeldung, und das Programm kehrt unverrichte-
          ter Dinge wieder zum Hauptmenü zurück. Also zuerst auf dem  Sharp
          CSAVE (oder CSAVE "NAME" oder CSAVE "NAME","PASSWORT" etc.)  tip-
          pen, dann erst auf dem PC die Return-Taste drücken.

 2.2 Daten zum Sharp schicken (CLOAD/INPUT #)

          Dies ist die Umkehrung des  ersten Befehls. Wenn ein Programm  im
          Speicher des PC ist, so erfolgt (schon wieder) die  Aufforderung,
          RETURN zu drücken. Danach schiebt  der PC unerbittlich die  Daten
          zum Sharp 'rüber, und läßt sich nicht einmal mehr durch den  "Af-
          fengriff" (Ctrl-Alt-Del) davon  abbringen. Also  erst beim  Sharp
          CLOAD (oder CLOAD "NAME" oder ...) eingeben, und dann RETURN  auf
          dem PC drücken!

 2.3 Daten auf Diskette speichern

          Mit diesem Menüpunkt schreibt man die Daten, die im  Arbeitsspei-
          cher des PC stehen, auf das Disketten- oder  Festplattenlaufwerk.
          Auf die Frage nach dem  Dateinamen kann man mit einem  kompletten
           Pfadnamen antworten. Ist ein Vorschlag in eckigen Klammern "[VOR-
          SCHLAG]" vorgegeben, reicht ein  einfacher Druck auf die  Return-
          Taste, um den Namen zu übernehmen.

 2.4 Daten von Diskette laden

          Dies ist die Umkehrung zu Punkt drei. Man wird nach einem  Datei-
          namen gefragt, und diese  Datei wird dann (hoffentlich)  eingele-
          sen. Taucht ein  Fehler auf,  so wird  dieser angezeigt  ("Fehler
          beim Öffnen" bedeutet meistens: "Datei nicht gefunden"). Es  kön-
          nen nur Daten eingelesen  werden, die mit  dem Punkt drei  vorher
          geschrieben wurden.

 2.5 BASIC-Programm (ASCII-Text) von Diskette laden

          Mit diesem Menüpunkt werden BASIC-Programme im Klartext  eingela-
          den und in das Sharp-Format konvertiert (kann recht lange dauern,
          da ich den primitivsten und langsamsten Algorithmus benutzt habe,
          den ich finden konnte). Man kann aber die konvertierten Programme
          mit Punkt drei sichern und später mit Punkt vier schneller wieder
          einlesen (zum Archivieren). Das Programm erkennt auch die Symbole
          "¹" (Wurzelzeichen) und "Ò" (Pi) korrekt. Die Programmzeilen wer-
          den beim Einlesen in aufsteigender Reihenfolge sortiert. Doppelte
          oder zu große Zeilennummern werden erkannt und angemeckert.  Syn-
          taxfehler und zu lange Zeilen allerdings nicht. Hier muß der  Be-
          nutzer (ganz recht: SIE!) selbst  aufpassen. Siehe dazu auch  das
          Kapitel "Wichtige Hinweise".

 2.6 Programm LISTen

          Wenn ein BASIC-Programm im Speicher  ist, so erscheint die  Frage
          nach dem "wohin". Ein RETURN als Antwort schickt das Listing  zum
          Gerät CON, also auf den  Bildschirm. Es kann jeder Datei-,  Pfad-
          oder Gerätename angegeben werden.  Beispiele: PRN oder LPT1  oder
          LPT2 -->  Drucker, COM1  oder  COM2 -->  serielle  Schnittstelle,
          c:\sharp\test.bas --> Datei  auf der Diskette.  Die Angabe  eines
          Dateinamens erlaubt es übrigens, das Programm in eine ASCII-Datei
          zu schreiben, die mit einem beliebigen Texteditor geändert werden
          kann (Programmpflege!).  Die  so abgespeicherten  und  geänderten
          Programme lassen sich mit Punkt fünf wieder einlesen.

 2.7 Druckerport ändern

          Beim Start geht das Programm  davon aus, daß das  Sharp-Interface
          am "letzten"  verfügbaren Druckerport  hängt. Ist  das nicht  der
          Fall, so kann man die  Einstellung mit dieser Option ändern.  Er-
          laubt sind die  Schnittstellen LPT1  bis LPT4.  Ist die  gewählte
          Schnittstelle nicht vorhanden, so gibt das Programm eine  Fehler-
          meldung aus und behält die Voreinstellung.

 2.8 Verzeichnis anzeigen

          Mit dieser Option kann man sich das Verzeichnis der Diskette bzw.
          Festplatte anzeigen lassen. Das Programm fragt nach einer  Maske.
          Drückt man einfach RETURN, so werden alle Basic-Dateien angezeigt
          (erkennbar an dem nachgestellten ".BAS"). Man kann aber jede  be-
          liebige Suchmaske angeben, z.  B. *.* für  alle Dateien im  aktu-
          ellen Verzeichnis, c:\*.bas für  alle Basic-Dateien im  Hauptver-
          zeichnis von c: etc. Wird  nur ein Verzeichnisname angegeben,  so
          zeigt das Programm alle Dateien  in diesem Verzeichnis (so  zeigt
          z.B.  \  das  Hauptverzeichnis).  Unterverzeichnisse  werden   in
          Großbuchstaben angezeigt, Dateinamen in Kleinbuchstaben.

 3. Wichtige Hinweise

          Dieses Programm ist  nicht perfekt. Es  findet keine  Überprüfung
          statt, ob die eingelesen BASIC-Zeilen  zu lang sind, oder ob  das
          Programm zu lang wird. Tritt ein solcher Fall ein, so können  in-
          terne Daten überschrieben werden, was unter Umständen den Rechner
          dazu veranlassen könnte,  seinen Dienst vorübergehend  einzustel-
          len. Die Aufnahmekapazität  für Daten beträgt  exakt 32000  Bytes
          (Konstante MAX_MEM in SHARP.C),  was für die meisten  Anwendungen
          ausreichen wird. Die maximale Länge einer BASIC-Zeile beträgt  80
          Bytes (das sind wegen der  gepackten Darstellung im Rechner  mei-
          stens wesentlich mehr  Zeichen). Der Benutzer  ist dafür  verant-
          wortlich, daß diese Grenzwerte nicht überschritten werden.

          Außerdem ist darauf zu achten, daß der Sharp PC-1403 auch  kleine
          Buchstaben beherrscht.  Besitzer der  "älteren" Sharps,  die  nur
          Großbuchstaben kennen, müssen beim Eingeben der Programme  selbst
          darauf achten, daß  in Kommentaren  (REM-Zeilen) und  Textstrings
          keine Kleinbuchstaben  vorkommen. Bei  den Basic-Befehlen  selbst
          spielt die Graphie keine Rolle.

          Wenn Daten an  den Sharp übertragen  werden (Menüpunkt zwei),  so
          produziert das  Programm unerbittlich  seine Tonfrequenzen,  auch
          wenn gar kein  Sharp angeschlossen ist.  Man kann diesen  Vorgang
          nicht einmal mit dem "Affengriff" unterbrechen. Das liegt  daran,
          daß während  des Sendens  alle Interrupts  gesperrt sind.  Leider
          läßt sich  das nicht  verhindern, da  sonst nicht  sichergestellt
          werden kann, daß das Timing exakt eingehalten wird. Beim  Empfan-
          gen von Daten  (Menüpunkt zwei) gilt  übrigens ähnliches,  jedoch
          wird dort nach spätestens 5  Sekunden mit einem Timeout  abgebro-
          chen, wenn kein  gültiges Signal vom  Sharp gelesen werden  kann.
          Die Sache mit dem gesperrten Interrupt hat übrigens auch noch den
          Nebeneffekt, daß die Systemuhr im  PC hinterher ein paar  Minuten
          nachgeht, da sie direkt vom Timerinterrupt abhängig ist.

  4. Für den interessierten Benutzer

 4.1 Der PC und sein Timerlein

          Die Sende- und Empfangsroutinen arbeiten unabhängig von der Takt-
          frequenz des  verwendeten  PC's. Für  die  nötigen  Zeitmessungen
          wurde der Kanal 2 des in jedem PC vorhandenen Timer-Bausteins be-
          nutzt. Dieser Kanal  fristet normalerweise als  Frequenzgenerator
          für den Lautsprecher (wer kennt nicht das nervtötende Piepsen bei
          falschen Tastatureingaben!?) ein langweiliges Dasein und wird für
          die kleine Abwechslung sicher dankbar sein. Wer einen  frisierten
          Sharp mit einer anderen Taktfrequenz hat, müßte Daten zum PC ohne
          Fehler übertragen können,  da der Sharp  vor der Übertragung  ein
          spezielles Synchronisationssignal sendet. Er   (der Mensch)  wird
          aber wegen der geänderten Taktfrequenz  keine Daten an den  Sharp
          zurückschicken können. Dessen Empfangsroutinen sind leider  recht
          empfindlich  gegenüber  geänderten  Tonfrequenzen.  Eine  Abhilfe
          schafft der folgende Trick:

          Das Programm benutzt zum Senden  von Daten an den Sharp eine  Va-
          riable, die die benötigte  Zeitkonstante enthält. Diese  Variable
          ist mit einem Standardwert, der für den "normalen" Sharp  berech-
          net wurde, initialisiert. Bei jedem Ladevorgang wird diese  Zeit-
          konstante anhand des Synchronisationssignals neu berechnet.  Wer-
          den also zuerst irgendwelche "Dummy"-Daten vom Sharp zum PC über-
          tragen (der Vorspann reicht schon aus, danach darf BREAK gedrückt
          werden), so wird die Zeitkonstante  neu berechnet und behält  bis
          zum Programmende ihre Gültigkeit.

 4.2 Unterstützte Sharp-Dateien

          Das Programm lädt und erkennt automatisch folgende Dateitypen:

           Typ                ¦ speichern/laden z.B. mit
          -------------------+-------------------------------------------------
          Basic              ¦ CSAVE                   CLOAD
                             ¦ CSAVE "NAME"            CLOAD "NAME"
          Basic mit Password ¦ CSAVE ,"PASWORD"        CLOAD
                             ¦ CSAVE "NAME","PASWORD"  CLOAD "NAME"
          Binärdateien       ¦ CSAVE M;Startadresse,Endadresse
                             ¦ CSAVE M"NAME";Startadresse,Endadresse
                             ¦ CLOAD M                 CLOAD M"NAME"
                             ¦ CLOAD M;Ladeadresse     CLOAD M"NAME";Ladeadresse
          Datendateien       ¦ PRINT #Variable         PRINT #"NAME";Variable
                             ¦ INPUT #Variable         INPUT #"NAME";Variable

          Noch einige Anmerkungen dazu:

          Datendateien können nur sehr eingeschränkt benutzt werden, da mir
          das genaue Dateiformat nicht bekannt ist. Konkret heißt das,  daß
          beim PRINT#-Befehl  keine Variablenliste  angegeben werden  kann,
          sondern nur eine einzige Variable. Konstrukte mit Sternchen (z.B.
          "PRINT #B*")  sind allerdings  erlaubt.  Für Hinweise  zu  diesem
          Thema bin ich natürlich dankbar.

          Die Syntax  einiger der  aufgeführten  Befehle ist  (glaube  ich)
          nicht korrekt. So merkwürdig sich das anhört: ich selbst bin kein
          Besitzer eines Sharp-Rechners;  daher kann ich  für die  korrekte
          Syntax der Befehle nicht garantieren.

 4.3 Programmpflege

          Wenn das Programm verändert und neu übersetzt werden muß, so  ist
          darauf zu achten,  daß der  C-Compiler unbedingt  auf das  kleine
          Speichermodell eingestellt wird (SMALL  MODEL), da sonst die  As-
          semblerroutinen durcheinander geraten.  Das geschieht bei  Micro-
          soft mit der Option /AS, bei Turbo-C durch den Menüpunkt Options/
          Compiler/Model/Small (bzw. mit der  Option -ms bei der  Kommando-
          zeilenversion). Das C-Programm läßt sich mit jedem "modernen"  C-
          Compiler, das Assemblerprogramm mit MASM 5.1 oder TASM 1.0  über-
          setzen (Vorsicht: Die korrekte Groß- und Kleinschreibung der  Op-
          tionen und die Semikola am Zeilenende sind wichtig!).

          Mit Microsoft-Programmen:

              cl /c /AS /Ox /Gs sharp.c
              masm /Mx sharplow;
              link sharp+sharplow;
          Oder einfach:
              make sharp

          Mit den Borland-Produkten:

              tcc -c -ms -I\tc\include sharp.c
              tasm /Mx sharplow
              tlink \tc\lib\c0s sharp sharplow, sharp,, \tc\lib\cs
          Oder auch:
              tcc -c -ms sharp.c sharplow.asm
          Oder ganz einfach automatisch mit dem Borland-Make:
              make

          Für die  intergrierte Entwicklungsumgebung  von Turbo-C  gibt  es
          eine Project-Datei  (SHARP.PRJ),  die  über  den  Menupunkt  Pro-
           ject/Project name  eingeladen werden  sollte; danach  sollte  ein
          einfaches  Compile/Make  EXE  file  ausreichen,  um  das  fertige
          Programm zu generieren.

          Voraussetzung ist natürlich, das  sich C-Compiler und  -Assembler
          im  Suchpfad  befinden,  und  daß  die  Borland-Bibliotheken  und
          Inlcude-Dateien  wirklich  im   Verzeichnis  "\tc\lib"  bzw.   in
          "\tc\include" stehen. Andernfalls  müssen Sie TLINK  und TCC  die
          entsprechenden Verzeichnisse  mitteilen.  Die  Warnungen  des  C-
          Compilers können ignoriert werden.

          Falls später mal jemand eigene Forschungen betreiben will: Werden
          die Routinen "holesharp (&Header)" und "sendesharp (&Header)" mit
          Header.Dateityp = S_DUMP aufgerufen, so werden die Daten  vom/zum
          Sharp übertragen, ohne daß Header, Prüfsummen etc.  interpretiert
          werden. Aber Vorsicht:  bei allen Bytes  wurden nach dem  Empfang
          Low- und High-Nibble vertauscht!

 5. Eine kleine Referenz - Technische Informationen

 5.1 Das Interface zwischen Sharp und PC

          Zuerst einmal  zeige  ich  hier die  Pinbelegung  der  multifunk-
          tionalen Schnittstelle des  Sharps, soweit sie  mir bekannt  ist.
          Die Tabellenspalte Richtung  gibt an, ob  die Leitung ein  Signal
          zum Sharp hin ("in") oder vom Sharp weg ("out") führt. Alle Anga-
          ben sind ohne Gewähr:

              Pin ¦ Richtung ¦ Bedeutung             +-------------
              ----+----------+-------------          ¦  on
               1  ¦ ??       ¦ ??                1 --¦ +-+ +---------
               2  ¦ ---      ¦ Vcc    (+6V)      2 --¦ ¦ ¦ ¦
               3  ¦ ---      ¦ Ground ( 0V)      3 --¦ +-+ ¦ > CSAVE¦
               4  ¦ out      ¦ Busy              4 --¦ off ¦   _ _
               5  ¦ out      ¦ Data out          5 --¦     +-----------
               6  ¦ in       ¦ Load              6 --¦
               7  ¦ out      ¦ Save              7 --¦ +---+ +---+ +---
               8  ¦ in       ¦ Data in           8 --¦ +---+ +---+ +--
               9  ¦ in       ¦ Ack               9 --¦ +---+ +---+ +-
              10  ¦ ---      ¦ n.c.             10 --¦ +---+ +---+
              11  ¦ ---      ¦ n.c.             11 --¦ +---+ +--
                                                     ¦ +---+

          Relevant für die Datenübertragung  vom/zum PC sind die  Leitungen
          Ground (3), Load  (6) und  Save (7).  Beim PC  wird die  Drucker-
          schnittstelle als universeller I/O-Port mißbraucht. Sie ist übri-
          gens hervorragend  geeignet für  einfache Steuerungsaufgaben  mit
          ihren (je nach Beschaltung und Programmierung) bis zu 12 Aus- und
          9 Eingängen. In  diesem Fall wird  nur je  ein Ein- bzw.  Ausgang
          benötigt. Diese  Funktion  übernehmen die  Pins  D0  (Datenbit 0,
          Pin 2) als Ausgang und Strobe (Pin 1) als Eingang. Die Masse kann
          man z.B. an Pin 18 entnehmen.

          Da im Sharp  CMOS-Bauteile, im  PC aber  meist TTL-IC's  stecken,
          sollte man zum Schutze des Sharp (und seiner dünnen  Knopfzellen)
          die Leitungen  nicht direkt  verbinden. Mein  Schaltungsvorschlag
          sieht folgendermaßen aus (ich hoffe, der IBM-Zeichensatz gibt ge-
          nug Grafiksymbole her...):
 
              PC                                             Sharp

          Signal  Pin                                      Pin  Signal
                                      BC548 oder
          Strobe   1 --------------+  BC238
                                  C \¦_____+-------+_______ 7   Save
                                    /¦ B   +-------+
                                  E¦        47 kOhm
          Ground  18 -------------------------------------- 3   Ground

          Data 0   2 __________+-------+___________________ 6   Load
                               +-------+
                               ca. 10 kOhm

          (Das soll mir mal einer nachmachen, im Textmodus einen Schaltplan
          zu zeichnen. Zugegeben, der Transistor läßt etwas zu wünschen üb-
          rig, aber er ist doch ganz gut zu erkennen...)

          Ich glaube, ich  bin einigen  Leuten noch  eine kleine  Erklärung
          schuldig. Einem  aufmerksamen  Leser wird  wohl  nicht  entgangen
          sein, daß "Strobe" eigentlich ein  Signal vom PC zum Drucker  ist
          und nicht umgekehrt.  Das ist im  Prinzip richtig.  Aber in  IBMs
          paralleler Schnittstelle  ist diese  Leitung als  Open  Collector
          ausgeführt (die es  betrifft, wissen jetzt  bescheid), mit  einem
          eingebauten Pull-Up-Widerstand von 4,7k. Diesen Ausgang kann  man
          über einen anderen Portbaustein zurücklesen. Wird nun die Strobe-
          Leitung auf 5V  gelegt (der interne  Transistor sperrt), so  kann
          man mit einem externen Schalter/Transistor/Schalttransistor (eben
          den BCsowieso von oben) gegen Masse den Pegel der Leitung ändern,
          ohne irgendwelchen  Schaden anzurichten.  Dieser so  eingestellte
          Pegel läßt sich dann über oben genannten Port auslesen.

          Im Laufe  der Zeit  hat sich  herausgestellt, daß  das  Interface
          nicht an allen parallelen Schnittstellen arbeitet, die im  Umlauf
          sind.  An  den  "alten"   Ports,  die  noch  aus   TTL-Bausteinen
          kompatibel aufgebaut sind, sollte das Interface problemlos seinen
          Dienst tun.  Allerdings  gibt  es  Probleme  mit  einigen  dieser
          neumodischen Druckerkarten, die, vielleicht sogar in  Kombination
          mit einer CGA- oder  Herkuleskarte, aus integrierten  Gate-Arrays
          aufgebaut sind.  Ich habe  die Ursachen  nicht näher  untersucht.
          Vielleicht fehlt es diesen Karten an den Pull-Up-Widerständen bei
          den  Steuerleitungen?  Ist  man  (un)glücklicher  Besitzer  einer
          solchen Karte, kann man sich  notfalls damit helfen, daß man  die
          Leitungen direkt,  das  heißt ohne  Transistor  und  Widerstände,
          miteinander verbindet (also Pins  1 -- 7,  18 -- 3  und 2 --  6).
          Dann sollte man aber den Sharp nicht tagelang am PC angeschlossen
          lassen, sondern nur für  die Dauer der eigentlichen  Übertragung.
          Vielleicht bin ich etwas übervorsichtig, aber neue Batterien  für
          den Sharp sind ja auch nicht ganz billig.

 5.2 Das Übertragungsformat

          Das  Format,  mit  dem  der  Sharp  seine  Daten  auf  Magnetband
          schreibt, ist (leider)  nicht ganz trivial.  Da zu erwarten  ist,
          daß dieser Abschnitt  etwas länger (und  auch interessant)  wird,
          unterteile ich ihn noch etwas feiner. Also los:

 5.2.1 Am Anfang war das Bit - oder "Von Nullen und Einsen"

          Der Sharp  kennt, wie  eigentlich jeder  andere digitale  Rechner
          auch, nur Nullen und Einsen  (meist einfach Bits genannt).  Alles
          schon mal  gehört.  Im Speicher  ist  diese Art  der  Darstellung
          durchaus angebracht, nur  für Magnetbänder (sprich:  Musikkasset-
          ten) ist sie denkbar  ungeeignet. Darum macht  der Sharp aus  den
          Bits Töne, denn damit können Kassettenrekorder ganz gut  umgehen.
          Aus jeder Eins wird ein Ton von 4000 Hz, und aus jeder Null einer
          von 2000 Hz. Weiterhin  legt er fest,  daß jedes  Bit genau  2 ms
          dauert. Nach einer kleinen Rechnung kommt man dann auf  folgendes
          Ergebnis (Tabellen sehen immer professioneller aus):

               Bit¦ der Sharp sendet
              ---+----------------------
               0 ¦ 4 Perioden zu 2000 Hz
               1 ¦ 8 Perioden zu 4000 Hz
 

 5.2.2 Vom Bit zum Byte - oder "Nibble, wechsle dich"

          Da der Sharp bekanntlich acht dieser Bits zu einem Byte zusammen-
          faßt, das Magnetband aber nur eine Frequenz gleichzeitig  aufneh-
          men kann (wenn  man einfacher Software  und sicherer  Übertragung
          den Vorzug gibt),  schaufelt er die  Bits seriell im  Gänsemarsch
          über die Leitung. Dabei  benutzt er aber  ein anderes Format  als
          allgemein gebräuchlich ist. Er spaltet das Byte in der Mitte  und
          sendet jedes Nibble  einzeln, jeweils mit  Start- und  Stopbit(s)
          versehen. Er scheint sich aber  nicht einig zu sein, welche  Rei-
          henfolge dabei die beste ist, denn sie wechselt von Zeit zu Zeit.
          Doch dazu später mehr. Zunächst einmal habe ich die beiden mögli-
          chen Übertragungsformate  aufgeschlüsselt. Ich  habe sie  "H-Typ"
          und "D-Typ" genannt,  weil der erstere  hauptsächlich im  Header,
          der letztere fast nur in Datenblöcken zu finden ist.

          Angenommen, das zu übertragende Byte sei `hgfedcba', wobei a  das
          Bit 0 und h das  Bit 7 ist. Dann  produziert der Sharp  folgenden
          Bit-Brei:

          H-Typ: Nicht verdreht

                   0abcd10efgh11...
              mit  0--------------- 1 Startbit
                   -abcd----------- 4 Datenbits (unteres Nibble)
                   -----1---------- 1 Stopbit
                   ------0--------- noch ein Startbit
                   -------efgh----- 4 Datenbits (oberes Nibble)
                   -----------11... 2 bis 5 Stopbits

          D-Typ: Low- und High-Nibble vertauscht

                   0efgh10abcd11...
              mit  0--------------- 1 Startbit
                   -efgh----------- 4 Datenbits (oberes Nibble)
                   -----1---------- 1 Stopbit
                   ------0--------- noch ein Startbit
                   -------abcd----- 4 Datenbits (unteres Nibble)
                   -----------11... 2 bis 5 Stopbits

          Wo welcher Typ mit wieviel  Stopbits erscheint, werde ich in  den
          nächsten Kapiteln jeweils mit angeben.

 5.2.3 Der Header - oder "Mit dem Kopf durch das Band"

          Vor der eigentlichen Übertragung schickt der Sharp einen  kleinen
          Datenblock durch die Leitung, in  dem verschlüsselt ist, um  wel-
          chen Dateityp es sich handelt,  wie die Datei heißt, etc.  Dieser
          sogenannte Header hat den folgenden Aufbau:
 
              Byte¦ Typ   ¦ Funktion
              ----+-------+-------------------------
               00 ¦ D-Typ ¦ Dateityp
               01 ¦ Name  ¦ Dateiname
               0A ¦ Name  ¦ Password, wenn vorhanden

          Ein `Name' sieht dabei so aus:

              Byte¦ Typ   ¦ Funktion
              ----+-------+------------------------------------------
               00 ¦ H-Typ ¦ Dateiname, 7. Buchstabe
               01 ¦ H-Typ ¦ Dateiname, 6. Buchstabe
               ...¦  ...  ¦    ...
               05 ¦ H-Typ ¦ Dateiname, 2. Buchstabe
               06 ¦ H-Typ ¦ Dateiname, 1. Buchstabe
               07 ¦ D-Typ ¦ Kennung für das Ende des Namens (immer 5F)
               08 ¦ D-Typ ¦ Prüfsumme über die Bytes 00 bis 07

          Der Dateiname wird  immer auf sieben  Zeichen gestreckt oder  ge-
          kürzt. Ist der Name kürzer, so wird er mit Nullen (das ASCII-Zei-
          chen NUL, keine "0")  aufgefüllt. Das gilt  auch, wenn kein  Name
          angegeben wird, er besteht dann  aus sieben Nullen. Das Feld  für
          das Password existiert  nur, wenn  es im  Dateityp vermerkt  ist,
          sonst wird es weggelassen. Folgende Dateitypen sind mir bis jetzt
          bekannt:

               Typ ¦ Bedeutung
              ----+----------------------------
               70 ¦ Basic-Programm
               71 ¦ Basic-Programm mit Password
               74 ¦ Datendatei
               76 ¦ Binärdatei

          Im Header sendet der Sharp übrigens hinter jedem Byte 5, in  Wor-
          ten: "fünf", Stopbits.

 5.2.4 Blöcke und Prüfsummen

          Der Sharp bildet über  jeden Datenblock eine 8-Bit-Prüfsumme  wie
          folgt: Am Anfang des Blocks wird die Prüfsumme auf 0 gesetzt. Je-
          des Byte, das mit in  die Prüfsumme soll, wird in Low-Nibble  und
          High-Nibble zerlegt.  Dann wird  erst das  High-Nibble, dann  das
          Low-Nibble zur Prüfsumme addiert.  Tritt bei der ersten  Addition
          (die des High-Nibbles)  ein Überlauf der  Prüfsumme auf, so  wird
          diese um eins erhöht. Ein  eventueller Überlauf bei der  Addition
          des Low-Nibbles wird ignoriert.

          In Assembler läßt sich das z.B. so in Befehle fassen:

          Pruefsumme  DB 0                ; hier landet die Prüfsumme
          ; ...
          Pruefe      PROC
          ; Das Byte, das `geprüft' werden soll, ist in AL
                      mov ah, al          ; rette eine Kopie
                      mov cl, 4
                      shr ah, cl          ; AH enthält das High-Nibble
                      and al, 0Fh         ; und AL das Low-Nibble
                      add Pruefsumme, ah  ; addiere High, Überlauf im Carry
                      adc Pruefsumme, al  ; und Low-Nibble mit Übertrag
                      ret
          Pruefe      ENDP

          Dabei ist zu beachten, daß die Prüfsumme über die "echten"  Daten
          gebildet wird.  Das  spielt eine  Rolle  bei Bytes  des  `D-Typs'
          (siehe oben), bei denen der Sharp die Nibbles verdreht. Die Prüf-
          summe wird erst  nach dem "Entknoten"  des Bytes berechnet  (oder
          vor dem Verdrehen, wenn man selbst die Daten sendet).

          Bei den Prüfsummen im Header muß man darauf achten, daß das erste
          Byte (der Dateityp)  nicht mit überprüft  wird. Es  wird nur  die
          Quersumme über den Namen und das Password (wenn vorhanden) gebil-
          det, wobei sie  vor letzterem natürlich  wieder auf Null  gesetzt
          wird. Das Passwordfeld im Header gilt als eigenständiger "Daten"-
          Block.

          Der Aufbau der eigentlichen  Daten nach dem  Header hat so  seine
          Tücken. Mir ist nur  die Struktur eines Basic-Programms  einiger-
          maßen bekannt, zu den anderen  Datentypen kann ich keine  näheren
          Angaben machen. Also zum Basic-Programm. Alle Bytes in einem  Ba-
          sicprogramm, die nach  dem Header kommen,  sind übrigens vom  "D-
          Typ", auch  die  Prüfsummen.  Außerdem reduziert  der  Sharp  die
          Anzahl der Stopbits in den Daten auf zwei.

          Allgemein gilt, daß  nach jeweils 120  (dezimal!) Datenbytes  des
          Basic-Programms eine  Prüfsumme eingefügt  wird. Ein  Basic-Block
          ist also  120 Bytes  lang. Nach  jedem Block  wird die  Prüfsumme
          wieder auf Null zurückgesetzt. Am Ende des Programms stehen 2 FF-
          Bytes, von denen das erste  eigentlich noch zum Programm  gehört.
          Nach den beiden Eff-Effs steht noch eine abschließende Prüfsumme,
          in der alle Bytes dieses  letzten Blocks, bis einschließlich  das
          erste FF-Byte, enthalten sind - das letzte FF ist nicht mit drin.

          Da ich mit diesen Regeln  beim Überprüfen der Prüfsummen am  Ende
          eines Programms einige Schwierigkeiten  hatte, will ich den  Vor-
          gang noch einmal  anders formulieren: Es  muß zuerst das  gesamte
          Programm eingeladen werden. Dann  werden die Datenblöcke  solange
          "normal" in einer Schleife überprüft (Prüfsumme alle 120  Bytes),
          bis noch genau 3 Bytes über  sind. Man nehme das erste davon  (es
          muß ein FF sein) und nehme  es mit in die Prüfsumme hinein.  Dann
          nehme man das zweite (es muß ebenfalls FF sein) und ignoriere es.
          Dann nehme man das  dritte und letzte  und vergleiche es mit  der
          berechneten Prüfsumme.  Sie müssen  übereinstimmen, sonst  stimmt
          bei Ihrem Programm  was nicht.  Diesen Aufwand  muß man  (leider)
          treiben, da man  sonst Probleme bekommt,  wenn der letzte  Daten-
          block ungefähr 120 Bytes lang ist (119 oder 120 Bytes).

 6. Schlußbemerkung

          So, ich glaube,  das langt fürs  erste. Soviel Dokumentation  muß
          erstmal getippt  werden. Ich  hoffe,  dieses Programm  macht  den
          Sharp-Benutzern das Leben etwas bequemer.

          Übrigens: Das Programm darf (soll!)  sich jeder kopieren, den  es
          interessiert. Die Dateien sollten nur alle zusammen bleiben, denn
          ich weiß  aus eigener  Erfahrung, wie  schmerzhaft es  ist,  wenn
          plötzlich eine Datei  fehlt (wenn es  auch nur eine  Header-Datei
          ist ...).

          Dieses Programm soll auch nicht das absolute Produkt  darstellen;
          jeder soll  sich  frei  fühlen,  selbst  Verbesserungen  und  Er-
          weiterungen vorzunehmen. Ich hoffe, die Quelltexte sind  einiger-
          maßen lesbar und verständlich.

                        Norbert Unterberg,
                        Köhlerstr. 12c,
                        D-5802 Wetter 2