100 REM  Version 1.9 February 05/86 Ian Cottrell
110 CLEAR
120 VER$="1.9":DATE$="February 05/86"
130 CLS$=CHR$(24):PRINT CLS$;:    REM  Clear Screen Code
140 E$=CHR$(27):REM  Escape Character
150 DIM PRNAME$(8)
160 PRINT TAB(29) "=== C R O S S R E F ==="
170 PRINT
180 PRINT TAB(19) "COPYRIGHT (C) 1980 BY ADVANCED INFORMATICS"
190 PRINT TAB(17) "LISTS ALL VARIABLES AND REFERENCE LINE NUMBERS"
200 PRINT
210 PRINT TAB((71-LEN(VER$)-LEN(DATE$))/2);"Version ";VER$;" ";DATE$
220 PRINT TAB(39) "by"
230 PRINT TAB(24) "Klaus Bartels and Ian Cottrell":PRINT
240 GOSUB 2450
250 ON P GOSUB 2140,2180,2220,2260,2300,2340,2380,2420
260 LPRINT RP$;:REM  RESET PRINTER IF POSSIBLE
270 DEFINT I-J:LW=132
280 ON ERROR GOTO 1950
290 DIM RW$(150),PT%(25),F$(10)
300 DIM VNXT%(490),V$(490),FRST%(400),LST%(400),RFL%(2000),NXT%(2000)
310 '
320 '  RESERVED WORDS
330 '
340 DATA ABS,ALL,AND,ASC,AS,ATN,AUTO,BASE
350 DATA CALL,CDBL,CHAIN,CHR$,CINT,CLEAR,CLOSE,COMMON,CONSOLE,CONT
360 DATA COS,CSAVE,CSNG,CVD,CVI,CVS
370 DATA DATA,DEFDBL,DEFINT,DEFSNG,DEFSTR,DEFUSR,DEF
380 DATA DELETE,DIM,DSKI$,DSKO$,DSKF
390 DATA EDIT,ELSE,END,EOF,EQV,ERASE,ERL,ERROR,ERR,EXP
400 DATA FIELD#,FIELD,FILES,FIX,FN,FOR,FRE
410 DATA GET,GOSUB,GOTO,HEX$
420 DATA IF,IMP,INKEY$,INPUT#,INPUT$,INPUT,INP,INSTR,INT,KILL
430 DATA LEFT$,LEN,LET,LINE,LIST,LLIST,LOAD,LOC,LOF,LOG,LPOS,LPRINT,LSET
440 DATA MERGE,MID$,MKD$,MKI$,MKS$,MOD,MOUNT
450 DATA NAME,NEW,NEXT,NOT,NULL,OCT$,ON,OPEN,OPTION,OR,OUT
460 DATA PEEK,POKE,POS,PRINT#,PRINT,PUT
470 DATA RANDOMIZE,READ,REM,REMOVE,RENUM,RESET,RESTORE,RESUME
480 DATA RETURN,RIGHT$,RND,RSET,RUN
490 DATA SAVE,SGN,SIN,SPACE$,SPC,SQR,STEP,STOP,STR$,STRING$,SWAP,SYSTEM
500 DATA TAB,TAN,THEN,TO,TROFF,TRON,UNLOAD,USING,USR
510 DATA VAL,VARPTR,WAIT,WEND,WHILE,WIDTH,WRITE#,WRITE,XOR,"\"
520 '
530 ' FILL ARRAY WITH RESERVED WORDS
540 '
550 RESTORE 340
560 RW=0
570 READ RW$
580 RW=RW+1:RW$(RW)=RW$:IF RW$="\" THEN 620
590 I=ASC(RW$)-ASC("A"):IF PT%(I)=0 THEN PT%(I)=RW
600 GOTO 570
610 '
620 FOR I=0 TO 25:IF PT%(I)=0 THEN PT%(I)=RW
630 NEXT
640 '
650 '  GET LIST OF FILE NAMES
660 '
670 FX=0:PRINT CLS$
680 PRINT:PRINT "ASCII SAVE PROGRAM #" FX+1 " = ";:LINE INPUT L$
690 IF L$="" THEN IF FX<1 THEN 910 ELSE 750
700 IF INSTR(L$,".")=0 THEN L$=L$+".BAS"
710 NAME L$ AS L$
720 FX=FX+1:F$(FX)=L$
730 GOTO 680
740 '
750 PRINT:INPUT "DATE = ",D$
760 PRINT:INPUT "1)  CROSS REFERENCE    2)  LIST    3)  BOTH ";M
770 '
780 ' PROCESS LIST OF FILE NAMES
790 '
800 PRINT CLS$
810 FOR IDENT=1 TO FX
820  PRINT TAB(18);"XREF FILE ";F$(IDENT)
830 NEXT IDENT
840 PRINT
850 FOR F=1 TO FX
860 CLOSE:OPEN "I",1,F$(F):PRG$="'"+F$(F)+"' - "+D$
870 PRINT "CROSS-REF RUN LIST OF : ";PRG$
880 GOSUB 950
890 NEXT
900 LPRINT FF$
910 END
920 '
930 '  INITIALIZE FOR CROSS REFERENCE
940 '
950 LC=0:BC=0:PZ=0:V$="":C$="":VC=91:RC=-1:PZ=0
960 FOR I=0 TO 91:VNXT%(I)=-1:NEXT
970 IF M>1 THEN GOSUB 1990
980 '
990 '  INPUT LINE AND EXTRACT LINE NUMBER
1000 '
1010 IF EOF(1) THEN 1660
1020 LINE INPUT#1,L$:IF M>1 THEN GOSUB 1890:IF M=2 THEN 1010
1030 LG=LEN(L$):BRNCH=0:ER$="":LC=LC+1:BC=BC+LG
1040 GOSUB 2070
1050 PRINT "LEN=";LG;TAB(10);LEFT$(L$,65);TAB(78);"<"
1060  IF LN<10 THEN LP=2:GOTO 1110
1070   IF LN<100 THEN LP=3:GOTO 1110
1080    IF LN<1000 THEN LP=4:GOTO 1110
1090     IF LN<10000 THEN LP=5:GOTO 1110
1100 LP=6
1110 IF LN>32767 THEN LN=LN-65536!
1120 '
1130 '  PARSE REST OF LINE
1140 '
1150 LP=LP+1:IF LP>LG THEN GOSUB 1470:GOTO 1010
1160 C$=MID$(L$,LP,1)
1170 IF C$=CHR$(10) THEN LZ=LZ+1
1180 IF C$>="A" AND C$<="Z" THEN 1300 ELSE IF C$>="0" AND C$<="9" THEN 1610
1190 IF C$=" " THEN 1200 ELSE IF C$<>"," THEN BRNCH=0
1200 IF C$=CHR$(34) THEN GOSUB 1470:LP=INSTR(LP+1,L$,C$):IF LP>0 THEN 1150

     ELSE 1010
1210 IF C$="'" THEN GOSUB 1470:GOTO 1010
1220 IF C$="&" THEN GOSUB 1470:V$=C$:GOTO 1150
1230 IF C$="$" OR C$="!" OR C$="%" OR C$="#" THEN GOSUB 1590:GOTO 1150
1240 IF C$="(" THEN GOSUB 1590
1250 GOSUB 1470:IF C$<>"," THEN ER$=""
1260 GOTO 1150
1270 '
1280 '  TEST FOR COMMAND
1290 '
1300 C=ASC(C$):P=PT%(C-ASC("A")):BRNCH=0
1310 IF C<ASC(RW$(P)) THEN 1620
1320 IF INSTR(LP,L$,RW$(P))<>LP THEN P=P+1:GOTO 1310
1330 N$=MID$(L$,LP+LEN(RW$(P)),1)
1340 N=VAL(N$)
1350 IF N>47 AND N<58 AND N>64 AND N<90 AND N>94 THEN P=P+1:GOTO 1310
1360 T$=MID$(L$,LP-1,1)
1370 IF (T$>="A" AND T$<="Z") OR (T$>="0" AND T$<="9") OR T$="." THEN 1620
1380 GOSUB 1470:RW$=RW$(P)
1390 IF RW$="DATA" THEN LP=INSTR(LP,L$,":"):IF LP>0 THEN 1150 ELSE 1010
1400 IF RW$="REM" THEN 1010
1410 IF RW$="GOTO" OR RW$="GOSUB" OR RW$="THEN" OR RW$="ELSE" OR RW$="RESUME"

      THEN BRNCH=1
1420 IF RW$="ERASE" THEN ER$="(" ELSE ER$=""
1430 LP=LP+LEN(RW$)-1:GOTO 1150
1440 '
1450 '  END VARIABLE
1460 '
1470 IF V$=""THEN RETURN
1480 IF V$>="A" THEN V$=V$+ER$:C=ASC(V$)+1 ELSE IF V$>="0" THEN 

     V$=RIGHT$("    "+V$,5):C=VAL(LEFT$(V$,2)) ELSE 1550
1490 IL=-1:I=C
1500 IF V$>V$(I) THEN IL=I:I=VNXT%(I):IF I>0 THEN 1500 ELSE 1520
1510 IF V$=V$(I) THEN J=LST%(I-91):IF RFL%(J)=LN THEN 1550 ELSE RC=RC+1:

     NXT%(J)=RC:GOTO 1540
1520 VC=VC+1:IF IL>=0 THEN VNXT%(IL)=VC
1530 V$(VC)=V$:VNXT%(VC)=I:RC=RC+1:FRST%(VC-91)=RC:I=VC
1540 RFL%(RC)=LN:NXT%(RC)=-1:LST%(I-91)=RC
1550 V$="":RETURN
1560 '
1570 '  EXPAND VARIABLE
1580 '
1590 IF V$<>"" THEN V$=V$+C$
1600 RETURN
1610 IF V$="" AND BRNCH=0 THEN 1150
1620 V$=V$+C$:GOTO 1150
1630 '
1640 '  LIST VARIABLES
1650 '
1660 IF M=2 THEN RETURN
1670 GOSUB 1860
1680 FOR J=0 TO 91:V=J
1690 V=VNXT%(V):IF V<0 THEN 1800
1700 IF LZ>56 THEN GOSUB 1860 ELSE SZ=SZ+1:IF SZ=3 THEN GOSUB 1870
1710 RZ=0:I=FRST%(V-91):LPRINT TAB(10) V$(V);
1720 IF RZ=0 THEN LPRINT TAB(26);
1730 LN=RFL%(I):IF LN<0 THEN LN=LN+65536!
1740 LPRINT USING "    #####";LN,
1750 RZ=RZ+1
1760 IF RZ>10 THEN RZ=0:LPRINT:LZ=LZ+1:IF LZ>56 THEN GOSUB 1870
1770 I=NXT%(I):IF I>0 THEN 1720
1780 IF RZ>0 THEN LPRINT:LZ=LZ+1
1790 GOTO 1690
1800 NEXT J
1810 '
1820 LPRINT TAB(10) STRING$(122,"=")
1830 LPRINT TAB(10) "LINES: " LC "     BYTES: " BC "    SYMBOLS: "

     VC-91 "    REFERENCES: " RC+1
1840 LZ=LZ+2:RETURN
1850 '
1860 GOSUB 1990:LPRINT TAB(10) "SYMBOL" TAB(30) "REFERENCE LINE":LZ=LZ+1
1870 LPRINT TAB(10) STRING$(122,"-"):LZ=LZ+1:SZ=0:RETURN
1880 '
1890 X=1
1900 IF LZ>60 THEN GOSUB 1990
1910 IF RIGHT$(L$,3)="'PG" THEN GOSUB 1990
1920 Y=INSTR(X,L$,CHR$(10)):IF Y>0 THEN LPRINT TAB(10) MID$(L$,X,Y-X):

     LZ=LZ+1:IF ASC(MID$(L$,Y+1,1))=13 THEN X=Y+2 ELSE X=Y+1:GOTO 1920
1930 LPRINT TAB(10) MID$(L$,X,LW):LZ=LZ+1:X=X+LW:

     IF X<LEN(L$) THEN 1930 ELSE RETURN
1940 '
1950 IF ERR=53 THEN PRINT:PRINT "FILE NOT FOUND":RESUME 680
1960 IF ERR=58 THEN RESUME 720
1970 ON ERROR GOTO 0
1980 '
1990 LPRINT FF$;
2000 PZ=PZ+1
2010 LS=(58-LEN(PRG$)-6)
2020 LPRINT CMP$;
2030 LPRINT TAB(10);EXO$;PRG$;SPC(LS);
2040 LPRINT " Page ";PZ
2050 LPRINT EXF$:LPRINT
2060 LZ=4:RETURN
2070 NUM=0
2080 FOR II=1 TO LG
2090 IF MID$(L$,II,1)=" " THEN II=LG ELSE NUM=NUM+1
2100 NEXT II
2110 LN=VAL(LEFT$(L$,NUM))
2120 RETURN
2130 REM  QANTEX 7030 PRINTER
2140 EXO$=CHR$(14):EXF$=CHR$(15)
2150 CMP$=E$+"[4w":RP$=E$+"c":FF$=CHR$(12)
2160 RETURN
2170 REM  C. ITOH PROWRITER PRINTERS
2180 EXO$=CHR$(14):EXF$=CHR$(15)
2190 CMP$=E$+"Q":RP$="":FF$=CHR$(12)
2200 RETURN
2210 REM  EPSON MX-80/100 PRINTERS
2220 EXO$=CHR$(14):EXF$=CHR$(20)
2230 CMP$=CHR$(15):RP$="":FF$=CHR$(12)
2240 RETURN
2250 REM  STAR MICRONICS GEMINI PRINTER
2260 EXO$=E$+CHR$(14):EXF$=CHR$(20)
2270 CMP$=E$+"B"+CHR$(3):RP$="":FF$=CHR$(12)
2280 RETURN
2290 REM  GENICOM 3400 PRINTER
2300 EXO$=E$+CHR$(14):EXF$=CHR$(20)
2310 CMP$=E$+"[;43 G":RP$="":FF$=CHR$(12)
2320 RETURN
2330 REM  CITIZEN MSP-10/15/20/25 PRINTERS
2340 EXO$=CHR$(14):EXF$=CHR$(20)
2350 CMP$=CHR$(15):RP$=E$+"@":FF$=CHR$(12)
2360 RETURN
2370 REM  PANASONIC KX-P1090 PRINTER
2380 EXO$=CHR$(14):EXF$=CHR$(20)
2390 CMP$=CHR$(15):RP$=E$+"@":FF$=CHR$(12)
2400 RETURN
2410 REM  FACIT 4510 PRINTER
2420 EXO$=CHR$(30):EXF$=CHR$(31)
2430 CMP$=E$+"7":RP$=E$+"0":FF$=CHR$(12)
2440 RETURN
2450 REM  Read names of available printers
2460 RESTORE 2500
2470 FOR M=1 TO 8
2480	READ PRNAME$(M)
2490 NEXT M
2500 DATA "Qantex 7030","C. Itoh Prowriter","Epson MX/FX-80/100"
2510 DATA "Star Micronics Gemini","GE Genicom 3400","Citizen MSP-10/15/20/25"
2520 DATA "Panasonic KX-P1090","Facit 4510"
2530 REM  Ask for desired printer
2540 PRINT
2550 PRINT "> This program presently supports the following printers:":PRINT
2560 FOR I=1 TO 8 STEP 2
2570	PRINT "       " CHR$(I+48) ")  " PRNAME$(I) TAB(41)

        CHR$(I+1+48) ")  " PRNAME$(I+1)
2580 NEXT I
2590 PRINT:PRINT "> Please select the printer you wish to use .... ";
2600 R$=INKEY$:IF R$="" THEN 2600 ELSE PRINT R$
2610 P=VAL(R$)
2620 IF P<1 OR P>8 THEN 2590
2630 RETURN
