BASIC-Compiler-Optionen

Beim erstmaligen Compilieren eines Quelltextes oder wenn Sie den Menüpunkt BASIC-Programm compilieren mit... aufrufen, erscheint ein Fenster, in dem Sie Optionen einstellen können. Diese Optionen beeinflussen die Arbeitsweise des Compilers.

Haben Sie mehrere BASIC-Quelltexte im Texteditor geöffnet, werden die Compiler-Optionen für jeden Quelltext separat verwaltet.

Die BASIC-Compiler-Optionen unterteilen sich in mehrere Gruppen, die nachfolgend beschrieben werden.

1. Optionen in der Gruppe Allgemein

In dieser Gruppe finden Sie allgemeine Einstellmöglichkeiten wie z.B. den Namen des Programms und die Speicheraufteilung. Der Programmname kann nur bei einigen emulierten Systemen eingegeben werden und dient zur Erzeugung eines entsprechenden Menüeintrags bzw. Kommandorahmens.

Die Speicheraufteilung ist dagegen bei allen emulierten Systemen relevant. Die Tabelle skizziert die Speicheraufteilung von unten nach oben. Das untere Ende geben Sie im Feld Anfangsadresse an, das obere Ende im Feld Max. Endadresse. Die Anfangsadresse ist auch gleichzeitig die Startadresse.

frei für BASIC-Programm,
Anfang: TOP, Größe: SIZE
eigener Stack (falls angegeben)
Variablen-Array (@-Variablen)
einfache Variablen
Eingabepuffer
interne Speicherzellen
erzeugter Maschinencode


Sollten Sie in Ihrem BASIC-Programm mit @-Variablen arbeiten, muss für dieses Variablen-Array Platz reserviert werden. Die Größe des Arrays geben Sie als Anzahl der Variablen im Feld Größe des @-Variablen-Arrays an. Wenn das BASIC-Programm keine @-Variablen enthält, wird auch kein Variablen-Array angelegt. In dem Fall ist die Angabe in den Optionen nicht relevant.

Zum Schluss legen Sie fest, ob das compilierte Programm den Systemstack verwenden soll oder einen eigenen Stack-Bereich, dessen Größe Sie allerdings angeben müssen. Ein eigener Stack-Bereich ist dann erforderlich, wenn das BASIC-Programm viele geschachtelte FOR-Schleifen oder geschachtelte GOSUB-Aufrufe enthält.

Mit der BASIC-Funktion TOP können Sie die Adresse der ersten nicht mehr verwendeten Speicherzelle erfragen. Der Speicherbereich ab dieser Adresse bis zur maximalen Endadresse ist für das BASIC-Programm reserviert und kann von diesem auch frei verwendet werden, z.B. mit POKE und PEEK. Die Größe dieses Speicherbereichs ermitteln Sie mit der SIZE-Funktion.

Achtung! Mit der Anfangsadresse legen Sie den Standort des Programms fest. Diese Adresse muss natürlich im RAM liegen. Wenn Sie ein Programm das erste mal compilieren, wird die Anfangsadresse mit einem für das gerade emulierte System sinnvollen Wert vorbelegt. Sollten Sie nun, während der BASIC-Quelltext noch geöffnet ist, in den Einstellungen ein anderes zu emulierendes System auswählen, wodurch der Compiler beim nächsten Compilieren auch den Programmcode für dieses andere System erzeugen wird, werden die Compiler-Optionen nicht mehr automatisch angepasst. In dem Fall müssen Sie eventuell selbst eine andere Startadresse und ggf. auch eine andere maximale Endadresse eingeben.

2. Optionen in der Gruppe Laufzeiteigenschaften

Mit den Optionen in dieser Gruppe geben Sie an, welche Prüfungen der Compiler in den Programmcode einbauen soll. Solange Sie an einem BASIC-Programm entwickeln, sind Programmfehler nicht ausgeschlossen und können im compilierten Programm auch zu einem Absturz führen. Die eingebauten Prüfungen dienen dazu, dass das Programm nicht unkontrolliert abstürzt und so vielleicht auch noch Daten im Arbeitsspeicher zerstört, sondern dass das Programm bei einem Fehler kontrolliert beendet wird. Je mehr Prüfungen in den Programmcode eingebaut werden, desto sicherer, aber auch größer und langsamer wird das Programm. Aus diesem Grund sollte man während der Entwicklungsphase die Prüfungen aktivieren und wenn das Programm fertig und hoffentlich fehlerfrei ist, die Prüfungen wieder deaktivieren.

Mit dem Knopf Max. Sicherheit werden die Prüfungen aktiviert, die für die Programmentwicklung sinnvoll sind, d.h. Fehler im BASIC-Programm führen schlimmstenfalls zu einer kontrollierten Programmbeendigung mit einer Fehlermeldung. Von den Prüfungen ausgenommen sind allerdings Fehler, die in mit CALL aufgerufenen Maschinencodeunterprogrammen auftreten, oder die darauf zurückzuführen sind, dass mit POKE und DOKE der Stack oder der eigene Programmcode im Arbeitsspeicher zerstört wurde.

Wenn Sie das Programm fertig entwickelt haben und sicher sind, dass keine Fehler mehr enthalten sind, können Sie den Knopf Max. Geschwindigkeit einschalten. In dem Fall werden nur noch unbedingt notwendige Prüfungen, z.B. arithmetischer Überlauf oder Division durch Null, eingebaut.

Beim dritten Knopf Benutzerdefiniert können Sie auf der rechten Seite die einzelnen Prüfungen selbst auswählen, die in den Programmcode einfließen sollen. Nachfolgend werden die möglichen Prüfungen beschrieben.

2.1. CTRL-C bricht Programm ab

Bei dieser Option wird regelmäßig die Tastatur abgefragt, ob der Anwender die Tastenkombination CTRL-C (S4-K auf der Z1013-Folienflachtastatur) gedrückt hat. Ist das der Fall, wird das Programm mit der Meldung "BREAK" beendet. Diese Option ist sinnvoll, wenn das Programm aufgrund eines Fehlers in einer Endlosschleife hängt oder wenn, was aber ein schlechter Programmierstil ist, das Programm prinzipiell keine Möglichkeit zum Beenden bietet. Für beide Fälle kann man aber zumindest im Emulator auch problemlos einen RESET auslösen.

Diese Option verlangsamt die Programmausführung mitunter erheblich, da die Abfrage der Tastatur viel Rechenzeit kostet.

2.2. CTRL-C bricht Programm bei Eingaben ab

Bei dieser Option kann der Anwender das Programm mit der besagten Tastenkombination abbrechen, aber nur, wenn das Programm die Tastatur sowieso gerade abfragt, z.B. weil es auf eine Eingabe wartet oder weil die INKEY-Funktion aufgerufen wird.

Diese Option verlangsamt die Programmausführung praktisch nicht, da die Tastatur ja nicht zusätzlich abgefragt wird.

2.3. CTRL-C bricht Programm nicht ab

Bei dieser Option kann das Programm mit CTRL-C nicht abgebrochen werden.

2.4. Grenzen des @-Variablen-Arrays prüfen

Bei dieser Option wird geprüft, ob der Zugriff auf eine Variable des @-Variablen-Arrays außerhalb des Bereichs liegt, der im Feld Größe des @-Variablen-Arrays angegeben wurde.

2.5. Stack bezüglich GOSUB/RETURN und FOR/NEXT prüfen

Bei der GOSUB-Anweisung wird die Rückkehradresse auf den Stack geschrieben, die bei RETURN wieder gelesen wird. Auch die FOR-Anweisung schreibt Werte auf den Stack, die wieder bei NEXT benötigt werden. Wenn nun der Stack durcheinander gerät, d.h. wenn auf ein GOSUB ein NEXT oder auf ein FOR ein RETURN folgt, führt das unweigerlich zum Programmabsturz.

Bei dieser Option werden zusätzlich sogenannte Magic-Werte auf den Stack geschrieben, mit denen erkannt werden kann, ob die GOSUB/RETURN- und die FOR/NEXT-Paarung eingehalten wurde. Außerdem wird geprüft, ob der Stack überläuft.

3. Optionen in der Gruppe Erzeugter Programmcode

Mit den Optionen in dieser Gruppe geben Sie an, ob der erzeugte Programmcode in den Emulator und/oder in eine Datei geschrieben werden soll. Wenn Sie den Compiler aufrufen mit dem Menüpunkt BASIC-Programm compilieren und starten, wird der Programmcode auch dann in den Emulator geladen, wenn Sie die Option Programmcode in Emulator laden nicht eingeschaltet haben,

Der erzeugte Programmcode wird nur dann in den Emulator geladen oder in eine Datei geschrieben, wenn der Compiler keine Fehler gemeldet hat.

4. Optionen in der Gruppe Sonstiges

4.1. CALL-Anweisungen melden

Mit der CALL-Anweisung können Maschinencodeunterprogramme aufgerufen werden, wovon z.B. originale Z1013-Tiny-BASIC-Programme auch reichlich Gebrauch machen. Gelegentlich werden Maschinencoderoutinen des BASIC-Interpreters oder des Monitorprogramms aufgerufen. Manchmal wird jedoch der benötigte Maschinencode auch als Kommentar oder auf eine ganz andere undurchsichtige Art und Weise im BASIC-Programm untergebracht. Solche BASIC-Programme können wahrscheinlich fehlerfrei in JKCEMU compiliert werden, nur ist dann der benötigte Maschinencode nicht mehr enthalten. Wenn Sie nun das compilierte BASIC-Programm ausführen, ist ein Programmabsturz so gut wie sicher.

Die Moral aus der Geschichte ist, dass Sie vor dem Compilieren von BASIC-Programmen, die im originalen Interpreter problemlos laufen, alle CALL-Anweisungen dahingehend prüfen müssen, ob der aufgerufende Programmcode auch tatsächlich vorhanden ist. Und genau dafür ist die Option gedacht. Sie meldet nämlich das Vorhandensein einer jeden CALL-Anweisung im Quelltext, damit Sie keine einzige übersehen.

Maschinencode müssen Sie im BASIC-Programm mit offiziellen BASIC-Mitteln unterbringen, damit nichts durch den Compiler verloren geht. Sehr kurze Maschinencoderoutinen lassen sich mit einer Reihe von POKE-Anweisungen programmieren, z.B.:

100 POKE TOP,HEX(E7)
110 POKE TOP+1,2
120 POKE TOP+2,'H'
130 POKE TOP+3,'A'
140 POKE TOP+4,'L'
150 POKE TOP+5,'L'
160 POKE TOP+6,'O'
170 POKE TOP+7,HEX(8D)
180 POKE TOP+8,HEX(C9)
190 CALL TOP

Bei größeren Maschinencodeteilen lassen sich die Anweisungen DATA und READ gut verwenden, die allerdings der originale AC1-Mini-BASIC- und Z1013-Tiny-BASIC-Interpreter nicht kennt:

100 DATA HEX(E7),2,'H','A','L','L','O',HEX(8D),HEX(C9)
110 FOR I=1 TO 9
120 READ B
130 POKE TOP+I,B
140 NEXT I
150 CALL TOP

4.2. Abweichungen von der originalen AC1-Mini-BASIC bzw. Z1013-Tiny-BASIC-Syntax melden

