Cross-Ref optimiert

Viele Verbesserungsvorschläge sind uns seit Erscheinen der Ausgabe 6/85 zu dem Dokumentationsprogramm »Cross-Ref« zugeschickt worden. Die besten sind hier zusammengestellt. Jetzt ist es zum Beispiel auch möglich, Simons Basic-Programme bearbeiten zu lassen.

Der Ärger mit dem GOTO

Zunächst muß im Programm (siehe Listing 1) darauf geachtet werden, daß Zeichen innerhalb von Anführungsstrichen grundsätzlich überlesen werden. Das gilt insbesondere in DATA- beziehungsweise REM-Zeilen. Das Flag »Y2« wird jeweils beim ersten Anführungszeichen gesetzt und beim nächsten Auftreten, spätestens am Zeilenende (X=0), gelöscht (Zeilen 342 und 345 sowie 762, 764 und 820, 825). Zeilensprünge nach »THEN« (Token 167) mit nachfolgendem »GOSUB« etc. werden in der alten Programmversion nicht gefunden. Die zusätzliche Zeile 495 testet bei vorausgegangenem »NEXT« (Flag »Y1« wurde dann in Zeile 358 gesetzt) die nachfolgenden Sprungbefehle »GOTO«, »RUN«, »GOSUB« und »GOTO« (Token 203 und 164), wobei das Flag für »GO« in Zeile 355 gesetzt wurde; der Test auf nachfolgendes »TO« erfolgt in Zeile 360.

Da beim Erstellen eines neuen Strings in der Version aus 64’er, Ausgabe 6/85, kein Test auf ein bereits vorhandenes gleiches Sprungziel erfolgt (dies geschieht nur innerhalb eines Strings in Zeile 460), bringen die neuen Zeilen 450, 455 und 458 Abhilfe; Entsprechendes gilt bei den Variablen für die Zeilen 920, 925 und 928.

