18. Abwärtskompatibilität^18.1 Der klassische BASIC ModusÄltere, nicht objekt-orientierte BASIC Programme besitzen ein "Hauptprogramm", das beim Start des Programms automatisch ausgeführt wird. Außerdem gibt es einen vordefinierten Bildschirm, auf den alle Text- und Grafikausgaben erfolgen. R-BASIC kann dieses Verhalten simulieren, so dass das Übertragen älterer Programme nach R-BASIC vereinfacht wird. Dazu gibt es die Anweisung ClassicCode.Syntax: ClassicCode ClassicCode muss vor der ersten ausführbaren Anweisung (z.B. Print) im Quelltext stehen. Fall Sie Include-Anweisungen verwenden, muss ClassicCode nach den Include-Anweisungen stehen. Die Anweisung ClassicCode bewirkt folgendes:
^18.2 ZeilennummernViele ältere BASIC-Programme lesen sich etwa so: |
10 Print "Bitte geben Sie eine Zahl ein" 20 INPUT Z 30 IF Z < 5 THEN PRINT "Unter Fünf" 40 GOTO 10 |
|
Die Zahlen am Beginn jeder Zeile werden als Zeilennummern bezeichnet und sind bei älteren BASIC-Interpretern lebensnotwendig. R-BASIC kommt gänzlich ohne Zeilennummern aus, zur Definition von Sprungzielen gibt es den LABEL Befehl.
Achtung! Verwechseln Sie diese im Code vereinbarten Zeilennummern nicht mit den im Editorfenster angezeigten Zeilennummern! R-BASIC kann jedoch mit Zeilennummern umgehen (Bei GOTO, GOSUB und RESTORE), so dass ältere Programme einfacher nach R-BASIC zu übertragen sind. Dazu müssen Sie die Zeilennummern aber explizit im Programm vereinbaren. Beispielsweise könnten Sie obiges Programm direkt so eingeben, wie es oben steht. Es geht aber auch folgende Variante: |
10 Print "Bitte geben Sie eine Zahl ein" INPUT Z IF Z < 5 THEN PRINT "Unter Fünf" GOTO 10 |
|
Wesentlich besser ist aber diese Form: |
Label restart Print "Bitte geben Sie eine Zahl ein" INPUT Z IF Z < 5 THEN PRINT "Unter Fünf" GOTO restart |
|
Hinweis: R-BASIC prüft die Gültigkeit von Zeilennummern nicht! Mehrfach definierte Zeilennummern werden nicht erkannt! Die Verwendung von Zeilennummern, die nicht existieren (also nicht explizit angegeben wurden) führt aber zu einem Compilerfehler Die Verwendung von Zeilennummern ist mit den Befehlen GOTO, GOSUB und RESTORE möglich. 18.3 Kompatibilität mit dem KC-85-BASICDas folgende Kapitel ist für Nutzer interessant, die einen KC-85 Homecomputer besitzen oder besessen haben oder aus einem anderen Grund ein KC-85 Programm nach R-BASIC portieren wollen. R-BASIC ist weitgehend abwärts-kompatibel zum BASIC des KC-85/3 und KC-85/4, so dass reine KC-BASIC-Programme ohne größere Probleme laufen sollten. Hinweise zur Portierung von KC-85 BASIC ProgrammenErforderliche EinstellungenR-BASIC ist nicht als KC-Emulator konzipiert. Insbesondere steht die Hardware des KC-85 nicht zur Verfügung und wird auch nicht emuliert. Mit der Systemvariablen kc85Features können Sie R-BASIC trotzdem dazu bringen, sich in bestimmten Situationen wie der KC-85 zu verhalten. In diesem Modus können Sie weiterhin alle R-BASIC Befehle verwenden. Ausnahme sind einige Farbbefehle, da auf dem KC-85 nur maximal 16 Farben möglich sind.Zusätzlich müssen Sie bestimmte Bedingungen einhalten. Dazu gehört, dass Sie als Screen eine 8Bit Bitmap mit aktivierter Palette (idealer Weise 640x512 Pixel) verwenden sowie das Koordinatensystem drehen. Wie man das macht und weitere notwendige Einstellungen finden Sie in der Beispieldatei 'KC 85 Demo' im Ordner 'R-BASIC\Beispiel\Erste Schritte'. Einige Details der Implementation verlassen sich darauf, dass die im Beispiel aufgeführten Initialisierungsschritte ausgeführt wurden. FarbenAuf dem KC-85 sind nur 8 Hintergrundfarben (Farbcodes 0 bis 7) und 16 Vordergrundfarben (Farbcodes 0 bis 15 und 16 bis 31) möglich. Die Farbtöne von Vordergrund- und Hintergrundfarben unterscheiden sich, so dass insgesamt 24 verschieden Farben möglich sind. Werden die Farbcodes 16 bis 31 für die Vordergrundfarbe verwendet, so werden die entsprechenden Pixel blinkend dargestellt. Intern wird das folgendermaßen so realisiert:
VariablenAuf dem KC-85 werden Variablen bei ihrer ersten Verwendung definiert. Nur Felder müssen mit DIM angegeben werden. Unter R-BASIC müssen Sie alle Variablen zunächst mit DIM vereinbaren. Beachten Sie, dass auf dem KC nur die ersten beiden Buchstaben einer Variable von Bedeutung sind! WE ist die gleiche Variable wie WELT und AL$ die gleiche wie ALF$.IRMDie Grafikausgabe des KC-85 erfolgt über einen Bildwiederholspeicher (IRM: Image Repeat Memory). Er besteht aus dem Pixelspeicher ab Adresse 0, dem Colorspeicher ab Adresse 10240, den Arbeitszellen des KC-Betriebssystems CAOS ab Adresse 12800 und einem freien Bereich ab Adresse 14848.Im Pixelspeicher ist in jedem Byte für 8 Pixel die Information abgelegt, ob die Vordergrundfarbe oder die Hintergrundfarbe angezeigt werden soll. Der Colorspeicher enthält in jedem Byte für jeweils 4x8 Pixel die zugehörige Vordergrund- und die Hintergrundfarbe. Eine genaue Aufteilung des IRM sowie Informationen dazu, welche der CAOS Arbeitszellen von R-BASIC benutzt werden können, finden Sie im Anhang. Aus BASIC heraus kann der IRM mit den Befehlen VPEEK und VPOKE (siehe unten) angesprochen werden. R-BASIC stellt dafür einen eigenen Speicherblock bereit. Je nachdem welche Bits in der Systemvariablen kc85Features gesetzt sind löst ein VPOKE Befehl weitere Aktionen aus, die das Verhalten des KC-85 nachahmen. Sie sollten auf jeden Fall den zu portierenden Code nach Peek, Poke, VPeek, VPoke, Deek und Doke Befehlen durchsuchen um deren Funktion gegebenenfalls anpassen zu können. ZeilennummernKlassische BASIC Programme benötigen Zeilennummern, R-BASIC nicht. R-BASIC kann jedoch mit Zeilennummern umgehen, so dass Sie beim Portieren eines Programms die Zeilennummern nicht entfernen müssen.Im Gegensatz zum KC-BASIC übernimmt R-BASIC reine Kommentarzeilen nicht in den Code. Folgende KC-Sequenz führt unter R-BASIC zu einem Fehler (Zeilennummer existiert nicht) wenn der Befehl 'GOSUB 1100' compiliert wird. |
1100 ! Unterprogramm zur Anzeige 1110 Window : COLOR 15, 1: CLS |
| Ändern Sie den Code dann folgendermaßen: |
! Unterprogramm zur Anzeige 1100 Window : COLOR 15, 1: CLS |
ZeichensatzDer Zeichensatz von KC und PC / R-BASIC unterscheiden sich an einige Stellen. Insbesondere müssen Sie die deutschen Umlaute über ihren Code in einen String einfügen, ein 'ä' z.B. als '\125'. Eine entsprechende Übersicht finden Sie im Anhang, Kapitel H.ZeichengeneratorEiner der Initialisierungsschritte ist das Einstellen des BlockGrafik Modus. Wenn das Bit 9 in den kc85Features gesetzt ist kann R-BASIC erkennen, ob ein KC-85 Programm der Zeichengenerator des KC-85 ändert (Verwendung der Befehle POKE bzw. VPOKE) und seinen eigenen Zeichengenerator entsprechend anpassen. Wo der KC-Zeichengenerator liegt wird von den Arbeitszellen 14246 bis 14253 im IRM bestimmt, die mit dem Befehl VPOKE geändert werden können. Details dazu finden Sie im Anhang. Der Standard-Zeichengenerator liegt beim KC im ROM auf den Adressen 60928 (&hEE00)bzw. 65024 (&hFE00). R-BASIC erkennt, wenn das Programm den Zeichengenerator in den RAM (Adresse kleiner 49152 bzw. &hC000) verschiebt und überwacht die entsprechenden Adressen dann.R-BASIC reagiert jedoch nicht adäquat, wenn das Programm die Adresse des Zeichengenerators wieder in den ROM zurück verschiebt. Das kann sinnvoll sein, wenn zwischenzeitlich wieder Buchstaben statt Grafikzeichen ausgegeben werden sollen. Sie müssen diese Programmstellen finden und ändern, indem Sie zwischenzeitlich auf den alternativen Zeichengenerator von R-BASIC wechseln. Im Normalfall müssen Sie dafür an zwei Stellen im Programm VPOKE durch BlockSelect ersetzen. Im eingangs genannten Beispiel ist das demonstriert. LaufzeitLäuft ein Programm zu schnell, z.B. in einer Spielschleife, so können Sie den Befehl DELAY verwenden. Wenn Sie während der zu schnell laufenden Schleife Strg-B drücken öffnet sich der R-BASIC Debugger und Sie können im Einzelschrittbetrieb die passende Position für die Delay-Befehle finden. Beachten Sie die Dokumentation zum Delay-Befehl!Nicht vollständig KC-kompatible BefehleEinige wenige Befehle sind nicht vollständig KC-kompatibel programmiert, um die Leistungsfähigkeit von R-BASIC nicht unnötig einzuschränken. In anderen Fällen würde der Nutzen im Vergleich zum erforderlichen Aufwand einfach zu gering.
Nicht unterstützte KC-BASIC BefehleEinige Befehle sind unter R-BASIC nicht sinnvoll (z.B. die Editorbefehle) oder konzeptionell nicht möglich (z.B. der Aufruf von Z80 Maschinencode).
Spezielle Befehle für die KC-Kompatibilitätkc85FeaturesDie Systemvariable kc85Features bestimmt das Kompatibilitätslevel von R-BASIC gegenüber dem KC-85 BASIC. Die in der Tabelle unten aufgelisteten Funktionen kann man einzeln ein- und ausschalten, da viele von ihnen R-BASIC einschränken oder verlangsamen. Dazu enthält die Variable kc85Features Bitflags, das heißt, jedes Bit hat eine eigene Bedeutung. Die Arbeit mit Bitflags ist im Kapitel 2.3.5.4 des Programmierhandbuchs beschrieben.Die meisten Bits setzen voraus, dass der Ausgabescreen eine 8 Bit Bitmap mit Palette ist. Ist diese Bedingung nicht erfüllt funktionieren einige Funktionen nicht oder verhalten sich 'seltsam'. Übersicht über die Bits in kc85Features
Nähere Beschreibung der einzelnen Bits
VPOKEVPOKE schreibt ein Byte in den IRM. In diesem Bereich liegt der Bildwiederholspeicher des KC-85 und die Arbeitszellen des KC Betriebssystems. Einige Bits in der Systemvariablen kc85Fetaures bestimmen, ob VPOKE weitere Aktionen auslöst oder einfach nur den Speicher beschreibt.Eine genaue Aufteilung des IRM sowie Informationen dazu, welche der CAOS Arbeitszellen von R-BASIC benutzt werden können, finden Sie im Anhang.
VPEEKVPEEK liest ein Byte aus dem IRM. Die Bits 4 und 6 der Systemvariablen kc85Features bestimmen, ob beim Lesen aus dem Pixel- bzw. Color-RAM der IRM selbst gelesen werden soll oder ob VPEEK versuchen soll, den Wert aus den Pixeldaten der Ausgabebitmap zu rekonstruieren.
KC_WIDTHKC_WIDTH (Breite, KC Kompatibilitätsbefehl) bestimmt die maximale Länge einer Ausgabezeile. Dieser Befehl ist ursprünglich zur Arbeit mit Druckern gedacht und wurde deswegen umbenannt. Der Originalbefehl im KC-85 BASIC lautet WIDTH.
Beispiel: |
KC_WIDTH 15 |
KCClearKCCLEAR löscht den globalen Variablenspeicher, einschließlich String und HUGE Variablen. Der Originalbefehl im KC-85 BASIC lautet CLEAR.
Beispiel: |
KCClear |
^ |