VC 20
Tips & Tricks

Programmiertes LISTing: LISTX-Y

Bei Hilfsprogrammen, die viele Benutzeranleitungen enthalten, gibt man diese Anleitungen normalerweise über PRINT-Anweisungen auf dem Bildschirm aus. An sich würde es bei geschickter Formulierung jedoch reichen, die sowieso vorhandenen REM-Erläuterungen als Anleitungen für den Benutzer mitzuverwenden.

Nur, wie bringt man diese auf den Bildschirm? Mit LIST wird das Basic-Programm jedesmal zum Direktmodus hin verlassen und, was noch schwerer wiegt, die Anfangs- und Endzeilennummern können nur als direkte Zahlen, nicht über Variablen, angegeben werden. Unser Programmvorschlag (Listing 1) simuliert den im VC 20-Basic nicht vorhandenen Befehl LISTX-Y (X=Variable, die die Anfangszeilennummer des zu listenden Programms übergibt, Y = Endzeilennummer).

Man könnte sich ein solches Hilfsprogramm durch Beschreiben des Tastaturpuffers konstruieren. Dann würden sich aber die in den Puffer geschriebenen LIST-Anweisungen auf dem Bildschirm störend bemerkbar machen. Andererseits kommt aus Geschwindigkeitsgründen nur ein Maschinenprogramm in Frage. Will man ein solches Maschinenprogramm per DATA-Zeilen einlesbar gestalten, wäre der Aufwand recht hoch. Außerdem gäbe es Schwierigkeiten mit dem nur immer auf den Datenanfang zurückstellbaren DATA-Zeiger (kein RESTORE X vorhanden). Einlesen per POKE wäre noch aufwendiger. Umgekehrt muß aber ein solches Maschinenprogramm zur Simulation von LIST Y notwendigerweise viele Teile enthalten, die bereits im Betriebssystem vorkommen. Wir lösen das Problem, indem wir mit zwei einfachen FOR-NEXT-Schleifen geeignete Teile des Betriebssystems in den Kassettenpuffer kopieren und diese Kopien dann durch sechs POKE-Anweisungen so abändern, daß sie unseren Ansprüchen genügen. Listing 1 zeigt das entsprechende Unterprogramm, das beim ersten Aufruf mit »GOSUB 63000« die Maschinenroutine erzeugt. Alle weiteren Aufrufe können mit »GOSUB 6350« erfolgen, wodurch, einiges an Zeit gespart wird. In der Variablen X wird die Anfangszeile, in Y die Endzeile übergeben. Listing 3 zeigt ein Demo-Programm. In Listing 2 gebe wir ein Anwendungsbeispiel an: In einem längeren Programm mögen alle REM-Erläuterungen in den Zeilen 100*a bis 100*a+4 untergebracht sein, also in den ersten fünf Zeilen ab jeder vollen Hunderternummer. Das Beispielprogramm nach Listing 2 wird per GOSUB63100 angesprungen und listet per Cursor-Down-Taste alle oben genannten REM-Zeilen (und nur diese, eventuelle weitere REM-Zeilen werden nicht berücksichtigt). Und zwar geschieht dies in Endlosform, das heißt nach Durchgang durch die letzte zu listende REM-Erläuterung erscheint wieder die erste und so fort. Durch Drücken der Return-Taste gelangt man wieder ins Hauptprogramm.

(Fred Behringer/ev)
60010 Einlesen von $C613-$C640 (50707-50752). Maschinenprogramm zur Berechnung der Startadresse einer Basic- Zeile. Zeilennummereingabe (der Anfangszeile) in $0014/$0015 (20/21).
63020 Verlegen dieser Parameterübergabestellen nach $00FB/$00FC (251/252), da $0014/$0015 (20/21) beim Ansprung SYS828 (siehe unten) gestört werden
63030 $C6009-$C741 (50889-51009). Programm zum Auflisten der gewünschten Zeilen. In diesem Programm wird die laufende Nummer der gerade gelisteten Zeile mit der beim Ansprung dieser Routine an $0014/$0015 (20/21) übergebenen Nummer der Endzeile verglichen, und die Routine wird verlassen, wenn die Endnummer erreicht ist. Auch hier läßt sich aus dem eben erwähnten Grund die Stelle $0014/$0015 (20/21) nicht als Parameterübergabestelle (von Basic zu Maschinenprogramm) verwenden und wird in 63040 zu $00FD/$00FE (253/254) abgeändert. Überschreiben des JMP-Befehls in $C714 (50964) mit einem RTS-Befehl sorgt dafür, daß nicht zum Basic-Warmstart zurückgekehrt wird, sondern zum Hauptprogramm. Die Sprungadresse $0306/$0307 (774/775), die in $C717 (50967) wirksam wird, hätte geändert werden müssen, da sich der Sprung ja nun auf die der Stelle $C71A (50970) entsprechenden Stelle in der Kopie im Kassettenpuffer bezieht. Es war einfacher, den (hier) überflüssigen JMP-Befehl in $C717 (50967) zu umgehen, indem die Sprungadresse in der der Stelle $C705 (50949) entsprechenden Stelle der Kopie abgeändert wurde.
63050 Die vom Hauptprogramm in X stammende Nummer der Anfangszeile wird in Low Byte/High Byte gespalten und der Stelle 251/252 übergeben (siehe oben)
63060 Entsprechend für die aus Y stammende Nummer der Endzeile und 253/254
63070 Aufruf des Maschinenprogramms und Rückkehr ins Basic-Hauptprogramm. Nach Rückkehr steht in $030D/$030C (781/780) die Nummer (Low Byte/High Byte) der nächstanstehenden Basic-Zeile zur Verfügung.
Beschreibung des Programms nach Listing 1 zur Simulation von LISTX-Y
63110 Einlesen des Simulationsprogramms für LISTX-Y nach Listing 1
63120 Anfangszeile auf Null
63130
63140
Wenn Return-Taste, dann zurück ins Hauptprogramm
63150 Wenn nicht Cursor-Down- oder Return-Taste, dann Anfang wieder 0.
63160 Wenn Cursor-Down-Taste, dann Listen der Zeilen X bis X+4 und Ausgleich für Zeilenvorschub
63170 Sprung um 100 nach vorn. Wenn Vorrat erschöpft, Zeilennummer wieder auf 0 (Endlosdurchlauf).
63180 Schnelles Vortasten zur nächsten vorhandenen Zeile mit Nummer zwischen 110*a und 100*a+4
63190 Weiter in Eingabeschleife
Beschreibung des Programms nach Listing 2 zum Ausdrucken aller Kopf-REM-Zeilen. Das Programm verwendet die Routine für LISTX-Y aus Listing 1.
63000 rem list x-y
63001 rem ========
63002 rem
63010 fori=0to45:poke828+i,peek(50707+i):next
63020 poke845,252:poke856,251
63030 fori=0to120:poke874+i,peek(50889+i):next
63040 poke896,254:poke900,253:poke935,19:poke949,96
63050 poke252,x/256:poke251,x-256*peek(252)
63060 poke254,y/256:poke253,y-256*peek(254)
63070 sys828:return
Listing 1. Programm zur Simulation von LISTX-Y. Ansprung per GOSUB63000. Einlesezeit 2,6 Sekunden. Jeder weitere Ansprung per GOSUB63050 mit »sofortiger« Abarbeitung.
63100 rem ausdrucken der zeilen 100*a bis 100*a+4
63105 rem
63110 gosub63000:printchr$(147);
63120 x=0
63130 getx$:ifx$=""then63130
63140 ifx$=chr$(13)then63200
63150 ifx$<>chr$(17)then63120
63160 y=x+4:gosub63050:printchr$(145);
63170 x=x+100:ifx>63999thenx=0:goto63130
63180 i=peek(781)+256*peek(780):ifi<y+1ori>x+4thenx=int(i/100)*100
63190 goto63130
63200 return
Listing 2. Programm zum Ausdrucken aller Zeilen mit den Nummern 100*a bis 100*a+4, wobei a von 0 bis 633 geht. Nicht vorhandene Zeilen werden ohne Verzögerung übersprungen. Der Ausdruck läuft, solange die Cursor-Down-Taste gedrückt ist, auch über 63304 hinaus (Wiederanfang bei 0).
10 rem list-demo
20 rem =========
30 rem
40 rem
50 rem
60 rem
70 print"list-demo"
80 print
90 input"von";x:input"bis";y
100 print
110 gosub63000:rem list x-y
120 print:print"** ok ** (taste)"
130 geta$:ifa$=""then130
140 print:print
150 goto70
160 rem
170 rem
180 rem
Listing 3. LIST-Demo zum Testen der Routine nach Listing 1.
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →