60000 DEFINT a-z
60010 '*** CROSSREF ***
60020 '(c) G.Cebulla **
60030 '*** Jan.1988 ***
60040 DIM varname$(0),sprungziel(0),znr(0),sort(0)
60050 DIM kenn$(2),typ$(2)
60060 kenn$(0)="%":kenn$(1)="$":kenn$(2)="!"
60070 typ$(0)="Integer":typ$(1)="String":typ$(2)="Real"
60080 MODE 2:INK 0,0:INK 1,26:BORDER 5:ZONE 7
60090 WINDOW 1,80,2,22
60100 WINDOW #1,1,80,1,1
60110 WINDOW #2,1,80,23,25
60120 PAPER 1:PEN 0:CLS
60130 PAPER#1,0:PEN#1,1
60140 PAPER#2,0:PEN#2,1
60150 '
60160 'Hauptmenue
60170 '
60180 WHILE xref<>3
60190 CLS #2
60200 PRINT#2,TAB(31) CHR$(7) "H A U P T M E N U E"
60210 PRINT#2,"[1] Referenzliste Variablen" SPC(8) "[2] Referenzliste Sprungziele" SPC(8) "[3] Ende";
60220 PRINT#2,TAB(34) "Ihre Wahl: [" CHR$(143) "]";
60230 a$=""
60240 WHILE a$<"1" OR a$>"3"
60250 a$=INKEY$
60260 WEND
60270 xref=VAL(a$)
60280 IF xref<>3 THEN GOSUB 60390
60290 WEND
60300 MODE 2
60310 PAPER 0:PEN 1:CLEAR
60320 END
60330 '
60340 'Unterprogramme
60350 '
60360 '
60370 'Steuerprogramm fuer Referenzliste
60380 '
60390 CLS#2:CLS#1:CLS
60400 PRINT#2,CHR$(7) "Ausgabe auf [D]rucker oder [B]ildschirm?"
60410 WHILE a$<>"D" AND a$<>"B"
60420 a$=UPPER$(INKEY$)
60430 WEND
60440 IF a$="B" THEN aus=0 ELSE aus=8
60450 CLS#2
60460 abbruch=0
60470 IF erstezeile!<>0 THEN GOSUB 60650 ELSE GOSUB 60740
60480 IF a$<>"N" OR xref<>durchsucht THEN GOSUB 61030
60490 IF abbruch THEN RETURN
60500 WINDOW SWAP 0,1
60510 IF aus=8 THEN WHILE INP(&F500) AND 64:PRINT#2,CHR$(7) "Drucker einschalten!":WEND:PRINT#8,CHR$(27) "M" CHR$(27) "3" CHR$(30);
60520 CLS#2
60530 PRINT#aus,TAB(19-2*xref) "C R O S S - R E F E R E N Z   ";
60540 IF xref=1 THEN PRINT#aus,"V A R I A B L E N" ELSE PRINT#aus,"S P R U N G Z I E L E"
60550 WINDOW SWAP 0,1
60560 PRINT#2,CHR$(7) "Abbruch mit [ENTER]"
60570 zeile=0
60580 CLS
60590 ON xref GOSUB 62250,62420
60600 IF aus=8 THEN PRINT#aus:PRINT#aus
60610 RETURN
60620 '
60630 'Zeilennummernbereich aendern?
60640 '
60650 PRINT#2,CHR$(7) "Wollen Sie den Zeilennummernbereich aendern?  [J/N]"
60660 WHILE a$<>"J" AND a$<>"N"
60670 a$=UPPER$(INKEY$)
60680 WEND
60690 IF a$="J" THEN GOSUB 60740
60700 RETURN
60710 '
60720 'Zeilennummernbereich bestimmen
60730 '
60740 PRINT#2,CHR$(7) "Bitte geben Sie den Zeilennummernbereich ein:"
60750 INPUT#2," Erste Zeile: ",erstezeile!
60760 IF erstezeile!=0 THEN erstezeile!=1
60770 IF erstezeile!<0 OR erstezeile!>65535 THEN PRINT#2,"Unzulaessige Eingabe!":GOTO 60740
60780 INPUT#2,"Letzte Zeile: ",letztezeile!
60790 IF letztezeile!=0 THEN letztezeile!=59999 - 5536*(erstezeile!>=60000)
60800 IF letztezeile!<erstezeile! OR letztezeile!<0 OR letztezeile!>65535 THEN PRINT#2,"Unzulaessige Eingabe!":GOTO 60740
60810 CLS#2
60820 zanf!=368:znr!=0
60830 zlaenge=-1
60840 WHILE znr!<erstezeile! AND zlaenge<>0
60850 GOSUB 61440
60860 zanf!=zanf!+zlaenge
60870 WEND
60880 IF zlaenge=0 THEN PRINT#2,"Der angegebene Bereich existiert nicht!":GOTO 60740
60890 start!=zanf!-zlaenge
60900 zanzahl=0
60910 WHILE znr!<=letztezeile! AND zlaenge<>0
60920 GOSUB 61440
60930 zanf!=zanf!+zlaenge
60940 zanzahl=zanzahl+1
60950 WEND
60960 IF zanzahl=0 THEN PRINT#2,"Der angegebene Bereich existiert nicht!":GOTO 60740
60970 ende!=zanf!-zlaenge
60980 PRINT#2,"Der Bereich von" erstezeile! "bis" letztezeile! "enthaelt" zanzahl "Programmzeilen und" ende!-start! "Bytes
60990 RETURN
61000 '
61010 'Programmbereich durchsuchen
61020 '
61030 durchsucht=0
61040 ERASE varname$,sprungziel,znr,sort
61050 amax=MIN(200,INT(FRE(0)/60)):zmax=20
61060 IF xref=1 THEN DIM varname$(amax),sprungziel(0) ELSE DIM varname$(0),sprungziel(amax)
61070 DIM znr(amax,zmax),sort(amax)
61080 FOR i=1 TO amax
61090 sort(i)=i
61100 NEXT
61110 PRINT#2,CHR$(7) "Programmbereich wird durchsucht..."
61120 PRINT#2,"Abbruch mit [ENTER]"
61130 zanf!=start!
61140 anzahl=-1
61150 WHILE zanf!<ende! AND abbruch=0
61160 GOSUB 61440
61170 PRINT"["+MID$(STR$(znr!),2)+"]";
61180 adr!=zanf!+4
61190 naechstezeile!=zanf!+zlaenge
61200 WHILE adr!<naechstezeile!
61210 byte=PEEK(adr!)
61220 IF byte>=2 AND byte<=&D THEN ON xref GOSUB 61660,61500
61230 IF byte=&19 OR byte=&FF THEN adr!=adr!+1
61240 IF byte>=&1A AND byte<=&1C THEN adr!=adr!+2
61250 IF byte=&1D OR byte=&1E THEN IF xref=1 THEN adr!=adr!+2 ELSE GOSUB 61880
61260 IF byte=&1F THEN adr!=adr!+5
61270 IF byte=&22 THEN GOSUB 61580
61280 IF byte=&8C OR byte=&C0 OR byte=&C5 THEN adr!=naechstezeile!-1
61290 IF byte=&7C THEN GOSUB 61510
61300 adr!=adr!+1
61310 WEND
61320 zanf!=naechstezeile!
61330 IF INKEY$=CHR$(13) THEN abbruch=1
61340 WEND
61350 IF abbruch THEN RETURN
61360 durchsucht=xref
61370 CLS#2
61380 PRINT#2,CHR$(7) "Daten werden sortiert..."
61390 ON xref GOSUB 62070,62160
61400 RETURN
61410 '
61420 'Zeilennummer & -laenge auslesen
61430 '
61440 zlaenge=PEEK(zanf!) + 256*PEEK(zanf!+1)
61450 znr!=PEEK(zanf!+2) + 256*PEEK(zanf!+3)
61460 RETURN
61470 '
61480 'Variable ueberlesen
61490 '
61500 adr!=adr!+3
61510 WHILE PEEK(adr!)<128
61520 adr!=adr!+1
61530 WEND
61540 RETURN
61550 '
61560 'String ueberlesen
61570 '
61580 adr!=adr!+1
61590 WHILE PEEK(adr!)<>0 AND PEEK(adr!)<>&22
61600 adr!=adr!+1
61610 WEND
61620 RETURN
61630 '
61640 'Variablennamen eintragen
61650 '
61660 IF byte<=4 THEN typ=byte-2 ELSE typ=byte-7
61670 adr!=adr!+3
61680 name$=""
61690 WHILE byte<&80
61700 byte=PEEK(adr!)
61710 name$=name$+CHR$(byte AND &7F)
61720 adr!=adr!+1
61730 WEND
61740 name$=LOWER$(name$)
61750 WHILE PEEK(adr!)=&20
61760 adr!=adr!+1
61770 WEND
61780 byte=PEEK(adr!)
61790 IF byte=&28 OR byte=&5B THEN typ=typ OR 8
61800 name$=name$+CHR$(typ)
61810 FOR i=0 TO anzahl
61820 IF name$<>varname$(i) THEN NEXT i
61830 IF i>anzahl THEN IF anzahl<amax THEN anzahl=i:varname$(i)=name$:znr(i,0)=1:znr(i,1)=znr!-32768 ELSE ERROR 9 ELSE GOSUB 61970
61840 RETURN
61850 '
61860 'Sprungziel eintragen
61870 '
61880 IF byte=&1D THEN zadr!=PEEK(adr!+1)+256*PEEK(adr!+2):sprungziel=PEEK(zadr!+3)+256*PEEK(zadr!+4)-32768 ELSE sprungziel=PEEK(adr!+1)+256*PEEK(adr!+2)-32768
61890 adr!=adr!+2
61900 FOR i=0 TO anzahl
61910 IF sprungziel<>sprungziel(i) THEN NEXT
61920 IF i>anzahl THEN IF anzahl<amax THEN anzahl=i:sprungziel(i)=sprungziel:znr(i,0)=1:znr(i,1)=znr!-32768 ELSE ERROR 9 ELSE GOSUB 61970
61930 RETURN
61940 '
61950 'Zeilennummer eintragen
61960 '
61970 n=znr(i,0)
61980 WHILE n<0
61990 i=ABS(n)
62000 n=znr(i,0)
62010 WEND
62020 IF znr(i,n)<>znr!-32768 THEN IF n<zmax THEN znr(i,0)=znr(i,0)+1:znr(i,znr[i,0])=znr!-32768 ELSE IF amax>anzahl THEN znr(i,0)=-amax:znr(amax,0)=1:znr(amax,1)=znr!-32768:amax=amax-1 ELSE ERROR 9
62030 RETURN
62040 '
62050 'Variablennamen sortieren
62060 '
62070 FOR i=0 TO anzahl-1
62080 FOR j=anzahl TO i+1 STEP -1
62090 IF varname$(sort[j-1])>varname$(sort[j]) THEN zw=sort(j-1):sort(j-1)=sort(j):sort(j)=zw
62100 NEXT j
62110 NEXT i
62120 RETURN
62130 '
62140 'Sprungziele sortieren
62150 '
62160 FOR i=0 TO anzahl-1
62170 FOR j=anzahl TO i+1 STEP -1
62180 IF sprungziel(sort[j-1])>sprungziel(sort[j]) THEN zw=sort(j-1):sort(j-1)=sort(j):sort(j)=zw
62190 NEXT j
62200 NEXT i
62210 RETURN
62220 '
62230 'Variablen ausgeben
62240 '
62250 FOR i=0 TO anzahl
62260 typ=ASC(RIGHT$(varname$[sort(i)],1))
62270 PRINT#aus,LEFT$(varname$[sort(i)],LEN(varname$[sort(i)])-1);
62280 IF (typ AND 4)=0 THEN PRINT#aus,kenn$(typ AND 3);
62290 PRINT#aus,,typ$(typ AND 3);
62300 IF typ AND 8 THEN PRINT#aus,"-Array";
62310 IF typ AND 4 THEN PRINT#aus," ohne "; ELSE PRINT#aus," mit ";
62320 PRINT#aus,"Typkennzeichen"
62330 zeile=zeile+1
62340 PRINT#aus,TAB(7)
62350 GOSUB 62510
62360 IF INKEY$=CHR$(13) THEN RETURN
62370 NEXT i
62380 RETURN
62390 '
62400 'Sprungziele ausgeben
62410 '
62420 FOR i=0 TO anzahl
62430 PRINT#aus,USING"#####:";sprungziel(sort[i])+32768;
62440 GOSUB 62510
62450 IF INKEY$=CHR$(13) THEN RETURN
62460 NEXT i
62470 RETURN
62480 '
62490 'Zeilennummern ausgeben
62500 '
62510 index=sort(i):m=-1
62520 WHILE m<0
62530 m=znr(index,0)
62540 IF m>0 THEN n=m ELSE n=zmax
62550 FOR j=1 TO n
62560 IF POS(#aus)=79 THEN GOSUB 62670:PRINT#aus,TAB(7)
62570 PRINT#aus,USING" #####";znr(index,j)+32768;
62580 NEXT j
62590 IF m<0 THEN index=ABS(m)
62600 WEND
62610 PRINT#aus
62620 GOSUB 62670
62630 RETURN
62640 '
62650 'Bildschirmausgabe anhalten
62660 '
62670 zeile=zeile+1
62680 IF zeile>=19 AND aus=0  THEN PRINT TAB(56) "[weiter mit Tastendruck]";:WHILE INKEY$="":WEND:PRINT CHR$(17) CHR$(13);:zeile=0
62690 RETURN