Mathematical-Basic: Das Super-Basic für den VC 20
Einen echten Knüller für alle Besitzer eines VC 20 mit 8 KByte Erweiterung haben wir zum »Listing des Monats« gewählt. Mathematical Basic steift über 50 neue Befehle und Funktionen zur Verfügung und setzt damit einen Standard, an dem andere Toolkits künftig gemessen werden müssen.
Das Programm ist vollständig in Assembler geschrieben und liegt zum Eintippen als Basic-Lader vor. Nach dem Starten des Laders wird das eigentliche Maschinenprogramm ab Adresse 29211, also am oberen Ende von Speicherblock 3 abgelegt und gleichzeitig vor dem Überschreiben durch Basic-Programme oder Variable geschützt. Bei einem voll ausgebauten VC 20 (+ 24 KByte) kann das Programm ohne weitere Veränderungen benutzt werden. Aber auch Besitzer einer 8-KByte-Erweiterung können diese Basic-Erweiterung nutzen. Allerdings muß dann diese 8-KByte-Erweiterung hardwaremäßig auf den Adreßbereich von $6000 bis $7FFF, also auf Speicherblock 3 umgeschaltet werden. Schlagen Sie bitte die erforderliche Vorgehensweise im Handbuch für die 8-KByte-Erweiterung nach. Es ist die gleiche Umstellung, die auch nötig wird, wenn Sie das 8-KByte-Modul zusammen mit einer 16-KByte-Erweiterung als 24 KByte RAM nutzen wollen.
Haben Sie allerdings keine zusätzliche 16-KByte-Erweiterung, dann steht Ihnen für das Arbeiten mit Mathematical-Basic nur der Grundversionsspeicher zur Verfügung. Leider ist es nicht möglich, nur das 16-KByte-Modul zu verwenden, da dieses immer auf Speicherblock 1 und 2 eingestellt ist. Doch nun zum Programm selbst: Mathematical-Basic erweitert den Wortschatz des Basic-Interpreters um zusätzliche Befehle und Funktionen. Insbesondere wurde die Handhabung der trigonometrischen Funktionen verbessert (man kann zwischen Altgrad, Neugrad und Bogenmaß wählen). Daneben wurden Spezialbefehle für Diskettenbetrieb wie CATALOG, DLOAD, DSAVE etc. eingebaut. Strukturierte Programmierung wird durch DO…UNTIL-Schleifen unterstützt. Viele weitere Befehle und Funktionen vereinfachen die Programmierung zum Teil ganz erheblich.
Auf jeden Fall braucht »Mathematical-Basic« den Vergleich auch mit kommerziellen Softwareprodukten dieser Art nicht zu scheuen.
(ev)Eine gute Nachricht für alle Freunde des VC 20: Unser »Listing des Monats« macht mit über 50 neuen Befehlen das Programmieren zum Vergnügen.
Leider gibt es aber auch eine schlechte Nachricht. Sie müssen gut und gerne 150 DATA-Zeilen eintippen. Lassen Sie sich aber davon nicht entmutigen. Der Aufwand lohnt sich ganz bestimmt. Das Programm hilft Ihnen bei der wohl unvermeidlichen Suche nach Tippfehlern durch das blockweise Bilden von Prüfsummen.
Befehle des Mathematical Basic
- ':
erlaubt eine REM-Anweisung innerhalb einer Zeile ohne sofortige Programmfortsetzung ab folgender Zeile. - BEEP h, l:
gibt einen Ton variabler Höhe (h) und Länge (l) aus. h ist im Bereich von 0 bis 126 und l von 0 bis 255 definiert. Beträgt l=0, so wird kein Ton ausgegeben. - CATALOG:
bringt das Inhaltsverzeichnis der Diskette auf den Bildschirm. Dieser Befehl ist nur für das Gerät mit der Nummer 8 definiert. Wird während der Ausgabe die STOP-Taste betätigt, so wird die Ausgabe sofort abgebrochen. Wird die Leertaste gedrückt, so wird die Ausgabe nur unterbrochen und kann mit einer weiteren Betätigung dieser Taste fortgesetzt werden. - COLOR
c,h,r: setzt die Farben für Cursor (c), Hintergrund (h) und Rahmen (r). r und c erstrecken sich von 0 bis 7 und h von 0 bis 15. Die einzelnen Farben bezüglich der Nummercodes können dem VC 20-Handbuch entnommen werden. - CLS:
löscht den Bildschirmspeicher. - DEFUSRn TO x:
definiert einen der neun möglichen USR-Vektoren. Die einzelnen USR-Funktionen werden durch das Zeichen n unterschieden. n kann dabei A, B, C, D, E, F, G oder H sein. Die neunte USR-Funktion ist die, welche über den Vektor in den Adressen 1 und 2 angesprungen wird. Soll dieser Vektor definiert werden, so muß n weggelassen werden. Die Variable x steht für den Vektor selbst, also der Adresse, ab der die U8R-Funktion starten soll. Beispiel: DEFUSRA TO 30000. Die USR-Funktion USRA erhält die Einsprungadresse 30000. - DEGREE:
stellt die Routinen für trigonometrische Funktionen auf Normalgrad (0 bis 360) ein. - DELETE a-b:
löscht Zeilen eines Basic-Programms von Zeile a bis Zeile b. Für a und b sind nur Konstanten erlaubt. - DIRECTORY:
siehe CATALOG - DLOAD pn$:
lädt ein Programm mit dem Namen pn$ vom Floppy-Laufwerk mit der Nummer 8. Außer dem Namen sind keine weiteren Parameter erlaubt. - DO:
erlaubt zusammen mit UNTIL eine Schleife. Der zwischen diesen beiden Schlüsselwörtern liegende Programmteil wird so oft wiederholt, bis der Ausdruck, der UNTIL folgt, nicht mehr auf logisch 0 ist. Dazu ein Beispiel: DO GET a$: UNTIL a$=" ". Das Programm verläßt die Schleife nicht eher, bis die Leertaste gedrückt wird. DO-UNTIL-Schleifen können acht Ebenen tief geschachtelt werden. Eine neunte DO-Anweisung würde die Meldung »out of memory« zur Folge haben. Sollte UNTIL einmal ohne einen vorangegangenen DO-Befehl aufgerufen werden, so gibt der VC 20 »until without do« aus. - DSAVE pn$:
sichert ein Programm mit dem Namen pn$ auf dem Floppy-Laufwerk mit der Nummer 8. Außer dem Namen sind keine weiteren Parameter zulässig. Sollte dem Befehl DSAVE, DLOAD oder DVERIFY kein Parameter folgen, so wird automatisch »*« als Parameter gesetzt. - DVERIFY pn$:
vergleicht das Programm mit dem Namen pn$ im Speicher mit dem gleichen auf der Diskette. Als Parameter ist nur der Name erlaubt. - EXECUTE a$:
wandelt den String a$ in Interpretercode und führt die darin enthaltenen Anweisungen aus. Beispiel: a$="a=22":EXECUTE a$. Der Variablen a wird der Wert 22 zugewiesen. Der Befehl darf nicht im Direkt-Modus gegeben werden und der Befehlsstring (a$) darf eine Länge von 88 Zeichen nicht überschreiten. - GRAD:
stellt die trigonometrischen Routinen auf Neugrad (0 bis 400). - IF:
Die IF…THEN-Anweisung ist in ihren Aufbaumöglichkeiten erweitert worden. Es ist nicht mehr zwingend erforderlich, den THEN-Dummy zu schreiben. Beispiel: IF A=4 THEN PRINT B$ läßt sich auch als IF A=4 PRINT B$ eingeben. - INITIALIZE:
initialisiert die Floppy mit der Nummer 8. - LOCATE z,s:
setzt den Cursor in Zeile z und Spalte s. z liegt im Bereich von 1 bis 23 und s von 1 bis 22. Folgende Variationsmöglichkeiten sind gegeben: LOCATE z definiert nur eine neue Zeilenposition. LOCATE ,s setzt den Cursor innerhalb einer Zeile nur an eine neue Spaltenposition. - LPRINT:
verhält sich wie PRINT. Die Zeichen werden aber nicht auf den Bildschirm, sondern auf den Drucker (Nummer 4) ausgegeben. LPRINT und PPRINT sollten nur bei angeschlossenen Geräten benutzt werden, da sonst der IEC-Bus blockiert wird. - RADIAN:
stellt die trigonometrischen Routinen auf Bogenmaß ein. - RENUMBER z,s:
reorganisiert die Zeilennummern eines Basic-Programms. z ist dabei die Startzeile und s die Schrittweite, z und s dürfen nur Konstanten sein. Sollten dem Befehl keine Parameter folgen, so gilt z = 100 und s = 10. - RESTORE TO z:
positioniert den DATA-Pointer auf die Zeile z. Das Wort TO kann dabei wegfallen. RESTORE allein setzt den Pointer wie gewohnt auf den Programmstart. - RETURN TO z:
ermöglicht es, aus einem Unterprogramm in eine bestimmte Zeile z zurückzukehren. - RUN "name":
hat die gleiche Funktion wie DLOAD. Zusätzlich wird aber noch der String RUN +CHR$(13) in den Tastaturpuffer geschrieben. Das hat zur Folge, daß das gerade geladene Programm sofort gestartet wird. - PPRINT:
verhält sich wie PRINT. Die Zeichen werden aber, anstatt auf den Bildschirm, auf den Plotter (Nummer 6) ausgegeben. - QUIT:
führt ein Total-Reset aus. Mathematical Basic wird dabei gelöscht. - UNITL a: siehe DO.
Die Funktionen des Mathematical Basic
- ! a:
ist ein Äquivalent zur CHR$(a)-Funktion. Hierbei sind aber keine Klammern nötig, a ist nur als Konstante erlaubt. - &:
ist das »Hexadezimal-Vorzeichen« für Hex-Konstanten. Beispiel: &aO2b ist das Äquivalent für 41003. Die Anzahl der Hex-Ziffern ist beliebig, es wird maximal eine 16-Bit-Zahl errechnet. - ←:
entspricht dem Ausdruck CHR$(13) und kann auch genauso gehandhabt werden. - [a]:
hat die gleiche Wirkung wie die ABS-Funktion. Unterscheidet sich aber durch die bessere Selbstdokumentation. - ACS(a):
berechnet abhängig von der jeweiligen Einstellung durch RADIAN, DEGREE oder GRAD den Arcus-Cosinus von a. Die hier angesprochene Abhängigkeit gilt für alle trigonometrischen Funktionen. - ACT(a):
bestimmt den Arcus-Cotangens von a. - ASN(a):
ergibt den Arcus-Sinus von a. - CHR$(z,l).
ist eine Variante von CHR$(z). z entspricht dabei dem Zeichen des normalerweise nur 1 Byte langen Strings. Mit l läßt sich nun aber zusätzlich auch die Länge variieren. l ist dabei von 0 bis 255 definiert. - COT(a):
berechnet den Cotangens von a. - CRSCOL:
holt die momentane Spaltenposition des Cursors. - CRSLIN:
holt die momentane Zeilenposition des Cursors. - CVF(a$):
wandelt den fünf Zeichen langen String a$ in eine Fließkommazahl um. - CVI(a$):
wandelt den zwei Zeichen langen String a$ in eine Integerzahl um. - DEC(a$):
berechnet aus dem 4-Byte-String a$, der sich aus Hex-Ziffern aufbaut, eine dezimale 16-Bit-Zahl. - DIV(a,b,):
ist gleichwertig mit dem Ausdruck INT(a/b). - FRC(a):
holt die Nachkommazahl von a. - FUNCTION(a$).
wandelt den maximal 88 Zeichen langen String a$ in Interpretercode und berechnet ihn. Beispiel: y=FUNCTION("5+2"). y wird der Wert 7 zugewiesen. Diese Funktion darf nicht im Direktmodus stehen. - HEX$(a):
wandelt die 16-Bit-Zahl a in einen 4-Byte-Hex. String. - INSTR(a$,b$):
testet, an welcher Stelle a$ sich in b$ befindet. Ist a$ nicht in b$ enthalten, so ist das Ergebnis 0, ansonsten entspricht es der Position von a$ in b$. a$ und b$ müssen mindestens 1 Zeichen lang sein und a$ darf nicht länger als b$ sein. INSTR darf nicht im Direktmodus stehen. - LGD (a):
berechnet den dekadischen Logarithmus von a. - LGU(a,b):
bestimmt den Logarithmus von a zur Basis b. - MKF$(a):
wandelt die Zahl a in einen fünf Zeichen langen String. - MKI$(a):
wandelt die Integerzahl a in einen zwei Zeichen langen String. - MOD(a,b):
bestimmt den ganzzahligen Rest aus der Division von a durch b. - RANDOM:
entspricht dem Ausdruck RND(1). - RANDOM(a,b):
entspricht dem Ausdruck RND(1)*b+a. - TIME$:
ist eine modifizierte Form von Tl$. Der Unterschied liegt darin, daß bei TIME$ noch zwei Trennzeichen eingefügt werden. - USRn:
entspricht im Prinzip der USR(a)-Funktion. Unterschiede liegen darin, daß n (was der Kennung A, B, C, D, E, F, G oder H entspricht) folgen muß, aber keine »Klammer-auf-Klammer-zu«-Sequenz. Diese Routine (Aufruf durch JSR$cef1) muß zusätzlich an USR-Routinen, die für die Standard-USR-Funktion ausgelegt sind, angehängt werden. Der Vorteil bei den USRn-Funktionen liegt nun darin, daß man den USR-String mit mehreren Parametern übergeben kann. Die dazu nötigen Routinen sind:cefa Test auf Klammer auf und nächstes Zeichen holen. cd9e Ausdruck holen und String- und Integer-Flag setzen. cd8d Test auf numerischen Ausdruck. cd8f Test auf String. cef7 Test auf Klammer zu und nächstes Zeichen holen. cefd Test auf Komma und nächstes Zeichen holen.
Damit sind alle neuen Befehle und Funktionen vorgestellt. Bleibt nur noch, Ihnen viel Spaß beim Programmieren mit »Mathematical Basic« zu wünschen.
(Wolfgang W. Wirth/ev)