|
Der BASIC - Interpreter der KC-ReiheDer Interpreter besteht aus einer Vielzahl von Routinen und Tabellen. Hinter den Eintrittspunkten für Kalt- und Warmstart existierert eine Liste aller reservierten Wörter und nachfolgend die dazugehörigen Sprungtabellen. Der Kernteil der Tabellen ist für alle KC-Typen einheitlich gestaltet, der hintere Teil ist speziell den Rechnertypen KC 85/2 bis KC 85/4 bzw. KC 85/1, KC 87 angepaßt.
|
3. REMREM kennzeichnet Kommentare im Programm. Alles nach REM folgende wird überlesen und nicht interpretiert. Allerdings hat jedes REM zeitliche Auswirkungen, so verursacht ein REM eine Verzögerung im Programmablauf von ca. 1ms. Alternativ sollten daher alle REM am Ende eines Programms untergebracht werden, um so den Programmfluß nicht zu verlangsamen. |
4. LETZuweisungen in BASIC können optional mit LET erfolgen, z.B. LET X=1. Äquivalent dazu ist die Anweisung X=1. Der ursprüngliche Gedanke war, Zuweisungen und Vergleiche zu unterscheiden. |
5. Variablen und ihre BesonderheitenNumerische VariablenNumerische Variablen werden in sechs Bytes kodiert.
In den ersten zwei Bytes wird der Name der Variablen nach folgender
Regel kodiert: Das erste Byte ist 0, falls nur ein Buchstabe verwendet
wird.
In den verbleibenden vier Bytes wird der Wert der Variablen in gleitkommadarstellung mit Mantisse und Exponent verschlüsselt. Absolute Zahlenwerte liegen zwischen 9,4*10-39 und 1,7*1038, der größte Integerwert beläuft sich auf 3,35544*107. Zu Beginn des RUN ist der Variablenraum mit Nullen belegt. Stößt der Interpreter bei der Abarbeitung des Programms auf eine Variable, so legt er diese im reservierten Bereich ab. Dies geschieht immer nach dem selben Schema:
StringvariablenString-Variablen werden durch ein abschließendes "$" identifiziert und ähnlich wie numerische Variabaen gespeichert. Der Name wird ebenfalls in den ersten zwei Bytes abgelegt. Allerdings wird hier das erste Byte um 80H erhöht.AB$ = C2 41 anstelle von 42 41Erfaßt wird das Dollar-Zeichen als Kennzeichung einer String-Variablen also indirekt durch das Aufaddieren von 80H auf die HEX-Kodierung des zweiten Zeichens. Das dritte Byte beinhaltet die Zeichenanzhal des Strings. Im fünften
und sechsten Byte wird der Beginn des Strings im RAM als Pointer gespeichert.
Strings werden also indirekt abgelegt. Dies hat einen entscheidenen Vorteil zur Folge: Bei der Initialisirung muß nur die Anzahl der numerischen und String-Variablen gezählt und mit 6 multipliziert werden, um die notwendige Speichergröße für den Variablenraum zu erhalten. Die Ablage des Stringtextes erfolgt in einem separaten Adressraum. Strings können auf unterschiedliche Weise erzeugt werden:
Im zweiten und dritten Fall kann die Länge des Strings variieren. Deshalb wird der Inhalt des Strings nicht am alten Speicherplatz abgelegt werden, da sonst die Gefahr des Überschreibens anderer Strings besteht. Statt dessen wird jeder neu belegte String auf einen noch freien Speicherplatz abgelegt. Seine Adresse und seine Länge in den letzten vier Byte abgelegt. Der alte Text bleibt dabei als "Leiche" im Speicher erhalten. Abhilfe schafft hier die garbage collection. Sie wird vom Interpreter aufgerufen, wenn nicht mehr genügend freier Stringraum zur Verfügung steht. Bentuzte Strings werden an den Anfang des Speicherbereiches verschoben und ihre Pointer aktualisiert, die alten Belegungen werden dabei gelöscht. Die garbage collection kann sich als sehr zeitaufwendige Angelegenheit entpuppen. Der zeitliche Aufwand umfaßt zwei Zeiten
Der Abstand wächst mit der Differenz zwischen dem vorhanden Stringraum und dem Speicherbedarf für die Strings - er ist also von der Hardware abhängig. Andererseits hat auch die Häufigkeit der Neubelegung von Strings einen entscheidenen Einfluß. ArraysArrays werden in einem separatem Speicherbereich abgelegt. Zusammengehörige Werte verwenden denselben Namen. Im Anschluß der Namenskodierung und den Informationen über die Dimensionen folgen jeweils 4 Byte je Feldelement.Beispiel: DIM A(1,2,3)
Für jedes Feld existieren:
Bestimmungen für VariablennamenVariablennamen beliebiger Länge werden mit derf Einschränkung unterstützt, daß für die Speicherung und Unterscheidung der Varinbalen nur die ersten zwei Zeichen genutzt werden. So sind die Variablen "HALLO" bzw "HALLO2" in der Verarbeitung gleich und identifizieren somit dieselbe Variable.Die Regel zur Erzeugung eines Varibalennamens ist daher recht einfach
|
4. Sprunganweisungen GOTO und GOSUBBei diesen Befehlen besteht das Problem hauptsächlich in der Zeilensuche der anzuspringenden Zahl.Was geschieht nun bei GOTO n ?
Es ist daher anzuraten, Sprünge, ob nun mit GOTO oder Unterprogrammaufrufe mit GOSUB, immer soweit wie möglich nach vorne zu legen, damit somit die Suchzeit minimal gehalten werden kann. Das gleiche Problem war schon bei den Variablen zu sehen. Beim Aufruf von GOSUB wird die hinter GOSUB Zeilenzahl stehende Adresse auf den Stack gelegt und die Zeilensuche wie bei GOTO erläutert durchgeführt. Bei Erreichen von RETURN wird die Adresse vom Stack geholt und dann an dieser Stelle weitergearbeitet. Das RETURN ist somit sehr schnell und fällt daher kaum ins Gewicht. |
5. Die FOR - SchleifeDie FOR-Schleife hat folgenden Aufbau:FOR X=Anfangswert TO Endwert STEP SchrittweiteVor dem Schleifenrumpf wird X mit dem Startwert initialisiert, es läuft der Schleifenrumpf ab und bei Erreichen von NEXT X laufen nachflgende Punkte ab:SchleifenrumpfNEXT X
Einzig ausschlaggebende Veränderung ist die der Laufvariablen X. Soll beispielsweise die Schleife vorzeitig beendet werden, so ist es ratsam, nicht einfach aus der Schleife mittels GOTO herauszuspringen. Diese Vorgehensweise hinterläßt einen noch intakten Stack mit den Werten von Endwert und Schrittweite. Sicherer und damit korrekt ist es, die Laufvariable auf ihren Endwert zu setzen, um damit einen Abbruch zu erzeugen. Die Schleif wird in jedem Fall einmal durchlaufen. Um ihre Abarbeitung dennoch zu unterbinden, kann die IF - THEN - Anweisung eingesetzt werden. Im Zusammenspiel von STEP und einer IF - Anweisung am Ende des Schleifenrumpfes kann eine While - Schleife nachgebildet werden. Die Schrittweite wird mittels STEP 0 auf Null gestzt. Damit ist gewährleistet, daß die Laufvariable immer ihren Startwert behält. Am Ende des Schleifenrumpfes wird nun auf die Abbruchbedingung getetstet, tritt sie ein, wird die Laufvaribale auf ihren Endwert gesetzt und die Schleife wird abgebrochen. NEXT kann auch ohne Laufvariable genutzt werden kann. In diesem Fall wird bei Erreichen von NEXT die letzte Laufvariable im Stack benutzt und erhöht. Bei NEXT X hingegen wird der Stack nach der Varibalen X durchsucht und bis zu ihrer Position abggebaut. X wird nun erhöht. Ist keine Schleifenvariable mit dem Namen X vorhanden, erfolgt eine Felhlermeldung "?NF ERROR IN xxx" (next without for). Bei geschachtelten Schleifen ist daher immer die Reihenfolge des NEXT zu beachten: FOR X=XA TO XEWären NEXT X und NEXT Y vertauscht, also FOR X=XA TO XEso könnte NEXT Y nicht mehr ausgeführt werden, da Y nicht mehr auf dem Stack vorhanden ist, und es würde zur Fehlermeldung "?NF ERROR IN xxx" kommen. |
6. Logische VerknüpfungenDas KC-BASIC besitzt keine besonderen logischen Varibalen. Logische Varinblen werden hier indirekt erzeugt.BASIC stellt als logische Verknüpfen den üblichen Standard zur Verfügung, als da wären
Logische Werte werden nicht durch die Boolean-Werte true oder false dargestellt, sonder durch -1 und 0, wobei
Logische Operationen verwenden also nur ganze Zahlen und nur im Bereich von -1 bis 0 liefern "IF X" und "IF NOT X" eindeutige Aussagen. Bei anderen Zahlenbereichen sind beide Aussagen wahr. |
9. DATA - ZeilenZur Ablage von konstanten Daten, die oft genutzt werden, können DATA - Zeilen benutzt werden, z.B. DATA 12, Hallo. Die Besonderheit besteht darin, das Strings ohne Anführungszeichen abgelegt werden. Somit ist es möglich, Strings auch Zahlen zuzuweisen. Eine gemischte Ablage von Strings und Zahlen in einer DATA - Zeile ist zulässig.Ein RUN setzt den Zeiger der DATA - Zeilen immer auf die erste dieser Zeilen. Sollte im Programmlauf eine spezielle DATA - Zeile benötigt werden, so kann diese mittels RESTORE n angesprochen werden. 10 DATA ...In obigem Beispiel wird der DATA - Zeiger auf die Zeile 20 gesetzt und A erhält den Wert 12. Dies geschieht durch die Anweisung READ, die den aktuellen DATA - Wert liefert, der Zeiger wird nach dem Lesen auf den nächsten Wert gesetzt. RESTORE ohne Parameter setzt den DATA - Zeiger auf die erste DATA - Zeile. |
|