H E B A S

Ein BASIC - Interpreter- Modulsystem
f�r 68HC11-, Z80-, HD64180-, Z280- und 80X86-Systeme
(f�r MS-DOS, CP/M und EURO-Z80)

Befehle und Erl�uterungen der erweiterten Version
von Dr.rer.nat. Hehl Hans

(C) 1989-96
Stand: 01.07.1996

Vorwort Start des Interpreters Basic-Warmstart und Kontrollzeichen Fehlermeldungen und Fehlerbehandlung
BASIC-BEFEHLE Dateistrukturen / Ein- und Ausgabe HEBAS und Mathematik Beispielprogramm

Vorwort:

Der BASIC-Interpreter HEBAS l�uft je nach Version auf den verschiedensten Computern. So gibt es Versionen f�r CP/M 2.2, f�r CP/M-Plus, f�r den NDR-Rechner, f�r den mc-Computer, f�r MS-DOS und PC-DOS sowie f�r den EURO-Z80 oder 68HC11 der Fa. Kolter. Da keine illegalen Z80-Befehle verwendet werden, kann auch die CPU 64180 anstelle des Z80 eingesetzt werden. Auch unter CP/M-68k mit Z80-Emulator l�uft HEBAS.

Welche Vorteile bietet dieser BASIC-Interpreter?

Was die Arbeit mit diesem Interpreter erheblich erleichtert, sind einerseits die deutschen Fehlermeldungen und andererseits die schon vorhandenen zahlreichen sog. TOOL-KIT-Befehle wie AUTO, FIND, REPLACE usw., die bei anderen bekannten Rechnertypen erst zus�tzlich geladen werden m�ssen oder mittels EPROM zur Verf�gung gestellt werden.

Als Besonderheit mu� auch die Tatsache erw�hnt werden, da� die Ein- und Ausgabekan�le beliebig definierbar sind, d.h. da� z.B. das Inhaltsverzeichnis der Diskette oder auch Pro-grammteile in eine Datei geschrieben werden k�nnen, die dann unter BASIC ver�ndert wer-den kann. F�r jede Version des Interpreters gibt es auch den Quellcode auf Diskette mit Kommentaren und Erkl�rungen. Eigene BASIC-Befehle lassen sich leicht einbauen.

Nachfolgend sind einige BASIC-Befehle aufgef�hrt, die bei anderen Basic-Interpretern nicht zur Verf�gung stehen.

COPY Beliebiges Duplizieren von Programmteilen
DIR# Ausgabe in Dateien, damit bearbeitbar, Ausgabe auch auf Drucker
RESUME XY umfangreiche Fehlerbehandlung
EXCHANGE schneller Variablentausch (sortieren)
FIND Suchen von Zeichen bzw. Zeichenketten
HEX$ bzw. & Dezimal- u. Sedezimal-Umwandlung, damit direkte Eingabe von sedezimalen Zahlen
INPUT LINE Eingabe aller Zeichen (auch Komma!)
INSTR Suchen von Zeichen in Strings
MAT READ,MAT WRITE Matrix-Befehle
MID$ zus�tzlich: Austausch von Stringteilen
KILL L�schung der Speicherreservierung (DIM)
LOADGO Laden und Starten eines Programmes
LOG, LOG10 Nat�rlicher u. dek. Logarithmus
LOOKUP Suchbefehl f�r Dateien im Directory
LVAR Ausgabe der Variableninhalte
MERGE Verbinden von Programmen
MOD Modulo-Funktion (Divisionsrest)
OPTION Ver�nderung der E/A-Kanal-Parameter
PI u. EE(Eulersche Zahl e) Werte gespeichert
PRECISION Arithmetik auf 11 Stellen
PRIVACY Schutz durch Passwort (alle Befehle)
REPLACE Ersetzen von Zeichen im Programm
RESTORE XY Datazeiger auf beliebige DATA-Zeile
RND,RANDOMIZE echte Zufallszahlen (aus Refresh)
SAVE,RESAVE Speicherung im ASCII-Format m�glich, damit k�nnen Programme mit einem Texteditor bearbeitet werden.
TRACE Ausgabe der bearbeiteten Zeilennummern
USER Umschalten der USER-Bereiche (nur CP/M) von BASIC aus
USING Umfangreiche Formatierung (Zahlen,Texte)
VARPTR Adressenangabe der Stringzeiger

Im Handbuch werden Sedezimalzahlen ("Hexzahlen") durch ein nachgestelltes "h" gekennzeichnet, soweit in der Sedezimalzahl keine Buchstaben enthalten sind und eine Verwechslung mit Dezimalzahlen m�glich ist. Basic-Befehle werden im Handbuch gro� geschrieben (LOAD, SAVE), d�rfen jedoch beliebig als Gro�- oder Kleinbuchstaben eingegeben werden. Dr�cken der RETURN-Taste wird durch die Kurzfassung <CR> beschrieben, die Kontroll-Funktionen werden �hnlich abgek�rzt, z.B. <CTRL-E>. Falsche Schreibweise der Befehle f�hrt zur Meldung "Syntaxfehler".

Nachteile des Interpreters: Es gibt keinen bildschirmorientierten Editor (Terminal-System).

Aber: Schreiben Sie Ihr BASIC-Programm mit einem Textverarbeitungsprogramm im "Programmmodus" ohne Steuerzeichen. HEBAS kann ASCII-Texte lesen und so auch abspeichern (siehe SAVE).

 

Alphabetische Liste der BASIC-Befehle

Die nach einigen Befehlen angegebene Klammer soll darauf hinweisen, da� dem BASIC-Befehl ein Ausdruck in Klammern folgen mu� (sonst Syntaxfehler).

ABS( INT( SGN(
AND INTERRUPT SIN(
ASC( KILL SPACE$(
ATN( LEFT$( SPC(
AUTO LEN( SQR(
BYE LET STEP
BYTE( LIST STOP
BYTE$( LOAD STR$(
BYTEPOLL( LOADGO STRING$(
CALL LOC( TAB(
CHR$( LOF( TAN(
CLEAR LOG( THEN
CLOSE LOG10( TO
CONT LOOKUP TRACE
COPY LVAR USER(
COS( MAT USING
DATA MERGE VAL(
DATE$ MID$( VARPTR(
DEF MOD WAIT
DELETE NEW WRITE
DIM NEXT XOR
DIR NOT ! PRINT USING
EDIT ON ^ EXPONENT
EE (2.7182818285) OPEN GANZZAHLDIVISION DIV
ELSE OPTION * MULTIPLIKATION
END OR + PLUS
EOF OUT - MINUS
EOF( OUTBYTE / DIVISION
EQV PEEK( ? PRINT
ERASE PI (3.1415926536) < KLEINER
ERL POKE = GLEICH
ERR POS( > GR�SSER
ERR( PRECISION ' REM
ERROR PRINT  
EXCHANGE PRIVACY  
EXIT RANDOMIZE  
EXP( READ  
FIND READ(  
FIX$( REM  
FIX( RENAME  
FN RENUMBER  
FNEND REPLACE  
FNRETURN RESAVE  
FRE( RESET  
FOR RESTORE  
GOSUB RESUME  
GOTO RETURN  
HEX$( RIGHT$(  
IF RND  
IMP RND(  
INP( RUN  
INPUT SAVE  
INPUT LINE SETLOC  
INSTR(    

 

Fehlermeldungen:

1 NEXT ohne FOR 2 Syntaxfehler
3 RETURN ohne GOSUB 4 keine Daten
5 nicht erlaubt 6 Ergebnis zu gross
7 kein Speicherplatz 8 Sprungziel fehlt
9 DIM-Befehl falsch oder fehlt 10 DIM-Befehl doppelt
11 durch 0 teilen ? 12 kein Direktbefehl
13 Datentypen (Zahl/String) vermischt 14 kein Stringplatz
15 String zu lang 16 Ausdruck zu schwierig
17 CONT geht nicht 18 USER FN CALL fehlt
19 Dateiende falsch 20 Zeilen-Nr. falsch
21 BASIC verf�gbar 22 FNRETURN ohne FN CALL
23 Zeilen-Nr. fehlt 24 RECORD zu lang
25 MATRIX nicht definiert 26 Kanal falsch
27 RESUME ohne ERROR 28 Inhaltsverzeichnis voll
29 Extension falsch 30 DISK voll
31 Datei nicht gefunden 32 Datei existiert
33 Datei geschlossen 34 OPEN-Modus falsch
35 Dateiname falsch 36 OPTION falsch
37 INPUT nicht offen 38 OUTPUT nicht offen
39 Wahlzugriff geht nicht 40 Datei nicht offen
41 keine Bin�reinheit 42 kein Dateiplatz
43 RECORD-Nr. falsch 44 DISK gesch�tzt
45 EXIT ohne FOR 46 nicht verf�gbar
47 nicht vorhanden 48 kein internes Format
49 Fehler unbekannt  

Systemfehlermeldungen:

* Falsche Eingabe*
* Komma falsch *
** HALT **
** HALT ** Zeile ZE
nicht gefunden * Sprungziel fehlt *

 

Start des BASIC-Interpreters

Nach dem Laden und Starten des Basic-Interpreters wird nach der Speichergrenze ge-fragt. Eingabe von <CR> reserviert je nach Version verschieden gro�en Speicherplatz f�r Programme und zus�tzlich 100 Bytes f�r Zeichenketten. Eingabe einer Dezimal- oder einer Sedezimalzahl (mit Kennzeichnung "&" als erstes Zeichen) begrenzt den Speicher, um z.B. ein Maschinenprogramm im oberen Speicherbereich zu sch�tzen.

Beispiele (Werte je nach Version verschieden)
Eingabe: 45056 <CR> Anzeige: 26411 Bytes frei
&B000 <CR> 26411 " "
&DC07 <CR> 37672 " "

Bei der Eingabe von Sedezimalzahlen sind nur Gro�buchstaben erlaubt. Bei falschen Eingaben und bei Zahlen gr��er 56327 kommt die Frage "Speichergrenze?" wieder und es kann eine neue Zahl eingegeben werden. Nach der Meldung des Interpreters wird bei der Diskettenversion nach dem Datum gefragt. Es k�nnen bis zu 20 beliebige Zeichen eingegeben werden, die mit PRINT DATE$ abrufbar sind, z.B. 31. Dezember 1991 **. Die Eingabe von <CR> ergibt die Meldung "Fertig" ohne aktuelles Datum.

a) Hinweise f�r CP/M-Plus beim NDR-Rechner:

Es stehen 42536 Bytes f�r BASIC-Programme zur Verf�gung.

b) Hinweise f�r den NDR-Klein-Computer:

Beim Start wird automatisch der Bildschirm gel�scht und der deutsche Zeichensatz eingeschaltet. Wer dies nicht m�chte oder ver�ndern will, kann im Quellcode die Bytes 1A 1B 7A 31 ab�ndern (1A = CTRL-Z: Bildschirm l�schen, 1B = ESCAPE: Sonderfunktion, 7A 31 = z 1: deutscher Zeichensatz).

c) Hinweise f�r mc-Computer:

Durch den mc-Monitor sind beim Start folgende IOBYTE-Belegungen vorgegeben: C=T, R=T, P=T, L=T. Ist ein Drucker am System angeschlossen, so mu� vor dem CP/M-Start "AL=L" eingegeben werden.

d) EURO-Z80 Eprom-Interpreter von Elektor

Der Interpreter im Eprom wird �ber die V24-Schnittstelle mittels Terminalprogramm vom PC aus gesteuert. Als Terminalprogramm eignet sich z.B. Procomm aus dem Shareware-Bereich. Diese Eprom-Version enth�lt nat�rlich keine Diskettenbefehle. Es fehlen zus�tzlich auch noch einige Befehle, da der Platz im Eprom nicht ausreicht.

e) EURO86-Interpreter: MS-DOS-Version des EURO-Z80

Diese Version ist identisch zur EURO-Z80-Version, d.h. es liegen die gleichen Adressen-lagen von Programm und Variablen vor. Die Befehle DIR, LOAD, SAVE, RESAVE und RESET(Laufwerk) sind in dieser Version vorhanden. So kann ein Basic-Programm dann direkt in ein Eprom abgelegt werden.

f) HEBAS86-Interpreter: Vollversion mit allen Befehlen

Hier liegt die Vollversion vor, die identisch zum Z80-CP/M-Interpreter ist.

Basic-Warmstart

a) mc-Computer und CP/M 2.X

Wird w�hrend des Betriebes die RESET-Taste (auch BREAK-Taste genannt) bet�tigt, so wird aus dem Eprom der Monitor neu geladen, ohne da� der Speicher gel�scht wird. Arbeitet man nur mit dem Laufwerk A weiter, gen�gt die Eingabe "g100" und der BASIC-Inter-preter antwortet mit der Meldung "BASIC verf�gbar". Wurde z.B. in einer Endlosschleife mit der RESET-Taste abgebrochen, erfolgt nach dem Warmstart die Meldung "BASIC verf�gbar Zeile XYZ".

Will man nachtr�glich das IOBYTE ver�ndern, so kann dies auf zweierlei Art geschehen. Mittels RESET-Taste wird der Monitor gestartet. Nun kann eine andere Zuordnung getroffen und ein BASIC-Warmstart durchgef�hrt werden. Man kann aber auch mittels POKE-Befehl den Dezimalwert des IOBYTE in die Speicherstelle 61697 (F101h) schreiben (POKE &F101, Dezimalwert). Der Dezimalwert 128 gilt f�r die Einstellung AL=L, 0 f�r AL=T (siehe IOBYTE-Tabelle).

b) NDR-Klein-Rechner und mc-Computer mit CP/M 2.X

Will man nach dem Warmstart mit Laufwerk B arbeiten, mu� nach dem Monitor-Start zu-erst CP/M geladen werden. Danach wird durch Aufruf eines Pseudoprogrammes CONT.COM auf Adresse 100h gesprungen und der Interpreter gestartet. Das Programm CONT.COM enth�lt keine Bytes und wird einfach mit dem CP/M-Befehl "SAVE 0 CONT.COM" gespeichert. Laden oder Abspeichern von Programmen mit dem Befehl LOAD oder SAVE ergibt die Fehlermeldung "kein Dateiplatz". Der Befehl CLEAR,0 (Komma eingeben!) reserviert f�r diese Vorg�nge wieder Speicherplatz und Laden oder Abspeichern von BASIC-Programmen funktionieren wieder.

Tritt beim Betrieb des BASIC-Interpreters z.B ein BDOS ERR ON A: R/O auf, meldet sich nach Eingabe von <CTRL-C> CP/M mit dem Laufwerkbuchstaben, z.B. "A>". Durch Eingabe von CONT (Meldung: BASIC verf�gbar) und CLEAR,0 kann mit dem BASIC-Interpreter weiter gearbeitet werden, ohne da� ein Programmverlust eingetreten ist. Das mit DATE$ abrufbare aktuelle Datum bleibt beim Warmstart erhalten.

c) NDR-Klein-Rechner und CP/M-Plus

CP/M-Plus �berschreibt beim Kalt- und Warmstart den TPA -Bereich in Bank 1 ab 100h mit dem CCP. Damit werden wichtige Flag-Tabellen des Basic-Interpreters zerst�rt.

Kontrollzeichen:

<CTRL-E>:
Die Ausf�hrung eines BASIC-Programmes oder eines Direktbefehles wird abgebrochen und die Meldungen "^E","** HALT ** Zeile XYZ" oder nur "** HALT **" und dann "Fertig" ausgegeben.
Die Abbruchm�glichkeit mit <CTRL-E> wird mit dem Befehl INTERRUPT X in einem BASIC-Programm abgeschaltet, wobei zuvor mit X = 0 der Variablen X der Wert 0 zuge-wiesen oder gleich INTERRUPT 0 vorgesehen wird. Der Ausstieg aus der Schleife in einer Programmzeile "15 goto 15" ist nur noch durch Neustart des Monitors (RESET-Taste) m�glich. Allerdings wird die <CTRL-E>-Funktion durch Befehle wie INPUT im Programm wieder eingeschaltet, ebenso durch INTERRUPT 1.
Beim Befehl LIST unterbricht das Dr�cken der Leertaste die Ausgabe, ein erneutes Dr�cken setzt die Ausgabe fort. Wer dies r�ckg�ngig machen m�chte, kann im Quellcode dies �ndern.

<CTRL-U>:
Eine Eingabe im Programm oder als Direktbefehl wird gel�scht, solange nicht <CR> eingegeben worden war.

<CTRL-O>:
Die Ausgabe auf den Bildschirm wird im Programm oder bei einem Direktbefehl bis zur Mel-dung "Fertig" unterdr�ckt, aber nicht gestoppt. Der INPUT-Befehl bricht <CTRL-O> ab.

<CTRL-R>: nur bei CP/M
Es werden alle durch die Taste <DELETE> (Rubout) eingef�gten Trennzeichen (') und die als "Echo" angezeigten zu l�schenden Zeichen entfernt und die bereinigte Zeile neu ausgegeben. Der Cursor steht am Ende dieser Zeile und es kann mit der Eingabe fortgefahren werden.

<CTRL-Z>:
Es wird die Meldung "Dateiende falsch" ausgegeben. Dieser Befehl beendet z.B. auch eine Eingabe von der Tastatur �ber den READER-Kanal mit LOAD#3 (Strichcodeleser).

<CTRL-T>:
Wird w�hrend eines Programmablaufes die Tastenkombination <CTRL-T> gedr�ckt, so wird am Bildschirm die Zeilennummer ausgegeben, die gerade bearbeitet wird.

 

Dateistrukturen, Schreiben/Lesen und sonstige Ein- und Ausgabefunktionen

Moderne Textverarbeitungssysteme er�brigen oft umst�ndliche Eingabe- und Ausgaberoutinen in BASIC. Eine Adressendatei z.B. l��t sich mit einem Textprogramm leicht anlegen, ver�ndern und drucken. Aber schon ein Sortiervorgang oder eine spezielle Dateiart erfordern eine Bearbeitung mit einem eigens daf�r entworfenen Programm. Der BASIC-Interpre-ter HEBAS bietet hierf�r umfangreiche Befehle.

A) OPEN:

Befehlsform: OPEN # Kanal,"Modus","Laufwerk:Dateiname.Dateizusatz",Satzl�nge

1) # Kanal: F�r die Zusammenarbeit des Computers mit Peripherieger�ten werden Verbindungskan�le ben�tigt. Diese werden mit Nummern von 0 bis 255 gekennzeichnet.

Tabelle der Kanalnummern:

Konsole 0
Laden und Speichern von Programmn 1
Drucker (List-Device) 2
Leser (Reader) 3 (nur mc-Computer)
Stanzer (Punch) 4 (nur mc-Computer)
f�r sp�tere Erweiterungen 5-9
Floppy 10-255

Prinzipiell k�nnen alle Ein- bzw. Ausgabefunktionen �ber irgendeinen sinnvollen Kanal ablaufen. Eine Ausgabe von Zeichen auf die Konsole ist nat�rlich ebenso sinnlos wie die Ausgabe an die Leser-Schnittstelle. Laden und Speichern von Programmen kann nur �ber Kanal 1 ablaufen. Einem nicht angegebenen Kanal wird die Nummer 0 zugewiesen. Folgt einer Kanalzuweisung ein weiteres Argument, mu� dies durch ein Komma von der Kanalnummer abgetrennt sein. Schlie�en eines nicht offenen Kanals bewirkt die Fehlermeldung "Datei nicht offen".

Kanalmerkmale: Die Voreinstellungen der Kanalparameter sind beim Befehl OPTION erl�utert. Beim mc-Computer mu� die IOBYTE-Einstellung L = L nach dem Start des Monitors vorliegen.

a) Kanal #0

Dieser Kanal ist immer offen. Der Befehl OPEN#0,"O" <CR> l�scht den Bildschirm. Ausserdem werden die mit dem Befehl OPTION ver�nderten Voreinstellungen r�ckg�ngig ge-macht. Der Befehl CLOSE#0 <CR> l�cht ebenfalls den Bildschirm und der Kanal bleibt offen.

b) Kanal #1

Laden oder Speichern von Programmen l�uft �ber diesen fest eingestellten Kanal ab, was nicht ver�ndert werden kann. Eine Kanalangabe wird beim LOAD- und SAVE-Befehl nicht ber�cksichtigt, bei RESAVE wird "Syntaxfehler" ausgegeben.

c) Kanal #2

Der Kanal zum Drucker ist immer offen. Der Befehl OPEN#2,"O" <CR> gibt ein Formfeed aus; die Kanalparameter (falls mit dem Befehl OPTION ver�ndert) werden zur�ckgestellt. CLOSE#2 gibt ein Formfeed aus, der Kanal bleibt offen. FORMFEED = Seitenvorschub!

d) nur mc-Computer: Kanal #3

Der Reader-Kanal ist immer offen. Der Befehl OPEN#3,"I" <CR> stellt die Kanalparameter zur�ck. CLOSE#3 hat keine Auswirkung. Mit dem Befehl INPUT#3,A$ kann z.B. �ber die Tastatur ein Wort eingegeben werden, ohne da� die Zeichen auf dem Bildschirm erschei-nen.

e) nur mc-Computer: Kanal #4

Der Punch-Kanal ist immmer offen. Der Befehl OPEN#4,"O" gibt 16 Bytes mit dem Wert 255 (FF) aus und stellt die Kanalparameter zur�ck. CLOSE#4 gibt ein CTRL-Z (1A) aus, ge-folgt von 16 Bytes FF; der Kanal bleibt offen.

f) Die Kan�le 5 - 9 sollten nicht verwendet werden.

g) Kan�le 10 - 255

F�r Diskettenlaufwerke sind die Kan�le 10 bis 255 verwendbar. Jeder Ausgabekanal wird mit einer eigenen Datei verbunden, deren Name im OPEN-Befehl angegeben wird. Die ma-ximale Anzahl der durch ein Programm gleichzeitig ge�ffneten Kan�le wird durch den CLEAR-Befehl bestimmt (siehe dort).

2) Modus:

F�r die Verbindungskan�le zwischen Computer und Diskettenlaufwerk gibt es verschiedene Ausf�hrungsarten, die durch die Gro�buchstaben I, O, U und R abgek�rzt, in Anf�hr-ungszeichen gesetzt und mit Kommas von anderen Argumenten abgegrenzt werden m�s-sen. Der Modus kann auch durch eine Stringvariable angegeben werden (ansonsten Fehlermeldung "OPEN-Modus falsch").

a) I = Eingabe-Modus (Lese-Modus)

Diese Datei-Er�ffnungsart wird f�r sequentielle Lesevorg�nge von der Diskette ben�tigt. Die mit dem Dateinamen angegebene Datei wird auf der Diskette im angemeldeten oder eigens bezeichnetem Laufwerk gesucht und die Kanalverbindung hergestellt. Fehlt die Datei, erfolgt Fehlermeldung "Datei nicht gefunden". Der CLOSE-Befehl f�r einen solchen Kanal hat keine Funktion.

b) O = Ausgabe-Modus (Schreib-Modus)

Sequentielle Schreibvorg�nge erfordern diesen Modus. Die angegebene Datei wird wie beim I-Modus gesucht. Ist sie vorhanden, erfolgt die Fehlermeldung "Datei existiert Zeile XY", wenn nicht vorhanden, wird die Kanalverbindung hergestellt. Ein CLOSE nach einem solchen OPEN-Modus bewirkt die Ausgabe von CTRL-Z (1A), Leerung aller Zwischenspeicher und die Aktualisierung des Disketteninhaltsverzeichnisses.

c) U = Erg�nzungsmodus (Lese- und Schreibmodus)

Lesen und Schreiben sind �ber einen Kanal m�glich. Bei diesem Modus wird bei nicht gefundener Datei die Fehlermeldung "Datei nicht gefunden Zeile XY" angezeigt, ansonsten die Verbindung hergestellt. Jeder Schreibvorgang beginnt an der gleichen Stelle wie der vorhergehende Lesevorgang, jeder folgende Lesevorgang beginnt mit dem ersten, noch nicht bearbeitetem Byte. CLOSE ergibt eine Leerung der Zwischenspeicher und die Aktualisierung des Inhaltsverzeichnisses.

d) R = Random-Modus (Lese- und Schreibmodus, wahlfrei)

Hier kann sowohl sequentiell als auch mit wahlfreiem Zugriff geschrieben oder gelesen werden. Fehlt die angegebene Datei, wird sie neu angelegt. Ist sie vorhanden, wird sie erg�nzt oder an den bezeichneten Stellen �berschrieben (wahlfreier Zugriff), ohne da� Fehlermeldungen wie bei den anderen Zugriffsarten erfolgen. CLOSE leert die Zwischenspeicher und aktualisiert das Verzeichnis.

Allgemein:

Ein OPEN-Befehl setzt den Byte-Zeiger der Datei auf das erste Byte des Dateiinhaltes. Dies kann ohne Fehlermeldung bei der gleichen Datei beliebig oft wiederholt werden.

Ein CLOSE-Befehl schlie�t die Bearbeitung der Datei ab und trennt die Verbindung zur Datei. Mit dem CLEAR-Befehl reservierter Speicherplatz bleibt reserviert.

3) Laufwerk:Dateiname.Dateizusatz

Fehlt die Laufwerksangabe, wird die Datei auf der Diskette in dem angemeldetem Laufwerk gesucht. Sternchen im Dateinamen k�nnen bei Schreibvorg�ngen nicht als Abk�rzung verwendet werden (Auff�llung mit Fragezeichen). Fehlt der Dateizusatz, wird er durch .BAS erg�nzt. Die drei Parameter d�rfen auch durch Variableninhalte bestimmt werden.

4) Satzl�nge:

Diese Zahl bestimmt die L�nge eines einzelnen Datensatzes und mu� als Ganzzahl im Bereich von 1 bis 32767 eingegeben werden. Beim R-Modus wird sie sonst gleich 1 gesetzt, bei den anderen Modus-Arten bleibt sie unber�cksichtigt.

Um auf beliebige Teile einer Datei zugreifen zu k�nnen, ohne da� die ganze Datei in den Kernspeicher geladen wird, ben�tigt man die Adresse des Anfangsbytes des gesuchten Dateiteiles. Diese wird intern durch Multiplikation einer Satznummer (1 - 4194303) mit der Satzl�nge errechnet. Da jedoch die Satzl�nge auch die Trennzeichen (es sind dies die Bytes 22h, 0A und 0D) der Dateis�tze beinhaltet (siehe OPTION), mu� zur eigentlichen Datensatzl�nge noch der Wert 4 dazu addiert werden, sonst wird nicht auf den Anfang der Datens�tze zugegriffen. Die gesamte Dateil�nge (Summe der Satzl�ngen) kann unber�cksichtigt bleiben oder man beschreibt beim Anlegen der Datei alle Datens�tze mit einem Leerstring.

B) Schreib- und Lesevorg�nge:

F�r Schreib- bzw. Lesevorg�nge werden zun�chst nur noch folgende Befehle ben�tigt.

a) Schreiben: PRINT: Befehlsform: PRINT # Kanal @ Satznummer, Variable 1, Variable 2, usw.

Die Satznummer wird durch den vorangestellten Klammeraffen "@" gekennzeichnet, beide werden nur f�r Schreibvorg�nge bei wahlfreiem Zugriff ben�tigt. Nummerische Variablen Zahlen), Textvariablen und Ausdr�cke sind erlaubt.

b) Lesen: Input: Befehlsform: INPUT # Kanal @ Satznummer, Variable 1, Variable 2, usw.

Bis zu 250 Zeichen k�nnen �ber den angegebenen Kanal eingelesen werden (sonst Fehlermeldung "Record zu lang Zeile XY"). Um auch Kommas einlesen zu k�nnen, bedarf es des Befehles INPUT LINE # Kanal ... . Die mit dem Befehl OPTION angegebenen Trennzeichen werden mitgelesen, ausgenommen die ASCII-Zeichen 32h, 34h und 27h.

Es folgen nun Beispiele zur sequentiellen sowie zur wahlfreien Dateibearbeitung.

1) sequentiell schreiben

5 CLEAR 250
10 OPEN#15,"O","A:TEST.DAT"
20 INPUT A$:PRINT#15,A$
30 CLOSE#15

Es wird die Datei TEST.DAT �ber den Kanal Nr. 15 erstmalig im Ausgabe-Modus er�ffnet (Fehlermeldung, wenn die Datei TEST.DAT schon im Inhaltsverzeichnis der Diskette steht, siehe auch den Befehl LOOKUP im Abschnitt C). Nach der Eingabe bis zu 250 Zeichen ohne Kommas in die Variable A$ wird diese �ber den Kanal Nr. 15 ausgegeben, auf die Diskette im Laufwerk A geschrieben und mit CLOSE#15 die Bearbeitung abgeschlossen.

Wurde z.B. die Zeichenkette AAA* eingegeben, so werden beim Schreibvorgang folgende Zeichen (sedezimal) auf Diskette geschrieben:

22 41 41 41 2A 22 0D 0A 00 00 00 00 00 usw., auf 128 Bytes mit Nullen aufgef�llt.

Mehrere Eingaben k�nnen auch �ber eine FOR-NEXT-Schleife mit indizierten Variablen, z.B. A$(I), durchgef�hrt werden.

2) sequentiell lesen

5 CLEAR 250
10 OPEN#15,"I","TEST.DAT"
15 ON EOF GOTO 30
20 INPUT#15,A$:PRINT A$
30 CLOSE#15
40 END

Die in der Datei TEST.DAT enthaltene Zeichenkette wird in die Variable A$ �ber den Kanal Nr. 15 eingelesen und auf den Bildschirm ausgegeben. In Zeile 20 beider Beispiele k�nnen, durch ein Komma getrennt, auch mehrere Variablen stehen:

a) Schreiben: 20 INPUT A$,B$,C$,D$:PRINT#15,A$,B$,C$,D$

b) Lesen: 20 INPUT#15, A$,B$,C$,D$:PRINT A$,B$,C$,D$

3) sequentiell lesen und schreiben

5 CLEAR 250
10 OPEN#25,"U","TEST.DAT"
20 INPUT#25,A$:PRINT A$
30 INPUT"RICHTIG";X$
40 : IF X$ ="NEIN" THEN INPUT A$
50 PRINT#25,A$:GOTO 20
60 END

Aus einer bestehenden Datei wird jeweils eine Zeichenkette gelesen und falls f�r richtig befunden, wieder auf Diskette geschrieben. Nach dem Lesen der letzten Zeichenkette der Datei ergibt ein weiterer Lesezugriff die Fehlermeldung "Dateiende falsch Zeile 20". Dies kann durch eine Programmzeile 25 ON EOF GOTO 60 abgefangen werden.

4) wahlfrei schreiben

5 CLEAR 250
10 OPEN#10,"R","TEST.REC",104
20 FOR I = 1 TO 5
30 INPUT A$(I):PRINT#10@I,A$(I)
40 NEXT:CLOSE#10

Es werden 5 Datens�tze mit einer L�nge von 100 Zeichen in der Datei TEST.REC abgelegt.

5) wahlfrei lesen

5 CLEAR 250
10 OPEN#250,"R","TEST.REC",104
20 INPUT"Satznummer";SN: IF SN = 0 THEN END
30 INPUT#250@SN,A$:PRINT A$: GOTO 20
40 CLOSE#250

Jeder der mit Beispiel Nr.4 eingebenen f�nf Datens�tze kann beliebig gelesen werden. Hier zeigt sich die Grenze solcher einfacher Beispiele. Eine falsche Datennummer SN ergibt falsche Zeichenketten oder die Fehlermeldung "Dateiende falsch Zeile XY". Dies mu� durch das Programm abgefangen werden. Beachten Sie dazu das Beispielprogramm mit Erl�uterung am Schlu� des Handbuches.

C) Weitere Befehle zur Dateiverarbeitung:

1) BYTE(: Befehlsform: BYTE (# Kanal)

Damit k�nnen �ber den angegebenen Kanal sequentiell die dezimalen Werte der Bytes einzeln gelesen werden. Das Nummernzeichen "#" kann entfallen. Beispiel:

5 CLEAR 250
10 OPEN#15,"I","A:TEST.DAT"
20 B = BYTE(#15):PRINT B;
30 ON EOF GOTO 100
40 GOTO 20
50 :
100 CLOSE#15:PRINT"ENDE"

Es erfolgt die Ausgabe der Datei TEST.DAT zeichenweise in dezimalen Werten, z.B. der Datensatz "AAA" ergibt die Zeichenfolge 34 65 65 65 34 13 10 0 0 0 0 0 0 0 usw. bis 128 Bytes gelesen wurden.

Mit einer Programmzeile B = BYTE(#0) ist eine Tastaturabfrage m�glich. Der Interpreter h�lt mit der Programmausf�hrung an, bis eine Taste gedr�ckt wurde. Die Variable B enth�lt den dezimalen Wert der Taste, das Zeichen erscheint nicht auf dem Bildschirm.

10 PRINT"TASTE DR�CKEN:";
20 B = BYTE(#0)
30 PRINT"ZEICHEN DEZ.:";B
40 : IF B = 5 THEN STOP ELSE GOTO 20

Da auch Steuerzeichen wie <CTRL-E> als dezimaler Wert (5) ausgegeben werden, mu� zum Programmabbruch die Zeile 40 vorhanden sein. Weiterhin ist die Verwendung des Befehles auch in Verbindung mit dem Zusatz ON m�glich:

10 ON BYTE(#0) GOTO 100,200
20 STOP
100 PRINT"1. Sprung"
110 STOP
200 PRINT"2. Sprung"

Bei Eingabe von <CTRL-A> erfolgt ein Sprung zur Zeile 100, bei <CTRL-B> ein Sprung nach 200, da die beiden Eingaben die dezimalen Werte 1 und 2 besitzen.

2) BYTE$( Befehlsform: BYTE$( # Kanal , Zeichenanzahl)

Damit kann jetzt ein ganze Zeichenkette auf einmal eingelesen werden. Das Nummernzeichen "#" kann entfallen. Die Trennzeichen (" oder mit OPTION ver�ndert) der Zeichenkette werden mitgelesen und angezeigt. Eine fehlende Zeichenanzahl wird durch die Zahl 1 ersetzt.

5 CLEAR 250
10 OPEN#10,"I","A:TEST.DAT"
20 B$ = BYTE$(#10):PRINT B$;
30 ON EOF GOTO 100
40 GOTO 20
50 :100 CLOSE#10:PRINT"ENDE"

Die mit dem Beispiel Nr.1, Abschnitt B) geschriebene Datei wird gelesen und beim Zeichen CTRL-Z (1A) zur Zeile 100 gesprungen. Der Befehl BYTE$(#0,1) vereinfacht Eingaberoutinen, die nur bestimmte Zeichen als Eingabe zulassen.

10 PRINT"Bitte die Taste <F> dr�cken"
20 B$ = BYTE$(#0,1): IF B$ <> "f" THEN 20
30 PRINT"Fertig"

3) OUTBYTE: Befehlsform: OUTBYTE # Kanal @ Satznummer, Zahl oder Variable oder Zeichenkette

Es sind Zahlen von 0 bis 255 erlaubt. Von einer Zeichenkette wird jedes Zeichen als einzelnes Byte ausgegeben. Die L�nge der Zeichenkette wird nicht wie beim WRITE-Befehl angegeben. Steuerzeichen wie CTRL-I und andere lassen sich so an Daten anh�ngen.

PRINT#12,A$;:OUTBYTE#12,9:PRINT#21,B$;:OUTBYTE#12,9

Diese Befehle f�gen beim Schreibvorgang in eine Datei an A$ und B$ die Zeichen CTRL-I und 9 an. Weiterhin lassen sich mit OUTBYTE#0 Zahlenkolonnen ohne Zwischenraum ausgeben wie es bei dem Befehl PRINT nicht der Fall ist.

5 A = 1
10 FOR I = 1 TO 10
20 PRINT A; Ausgabe: 1 1 1 1 1 1 1 1 1 1
30 NEXT

dagegen:

5 A = 49
10 FOR I = 1 TO 10
20 OUTBYTE#0,A Ausgabe: 1111111111
30 NEXT

4) LOC(: Befehlsform: LOC( # Kanal )

Der Befehl gibt nach einem Schreib- oder Lesebefehl die Stellung des Byte-Zeigers an, d.h. die Zahl der insgesamt �bertragenen Bytes einer Zeichenkette einschlie�lich Trennzeichen. Wurde z. B. mit dem Programm Nr.1 im Abschnitt B) eine Zeichenkette mit 10 Zeichen auf Diskette geschrieben, so gibt der Befehl PRINT LOC(#15) als Zeile Nr. 25 die Zahl 14 aus. Diese Zahl ist um 4 gr��er als die L�nge der Zeichenkette (siehe auch Abschnitt A), Satzl�nge). Das Nummernzeichen "#" kann entfallen. Wurde z.B. mit dem Befehl OPTION #10,"Q",0 das Trennzeichen zwischen einzelnen Datens�tzen abgeschafft, so ist diese Zahl nur um 2 gr��er.

5) SETLOC: Befehlsform: SETLOC # Kanal @ Bytenummer, # Kanal @ Bytenummer, usw.

Dies ist das Gegenst�ck zum LOC(-Befehl. Es wird die Stelle in einem Datensatz angegeben, ab der ein Zugriff erfolgen soll. So kann bei sonst sequentieller Dateiverarbeitung in einem Datensatz wahlfrei gelesen oder geschrieben werden.

SETLOC#15@5 bedingt einen Zugriff ab dem f�nften Byte des Datensatzes, setzt also den Byte-Zeiger auf das 5.Byte des Datensatzes der mit Kanal Nr. 15 er�ffneten Datei. Man erspart sich so umst�ndliche Stringoperationen bei sequentiellen Dateien.

10 OPEN#10,"I","A:TEST.DAT"
20 ON EOF GOTO 70
30 INPUT"Byte-Nummer";BN
40 SETLOC#10@BN
50 PRINT BYTE$(#10,2)
60 GOTO 30
70 END

Ab dem angegebenen Byte werden zwei Zeichen gelesen und angezeigt (siehe BYTE-Befehl).

6) LOF(: Befehlsform: LOF( # Kanal )

Es wird die von einer Datei auf einer Diskette belegte Byteanzahl (immer Vielfache von 128) ausgegeben, wobei zuvor diese Datei �ber einen Kanal er�ffnet werden mu�.

10 INPUT "Dateiname";A$
15 IF A$="e" THEN END
20 OPEN#10,"I",A$
30 PRINT LOF(#10)
40 GOTO 10

7) LOOKUP(: Befehlsform: LOOKUP("Laufwerk: DATEINAME.DATEIZUSATZ") oder LOOKUP(Stringvariable)

Wird mit dem O-Modus eine Datei er�ffnet, so wird die Fehlermeldung "Datei existiert Zeile XY" ausgegebenen, falls eine Datei mit gleichem Namen schon vorhanden ist. Mit LOOKUP( kann dies abgefragt und mit dem ERASE-Befehl die Datei gel�scht werden. Der Befehl liefert den Wert -1, wenn die Datei vorhanden bzw. 0, wenn sie nicht vorhanden ist. Der Ausdruck in Klammern kann auch durch Variablen angegeben werden.

So kann beim Beispiel Nr.1 BYTE, Abschnitt B) die Zeile Nr. 7 eingef�gt werden.

7 IF LOOKUP("A:TEST.DAT") THEN ERASE "A:TEST.DAT"

Der Dateiname kann auch in einer Variablen enthalten sein, er mu� gro� geschrieben sein.

IF NOT LOOKUP(LW$+":"+D1$) THEN .........

8) WRITE: Befehlsform: WRITE # Kanal @ Satznummer , Variable oder "Zeichenkette"

Dieser Befehl kann nur f�r bin�re Ausgabeeinheiten verwendet werden (Kanal Nr.0 und Nr.2 ergeben die Fehlermeldung "keine Bin�reinheit). Die L�nge der in der Variablen enthaltenen Zeichenkette wird als erstes Byte vor den Zeichen der Zeichenkette auf Diskette geschrieben. Bei den im Abschnitt B) angegebenen Beispielen Nr.1 und 4 kann der Befehl PRINT # Kanal durch WRITE # Kanal ersetzt werden.

nur CP/M und mc-Computer:
Der Befehl WRITE #4 ohne weitere Argumente dient zur Ausgabe einer aus acht Bytes bestehenden Zeichenkette (FF FF FF FF FF FF FF 00), die als "data header" beim Kanal Nr. 4 verwendet wird, der vorher mit OPEN#4,"O" er�ffnet werden mu� (sonst Fehlermeldung "OUTPUT nicht offen").

9) READ: Befehlsform: READ # Kanal @ Satznummer , Variable

Nur von bin�ren Eingabeeinheiten (nicht die Tastatur) kann mit diesem Befehl gelesen werden (sonst Fehlermeldung "keine Bin�reinheit). Es werden soviele Zeichen eingelesen wie im ersten Byte der Zeichenkette angegeben sind.

nur mc-Computer:
READ #3 ohne Argumente liest solange Zeichen, bis ein "data header" gefunden wurde.

10) MAT WRITE: Befehlsform: MAT WRITE # Kanal @ Satznummer , Matrix 1, Matrix 2, usw.

Mit dem Befehl k�nnen ohne gro�en Programmieraufwand ein- oder zweidimensionale nummerische Matritzen �ber den angegebenen Kanal ausgegeben werden (nur Bin�reinheiten).

5 DIM A(3,5)
10 FOR I = 1 TO 3
20 FOR J = 1 TO 5
30 INPUT A(I,J)
40 NEXT J,I
50 :
60 OPEN#10,"O","A:TEST.MAT"
70 MAT WRITE#10,A
80 CLOSE#10

Nach der Eingabe beliebiger Zahlen wird die Matrix ohne FOR-NEXT-Befehle direkt �ber Kanal Nr. 10 in die Datei TEST.MAT geschrieben.

11) MAT READ: Befehlsform: MAT READ # Kanal @ Satznummer , Matrix 1, Matrix 2 usw.

Die mit obigem Beispiel erstellte Matrix wird mit diesem Befehl wieder gelesen.

10 DIM A(3,5)
20 OPEN#10,"I","A:TEST.MAT"
30 MAT READ#10,A
40 CLOSE#10
50 REM Anzeige der Matrix
60 FOR I = 1 TO 3
70 FOR J = 1 TO 5
80 PRINT A(I,J);
80 NEXT J :PRINT: NEXT I

Zum Einlesen der Matrix mu� diese vorher dimensioniert werden. Eine Dimensionierung, die von der beim Schreibvorgang vorhandenen abweicht, ergibt Lesefehler.

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

Fehlerbehandlung:

1) ERROR: Befehlsform: ERROR (Fehlernummer)

Wie schon im Abschnitt III bei den Direktbefehlen erl�utert, kann mit dem Befehl ERROR XY (0-48) die Fehlermeldung XY ausgegeben werden. Fehlermeldungen sind aber auch beliebig definierbar, wobei die Texte den Nummern 0 - 255 zugeordnet werden k�nnen. Entsprechend der gew�nschten Abbruchbedingung des Programmes wird die Fehlernummer angegeben.

30 IF A > 5 THEN ERROR 50

Wird w�hrend des Programmlaufes die Zeile 30 erreicht und der Wert der Variablen A ist gr��er als 5, dann wird die Zahl 50 als Fehlernummer gespeichert. Zu Beginn des Pro-grammes setzt man einen Sprungbefehl:

10 ON ERROR GOTO 1000

Im Unterprogramm ab Zeile 1000 kann dann der zugeh�rige Text ausgegeben werden.

1000 IF ERR = 50 THEN PRINT "A zu gro�": GOTO ....

Nach dem Befehl ON ERROR GOTO ... darf kein CLEAR-Befehl enthalten sein.

 

2) ERR

a) Befehlsform: ERR = Fehlernummer

Die Variable ERR enth�lt die Fehlernummer, die mit der IF-Bedingung abgefragt werden kann.

1000 IF ERR = 32 THEN ERASE "A:TEST.BAS"

Falls das Programm TEST.BAS existiert, wird es gel�scht.

b) Befehlsform: ERR( # Kanal ) oder ERR(10)

Tritt ein Fehler bei der Ben�tzung des angegebenen Kanals auf, so enth�lt die Funktion ERR(#Kanal) den Wert -1, sonst 0.

 

3) ERL Befehlsform: ERL = Zeilennummer

Die Variable ERL enth�lt die Zeilennummer der Programmzeile, in der der Fehler auftrat. Ein Fehler bei der Ausf�hrung eines Direktbefehles ergibt den Wert 65535 f�r ERL.

 

4) RESUME:

Soll nach der Fehlerbehandlung in einem Unterprogramm mit der normalen Programmaus-f�hrung fortgefahren werden, mu� der Befehl RESUME das Unterprogramm abschlie�en. Dieser Befehl entspricht dem RETURN nach einem GOSUB.

a) Befehlsform: RESUME

Es wird der Befehl wiederholt, der den Fehler verursachte.

b) Befehlsform: RESUME Zeilennummer

Das Programm wird mit der angegebenen BASIC-Zeile fortgesetzt.

c) Befehlsform: RESUME NEXT

Das Programm wird nach dem Befehl fortgesetzt, der den Fehler verursachte.Am Anfang eines Unterprogrammes zur Fehlerbehandlung kann auch ein weiterer ON ERROR GOTO-Befehl stehen.

 

Beispiel zum wahlfreien Diskettenzugriff (RANDOM-DATEI)

30 CLEAR 5000:A$ = CHR$(64) ' 1000 Byte f�r String
40 GOSUB 440 ' Bildschirm frei
50 PRINT"Anlegen einer Datei = 1":PRINT
60 PRINT"Daten schreiben = 2":PRINT
70 PRINT"Daten lesen = 3":PRINT
80 PRINT"Ende = 0":PRINT
90 B = VAL(BYTE$(#0)):RL=0 ' Tastaturabfrage
100 : ON B GOTO 130,210,330 ' Verteiler
110 CLOSE:END
120 :
130 ' alle Records anlegen und auff�llen
140 GOSUB 460:OPEN#20,"R",NA$,L1 ' L1 =RL+4
150 FOR RN = 1 TO RZ:PRINT RN;
160 : S$ =STR$(RN)+STRING$(A$,RL)
170 : S1$=FIX$(MID$(S$,2,LEN(S$)),RL) ' L�nge konstant
180 : PRINT#20@RN,S1$
190 NEXT RN:CLOSE#20:GOTO40
200 :
210 ' Record schreiben
220 GOSUB 440:PRINT"Record schreiben":PRINT
230 : IF RL=0 THEN GOSUB 460 ' Recorddaten
240 OPEN#20,"R",NA$,L1
250 : INPUT"Record-Nr. 0=Ende";RN
260 : IF RN = 0 THEN 310
270 : IF RN>RZ THEN 250 ' Recordnummer begrenzt
280 : INPUT"Eingabe:";E$
290 : IF LEN(E$)> RL THEN 280 ' Eingabe begrenzt
300 : PRINT#20@RN,E$:PRINT:GOTO 250
310 CLOSE#20:GOTO 40
320 :
330 ' Record lesen
340 GOSUB 440:PRINT"Record lesen":PRINT
350 : IF RL=0 THEN GOSUB 460 ' Recorddaten
360 OPEN#20,"R",NA$,L1
370 : INPUT"Record-Nr. 0=Ende";RN:GOSUB 440
380 : IF RN>RZ THEN GOSUB 440:PRINT"kein Record":GOTO 370
390 : IF RN=0 THEN 420
400 : INPUT#20@RN,E$: IF E$="" THEN PRINT"Keine Daten"
410 : PRINTE$:PRINT:GOTO 370
420 CLOSE#20:GOTO 40
430 :
440 PRINT CHR$(27);CHR$(69):RETURN ' Bildschirm frei
450 :
460 ' Recorddaten
470 INPUT"Dateiname ohne Dateityp";NA$:PRINT
480 INPUT"Laufwerk";LW$:PRINT
490 NA$=LW$ + ":" +NA$ +".rec"
500 : IF LOOKUP(NA$) THEN 570
510 IF B=3 THEN GOSUB 440:PRINT"Datei nicht vorhanden":
PRINT:GOTO 50
520 INPUT"Recordanzahl";RZ:PRINT
530 INPUT"Recordl�nge";RL:L1=RL+4
540 OPEN#20,"R",NA$,13:D$=FIX$(STR$(RZ),5)+FIX$(STR$(L1),4)
550 PRINT#20@0,D$:CLOSE#20:RETURN
570 : IF B=1 THEN GOSUB 440:PRINT"Datei vorhanden":PRINT:
GOTO 50
580 OPEN#20,"R",NA$,13:INPUT#20@0,D$
590 : RZ = VAL(LEFT$(D$,5)):L1=VAL(RIGHT$(D$,3)):RL=L1-4
600 : PRINT"Recordzahl:";RZ;" Recordl�nge:";RL:PRINT
610 CLOSE#20:RETURN

Erl�uterungen dazu:

Was ist das besondere daran? Bei sequentiellen Dateien sind alle Daten hintereinander abgelegt, z. B. Mitgliedsdaten eines Vereines. M�chte man einzelne Daten ver�ndern, sollten alle Daten im Kernspeicher zur Verf�gung stehen. Bei einer Datei mit wahlfreiem Zugriff k�nnen z.B. nur der 2. und dann gleich der 200. Datensatz bestehen und auch bearbeitet werden, ohne da� dazwischen Datens�tze vorhanden sein oder gelesen werden m�ssen. Man spricht von virtuellen Dateigr��en, da nur die tats�chlich vorhandenen Daten Speicherplatz auf der Diskette beanspruchen, also bei unserem Beispiel nur 2 Da-tens�tze. Bei kleineren Diskettenkapazit�ten gibt es jedoch dann erhebliche Probleme, wenn die virtuellen Dateien zu gro� werden. Bei dem Beispielprogramm wird daher die Datei in voller Gr��e angelegt.

Eine wahlfreie Datei enth�lt Datens�tze mit fest vorgegebener Satzl�nge. Ein Datensatz aus einem Adressenprogramm kann z.B. so aufgebaut sein:

Anrede (max. 10 Zeichen), Name u.Vorname (max. 40 Zeichen),

Stra�e (max. 30 Zeichen), Postleitzahl und Wohnort (max. 50)

Ein Datensatz (auch Record genannt) enth�lt dann immer 130 Zeichen. F�r jede Adresse gibt es einen Datensatz. Die Satzl�nge kann nachtr�glich nur durch �bertragen der Daten in eine gr��ere Datei abge�ndert werden. Auch bekannte Datenbanksysteme wie DBASE arbeiten nach diesem Prinzip. Jede Teilinformation, z.B. Stra�e beginnt immer an der glei-chen Stelle im Datensatz. Eine andere M�glichkeit ist die Verwendung eines Markier-ungszeichens nach jeder Teilinformation, das dann allerdings mit dem INSTRING-Befehl gesucht werden mu�.

Mit dem Beispielprogramm als Kernst�ck kann man z.B. ein Adressenprogramm auf-bauen. Eine sortierte sequentielle Datei enth�lt nur die Namen mit einer Schl�sselnummer, die die Satznummer der einzelnen Random-Dateien Adresse, Bankverbindung, Mitglieds-daten etc. enth�lt.

Programmbeschreibung: Das Programm ist in 5 Abschnitte gegliedert.

Nach Speicherreservierung und Bildschirml�schung wird ein Menueplan angeboten.

2. Abschnitt: Zeile 130-190 * Record anlegen *

Nach Eingabe und �berpr�fung der Recorddaten im Abschnitt Nr. 5 wird die Datei voll-st�ndig aufgef�llt, wobei die Recordnummer mit dem Zeichen CHR$(64) = "Klammeraffe" auf die eingegebene Recordl�nge erg�nzt wird. Somit werden bei einem Lesezugriff keine sinnlosen Daten gelesen. Die Recorddaten werden zus�tzlich auf der Diskette im Record Nr. 0 abgespeichert.

3. Abschnitt: Zeile 210-310 * Record schreiben *

Nur bei Programmstart (Rl=0) werden die Recorddaten im Abschnitt Nr. 5 entweder von der Diskette gelesen oder eingegeben. Die eingegebenen Daten werden vor dem Schreibvorgang �berpr�ft. Hier k�nnte man auch einen Lesezugriff einf�gen, um bei vorhan-denen Dateien nicht Daten durch versehentliches �berschreiben zu vernichten.

4. Abschnitt: Zeile 330-420 * Record lesen *

Dieser Abschnitt ist dem 3. Abschnitt �hnlich aufgebaut, nur erfolgt jetzt ein Lesezugriff. Ist die Datei anfangs mit dem Programmabschnitt Nr. 2 angelegt worden, so werden jetzt definierte Daten gelesen.

5. Abschnitt: Zeile 460-620 * Recorddaten *

Dies ist eigentlich der wichtigste Abschnitt. Zun�chst werden Dateiname und Laufwerk erf-ragt. Mit dem Befehl "lookup (Dateiname)" wird �berpr�ft, ob die Datei existiert. Wenn nicht, wird bei einem Lesezugriff (b=3) ins Menue zur�ckgesprungen bzw. bei einem Schreibzugriff werden erst die Recorddaten ermittelt.

Recordanzahl und Recordl�nge richten sich nach der Diskettenkapazit�t. Bei 360 KByte sind z.B. �ber 18000 Records mit 10 Zeichen Stringl�nge oder auch 2600 Records mit 100 Zeichen m�glich, wobei die Stringl�nge maximal 250 Zeichen betragen kann. Die Records werden mit den Bytes 22h, 0Dh, 0Ah und 22h miteinander verbunden. Daher mu� die ein-gegebene L�nge der Records um 4 erh�ht werden ( Zeile 530:L1=RL+4 ). Recordanzahl (RZ) und Recordl�nge (L1) werden als String (D$) mit konstanter L�nge ( 9 Zeichen ) abgespeichert. Ist die Datei vorhanden, so darf sie nicht aus Versehen mit Menueteil Nr. 1 durch Neuanlegen vernichtet werden; es erfolgt ein R�cksprung ins Menue (b=1). Nun kann Record Nr. 0 gelesen werden. Aus dem String (D$) werden Recordanzahl und Recordl�nge ermittelt, danach erfolgt der R�cksprung in den jeweiligen Programmabschnitt.

V. HEBAS und Mathematik

Im ersten Teil sind die mathematischen Operatoren, Vergleichsoperatoren und logischen Operatoren in abnehmender Priorit�t aufgef�hrt.Im zweiten Teil folgen mathematische Funktionen, dann Umwandlungsbefehle wie Zahl zu String usw., im vierten Teil sind einige Beispiele zur Rechengenauigkeit aufgef�hrt. Alle Befehle k�nnen als Direktbefehl und in BASIC-Zeilen verwendet werden. Abschlie�end wird die Definition eigener BASIC-Funktionen mit dem DEF-Befehl beschrieben.

PRECISION: Befehlsform: PRECISION (Zeichenanzahl)

Ergebnisse von Berechnungen (z.B. Dezimalbr�che) werden mit maximal 11 Zeichen (ohne Punkt) ausgegeben. Diese Anzahl kann verringert werden, wobei die letzte ausgegebene Stelle gerundet ist. Intern wird mit 11 Zahlen weiter gerechnet. Die Zahl 0 oder keine Angabe nach dem Befehl ergeben wieder 11 Zeichen.

PRECISION 5 <CR> oder PRECISION (5)

Es werden bei Rechenergebnissen Zahlen mit maximal 5 Zeichen ohne Punkt ausgegeben. PRINT 10/7 <CR> ergibt die Zahl 1.4286, Print 100/7 <CR> ergibt 14.286. Mit PRECISION 0 <CR> wird nach PRINT 10/7 die Zahl 1.4285714286 ausgegeben.

1) Operatoren:

a) () Ausdruck in Klammern

b) ^ Exponentialoperator

c) - Negation (Zahl oder Ausdruck)

d) * Multiplikation / Division

e) Ganzzahldivision (� bei deutscher Tastatur)

f) MOD Modulus

g) + Addition - Subtraktion

h) = Gleichheitszeichen

<> ungleich

< kleiner als

> gr��er als

<= kleiner oder gleich =< gleich oder kleiner

>= gr��er oder gleich => gleich oder gr��er

i) NOT bin�re Negation

j) AND logische UND-Verkn�pfung

k) OR logische ODER-Verkn�pfung

l) XOR logische Exklusiv-Oder-Verkn�pfung

m) EQV logische Gleichwertigkeit

n) IMP logische Ungleichheit (Implizierung)

Bei Operatoren in einer Zeile nimmt die Priorit�t von links nach rechts ab. Alle logische Operationen i) - n) setzen ihre Operatoren in 16-Bit-Ganzzahlwerte um. Dabei ist der Bereich von 0 - 65535 (FFFF) oder von -32768 bis 32767 erlaubt (sonst Fehlermeldung: nicht erlaubt).

2) Mathematische Funktionen

Die Klammer nach dem BASIC-Befehl dient als Hinweis, da� immer ein Ausdruck in Klammern folgen mu�, der auch durch eine numerische Variable oder durch einen arithmetischen Ausdruck ersetzt sein kann. Der berechnete Wert kann einer nummerischen Variablen zugewiesen werden. Bei Winkelfunktionen mu� der Winkel in Bogenma� (rad) angegeben werden. Die Umrechnung erfolgt durch Division des Winkelwertes (Grad = Altgrad) mit 180 und Multiplikation mit der Zahl Pi (1 Grad entspricht 0,017453.. rad). Die Variablen EE und PI enthalten fest gespeichert die Zahlenwerte f�r die Eulersche Zahl e und die Kreiszahl Pi.

a) ABS(: Befehlsform: ABS( Zahl oder numerische Variable )

Es findet eine Absolutwertbildung statt, d.h. negative Zahlen werden positiv. Exponent und Mantisse werden nicht ver�ndert.

PRINT ABS(-523) <CR> Anzeige: 523
PRINT ABS(-5.1234 * 10^4) <CR> " : 51233.999999

Hier zeigt sich ein grundlegender Fehler der Bin�r-Interpreter (siehe 4) Rechengenauigkeit).

b) ATN(: Es liegt die Umkehrfunktion des Tangens, der Arcustangens vor. Das Ergebnis wird im Bogenma� angegeben.

PRINT ATN(2) <CR> Anzeige: 1.1071487178

c) COS(: Es kann eine beliebige positive oder negative Zahl angegeben werden.

PRINT COS(0) <CR> Anzeige: 1
PRINT COS(60*PI/180) <CR> " : .5

d) EE: EE ohne Argument enth�lt die Eulersche Zahl e, die Basis der nat�rlichen Logarithmen.

PRINT EE <CR> Anzeige: 2.7182818285

e) EXP(: Es wird die Exponentialfunktion Y = e^X berechnet, wobei e die Eulersche Zahl 2,718..... darstellt.

PRINT EXP(88) <CR> Anzeige: 1.651636255E+38

Gr��ere Zahlen X bewirken die Fehlermeldung "Ergebnis zu gro�". Allerdings ist der Befehl PRINT EE^88 <CR> auch anwendbar. Bei verschiedenen Zahlen X zeigt sich dann, da� die mit beiden Befehlen f�r gleiche X-Werte erhaltenen Zahlen sich in der letzten Stelle unterscheiden.

PRINT EE^88 <CR> Anzeige: 1.6516362552E+38
A = 2 <CR> PRINT EXP(A) <CR> " : 7.3890560989
PRINT EE^A <CR> " : 7.389056099

f) FIX(: Dieser Befehl schneidet Zahlen hinter dem Dezimalpunkt ab und unterscheidet sich daher vom Befehl INT(, der die n�chste gr��te Ganzzahl ermittelt, die kleiner oder gleich der als Argument verwendeten Zahl ist.

A = 123.567 <CR> PRINT FIX(A) <CR> Anzeige: 123
" INT(A) " " : 123
A = - 0.5 <CR> " FIX(A) " " : 0
dagegen: PRINT INT(A) <CR> " : -1

g) INT(: Mit dem Befehl INT( kann eine Zahl Z auf X Stellen gerundet werden.

E = INT(Z*10^X + 0.5)/10^X

h) LOG(: Es wird der nat�rliche Logarithmus (Logarithmus zur Basis e) berechnet.

PRINT LOG(1000) <CR> Anzeige: 6.907755279
PRINT LOG(EE) <CR> Anzeige: 1

i) LOG10(: Es erfolgt die Berechnung des dekadischen Logarithmus (zur Basis 10).

PRINT LOG10(1000) <CR> Anzeige: 3
PRINT LOG10(EE) <CR> " : .4342944819

j) MOD: Befehlsform: Dividend MOD Divisor

Es wird der Rest ermittelt, den man bei der Division des Dividenden durch den Divisor erh�lt.

PRINT 9 MOD 2 <CR> Anzeige: 1
" 8 MOD 2 <CR> " : 0

k) PI: Die Variable PI enth�lt den Wert der Kreiszahl.

PRINT PI <CR> Anzeige: 3.1415926536
PRINT PI/180 " : .01745329252
RINT 4*ATN(1) " : 3.1415926536

l) RND: Ohne Argument liefert der RND-Befehl Pseudo-Zufallszahlen zwischen 0 und 1, die einem festgelegten Algorithmus entstammen. Dadurch ergeben sich nach dem Start des BASIC-Interpreters immer dieselben Zahlen.

PRINT RND <CR> Anzeige: .26943583396

" " " " : .72796806886
" " " " : .089675555242

Der Befehl RANDOMIZE ergibt einen zuf�lligen Startpunkt der Pseudo-Zufallszahlenfolge (Z80: Zahl aus dem Refresh-Register R, 80X86: Timerwert).

RND(: Wird als Argument der Wert Null angegeben, wird erstmalig eine beliebige Zahl angezeigt und dann wiederholt.

PRINT RND(0) <CR> Anzeige z.B.: .5019531548
PRINT RND(0) <CR> " : .5019531548

Werte gr��er Null entsprechen dem RND-Befehl ohne Argument. PRINT RND(1) ergibt dieselben Zahlen wie PRINT RND. Negative Argumente bestimmen den Startpunkt der Zufallszahlenfolge. Die folgenden Zufallszahlensequenzen sind nach jedem BASIC-Start wiederum identisch.

A = RND(-280) <CR> PRINT RND <CR> Anzeige: 1.0207557995E-03

PRINT RND <CR> " : .94715060253
PRINT RND <CR> " : .826904723

Der Bereich ganzzahliger Zufallszahlen kann durch Angabe eines Anfangswertes AW und eines gr��eren Endwertes EW begrenzt weren.

B = INT((EW+1-AW)*RND+AW)

m) SGN(: Ist der im Argument enthaltene Zahlenwert positiv, Null oder negativ, so kann dies mit dem Befehl SGN ermittelt werden. Positive Werte ergeben als Ergebnis 1, negative -1, die Zahl 0 ergibt den Wert 0. Mit diesem Befehl kann eine Dezimalzahl in eine Bin�rzahl umgewandelt werden.

10 INPUT D
20 FOR I = 7 TO 0 STEP -1
30 PRINT SGN(X AND 2^I);
40 NEXT

n) SIN(: Das als Argument angegebene Bogenma� wird in den Sinus umgerechnet.

SIN(45*PI/180) <CR> Anzeige: .70710678119

o) SQR(: Es wird die Quadratwurzel der als Argument angegebenen Zahl berechnet. Negative Zahlen ergeben die Fehlermeldung "nicht erlaubt". H�here Wurzeln lassen sich durch den inversen Exponenten der Zahl X berechnen.

PRINT SQR(2) <CR> Anzeige: 1.4142135624
PRINT SQR(5)*SQR(5) <CR> " : 5
PRINT 10000^(1/4) " : 10 (4.WURZEL)

p) TAN(: F�r den im Bogenma� angegebenen Wert wird der Tangens berechnet.

PRINT TAN(45*PI/180) <CR> Anzeige: 1

3) Umwandlungsfunktionen Zahl-Zeichenkette und sonstige mathematische Befehle:

a) STR$(: Befehlsform: STR$ (Zahl oder nummerische Variable oder Ausdruck)

Die im Argument enthaltenen Zahlen werden mit diesem Befehl als Zeichenkette gekennzeichnet.

A$ = STR$(123456) <CR> PRINT A$ <CR> Anzeige: 123456
PRINT ASC(LEFT$(A$,1) <CR> " : 32

Das erste Zeichen der Zeichenkette A$ ist also ein Leerzeichen, was oft zu einem Fehlverhalten eines BASIC-Programmes f�hrt.

b) VAL(: Befehlsform: VAL ( Stringvariable oder Zeichenkette)

Die Fehlermeldung "Datentypen (Zahl/String) vermischt" erscheint, wenn man einer nummerischen Variablen den Inhalt einer Zeichenkette zuordnen will. Mit dem Befehl VAL ist dies m�glich. Es werden nur Zahlen am Anfang einer Zeichenkette ausgewertet.

A$ = "45.7" <CR> PRINT VAL(A$) <CR> Anzeige: 45.7
PRINT VAL("1234ABC") <CR> " : 1234
PRINT VAL("ABC1234") <CR> " : 0
PRINT VAL("123.45A") <CR> " : 123.45

c) HEX$(: Diese Stringfunktion wandelt eine als Argument angegebene Dezimalzahl (abgerundeter Wert) im Bereich von + 65535 bis - 65535 in einen String um, der die Sedezimalzahl enth�lt.

PRINT HEX$(1000) <CR> Anzeige: 03E8
A = 2020 <CR> PRINT HEX$(A) <CR> " : 07E4
PRINT HEX$(18.9) " : 0012

d) &: Dieses Zeichen mu� sedezimalen Zahlen vorangestellt werden, sonst kommt z.B. bei dem Befehl INPUT A die Fehlermeldung "* Falsche Eingabe *" (siehe auch Kapitel I). Dagegen ergibt A = 3E8 bei PRINT A den Wert 300000000, also 3*10^8.

PRINT &3E8 <CR> Anzeige: 1000

10 INPUT"HEX-ZAHL";A$ Eingabe einer sedezimalen Zahl
20 PRINT VAL("&"+A$) mit Gro�buchstaben, Ausgabe der Dezimalzahl

e) Ganzzahldivision: DIV

