VC 20
Tips & Tricks
5/84, S. 85

Basic-Programme stutzen

Es kommt nicht selten vor, daß man Teile eines umfangreichen Basic-Programms für eine Neuentwicklung verwenden möchte, während andere Teile als überflüssig weggeschnitten werden sollen. Eine kleine Routine hilft dabei.

Exbasic Level II kennt den im VC20-Basic nicht vorhandenen Befehl DELETE, genauer: DEL-b, DELa-b, DELa-, wobei a und b explizit vorgegebene Zeilennummern sind. Das im folgenden vorgeschlagene Basic-Programm simuliert den Befehl DELa-, genauer: DEL X-, wobei der (gegebenenfalls erst vom Hauptprogramm zu berechnende) aktuelle Wert von X diejenige Basic-Zeile angibt, ab welcher (inklusiv) das im Basic-Speicher befindliche Programm gekürzt werden soll. Wir beschränken uns auf DEL X-. DEL-X und DEL X-Y lassen sich nach ähnlichem Muster aufbauen (Kopieren geeigneter Teile des Interpreters in den Kassettenpuffer und dortiges Abändern durch einige wenige POKE-Befehle), erfordern aber einen etwa doppelt so großen Aufwand.

Zunächst wird das Maschinenprogramm 50707 des Interpreters in den Kassettenpuffer kopiert. Dieses Programm 50707 berechnet die Adresse derjenigen Basic-Zeile, deren Zeilennummer in 20/21 eingegeben wird, nennen wir sie ADRX. Da 20/21 beim Abarbeiten des Programms durch die Adressenberechnung bei SYS828 in Zeile 560 gestört wird, wird die Zeilennummer-Übergabestelle in der 50707-Kopie nach 1/2 verlegt. An die 50707-Kopie im Kassettenpuffer wird eine (anschließend mit 5 POKE-Befehlen abgeänderte) Kopie eines für unsere Zwecke geeigneten Teilstücks des Maschinenunterprogramms 50756 vom Interpreters gelegt. Dieses speichert in ADRX und ADRX+1 den Wert 0 (Signal für Basic-Programmende) und setzt den Zeiger 45/46 (Variablenanfang) auf ADRX + 2. Das Gesamtmaschinenprogramm im Kassettenpuffer wird per SYS828 angesprungen, und ein CLR sorgt nach Rückkehr in Basic für ein Angleichen der restlichen Basic-Zeiger.

Das Programm (das sich als ein bei Bedarf einzugebendes oder bei Neuentwicklungen schon vorsorglich vorzusehendes Hilfsprogramm (Utility) versteht) kennt keine Fehlermeldungen. Ist die Basic-Zeile X nicht vorhanden, wird der Programmrest ab der nächsten verfügbaren auf X folgenden Basic-Zeile weggeschnitten. Selbstverständlich kann sich das Hilfsprogramm auch selbst (ganz oder teilweise) stutzen. Gibt esweder die Basic-Zeile X noch eine Basic-Zeile mit höherer Nummer, so bleibt alles so, wie es ist.

Das Beispielsprogramm schneidet die Zeile 700 und alle darauffolgenden Zeilen weg. Bei X = 690 in Zeile 100 würde es ebenfalls Zeile 700 und alle folgenden wegschneiden. Bei X = 720 würde alles so bleiben, wie es ist. Bei X = 200 bliebe nur die Zeile 100 stehen.

Wird das Hilfsprogramm mehrfach verwendet, so reicht es zur Ablaufbeschleunigung, in Zeile 100 nach 550 zu springen. Der Teil 500 bis 540 generiert das Maschinenprogramm im Kassettenpuffer, welches natürlich solange zur Verfügung steht, wie der Kassettenpuffer nicht benötigt wird (SAVE, LOAD, VERIFY).

(Fred Behringer)
Zeile
100 X mit Zeilennummer laden, ab welcher das Gesamtprogramm gekürzt werden soll.
510 Kopieren des Interpreter-Unterprogramms 50707 in den Kassettenpuffer.
520 Verlegen der Parameter-Eingabestellen 20/21 in der 50707-Kopie nach 1/2, da 20/21 auch von der Adressenberechnung in SYS828 (Zeile 560) benötigt wird.
530 Kopieren eines geeigneten Teilstücks des Interpreter-Unterprogramms 50756 in den Kassettenpuffer und
540 geeignetes Abändern, so daß in die von der 50707-Kopie in 95/96 gelieferte Anfangsadresse der Basic-Zeile X (oder, bei Nichtvorhandensein von X, der nächstmöglichen Basic-Zeile), sagen wir ADRX, und in ADRX+1 der Wert 0 (Basic-Ende) und in 45/46 die Adresse ADRX+2 (Variablenanfang) gelegt wird.
550 Aufspalten der in X vorgegebenen Basic-Zeilennummer in Low Byte und High Byte und Übergabe an 1/2.
560 Abarbeiten des Maschinenprogramms und anschließendes Nachstellen der restlichen Basic-Zeiger.
Programmbeschreibung zu »DELETE X«
100 x=700:goto500
500 rem:deletex-
510 fori=0to45:poke828+i,peek(50707+i):next
520 poke845,2:poke856,1
530 fori=0to20:poke874+i,peek(50756+i):next
540 poke878,95:poke881,95:poke883,95:poke890,96:poke895,96
550 poke2,x/256:x=x-256*peek(2):poke1,x
560 sys828:clr
700 rem*
701 rem*
702 rem*
710 rem*
Listing zu »DELETE X«
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →