Texteditor
Im Emulator ist ein Texteditor integriert,
der insbesondere für die Entwicklung von Assembler- und
Tiny-MP-BASIC-Programmen gedacht ist.
Es können aber auch beliebige andere Textdateien editiert werden.
Neben den üblichen Editorfunktionen wie Dateien öffnen
und speichern, suchen und ersetzen, Zugriff auf die Zwischenablage
usw. bietet er die Möglichkeit,
ein BASIC-Programm aus dem Arbeitsspeicher des Emulators zu laden
und umgekehrt wieder in den Arbeitsspeicher zu transferieren.
Nachfolgend werden nur die Funktionen beschrieben,
die sich von den üblichen Editorfunktionen unterscheiden.
Enthält der Texteditor ein
Assembler-Programm,
so können Sie es übersetzen und in den Arbeitsspeicer
das Emulators laden.
Dafür gibt es im Menü Programmierung die beiden
Einträge Assembliere und Assembliere mit....
Beim ersten Eintrag werden die Assembler-Optionen nur einmal angezeigt,
beim zweiten jedesmal.
Möchte man also die Assembler-Optionen ändern,
verwendet man den zweiten des beiden Menüpunkte.
Der Editor enthält einen Parser,
der die Syntax des angezeigten BASIC-Programms prüft,
das Programm in das komprimierte Speicherformat überführt
und in den Arbeitsspeicher des Emulators lädt.
Zu finden ist diese Funktion in Form von drei Einträgen
im Menü Programmierung.
Der erste Menüpunkt führt nur eine
syntaktische Prüfung durch,
die anderen beiden laden das Programm auch in den Arbeitsspeicher.
Tritt bei der syntaktischen Prüfung ein Fehler oder
eine Warnung auf, wird dies im unteren Bereich des Editor ausgegeben.
Neben der eigentlichen Meldung wird auch die betroffene
BASIC-Zeile mit angezeigt.
Die relevante Stelle innerhalb dieser Zeile ist mit drei
Fragezeichen gekennzeichnet.
Um direkt von der Fehlermeldung bzw. Warnung zur betroffenen BASIC-Zeile
zu gelangen, klicken Sie doppelt auf die eigentliche Meldung,
d.h. auf die Zeile mit der Zeilennummer.
Der Editor setzt dann den Cursor auf die relevante BASIC-Zeile.
Der Parser beachtet streng die Besonderheiten bei
IF...THEN...ELSE,
d.h. dort, wo ein ELSE vom BASIC-Interpreter zwar nicht
angemeckert wird, aber auch keine Wirkung zeigt,
erlaubt es der BASIC-Parser des Editors erst gar nicht.
Zusätzlich zu der vom BASIC-Interpreter vorgegebenen Syntax
gelten für den Parser folgende Regeln:
- Leerzeilen werden ignoriert
-
Schlüsselwörter, Variablen, Hexadezimalzahlen,
Prozedur- und Funktionsnamen können klein geschrieben werden.
Der Parser wandelt sie in Großbuchstaben um.
-
Das Schlüsselwort LET kann entfallen.
Der Parser setzt es dann bei einer Zuweisung automatisch davor.
-
Enthält eine BASIC-Zeile keine Zeilennummer,
wird die Zeile mit einem Semikolon getrennt an die vorherige
angehängt, d.h., aus
100 A=1
PRINT A
110 END
erzeugt der Parser
100 LET A=1; PRINT A
110 END
Daraus folgt, das die erste Zeile eine BASIC-Zeilennummer haben muss.
-
Für die IF-Anweisung sind folgende Syntax-Varianten
möglich:
IF <Bedingung> THEN <Anweisung>
IF <Bedingung> THEN <Zeilennummer>
IF <Bedingung> <Anweisung>
Das Schlüsselwort THEN kann weggelassen werden.
Folgt hinter der Bedingung ein GOTO mit einer Zahl
als Zeilennummer, so kann anstelle von THEN auch
GOTO weggelassen werden.
Dies gilt jedoch nicht, wenn die Zeilennummer mit einem
variablen Ausdruck angegeben ist.
-
Die REM-Anweisung darf nur ASCII-Zeichen und die deutschen
Umlaute als Kommentar enthalten.
Umlaute werden entsprechend ES 4.0 kodiert.
Der Tiny-MP-BASIC-Interpreter kann durch externe Prozeduren
und Funktionen erweitert werden.
Dazu ist das Register 8 mit der Anfangsadresse
einer entsprechenden Prozedurnamentabelle zu laden.
Wird im BASIC-Programm die Prozedur SETRR mit einer 8
als erstes Argument und einem konstanten Wert als zweites
Argument aufgerufen, liest der BASIC-Parser die Prozedurnamentabelle
ein und gibt im Log-Bereich eine entsprechende Meldung aus.
Der BASIC-Interpreter erlaubt zwar alle Zeichen als externe
Prozedurnamen, allerdings kann der Texteditor nicht wissen,
ob eine gültige Prozedurnamentabelle im Speicher vorliegt.
Um dies zu erkennen, werden vom BASIC-Parser nur Prozedur-
und Funktionsnamen berücksichtigt,
die max. 32 Zeichen lang sind und nur Buchstaben,
Ziffern und den Unterstrich enthalten,
wobei Ziffern erst ab der zweiten Stelle erlaubt sind.
Diese externen Prozeduren und Funktionen können wie
interne verwendet werden.
Auch die Groß-/Kleinschreibung wird automatisch angepasst,
so dass darauf im BASIC-Programm nicht geachtet werden muss.
Allerdings kann der BASIC-Parser nicht prüfen,
ob die Anzahl der Argumente stimmt,
denn diese Information ist in der Prozedurnamentabelle
nicht enthalten.
Wird eine Prozedur oder Funktion aufgerufen,
die keiner internen entspricht und auch in der eingelesenen
Tabelle nicht zu finden ist, erscheint eine Warnung.
So ist auch die Programmierung mit externen Prozeduren und Funktionen
möglich, ohne dass zu dem Zeitpunkt die Prozedurnamentabelle
im Arbeitsspeicher vorhanden sein muss.
Eine automatische Anpassung der Groß-/Kleinschreibung
findet in dem Fall nicht statt, d.h., der nicht gefundene
Prozedur- bzw. Funktionsname wird so wie im Texteditor geschrieben
in den Arbeistspeicher übertragen.
Manche BASIC-Programm verwenden kleine Maschinencodeunterprogramme
oder Pixeldaten für Sprites,
die, um sie nicht extra laden zu müssen,
als "Kommentar" in eine REM-Zeile gepackt werden.
Nun ist die Eingabe aller binären Code-Werte über die Tastatur
nicht möglich.
Aus diesem Grund bietet der im Texteditor enthaltene BASIC-Parser
eine spezielle Unterstützung dafür an,
indem er zwei Pseudo-Anweisungen versteht, die beide
in eine gew&oumL;hnliche REM-Anweisung übersetzt werden.
BREM bedeutet soviel wie Binary REM bzw.
Binary Remark und soll ausdrücken,
dass der Kommentar mit binären Werten angegeben wird.
Konkret werden im Gegensatz zum gewöhnlichen REM-Befehl
die einzelnen Kommentar-Bytes nicht durch jeweils ein Zeichen,
sondern durch eine Dezimal- oder Hexadezimalzahl geschrieben.
Zur Unterscheidung muss eine Hexadezimalzahl
mit einem Prozentzeichen beginnen.
Beispiel:
10 BREM %41, %42, %43
wird übersetzt in:
10 REM ABC
Die Werte %41, %42 und %43 entsprechen den ASCII-Codes
der Buchstaben A, B und C.
Auf diese Art und Weise können fast beliebige Byte-Werte
in die Kommentarzeile geschrieben werden.
Das Semikolon (Wert 59 bzw. %3B) kann jedoch nicht verwendet werden,
da es das Ende einer Anweisung und somit auch das Ende
der REM-Anweisung bedeutet.
Der Wert 13 bzw. %0D gefolgt von einem Byte mit gesetztem Bit 7
ist ebenfalls nicht möglich, da das eine neue BASIC-Zeile bedeutet.
Beim 2K-BASIC-System und beim ES1988 können die Werte 13
bzw. %0D sowie 0 grundsätzlich nicht verwendet werden,
da diese dort als Zeilen- bzw. Programmende gewertet werden.
Achtung! Werden mehrere BREM-Anweisungen ohne Zeilenummer
untereinander geschrieben, so werden diese bewusst zu nur einer
einzigen REM-Anweisung übersetzt,
um auf diese Art und Weise auch einen größeren
Bin&aumL;rbereich im BASIC-Programm unterbringen zu k&oumL;nnen.
Beispiel:
10 BREM 65,66,67
REM 68,69,70
20 PRINT
wird übersetzt in:
10 REM ABCDEF
20 PRINT
Achtung! BREM sollte nicht die letzte Anweisung in einem
BASIC-Programm sein, da sonst abhängig von den konkret
angegebenen Byte-Werten möglicherweise das Ende des Programms
nicht korrekt ermittelt werden kann.
Mit einem ASM-Befehl wird ein Assembler-Abschnitt begonnen.
Alle nachfolgenden Zeilen, die nicht mit einer Ziffer beginnen,
werden als Assembler-Quelltext betrachtet und assembliert.
Der vom Assembler erzeugte Code ist dann der "Kommentar"
der erzeugten REM-Anweisung.
Achtung! Auch bei der Pseudo-Anweisung ASM
gilt die Einschränkung,
dass nicht alle binären Werte erlaubt sind.
Erzeugt also der Assembler ein Byte oder eine Byte-Folge,
welche nicht in der REM-Anweisung erlaubt sind,
erscheint eine entsprechende Meldung.
Intern wird dem Assembler-Abschnitt ein .org-Befehl
mit der aktuelle Adresse (die des ersten Bytes hinter dem erzeugten REM)
vorangestellt.
Aus diesem Grund sollte der Assembler-Abschnitt selbst keine
.org-Instruktion enthalten.
Die erste Zeile, die nach der ASM-Anweisung mit einer Ziffer beginnt,
beendet den Assembler-Block.
Diese Ziffer markiert den Anfang der BASIC-Zeilennummer.
Beispiel für ES 4.0:
10 asm
push rp
call %082d
db 'Hallo',%0d,%0a,0
pop rp
ret
20 rem --- ab hier wieder BASIC ---
30 call %e003
40 end
Achtung! Enthält ein BASIC-Programm mehrere
ASM-Anweisungen, wird jeder Assembler-Block eigenständig
assembliert.
Diese Funktion finden Sie in Form von zwei Einträgen
im Menü Datei.
Das an der angegebenen hexadezimalen Adresse im Arbeitsspeicher
beginnende BASIC-Programm wird in den Editor geladen und dort angezeigt.
Dabei erfolgt eine Umwandlung vom
komprimierten Speicherformat
in die übliche BASIC-Darstellung, d.h.,
die Schlüsselwörter werden ausgeschrieben und Leerzeichen
an bestimmten Stellen eingefügt.
Mit Hilfe dieser Funktion kann auch ein im Arbeitsspeicher
befindliches BASIC-Programm ausgedruckt werden,
indem man es einfach über die Druckfunktion des Editors druckt.
Hinweis: REM-Anweisungen, die im Kommentar Bytes enthalten,
die keine ASCII-Zeichen und auch keine deutsche Umlaute
entsprechend ES 4.0 sind,
werden als BREM angezeigt.