Wird eine Division mit diesem BASIC-Befehl durchgef�hrt, so entf�llt die Verwendung des INT(-Befehles, wenn ein ganzzahliges Ergebnis ben�tigt wird.

PRINT 5 DIV 3 <CR> Anzeige: 1

4) Rechengenauigkeit des Interpreters

Die folgenden Beispiele zeigen, da� dieser BASIC-Interpreter weniger Probleme mit Rundungsfehlern hat als andere.

X = 66/20 <CR> PRINT INT(10*X)/10 <CR> Anzeige: 3.3
X = SQR(2) <CR> PRINT X^2 <CR> Anzeige: 2
PRINT LOG(0.99995) <CR> Anzeige: -5.0001249077E-05

Allerdings kann aufgrund der bin�ren Zahlendarstellung bei einer Schleife von -1 nach 1 in Schritten 0.1 der Wert Null nicht erreicht werden.

10 FOR N = -1 TO 1 STEP .1 Nach der Anzeige der Werte
20 PRINT N -1, -.9 bis -.2 kommen
30 IF N=0 THEN PRINT "N = 0" -.099999999999 und
40 NEXT 1.1368683772E-12

5) Definition eigener BASIC-Funktionen

Mit diesen Befehlen k�nnen mathematische Funktionen definiert werden, die in einem Programm mehrmals f�r unterschiedliche nummerische Variablen anwendbar sind. HEBAS erlaubt sogar die Verwendung von Variablen f�r Zeichenketten bei entsprechenden Funk-tionen.