Ein ganz wichtiger Punkt ist die Tatsache, daß »E« (ASCII-Code=69) nach Ziffern oder nach einem Punkt keine Variable ist. Dieses wird in Zeile 855 in Verbindung mit Zeile 90 (X2=ASCII-Code des vorausgehenden Zeichens) untersucht. Längere Variablennamen, die im Commodore-Basic vorkommen können, werden in der Programmversion falsch interpretiert. Durch die neue Zeile 952 werden maximal zwei Zeichen und/oder »$,%H,(« (Zeilen 870 beziehungsweise 880) zugelassen. Da das nachfolgende Zeichen bereits in Zeile 870 gelesen werden mußte, sorgt das Flag »Y3« dafür, daß in Zeile 750 dieses Zeichen nicht übersprungen wird (letzteres gilt auch für die Zeile 965 beim Auftreten eines Anführungszeichens).

Damit die Zeilensprünge in der richtigen Reihenfolge ausgegeben werden, sollten die Sortier-Routine (Zeilen 520 bis 540) und die Ausgabezeilen 650 und 660 entsprechend der Variablen-Ausgabe (siehe Zeilen 990 und 1 140) geändert werden.

Einige der angesprochenen Punkte werden durch das beiliegende Testprogramm (Listing 2) deutlich. Nach Eingabe der zusätzlichen beziehungsweise geänderten Zeilen dürfte einer guten Programmdokumentation nichts mehr im Wege stehen.

(Gerhard Löber/tr)

Simons Basic dokumentieren

Zuerst einmal ein dickes Lob an Stefan Becker, den Autor der Dokumentationshilfe in der 64’er, Ausgabe 6/85, für sein hervorragendes Programm. Aber auch hier gilt: Kein Programm, das nicht noch besser werden könnte.

Als erstes fiel mir auf, daß eine Dokumentation von Simons-Basic-Programmen nicht möglich war. Hier die vorläufige Lösung: Folgende Zeilen müssen eingefügt werden: 495 if x=100 then 330 805 if x=34 then y=2 806 if x=100 then y=3 835 if y=3 and (x=49 or x=50 or x=51) then y=0 836 if y=3 goto 750

Folgende Zeilen müssen geändert werden: 770 if x=34 or x=100 or x=131 or x=143 then z=0: goto 800 820 if x=34 and y=2 goto 750 920 …:va$(i)=v1$+" :"

Des weiteren empfand ich es als einigermaßen lästig, bei vielen Variablen ständig die Frage »Wollen Sie Bemerkungen eingeben?« beantworten zu müssen. Nach folgenden Änderungen kann man die Variablen beliebig durchsuchen und mit Text versehen, um danach durch Eingabe von »E« wie Ende zur Ausgabe zu gelangen. Außerdem kann man nun bei Variablen, die sich über mehrere Druckzeilen erstrecken, seine Bemerkungen auf alle zugehörigen Zeilen verteilen. Folgende Zeilen sind einzufügen: 1105 if a$ =”e” goto 1180 1135 print ”{home}{9down}”le$

Folgende Zeilen müssen geändert werden: 1080 …a$<>chr$(13) and a$<>”e” goto 1080 1020 open 1,0 1160 …: goto 1070

Die folgenden Zeilen sind zu löschen: 1140 1150 1170

Bei der Ausgabe ohne Zeilennummer genügt es im allgemeinen, wenn eine Variable, auch wenn sie sich über mehrere Zeilen erstreckt, nur einmal ausgegeben wird. Die folgende Lösung berücksichtigt dabei die Bemerkungen, die sich über mehrere Zeilen erstrecken. Es sind folgende Zeilen zu ändern: 1272 …:goto 1275 1273 if left$(va$(i+1),4)=left$(va$(i),4) then 1275 1274 print#1,left$(va$(i), 8) 1275 next i

Die Abfrage »Nochmal/Weiter« läßt sich bei einer Ausgabe auf den Drucker durch Einfügen folgender Zeilen vermeiden: 685 if dv=4 then 712 1245 if dv=4 then 1269

Meine letzte Anmerkung betrifft die leidige Garbage-Collection (siehe hierzu auch den Kurs »Effektives Programmieren«, 64’er, Ausgabe 1/85), die der Computer durchführt, wenn sein Stringspeicher voll ist, und er weiteren Platz braucht. Bei meinen längeren Programmen lag der Computer spätestens bei der Eingabe von Bemerkungen für längere Zeit stumm und schweigend vor mir. Folgende Änderungen können hier Verbesserung schaffen:

  1. Die Variable OB in Zeile 150 verkleinern. Sie gibt die Größe der Stringfelder an. Die Dauer der Garbage-Collection hängt aber in etwa vom Quadrat der Variablenzahl ab. Ich halte eine Angabe von QB=200 im Normalfall für völlig ausreichend. Ansonsten erscheint während des Programmlaufs eine entsprechende Fehlermeldung.
  2. Das Ersetzen der speicherplatzverschwendenden Sortierprozedur durch die SWAP-Routine aus der 64’er, Ausgabe 1/85, Seite 123. Hierzu
    1. Zeile 550 ersetzen durch: 550 sys 6000(ps$(i), ps$(j))
    2. Zeile 1000 ersetzen durch: 1000 sys 6000(va$(i),va$(j))
    3. Eingabe im Direktmodus: print (peek(45)+256*peek(46)) Den erhaltenen Wert aufschreiben!
    4. In den Zeilen 550 und 1000 den Wert 6000 durch den aufgeschriebenen Wert ersetzen.
    5. Das Programm mit SAVE”XREF1.0”,8 abspeichern.
    6. Den Basic-Lader der SWAP-Routine laden und starten.
    7. Auf die Frage nach der Startadresse den aufgeschriebenen Wert eingeben.
    8. Das Dokumentationsprogramm mit LOAD”XREF1.0”,8 laden.
    9. Im Direktmodus eingeben (für »W« dabei den aufgeschriebenen Wert einsetzen): POKE 45,(W+50)AND255:POKE 46,(W+50)/256 POKE174,(W+50)AND255:POKE175,(W+50)/256

Das Programm kann nun mit SAVE”XREF2.0”,8 abgespeichert werden.

Achtung! Es dürfen keine Veränderungen mehr vorgenommen werden, die die Länge des Programms beeinflussen, da das Maschinenprogramm direkt hinter dem Basic-Programm steht! Das Zwischenprodukt "XREF1.0” kann jetzt gelöscht werden.

(Lutz Kleinostendarp/tr)

Anpassung von Cross-Ref auf Datasette:

Bedingt durch ein anderes Speicherformat auf Datasette gegenüber der Floppy ist Cross-Ref mit den in 64’er, Ausgabe 6/86 genannten Änderungen für Kassettenbetrieb trotzdem nicht lauffähig. Auch die Abfrage der Status-Variablen ist nicht korrekt.

Um Cross-Ref trotzdem auch für unsere Datasettenbesitzer zugänglich zu machen, ist folgendes zu beachten:

Das zu bearbeitende Programm muß in einem »Pseudo-Floppy-Format« gespeichert werden. Dazu das Programm laden und mit folgenden Befehlen im Direktmodus (also ohne Zeilennummern) neu aufs Band schreiben. OPEN 1,1,1,”name” [RETURN] PRINT#1,CHR$(PEEK(43));CHR$(PEEK(44) [RETURN] FORI = PEEK(43) + 256*PEEK(44)TOPEEK(45) + 256*PEEK(46):PRINT#1,CHR$(PEEK(I));:NEXT [RETURN] CLOSE1 [RETURN]

Das File hat zwar jetzt das richtige Format, aber die Statusabfrage in Zeile 90 ergibt immer noch falsche Werte. Auf Diskette zeigt ein ST=64 nämlich das Ende eines Files an, auf Kassette dagegen bedeutet ST=64, daß ein CHR$(0) folgt! Die folgenden Änderungen berücksichtigen dies: 90 GET#1,A$ : X=ASC(A$+N$) : IF X <>0 THEN XX=0 : RETURN 95 XX=XX+1 : IF XX<3 THEN RETURN 290 OPEN 1,1,0,NA$ : GOSUB 120 : IF X=2049 THEN 310 730 OPEN 1,1,0,NA$ : GOSUB 120

Die Zeilen 1290 bis 1310 entfallen.

(Stefan Becker/tr)

Anmerkung der Redaktion:

Auf der Leserservice-Diskette dieser Ausgabe befindet sich »Cross-Ref« in der verbesserten Version von Gerhard Löber und die Simons Basic-Version von Lutz Kleinostendarp. Auch ist die Löber-Version zusätzlich compiliert worden. Diese Version können wir allen Lesern wegen der gewaltigen Geschwindigkeitsvorteile nur empfehlen.

10 rem*********************************
20 rem* programmname : xref           *
30 rem*     c-64                      *
40 rem*     floppy 1541 o. aehnliche  *
50 rem*     drucker (z.b. mps 801)    *
60 rem* von stefan becker             *
70 rem*********************************
80 clr:goto150
90 get#1,a$:x=asc(a$+n$):if(64andst)=0thenreturn
100 close1:ifpathenpa=0:goto520
110 goto960
120 gosub90:x1=x:gosub90:x=x1+256*x:return
130 ifsp<obandva<obandps<obthenreturn:rem*** grenzen erreicht ? ***
140 print:print"Bitte die Variable ob in Zeile 150 vergroessern.":goto1310
150 ob=500:dimsp$(ob),ps$(ob),va$(ob)
160 rem*** ob ist obergrenze der anzahl der spruenge und variablen ***
170 poke53280,6:poke53281,6
180 n$=chr$(0)
190 le$="                                                  "
200 printchr$(147)chr$(9)chr$(14)chr$(8)chr$(144);
210 print"{rvon}          Cross-Referenz-Lister         "
220 print"{down}{down}Ausgabe auf ":print"{down}{rvon}B{rvof}ildschirm oder {rvon}D{rvof}rucker{up}{up}{up}"
230 printspc(12);:poke204,0
240 geta$:ifa$<>"b"anda$<>"d"goto240
250 ifa$="b"thenprint"Bildschirm.":dv=3:goto270
260 print"Drucker.":dv=4
270 print"{down}                       {up}"
280 open1,0:print"Programmname: ";:input#1,na$:close1:print
290 open2,8,15:open1,8,2,na$+",p,r":gosub1290:gosub120:ifx=2049then310
300 print:print"Das Programm muss ab 2049 liegen.":goto1310
302 :
304 :
305 rem********************************
306 rem     pass 1 sprungtabelle
308 rem********************************
309 :
310 print"{clr}Pass 1 (Suchen der Spruenge){down}":pa=1
320 gosub120:gosub120:ze$=right$("     "+str$(x),5):print"{home}{down}{down}"ze$
330 gosub90:ifx=137orx=138orx=141orx=167thens1$="":goto360
340 ifx=0goto320
350 goto330
360 gosub90:ifx=32goto360
370 ifx>=48andx<=57thens1$=s1$+a$:goto360
380 ifs1$=""goto470
390 s1$=right$("      "+s1$,6)
400 ifleft$(sp$(sp),5)<>ze$thensp=sp+1:gosub130:sp$(sp)=ze$+":"
410 iflen(sp$(sp))>70thensp=sp+1:gosub130:sp$(sp)=ze$+":"
420 ifright$(sp$(sp),6)<>s1$thensp$(sp)=sp$(sp)+s1$
430 fori=1tops
440 ifleft$(ps$(i),6)<>s1$thennext:ps=i:gosub130:ps$(i)=s1$+":"
450 iflen(ps$(i))>70thennext:ps=ps+1:i=ps:gosub130:ps$(i)=s1$+":"
460 ifright$(ps$(i),5)<>ze$thenps$(i)=ps$(i)+" "+ze$
470 ifx=0goto320
480 ifx=44thens1$="":goto360
490 ifx=58orx>=127or(x>=65andx<=90)goto330
500 print:print"{down}Fehler im Quellprogramm. Zeile:"ze$:goto1310
502 :
504 :
506 rem -------------------------------
510 rem*** sortieren der sprungziele (feld ps$( ***
515 rem -------------------------------
516 :
520 fori=1tops
530 forj=itops
540 ifleft$(ps$(i),5)<left$(ps$(j),5)goto560
550 ps$(0)=ps$(i):ps$(i)=ps$(j):ps$(j)=ps$(0)
560 nextj
570 nexti
574 :
575 rem--------------------------------
576 rem   ausgabe spruenge + sprungziele
577 rem--------------------------------
578 :
580 open1,dv,7:print#1,"Programmname: "na$:print#1
590 print#1,"sprungtabelle           "
600 print#1,"--------------------------"
605 print#1,"zeile :   sprung auf zeile      ":print#1
610 fori=1tosp
620 ifleft$(sp$(i-1),5)=left$(sp$(i),5)thenprint#1,spc(7)mid$(sp$(i),7):goto640
630 print#1," "sp$(i)
640 nexti:print#1
645 print#1,"zeile :   wird angesprungen von":print#1
650 ps$(0)="":fori=2tops
660 ifleft$(ps$(i-1),6)<>left$(ps$(i),6)thenprint#1,ps$(i):goto680
670 print#1,spc(6);mid$(ps$(i),7)
680 nexti:close1
690 print"{down}{rvon}N{rvof}ochmals/{rvon}W{rvof}eiter"
700 geta$:ifa$<>"n"anda$<>"w"goto700
710 ifa$="n"goto580
712 :
714 :
715 rem********************************
716 rem     pass 2 variable suchen
718 rem********************************
719 :
720 print"{clr}Pass 2 (Suchen der Variablen){down}"
730 open1,8,2,na$+",p,r":gosub1290:gosub120
740 gosub120:gosub120:ze$=right$("     "+str$(x),5):print"{home}{down}{down}"ze$:y=0
750 gosub90
760 ifx=0goto740
770 ifx=34orx=131orx=143goto800
780 ifx>64andx<91goto850
790 goto750
800 ifx=131theny=1
810 gosub90:ifx=0goto740
820 ifx=34goto750
830 ifx=58andy=1goto750
840 goto810
850 v1$=a$
860 gosub90
870 ifx=36orx=37or(x>47andx<58)or(x>64andx<91)thenv1$=v1$+a$:goto860
880 ifx=40thenv1$=v1$+a$
890 v1$=left$(v1$+"    ",4)
900 fori=1tova
910 ifleft$(va$(i),4)<>v1$thennext:va=i:gosub130:va$(i)=v1$+"  :"
920 iflen(va$(i))>50thennext:va=va+1:i=va:gosub130:va$(i)=va$+"  :"
930 ifright$(va$(i),5)<>ze$thenva$(i)=va$(i)+" "+ze$
940 ifx=0goto740
950 goto750
952 :
954 :
956 rem -------------------------------
960 rem *** sortieren der variablen (feld va$( ***
965 rem -------------------------------
968 :
970 fori=1tova
980 forj=itova
990 ifleft$(va$(i),4)>left$(va$(j),4)goto1010
1000 va$(0)=va$(i):va$(i)=va$(j):va$(j)=va$(0)
1010 nextj
1020 nexti:va=va-1:i=va
1025 :
1030 print"{clr}Wollen Sie zu den Variablen":print"Bemerkungen eingeben?  ";
1040 geta$:ifa$="n"goto1180
1050 ifa$<>"j"goto1040
1060 print"Ja{down}{down}{down}"
1070 print"{home}{down}{down}{down}{down}{down}{down}Variablenname: ";left$(va$(i),4)
1073 printle$
1075 iflen(va$(i))>70thenprint"{up}{up}"right$(va$(i),25)
1080 geta$:ifa$<>"{up}"anda$<>"{down}"anda$<>chr$(13)goto1080
1090 ifa$="{up}"theni=i+1:ifi>vatheni=va
1100 ifa$="{down}"theni=i-1:ifi<1theni=1
1110 ifa$<>chr$(13)goto1070
1120 vr$=left$(va$(i),4):open1,0
1130 print"Text:";:input#1,te$:print:close1:te$=left$(te$,25)
1140 fori=vato1step-1
1150 ifleft$(va$(i),4)<>vr$thennext:print"Nicht vorhanden.":goto1070
1160 va$(i)=left$(va$(i)+le$,55)+right$(le$+te$,25):goto1030
1170 vr$=left$(vr$,4)
1174 ;
1175 rem-------------------------------
1176 rem     ausgabe variable
1177 rem-------------------------------
1180 print:open1,dv,7
1190 print#1,"{down}{down}liste der variablen     :"
1200 print#1,"-------------------------"
1210 fori=vato1step-1
1220 ifleft$(va$(i+1),4)<>left$(va$(i),4)thenprint#1,va$(i):goto1240
1230 print#1,spc(6);mid$(va$(i),7)
1240 nexti
1250 print"{down}{rvon}n{rvof}ochmals/{rvon}w{rvof}eiter"
1260 geta$:ifa$<>"n"anda$<>"w"goto1260
1263 ifa$="n"goto1190
1266 print"Variablenliste ohne Zeilennummer (j/n)"
1267 getr$:ifr$=""then1267
1268 ifr$<>"j"thenprint:print"ende":goto1310
1269 print#1:print#1:print#1,"Variablenliste ohne Zeilennummer"
1270 print#1,"-------------------------------"
1271 fori=vato1step-1
1272 iflen(va$(i))>70thenprint#1,left$(va$(i),8);right$(va$(i),25):goto1274
1273 print#1,left$(va$(i),8)
1274 nexti
1280 goto1310
1290 input#2,a$,b$:ifa$="00"thenreturn
1300 print:print"Disk-Error: ";b$
1310 close1:close2:end
90 x2=x:get#1,a$:x=asc(a$+chr$(0)):if(64andst)=0thenreturn

325 y=0:y2=0
330 gosub90

342 ifx=34theny2=noty2
345 ify2then330
348 ifx=137orx=138orx=141orx=167orx=203thens1$="":y1=0:y2=0:goto355

355 ifx=203theny=1
358 ifx=167theny1=1
360 gosub90:ifx=32orx=164andythen360

450 iflen(ps$(i))<70then460
455 ifright$(ps$(i),5)=ze$then470
458 next:ps=ps+1:i=ps:gosub130:ps$(i)=s1$+":"+ze$:goto470

490 ifx=58orx>64andx<91then330
495 ify1thenifx=137orx=138orx=141orx=203then355
498 ifx>127then330

520 fori=1tops-1
530 forj=i+1tops
540 ifleft$(ps$(i),5)>left$(ps$(j),5)goto560

650 ps$(0)="":fori=psto1step-1
660 ifleft$(ps$(i+1),6)<>left$(ps$(i),6)thenprint#1,ps$(i):goto680

745 y2=0:y3=0
750 y1=0:ify3=0thengosub90
760 y3=0:ifx=0then740
762 ifx=34theny2=noty2
764 ify2then750
770 ifx=131orx=143then800

820 ifx=34theny2=noty2
825 ify2then810

855 ifx=69thenifx2>47andx2<58orx2=46then750

865 ifx=34theny3=1:goto890
870 ifx=36orx=37thenv1$=v1$+a$:gosub90:y3=1:goto880
875 ifx>47andx<58orx>64andx<91then952

920 iflen(va$(i))<50then930
925 ifright$(va$(i),5)=ze$then940
928 next:va=va+1:i=va:gosub130:va$(i)=v1$+" :"+ze$:goto940

952 ify1=0thenv1$=v1$+a$:y1=1
954 goto860
Listing 1. Diese Zeilen müssen Sie neu eintippen. Verwenden Sie bitte dazu den neuen Checksummer (Seite 54)
10 rem*********************************
20 rem* programmname : xref           *
30 rem*     c-64                      *
40 rem*     floppy 1541 o. aehnliche  *
50 rem*     drucker (z.b. mps 801)    *
60 rem* von stefan becker             *
70 rem*********************************
80 clr:goto150
90 get#1,a$:x=asc(a$+n$):if(64andst)=0thenreturn
100 close1:ifpathenpa=0:goto520
110 goto960
120 gosub90:x1=x:gosub90:x=x1+256*x:return
130 ifsp<obandva<obandps<obthenreturn:rem*** grenzen erreicht ? ***
140 print:print"Bitte die Variable ob in Zeile 150 vergroessern.":goto1310
150 ob=500:dimsp$(ob),ps$(ob),va$(ob)
160 rem*** ob ist obergrenze der anzahl der spruenge und variablen ***
170 poke53280,6:poke53281,6
180 n$=chr$(0)
190 le$="                                                  "
200 printchr$(147)chr$(9)chr$(14)chr$(8)chr$(144);
210 print"{rvon}          Cross-Referenz-Lister         "
220 print"{down}{down}Ausgabe auf ":print"{down}{rvon}B{rvof}ildschirm oder {rvon}D{rvof}rucker{up}{up}{up}"
230 printspc(12);:poke204,0
240 geta$:ifa$<>"b"anda$<>"d"goto240
250 ifa$="b"thenprint"Bildschirm.":dv=3:goto270
260 print"Drucker.":dv=4
270 print"{down}                       {up}"
280 open1,0:print"Programmname: ";:input#1,na$:close1:print
290 open2,8,15:open1,8,2,na$+",p,r":gosub1290:gosub120:ifx=2049then310
300 print:print"Das Programm muss ab 2049 liegen.":goto1310
302 :
304 :
305 rem********************************
306 rem     pass 1 sprungtabelle
308 rem********************************
309 :
310 print"{clr}Pass 1 (Suchen der Spruenge){down}":pa=1
320 gosub120:gosub120:ze$=right$("     "+str$(x),5):print"{home}{down}{down}"ze$
330 gosub90:ifx=137orx=138orx=141orx=167thens1$="":goto360
340 ifx=0goto320
350 goto330
360 gosub90:ifx=32goto360
370 ifx>=48andx<=57thens1$=s1$+a$:goto360
380 ifs1$=""goto470
390 s1$=right$("      "+s1$,6)
400 ifleft$(sp$(sp),5)<>ze$thensp=sp+1:gosub130:sp$(sp)=ze$+":"
410 iflen(sp$(sp))>70thensp=sp+1:gosub130:sp$(sp)=ze$+":"
420 ifright$(sp$(sp),6)<>s1$thensp$(sp)=sp$(sp)+s1$
430 fori=1tops
440 ifleft$(ps$(i),6)<>s1$thennext:ps=i:gosub130:ps$(i)=s1$+":"
450 iflen(ps$(i))>70thennext:ps=ps+1:i=ps:gosub130:ps$(i)=s1$+":"
460 ifright$(ps$(i),5)<>ze$thenps$(i)=ps$(i)+" "+ze$
470 ifx=0goto320
480 ifx=44thens1$="":goto360
490 ifx=58orx>=127or(x>=65andx<=90)goto330
495 ifx=100then330
500 print:print"{down}Fehler im Quellprogramm. Zeile:"ze$:goto1310
502 :
504 :
506 rem -------------------------------
510 rem*** sortieren der sprungziele (feld ps$( ***
515 rem -------------------------------
516 :
520 fori=1tops
530 forj=itops
540 ifleft$(ps$(i),5)<left$(ps$(j),5)goto560
550 ps$(0)=ps$(i):ps$(i)=ps$(j):ps$(j)=ps$(0)
560 nextj
570 nexti
574 :
575 rem--------------------------------
576 rem   ausgabe spruenge + sprungziele
577 rem--------------------------------
578 :
580 open1,dv,7:print#1,"Programmname: "na$:print#1
590 print#1,"sprungtabelle           "
600 print#1,"--------------------------"
605 print#1,"zeile :   sprung auf zeile      ":print#1
610 fori=1tosp
620 ifleft$(sp$(i-1),5)=left$(sp$(i),5)thenprint#1,spc(7)mid$(sp$(i),7):goto640
630 print#1," "sp$(i)
640 nexti:print#1
645 print#1,"zeile :   wird angesprungen von":print#1
650 ps$(0)="":fori=2tops
660 ifleft$(ps$(i-1),6)<>left$(ps$(i),6)thenprint#1,ps$(i):goto680
670 print#1,spc(6);mid$(ps$(i),7)
680 nexti:close1
685 ifdv=4then712
690 print"{down}{rvon}N{rvof}ochmals/{rvon}W{rvof}eiter"
700 geta$:ifa$<>"n"anda$<>"w"goto700
710 ifa$="n"goto580
712 :
714 :
715 rem********************************
716 rem     pass 2 variable suchen
718 rem********************************
719 :
720 print"{clr}Pass 2 (Suchen der Variablen){down}"
730 open1,8,2,na$+",p,r":gosub1290:gosub120
740 gosub120:gosub120:ze$=right$("     "+str$(x),5):print"{home}{down}{down}"ze$:y=0
750 gosub90
760 ifx=0goto740
770 ifx=34orx=100orx=131orx=143goto800
780 ifx>64andx<91goto850
790 goto750
800 ifx=131theny=1
805 ifx=34theny=2
806 ifx=100theny=3
810 gosub90:ifx=0goto740
820 ifx=34andy=2goto750
830 ifx=58andy=1goto750
835 ify=3and(x=49orx=50orx=51)theny=0
836 ify=3goto750
840 goto810
850 v1$=a$
860 gosub90
870 ifx=36orx=37or(x>47andx<58)or(x>64andx<91)thenv1$=v1$+a$:goto860
880 ifx=40thenv1$=v1$+a$
890 v1$=left$(v1$+"    ",4)
900 fori=1tova
910 ifleft$(va$(i),4)<>v1$thennext:va=i:gosub130:va$(i)=v1$+"  :"
920 iflen(va$(i))>50thennext:va=va+1:i=va:gosub130:va$(i)=v1$+"  :"
930 ifright$(va$(i),5)<>ze$thenva$(i)=va$(i)+" "+ze$
940 ifx=0goto740
950 goto750
952 :
954 :
956 rem -------------------------------
960 rem *** sortieren der variablen (feld va$( ***
965 rem -------------------------------
968 :
970 fori=1tova
980 forj=itova
990 ifleft$(va$(i),4)>left$(va$(j),4)goto1010
1000 va$(0)=va$(i):va$(i)=va$(j):va$(j)=va$(0)
1010 nextj
1020 nexti:va=va-1:i=va
1025 :
1030 print"{clr}Wollen Sie zu den Variablen":print"Bemerkungen eingeben?  ";
1040 geta$:ifa$="n"goto1180
1050 ifa$<>"j"goto1040
1060 print"Ja{down}{down}{down}"
1070 print"{home}{down}{down}{down}{down}{down}{down}Variablenname: ";left$(va$(i),4)
1073 printle$
1075 iflen(va$(i))>70thenprint"{up}{up}"right$(va$(i),25)
1080 geta$:ifa$<>"{up}"anda$<>"{down}"anda$<>chr$(13)anda$<>"e"goto1080
1090 ifa$="{up}"theni=i+1:ifi>vatheni=va
1100 ifa$="{down}"theni=i-1:ifi<1theni=1
1105 ifa$="e"goto1180
1110 ifa$<>chr$(13)goto1070
1120 open1,0
1130 print"Text:";:input#1,te$:print:close1:te$=left$(te$,25)
1135 print"{clr}{down}{down}{down}{down}{down}{down}{down}{down}{down}"le$
1160 va$(i)=left$(va$(i)+le$,55)+right$(le$+te$,25):goto1070
1174 ;
1175 rem-------------------------------
1176 rem     ausgabe variable
1177 rem-------------------------------
1180 print:open1,dv,7
1190 print#1,"{down}{down}liste der variablen     :"
1200 print#1,"-------------------------"
1210 fori=vato1step-1
1220 ifleft$(va$(i+1),4)<>left$(va$(i),4)thenprint#1,va$(i):goto1240
1230 print#1,spc(6);mid$(va$(i),7)
1240 nexti
1245 ifdv=4then1269
1250 print"{down}{rvon}n{rvof}ochmals/{rvon}w{rvof}eiter"
1260 geta$:ifa$<>"n"anda$<>"w"goto1260
1263 ifa$="n"goto1190
1266 print"Variablenliste ohne Zeilennummer (j/n)"
1267 getr$:ifr$=""then1267
1268 ifr$<>"j"thenprint:print"ende":goto1310
1269 print#1:print#1:print#1,"Variablenliste ohne Zeilennummer"
1270 print#1,"-------------------------------"
1271 fori=vato1step-1
1272 iflen(va$(i))>70thenprint#1,left$(va$(i),8);right$(va$(i),25):goto1275
1273 ifleft$(va$(i+1),4)=left$(va$(i),4)then1275
1274 print#1,left$(va$(i),8)
1275 nexti
1280 goto1310
1290 input#2,a$,b$:ifa$="00"thenreturn
1300 print:print"Disk-Error: ";b$
1310 close1:close2:end
10 em testprogramm fuer "xref"
20 read text$,texte$,tex$(1),anzahl
30 ifan>1e3thengosub1000
40 printte$an
50 goto1000
60 print"*{CBM-M}1000{CBM-G}*":rem <cbm-m> 1000 <cbm-g>
70 data "abc,def","uvw:xyz",ttt,3
1000 printte$"test"
Listing 2. Dieses Beispielprogramm sollten Sie einmal vor und einmal nach den Änderungen von »Cross-Ref 64« bearbeiten lassen
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →