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.:
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.