DEF FN: a) Befehlsform: DEF FN Name (Dummy-Variable) = math. Funktion

Funktionen m�ssen mit einem Namen gekennzeichnet sein, der mit FN beginnt und bis zu zwei weitere Zeichen (nach den Regeln f�r Variablen ausgew�hlt) enthalten kann.Beispiele f�r Funktionsnamen sind: FN Q, FNA9, FNZZ usw. Mehr als zwei weitere Zeichen nach FN sind m�glich, werden aber nicht ausgewertet. Die Dummy-Variable dient als Platzhalter.

Beispiele f�r Funktionen:

DEF FN Q(X) = X*A
DEF FN A(X) = 1/COS(X)
DEF FN SR(V) = V/AC*20
DEF FN(X) = I+(K-1)*25+(L-1)*1000

Im Programm wird die am Programmanfang definierte Funktion mit dem Befehl FN Name (Variable) aufgerufen.

10 DEF FNQ(X) = X*A
20 INPUT A,B
30 PRINT FNQ(B)+5
40 C = FNQ(A):PRINT C

auch m�glich: S1 = T(FNA(X)) oder PRINT W$(T(FNA(X)))

HEBAS erlaubt auch die Verwendung von mehreren Dummy-Variablen sowie von Funkionen f�r die Verarbeitung von Zeichenketten. Funktionen d�rfen sich auch �ber mehrere BASIC-Zeilen erstrecken ("multiline"-Funktion), auch mit GOSUB-Befehlen. Dabei k�nnen andere Funktionen ebenso wie die gerade bearbeitete aufgerufen werden.

b) Befehlsform:

DEF FN Name (Dummy 1, Dummy 2, ......., Dummy n)

Funktion in mehreren BASIC-Zeilen

FNEND (Variable f�r Funktionswert)

Die Funktion kann jedoch nur einfache Funktionen mit der ersten Befehlsform enthalten, keine "multiline"-Funktion. FNEND beendet die Funktion und �bergibt den berechneten Ausdruck der angegebenen Variablen, die vom selben Typ (Zahl oder Zeichenkette) wie die Funktionsvariablen sein mu�.

Beispiel 1)

10 DEF FNFAC(I)
20 IF I = 0 THEN FNRETURN 1 REM FAC(0) =1
30 FNEND FNFAC(I-1)*I REM FAC(I) = FAC(I-1)*I

Beispiel 2)

10 DEF FN REP$(I$,I)
20 J$ = ""
30 IF I<=0 THEN FNRETURN J$
40 FOR J = 1 TO I
50 J$ = J$ + I$
60 NEXT
70 FNEND J$
80 :
90 INPUT"ZEICHEN, ANZAHL";I$,I
100 PRINT FNREP$(I$,I)

Der Befehl FNRETURN (Variable f�r Funktionswert) beendet die Funktion und �bergibt einen bestimmten Wert an das Programm. Mehrere FNRETURN-Befehle sind erlaubt.

** Achtung **

Ein Syntaxfehler in der Definition der Funktion wird erst beim Aufruf der Funktion erkannt, wobei dann aber die Zeilennummer der BASIC-Zeile ausgegeben wird, in der der Funktionsaufruf steht und nicht die Zeile mit der Definition.

Wird die Funktion aufgerufen, ohne da� eine Definition der Funktion stattgefunden hat, erfolgt die Fehlermeldung "USER FN CALL fehlt Zeile XY".