2000 5ec6 0000 T ... BASICODE 17..END
*******************************************************

		- 17 -

    von der 'checksum' wohl oder nicht eine Fehler-
    meldung gegeben. Der Recorder wird am Ende des
    Auslauftones stillgesetzt.

Das Leseprogramm sorgt in Wirklichkeit für zwei Din-
ge: erstens für das Lesen von Kassettensignalen und 
deren Umsetzung in 'bits' und 'bytes', und zweitens 
für das Umsetzen der eingelesenen Reihe ASCII-Zeichen 
in ein BASIC-Programm bzw. in Zeichencodes, so wie 
diese in dem betreffenden Computer erforderlich sind 
(beispielsweise: Computer, die nicht mit Kleinbuchsta-
ben zurecht kommen, müssen hereinkommende Kleinbuch-
staben in Großbuchstaben umsetzen. Das gleiche gilt 
für andere abweichende Codes. man denke nur an die 
Mmöglichkeit, daß durch Lesefehler Kontroll-Codes her-
einkommen: Diese müssen ebenfalls abgefangen und un-
schädlich gemacht werden. Empfehlung: Man setze schäd-
			  ----------
liche Kontrollzeichen in 'Gitterchen'(#) um).

Beide Aufgaben können mitunter teilweise erledigt 
werden, indem man bereits im System vorhandene Sub-
routinen (passen Sie dabei auf, falls von Ihrem Com-
puter verschiedene Versionen bestehen!) aufruft.

Einige Computer können die von der Kassette herein-
kommenden Signale über einen 'hardware-interrupt'
verarbeieten, so daß das Umsetzen in BASIC anschei-
nend gleichzeitig geschieht. Andere Computer müssen 
diese zwei Aufgaben notgedrungen nacheinander erledi-
gen, wobei die eingelesene Zeichenreihe erst im RAM 
gespeichert wird (hinter dem schon vorhandenen Pro-
gramm!) und wonach erst in einer zweiten Phase die 

*******************************************************

		- 18 -

Zeichen in BASIC umgesetzt werden.

Ungeachtet dessen, welches System verwendet wird, muß 
der Nutzer ständig auf dem Bildschirm verfolgen kön-
nen, daß da was geschieht. Am schönsten ist es wohl, 
wenn die hereinkommenden Zeilen nacheinander über den 
Schirm (oder zumindest über die unterste Schirzeile) 
'scrollen', doch andere Lösungen sind auch möglich. 
Dieses 'Folgenkönnen' gilt sowohl für die Lesephase 
als auch für die Umsetzphase (vgl. den nächsten Para-
graphen).

Paragraph 5: BASICODE wegschreiben
----------------------------------

Das BASICODE-Schreibprogramm schreibt das BASIC-Pro-
gramm (ab Zeile 1000, wenn BASICODE-3, ab Zeile 0, 
wenn BASICODE-1) in BASICODE-Format nach  Band.
Ebenso wie das Leseprogramm erfüllt auch das Schreib-
programm zwei Funktionen: einerseits das Umsetzen des 
Gedächtnisinhalts in ASCII-Zeichen (durchweg ist das 
ganz einfach das LISTen des Programms, auf jeden Fall 
das Umsetzen von TOKENS in Zeichen), und als zweites 
das richtige Beschreiben des Bandes. Auch hier hängt 
es von der Hardware ab, ob das eine oder das andere in 
zwei Runden nacheinander kommen muß oder aber schein-
bar zugleich geschieht durch die Unterbrechungsmög-
lichkeiten ('interruptfaciliteiten').
Wiederum gilt die Forderung, daß der Nutzer auf dem 
Schirm das Nötige geschehen sieht, wobei das 'summum' 
(der Gipfel) der Schönheit das mit-scrollen desjeni-
gen ist, was gleichzeitig auf Band geschrieben wird.

Bei einem Schreibsystem in zwei Runden, also erst 

*******************************************************

		- 19 -

LISTen und dann Schreiben, kann ein Raumproblem ent-
stehen, weil das gleiche Programm sowohl 'tokenized' 
als auch in ASCII aufbewahrt/gelagert wird. Das ist 
schlauer möglich, aber vielleicht arbeitet das in ei-
nigen Computern unerträglich langsam: 

Es ist möglich, immer sobald das 'listing' einer Zei-
le gemacht ist, die ursprüngliche BASIC-Version von 
dieser Zeile zu entfernen. Sobald das 'listing' fer-
tig ist, ist das BASIC-Programm verschwunden. Das 
'listing' wird dann auf 'tape' geschrieben, und so-
bald das geschieht bzw. geschehen ist, wird das 'li-
sting' wieder in BASIC umgesetzt mittels des betreffen-
den Teils aus dem Leseprogramm. Dieser 'truc' bringt 
einige Risiken mit sich und ist daher nur ausführbar, 
wenn sich die Kontrolle über den Computer ganz in den 
Händen des Programms befindet. Sollte der Nutzer das 
Programm abbrechen wollen, so sorgt das Programm auf 
jeden Fall erst noch für die Wiederherstellung des 
ursprünglichen Programms. 

Einige Forderungen werden ohne weiteres gestellt: 

1 Das Signal, so wie es auf Band geschrieben wird, muß 
  EXAKT der BASICODE-Norm genügen. Hierbei sei insbe-
  sondere an die 'timing' der Signale gedacht, sowohl 
  zwischen den einzelnen 'bits' als auch zwischen den 
  nächsten 'bytes' und auch im An- und Auslaufton. Des 
  weiteren sei verwiesen auf die Tatsache, daß das 
  MSB eines jeden 'byte' in der Praxis immer 1 ist, 
  außer eventuell in der 'checksum'. Des weiteren die 
  Reihenfolge der Zeichen in einem Programmblock: erst 

*******************************************************

		- 20 -

  5 Ssekunden Anlaufton, dann STX ($82), dann CR ($8D),
  die 'listing' mit immer einem Zwischenraum zwischen 
			  -----
  Zeilennummer und Zeilentext, und am Ende einer je-
  den Zeile ein CR ($8D), nach dem letzten CR ein ETX 
  ($83) und unmittelbar danach die 8-bit-checksum, der 
  1 Sekunde Auslaufton folgt.

2 Das Wegschreiben muß vom Nutzer abgebrochen werden 
  können (STOP-Taste auf dem Tastenbrett);

3 eine BASICODE-Zeile so wie diese auf dem Band ange-
  bracht wird, darf grundsätzlich nicht länger als 60 
  Zeichen sein (plus einem CR); somit dürfen zwischen 
  zwei aufeinanderfolgenden CR prinzipiell höchstens 
  60 andere Zeichen stehen. Der einzige Grund, weshalb
  auf dem Band mehr als 60 Zeichen gesetzt werden kön-
  ------------
  nen, kann derjenige sein, daß das Übersetuungspro-
  gramm einen Zwischenraum oder mehrere Zwischenräu-
  me hinzugefügt hat, entsprechend dem, was nach Punkt 
  7 erwähnt wird.

4 Es dürfen unter keiner Bedingung andere ASCII-Codes 
  darin vorkommen als Hex 20 (Zwischenraum) bis ein-
  schließlich Hex 7E. Auf dem Band werden es dann Hex 
  C0 bis einschließlich Hex FE. Daneben kommt CR (Hex 
  8D) vor, Hex 82 zu Beginn und Hex 83 am Schluß. Nur 
  die 'checksum',die über 8 bits den Exor all des Vor-
  angegangenen bildet, kann alle 8-bit Code sein. Es 
  sei erwähnt, daß die Buchstaben von BASIC-Variablen 
  und die Buchstaben der BASIC-keywords immer einen 
  ASCII-Code von Hex 41 vor dem A bis einschließlich 
  Hex 5A (vor dem Z) haben müssen. Buchstaben von Hex 
  61 bis Hex 7A sind ausschließlich zwischen 'quotes'

*******************************************************

		- 21 -

  und in REM-Zeilen erlaubt;

5 Nach dem $82 zum Beginn folgt immer erst ein $8D 
  (CR). Jede Zeilennummer wird von dem eigentlichen 
  Zeilentext getrennt durch einen Zwischenraum. Die-
  ser Zwischenraum zählt durchaus mit bei der Kontrol-
  le der Zeilenlänge der 60 Zeichen. Die CR am Ende 
  und eventuell hinzugefügte Zwischenräume zählen 
  nicht mit.

Um die Forderungen 2, 3 und 4 zu erfüllen, wäre zu 
empfehlen, das Schreibprogramm beim Wegschreiben in 
BASICODE-3 in zwei Phasen arbeiten zu lassen: In bei-
den Phasen wird das BASIC-Programm ausgelesen und um-
gesetzt in ASCII. Dabei wird je Zeichen und je Zeile 
die Zahl der erlaubten Zeichen und die Zeilenlänge 
kontrolliert. Sollte ein Verstoß gegen eine dieser 
Regeln festgestellt werden, so wird der Wegschreib-
prozeß abgebrochen mit einer Fehlermeldung, die an-
gibt, in welcher Zeile welcher Fehler entdeckt wor-
den ist.
Phase 1 und Phase 2 sind in dieser Hinsicht identisch. 
Der Unterschied besteht darin, daß in Phase 1 nichts 
nach Band geschrieben wird und in Phase gerade doch. 
Phase 1 verläuft somit ziemlich schnell und stoppt 
bei einem Fehler. Der Nutzer behebt diesen und star-
tet aufs neue. Erst wenn in Phase 1 keine Fehler ent-
deckt werden, wird sofort danach von selbst Phase 2 
ausgeführt. Darin kann dann natürlich kein Stop als 
Folge einer Fehlermeldung mehr vorkomen, so daß dann 
das Programm insgesamt gut auf das Band kommt (wenn 
nicht der Nutzer mit einer Stopp-Taste das Schreiben 

********************************************************

		- 22 -

unterbricht).
Beim Wegschreiben gemäß dem BASICODE-1-Format wird 
Phase 1 nicht ausgeführt und wird ohne jegliche Kon-
trolle nur Phase 2 erledigt. Auf diese Weise kann man 
BASICODE-1 für etwas mißbrauchen, wofür es ursprüng-
lich nicht bestimmt war, nämlich für die Übertragung 
eines Programmtextes in einen anderen Computer, unge-
achtet dessen, was da genau in diesem Text steht.

In Anbetracht dessen, daß Kassettenlesezeit ein rarer 
Artikel ist, ist es erwünscht, daß das Schreibprogramm 
alle Zwischenräume - außer zwischen "" und nach REM - 
entfernt. Es muß ein Zwischenraum eingefügt werden, 
	     ---
und zwar vor den BASIC-Kommandos GOTO, THEN, GOSUB, 
TO und STEP, sofern solch ein Kommando nicht das erste 
einer Zeile ist oder unmittelbar einem Doppelpunkt 
folgt (:). Nachbemerkung: Es ist somit kein Zwischen-
raum erforderlich für AND und OR. Diesen muß in BASI-
CODE 3 immerhin ein Häkchen vorangehen und folgen. Aus 
diesem Grunde hinzugefügte Zwischenräume zählen nicht 
mit für die maximale Zeilenlänge von 60 Zeichen.

eine Kontrolle über erlaubte BASIC-Kommandos ist fein. 
Insbesondere Instruktionen, wie POKE, USR oder CALL 
(Instruktionen, die somit bei falschem Gebrauch den 
Computer auf den Grund laufen lassen) sollten eigent-
lich durch das Schreibprogramm messerscharf abgelehnt 
werden. In einem REM-Auftrag oder als Text zwischen 
"" nach beisp@pielsweise PRINT kann natürlich wohl so 
etwas wie POKE stehen (z.B. in einem Poker-Programm). 
Es wäre nicht schön, wenn das Schreibprogramm auch 
daraufhin anhalten würde.

*******************************************************

		- 23 -

Paragraph 6: Polarität, Tondetektion und Anlaufdetek-
-----------------------------------------------------
tion
----

6.1 Schreiben auf und Lesen von der Kassette

Es erweist sich, daß Schreiben und Lesen ausgezeich-
net geht mit einem sehr einfachen 'interface'. Alles, 
was benötigt wird, um zu schreiben, ist ein Drähtchen/
Fädchen, auf dem die Spannung bei der Steuerung des 
Schreibprogramms hoch und niedrig gehalten werden kann.
Mit einem geeigneten Serienwiderstand läßt sich das 
Signal abschwächen bis zum Stand des Mikrophoneingangs.
Oft ist der Standard-Kassetteneingang auch schon so 
gemacht. Bei Computern ohne geeigneten Kassettenein-
gang läßt sih meistens mit wenig Mühe etwas finden, 
was sich geeignet machen läßt: ein 'game-output', und 
ein einziger Draht von einem parallelen 'output', bei-
spielsweise dem 'printer' oder einem der begleitenden 
Drähte des V24-Eingangs.

Auch der 'input' kann sehr einfach sein. Das Programm 
muß feststellen können, ob die Spannung auf einem Draht
niedrig oder hoch ist. Der Lautsprecherausgang eines 
Kassettenrecorders gibt auf einem durchschnittlichen 
Stand/Niveau 100 mV ab, wenn er hart steht, mehr als 
1 Volt. Diese (Wechsel-) Spannung reicht aus, um ei-
nen TTL-Eingang oder einen V24-Eingang anzusteuern. 
Zwar ist es dabei nötig, den Gleichspannungsstand mit
einigen Widerständen so einzustellen, daß der Eingang 
genau "auf der Grenze zwischen 0 und 1" steht. Wer ei-
nen Eindruck davon bekommen möchte, wie so etwas mög-
lich ist, sehe nur mal im BASICODE-3-Buch unter P2000 
nach. Dort wird unter anderem sobeim 'printerconnector'
verfahren.

*******************************************************

		- 24 -

Was nicht ohne weiteres gebraucht werden kann, ist 
der Daten-Ein- und Ausgang eines serienmäßigen Ein-
gangs.

6.2. Programmtips für die Schreibroutine

- Man versuche, das 'timing' der Wellenform so genau 
  wie nur möglich zu machen.
- Man kalkuliere auch die Zeit ein, die nötig ist, um 
  das nächste Zeichen aus dem Gedächtnis heranzuholen.
- Man sei gefaßt auf eine eventuelle Systemunterbre-
  chnung (interrupt); man schalte diesen/diese aus, wenn 
  er/es das 'timing' stören kann.
- Man sei gefaßt auf 'wait-cycles' des Prozessors; ei-
  nige Systeme fügen diese selbständig hinzu.
- BASICODE ist unabhängig von der Polarität. Es ist 
  daher erwünscht, die Routine so zu machen, daß er 
  wegzuschreibende Programme entweder 'random' oder 
  abwechselnd in die eine oder in die andere Polarität 
  schreibt (man vergleiche Seite 107 im Buch).
- Schreibroutine muß grundsätzlich zu jedem Zeit-
  punkt vom Nutzer abgebrochen werden können.

6.3 Programmiertips für die Leseroutine

- Man ermittle sowohl die aufwärts gehenden Flanken 
  (0 auf 1) als auch die abwärts gehenden Flanken 
  (1 auf 0). Bei 1200 Hz hat man dann 2400 mal je Se-
  kunde Information über die Tonhöhe, und die braucht 
  man ja auch.
- Man berechne immer die Zeit zwischen 2 übereinstim-
  menden Flanken (durch die zwei letzten Zeiten mitein-
  ander zu addieren). Es kann immerhin ganz leicht ge-

*******************************************************

		- 25 -

  -schehen, daß die Wellenform symmetrisch wird. Die 
  positiven Impulse werden dann kürzer als die negati-
  ven, oder umgekehrt, jedoch zusammen sind sie immer 
  gleich lang. Man monitoriere somit immer die gemein-
  same Zeit der beiden letzten halben Perioden.
- Man halte beim Lesen gesondert die Zeit bei, um die 
  'bits' einzunehmen. Man vertraue also nicht auf die 
  Beziehung 'bits'-Wellenform. Bei Störungen und 'drop-
  -outs' im Band hält man so besser Schritt mit den Zei-
  chen.
- Man warte nach dem Ende eines Zeichens wiederum auf 
  einen 'startbit', unabhängig von der Polarität. Man 
  vertraue nicht auf die 8 Perioden.
- Man mache ein 'timeout' beim Warten auf den 'start-
  bit'.
- Man wähle die 'Bit-Detektion' so, daß eine halbe 
  Periode von 2400 Hz plus einer halben Periode von 
  1200 Hz als 0 wiedererkannt wird.
- Man mache eine Anlauf-Tondetektion, in der 2 Sekun-
  den hintereinander ein Ton von 2400 Hz +/- 10% de-
  tektiert wird. Das verhindert, daß man mit Sprech-
  einlesen und Musik beginnt. 
- Die Leseroutine muß zu jeder Zeit vom Nutzer abge-
brochen werden können.

6.4 Graphische Übersicht über den Lesealgorithmus

*******************************************************

		- 26 -

1 Man warte auf den 'startbit'
2 Man warte 1 1/2 bit
3 Man warte 1 bit
4 feste Zeit!
5 feste Zeit!
6 ausgelesene Zeit
7 detektierter bit

t ist die Zeit zwischen zwei Nulldurchgängen
T ist die Zeit zwischen den letzten beiden übereinstim-
  menden Nulldurchgängen
Das Messen und Beibehalten von T ist ein frei laufen-
der Prozeß.

Das Warten auf einen 'startbit' bedeutet, daß gewartet 
wird bis T einen bestimmten Wert Überschreitet, im obi-
gen Beispiel z.B. 10. Danach in festen Zeitabständen 
nachsehen, was T ist, und auf diese Weise die 'bits' 
zusammenbringen. Man achte darauf, daß die 'sample'-
Momente am Ende der 'bits' liegen. Dann erst ist die 
Information ausreichend stabilisiert.

Wenn Sie das Leseprogramm so machen, daß ein 'startbit'
dadurch entdeckt wird, daß hintereinander vier Zyklen 
von 2400 Hz, gefolgt von einem Zyklus von 1200 Hz, vor-
beikommen, so wird erreicht, daß man nach einer Signal-
störung am schnellsten wieder in die Synchronisierung 
gelangt.

*******************************************************

		- 27 -

Es ist zu empfehlen, in das Übersetzungsprogramm ei-
ne klare Copyright-Angabe aufzunehmen. Außerdem wäre 
es gut, an einer oder an mehreren Stellen im Überset-
zungsprogramm eine verborgene Identifizierungsmöglich-
keit aufzunehmen, an der bei einer gesetzwidrigen Ko-
pierung festgestellt werden kann, daß es tatsächlich 
Ihr Programm ist.
Sie werden gebeten, eventuelle Fehler im Übersetzungs-
programm nicht nur zu verbessern, sondern auch die Lei-
tung der Stiftung über diese Fehler zu informieren.

--------------------------------------------------------

Dieser Text ist ausschließlich bestimmt für Autoren 
von BASICODE-3-Übersetungsprogrammen und ist Eigentum 
der Stiftung BASICODE. Dieser Text darf nur durch die 
oder im Namen der Leitung der Leitung der Stiftung
BASICODE verbreitet werden.

	- Ende der Seite 27 -

********************************************************


  - Ende des Textes BASICODE -

F.d.R.z.(Seite 17 BIS 27):

  Friedrich Henlich
  Hübnerstr.26
  Dresden 8027