Der JKCEMU-BASIC-Compiler unterstützt einen größeren Sprachumfang als der originale AC1-Mini-BASIC- bzw. Z1013-Tiny-BASIC-Interpreter. Möchten Sie jedoch mit dem Compiler ein BASIC-Programm entwickeln, welches auch im Interpreter fehlerfrei läuft, sollten Sie diese Option für den AC1 bzw. Z1013 einschalten. Der Compiler erzeugt dann immer eine Warnung, wenn der BASIC-Quelltext etwas enthält, was im originalen BASIC-Interpreter nicht erlaubt ist.

4.3. Variablennamen mit mehr als einem Zeichen Länge erlauben

Bei den originalen BASIC-Interpretern sind für einfache Variablen nur die Namen A bis Z erlaubt. AA und A1 führen z.B. zu einem Syntax-Fehler. Der JKCEMU-BASIC-Compiler hält sich aus Kompatibilitätsgründen standardmäßig an diese Einschränkung. Ist jedoch die Option eingeschaltet, können Variablennamen auch länger als ein Zeichen sein. Ab der zweiten Stelle sind neben Buchstaben auch Ziffern erlaubt.

Nun könnte man auch längere Variablennamen immer erlauben und einfach nur bei eingeschalteter Option "Abweichungen von der originalen ... BASIC-Syntax melden" eine Warnung erzeugen, wenn eine Variable länger als ein Zeichen ist. Doch dann ließen sich manche Programme nicht mehr übersetzen, obwohl sie der originalen BASIC-Syntax entsprechen. Folgendes Beispiel soll dies verdeutlichen:

100 A=1
110 B=5
120 FOR I=ATOB
130 PRINT I
140 NEXT I

Bei diesem Programm muss die Option ausgeschaltet sein. Anderenfalls meldet der Compiler in Zeile 120 einen Syntax-Fehler, da er ATOB als Name einer Variable ansieht und somit das Schlüsselwort TO und den Endwert vermisst. Der originale Z1013-Tiny-BASIC-Interpreter führt das Programm anstandslos aus.

4.4. BASIC-Quelltext formatieren

Bei dieser Option formatiert der Compiler den BASIC-Quelltext, d.h. Variablennamen und Schlüsselwörter werden groß- und, sofern sie mit einem Punkt abgekürzt wurden, auch ausgeschrieben sowie Leerzeichen entfernt bzw. neu gesetzt. Nach dem erfolgreichen Compilieren, und nur dann, sehen Sie im Editor den formatierten Quelltext. Sollte Ihnen dieser nicht gefallen, können Sie mit der Editorfunktion Rückgängig Ihren ursprünglichen Quelltext wieder herstellen.

4.5. Erzeugten Assembler-Quelltext anzeigen

Die Übersetzung des BASIC-Quelltextes in Maschinencode erfolgt in zwei Stufen: Zuerst ist der eigentliche Compiler dran, der als Ergebnis einen Assembler-Quelltext erzeugt. Im zweiten Schritt wird dieser Assembler-Quelltext durch den Assembler in Maschinencode übersetzt. Wenn Sie die Option einschalten, wird der vom Compiler erzeugte Assembler-Quelltext im Texteditor angezeigt.

4.6. FOR/NEXT als strukturierte Schleife übersetzen

Diese Option dient der Optimierung des Programmcodes und ist erst dann wirklich relevant, wenn das BASIC-Programm fertig entwickelt ist und endgültig compiliert werden soll. Sie darf nur eingeschaltet werden, wenn alle FOR/NEXT-Schleifen in einer strukturierten Form angewendet werden, d.h., dass zu jeder FOR-Anweisung genau eine NEXT-Anweisung gehört und dass niemals mit GOTO aus einer Schleife heraus oder in eine Schleife hinein gesprungen wird. Weitere Details zu dieser Option finden Sie unter Optimierung des Programmcodes.

4.7. Relative Sprünge bevorzugen

Diese Option dient der Optimierung des Programmcodes und ist erst dann wirklich relevant, wenn das BASIC-Programm fertig entwickelt ist und endgültig compiliert werden soll. Weitere Details zu dieser Option finden Sie unter Optimierung des Programmcodes.