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.


1. Assembler-Programm übersetzen

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.

2. BASIC-Programm in Arbeitsspeicher laden

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:


2.1. Unterstützung externer Prozeduren und Funktionen

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.

2.2. Binärcode in REM-Zeilen

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.

2.2.1. Pseudo-Anweisung BREM

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.

2.2.1. Pseudo-Anweisung ASM

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.

3. BASIC-Programm aus Arbeitsspeicher laden

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.