VC 20
Tips und Tricks

Basic-Befehle im Griff

Gerade für den Anfänger ist es nicht immer leicht, sich alle Basic-Befehle zu merken. Man denke nur an ausgefallene Befehle wie CMD oder POS(X).

Exbasic Level II kennt als Abhilfe den Befehl HELP, mit dem eine Liste sämtlicher Exbasicbefehle auf den Bildschirm gebracht werden kann. Die folgenden kurzen Programme (drei Lösungsmöglichkeiten für dasselbe Problem), die sich als Hilfsprogramme (Utility) zum Einbau in ein zu entwickelndes längeres Hauptprogramm verstehen, simulieren diesen Befehl HELP für das reine Basic, das heißt, sie geben eine Liste aller Befehle auf dem Bildschirm aus.

Wie geschieht das nun im einzelnen?

Eine unmittelbare Ausgabe aller Basic-Befehle auf dem Bildschirm per PRINT-Anweisungen hätte zwar gegenüber den neuen zu besprechenden drei Methoden den Vorteil, daß man diese Liste alphabetisch ordnen könnte. Sie wäre aber viel zu langsam (in der Größenordnung 5 Sekunden) und das generierte Basic-Programm wäre viel zu lang: Eine Liste aller aneinandergereihten Basic-Befehle, mit Trennzeichen zwischen Befehl und Befehl, umfaßt 331 Bytes. Einschließlich PRINT-Befehle, Hochkommata und Zeilennumerierungen würde ein solches Programm also mindestens 375 Bytes benötigen.

Nun enthält aber das Betriebssystem bereits eine Tabelle aller Basic-Befehle: 49310-49565 ($C09E-$C19D). Diese hat lediglich den Nachteil, daß sie keine Trennzeichen verwendet, sondern das Ende eines Basic-Befehlswortes dadurch kennzeichnet, daß der ASCII-Code des betreffenden Zeichens um den Wert 128 (Bit 7 gesetzt) erhöht wird. Das Vorhandensein einer solchen Tabelle wollen wir in den folgenden drei Vorschlägen zur Simulation von HELP ausnützen.

Methode 1: »HELP« in Basic

Das Basic-Programm nach Listing 1 ist der kürzeste unserer drei Vorschläge (nur 80 Bytes lang), es hat aber den Nachteil, daß es zum Aufbau der Basic-Befehlsliste mehr also vier Sekunden benötigt. Es wird (im Direktmodus oder vom Hauptprogramm aus) per GOSUB500 aufgerufen und PRINTet Zeichen für Zeichen der Tabelle 49310 — 49565, wobei es darauf achtet, daß immer wenn ein Befehlswort zu Ende ist, das betreffende Zeichen vor dem Ausdrucken (auf dem Bildschirm) zuerst normalisiert wird und daß dann zusätzlich noch ein Befehlsworttrennzeichen eingefügt wird (in Listing 1 an der Stelle X$=".", welches Symbol vom Leser beliebig abgeändert und individuellem Geschmack angepaßt werden kann). Nachteilig ist bei allen drei zu besprechenden Vorschlägen, daß man sich sinnvollerweise mit der durch die CBM-Tabelle vorgegebenen Unordnung zufriedengeben muß.

Methode 2: »HELP« per Maschinensprogramm

Das in Listing 2 aufgeführte Maschinensprogramm zur Ausgabe der Basic-Befehlsliste auf dem Bildschirm ist zwar ein wenig länger als das Basic-Programm in Listing 1, nämlich 106 Bytes lang. Dafür benötigt es aber zum Einlesen der Data-Zeilen deutlich weniger als ⅓ Sekunde und erzeugt die Basic-Befehlsliste nach dem Aufruf per SYS700 in einem kaum wahrnehmbaren Bruchteil einer Sekunde. Das eigentliche Maschinenprogramm ist nur 21 Bytes lang und kann (voll verschiebbar) überall abgelegt werden, wo es nicht stört, zum Beispiel in einem durch Herabsetzen der RAM-Grenzen geschützten Maschinensprachbereich oder im Kassettenpuffer oder eben auch dort, wo wir es hingelegt haben, nämlich in den für den Benutzer freien Bereich 678-767 (02A6-02FF). Wir haben es als mit SYS700 aufrufbar gestaltet. Bei Ablage an anderer Stelle aaaa müßte POKE700+I,X in Zeile 610 von Listing 2 durch POKEaaaa+l,X ersetzt und das Programm per SYSaaaa aufgerufen werden. Legt man das Programm nicht in den Kassettenpuffer, sondern wie hier vorgeschlagen, nach 700ff., dann kann man das generierende Basic-Programm aus Listing 2 natürlich nach dem Einlesen des Maschinenprogramms wieder löschen (ein Maschinenprogramm für größere Löschvorhaben wurde im 64’er Ausgabe 5/84, Seite 85, veröffentlicht). Listing 3 gibt eine ausführlich kommentierte Darstellung des Maschinensprogramms in Assemblernotierung.

Methode 3: Maschinenprogrammerzeuger ohne Datenzeilen

Will man das Maschinenprogramm in den Kassettenpuffer legen, so muß man es gegebenenfalls (bei zwischenzeitlicher Ausführung von LOAD, SAVE oder VERIFY) oder, wenn sich mehrere Hilfsprogramme den Kassettenpuffer teilen) vor jedem Aufruf neu generieren. Die Schwierigkeiten, die dadurch entstehen, daß der Basic-Datenzeiger per RESTORE nur immer an den Datenanfang gesetzt werden kann, lassen sich beispielsweise durch ein in Computer persönlich, Ausgabe 10/84, Seite 52, beschriebenes Hilfsprogramm beseitigen, mit welchem der Datenzeiger an beliebige Stellen gesetzt werden kann. Das nun noch zu beschreibende Programm nach Listing 4 vermeidet die Schwierigkeiten durch ausschließliche Verwendung von POKE-Anweisungen anstelle von DATA-Zeilen. Um den Aufwand so gering wie möglich zu halten, wurde angestrebt, mit möglichst weniger POKE-Anweisungen auszukommen. Das wurde mit einem Trick erreicht: Das für die Rückübersetzung der Token beim Ausdrucken nach dem LIST-Befehl zuständige Maschinenunterprogramm des Betriebssystems enthält fast alle Befehlssequenzen, die wir für unsere Zwecke benötigen. Das Programm in Listing 4 lädt den Maschinenprogrammabschnitt 50929 bis 51008 (C6F1 — C740), der zugegebenermaßen viel für unsere Zwecke überflüssigen Ballast enthält, mit einer einfachen FOR-NEXT-Schleife in den Kassettenpuffer, (Es wird mit GOSUB700 angesprungen). Jeder zweite und weitere Ansprung kann mit GOSUB730 erfolgen und wird dann in kaum wahrnehmbaren Bruchteilen einer Sekunde ausgeführt.

(Fred Behringer/ev)
500 rem:help
510 fori=0to254:x=peek(49310+i):ifx>99thenx=x-128:x$=".":goto530
520 x$=""
530 printchr$(x)+x$;:next:return
Listing 1. Simulation von HELP als reines Basicprogramm, Länge 80 Bytes, Ausführungszeit 4 s
600 rem:help
610 fori=0to20:readx:poke700+i,x:next
620 data 160,255,200,185,158,192,16,7,41,127,32,71,203,169,46,32,71,203,208,238,96
Listing 2. Simulation von HELP per Maschinenprogrammlader. Länge 106 Bytes. Einlesen 0,3 Sekunden. Ausführung »augenblicklich«, Ansprung SYS700.
     LDY #$FF     ZEICHENZAEHLER
NEXT INY          NAECHSTES ZEICHEN
     LDA $C09E,Y  IN AKKU
     BPL NORM     WORTENDE ?
     AND #$7F     DANN NORMALISIERT
     JSR $CB47    ZEICHEN AUSGEBEB
     LDA #$2E     WORTTRENNZEICHEN
NORM JSR $CB47    ZEICHEN AUSGEBEB
     BNE NEXT     ZEICHEN IN AKKU = 0 ?
ENDE RTS          DANN ZURUECK ZU BASIC
Listing 3. Assemblerdarstellung des nach Listing 2 erzeugten Maschinenprogramms
700 rem:help
710 fori=0to80:poke828+i,peek(50929+i):next
720 poke836,55:poke892,169:poke893,166:poke897,6:poke903,180:poke909,96
730 poke782,255:sys898:return
Listing 4. Simulation von HELP als Maschinenprogramm für Kassettenpuffer, ohne DATA-Zeilen. Länge 106 Bytes, Einlesen 1,5 s, Ausführung »augenblicklich«.
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →