12  REM        XREF:  BASIC LANGUAGE PROGRAM CROSS-REFERENCE GENERATOR
13  REM        36143  REV C --  2/73
100  DIM A$[72],B$[72],D$[10],E$[26],I$[72]
110  DIM P$[72],Q$[10]
120  DIM A[2940]
130  D$="0123456789"
140  E$="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
150  MAT A=ZER
160  P1=0
170  P2=2941
180  Q$="          "
900  PRINT "PROGRAM NAME";
910  INPUT P$
920  PRINT "DO YOU WANT A CROSS REFERENCE OF LINE NUMBERS";
925  INPUT A$
930  IF A$[1,1]="Y" THEN 960
935  IF A$[1,1]="N" THEN 950
940  PRINT "TYPE YES OR NO."
945  GOTO 920
950  Q8=2
955  GOTO 1004
960  PRINT "DO YOU WANT A DICTIONARY OF VARIABLES WITH LINE REFERENCES";
965  INPUT A$
970  IF A$[1,1]="Y" THEN 990
975  IF A$[1,1]="N" THEN 1000
980  PRINT "TYPE YES OR NO."
985  GOTO 960
990  Q8=3
995  GOTO 1004
1000  Q8=1
1004  PRINT "DO YOU WANT THE LISTING DOUBLE SPACED";
1006  INPUT A$
1008  IF A$[1,1]="Y" THEN 1016
1010  IF A$[1,1]="N" THEN 1018
1012  PRINT "TYPE YES OR NO."
1014  GOTO 1004
1016  Q5=1
1017  GOTO 1020
1018  Q5=2
1020  PRINT "PUT THE XPUNCHED TAPE IN THE READER AND SET IT TO AUTO."
1025  A=200
1030  ENTER A,B,A$
1031  A=10
1032  IF B#-256 THEN 1050
1033  PRINT 
1034  PRINT "IS THERE ANOTHER XPUNCHED TAPE FOR ";P$;
1036  INPUT A$
1038  IF A$[1,1]="Y" THEN 1020
1040  IF A$[1,1]="N" THEN 1046
1042  PRINT "TYPE YES OR NO."
1044  GOTO 1034
1046  GOSUB 7000
1048  STOP 
1050  FOR P=1 TO 5
1052  IF A$[P,P]=" " THEN 1070
1060  NEXT P
1070  I$=A$[1,P-1]
1080  GOSUB 6000
1090  N=I
1092  IF B >= 0 THEN 1100
1094  I=I+40000.
1096  GOSUB 4000
1098  GOTO 1030
1100  GOSUB 5000
1140  IF F#3 THEN 1240
1150  IF B$="GOTO" THEN 1280
1155  IF B$#"GOSUB" THEN 1160
1157  N=N+.5
1159  GOTO 1280
1160  IF B$="RESTORE" THEN 1280
1170  IF B$="IF" THEN 1480
1180  IF B$="DEF" THEN 1580
1190  IF B$="MAT" THEN 1680
1200  IF B$="PRINT" THEN 2600
1202  IF B$="RETURN" THEN 1030
1204  IF B$="STOP" THEN 1030
1206  IF B$="END" THEN 1030
1208  IF B$="DATA" THEN 1030
1210  IF B$="FILES" THEN 1030
1212  IF B$="REM" THEN 1030
1214  IF B$="IMAGE" THEN 1030
1220  GOSUB 5000
1230  IF F#2 THEN 1260
1240  GOSUB 8000
1250  GOSUB 4000
1260  IF F1=0 THEN 1220
1270  GOTO 1030
1280  I$=A$[P+1,LEN(A$)]
1285  IF LEN(I$)=0 THEN 1030
1290  GOSUB 6000
1300  IF K=1 THEN 1330
1310  GOSUB 4000
1320  GOTO 1030
1330  GOSUB 5000
1340  IF F#2 THEN 1380
1350  GOSUB 8000
1360  GOSUB 4000
1370  GOTO 1330
1380  IF B$#"OF" THEN 1330
1390  FOR I=P+1 TO LEN(A$)
1400  IF A$[I,I]="," THEN 1420
1410  NEXT I
1420  I$=A$[P+1,I-1]
1430  P=I
1440  GOSUB 6000
1450  GOSUB 4000
1460  IF P<LEN(A$) THEN 1390
1470  GOTO 1030
1480  GOSUB 5000
1490  IF F#2 THEN 1530
1500  GOSUB 8000
1510  GOSUB 4000
1520  GOTO 1480
1530  IF B$#"THEN" THEN 1480
1540  I$=A$[P+1,LEN(A$)]
1550  GOSUB 6000
1560  GOSUB 4000
1570  GOTO 1030
1580  GOSUB 5000
1590  IF F#2 THEN 1580
1600  I$=B$
1610  GOSUB 5000
1620  IF F#2 THEN 1660
1630  IF I$=B$ THEN 1660
1640  GOSUB 8000
1650  GOSUB 4000
1660  IF F1=0 THEN 1610
1670  GOTO 1030
1680  GOSUB 5000
1690  IF B$#"PRINT" THEN 1970
1700  IF A$[P+1,P+1]="#" THEN 1990
1710  GOSUB 5000
1720  IF B$#"USING" THEN 2060
1730  I$=A$[P+1,P+1]
1740  GOSUB 6000
1750  IF K=1 THEN 1860
1760  FOR J=P+2 TO LEN(A$)
1770  I$=A$[J,J]
1780  GOSUB 6000
1790  IF K=1 THEN 1810
1800  NEXT J
1810  I$=A$[P+1,J-1]
1820  P=J
1830  GOSUB 6000
1840  GOSUB 4000
1850  GOTO 1900
1860  GOSUB 5000
1870  IF F#2 THEN 1900
1880  GOSUB 8000
1890  GOSUB 4000
1900  IF P >= LEN(A$) THEN 1030
1910  GOSUB 5000
1920  B$[2]="["
1930  GOSUB 8000
1940  GOSUB 4000
1950  IF F1=0 THEN 1910
1960  GOTO 1030
1970  IF B$#"READ" THEN 2040
1980  IF A$[P+1,P+1]#"#" THEN 2050
1990  FOR Q=P-1 TO LEN(A$)
1995  IF A$[Q,Q]=";" THEN 2005
2000  NEXT Q
2005  GOSUB 5000
2010  IF P>Q THEN 2060
2015  IF F#2 THEN 2005
2020  GOSUB 8000
2022  GOSUB 4000
2024  GOTO 2005
2040  IF B$#"INPUT" THEN 2270
2050  GOSUB 5000
2060  B$[2]="["
2070  GOSUB 8000
2080  GOSUB 4000
2090  IF F1=1 THEN 1030
2100  IF A$[P,P]#"[" THEN 2050
2110  Q1=1
2120  FOR Q2=P+1 TO LEN(A$)
2130  IF A$[Q2,Q2]="[" THEN 2170
2140  IF A$[Q2,Q2]#"]" THEN 2190
2150  Q1=Q1-1
2160  GOTO 2180
2170  Q1=Q1+1
2180  IF Q1=0 THEN 2200
2190  NEXT Q2
2200  GOSUB 5000
2210  IF P>Q2 THEN 2060
2220  IF F#2 THEN 2250
2230  GOSUB 8000
2240  GOSUB 4000
2250  IF F1=0 THEN 2200
2260  GOTO 1030
2270  B$[2]="["
2275  GOSUB 8000
2280  GOSUB 4000
2290  GOSUB 5000
2300  IF B$="ZER" THEN 2330
2310  IF B$="CON" THEN 2330
2320  IF B$#"IDN" THEN 2390
2330  IF F1=1 THEN 1030
2340  GOSUB 5000
2350  IF F#2 THEN 2330
2360  GOSUB 8000
2370  GOSUB 4000
2380  GOTO 2330
2390  FOR I=1 TO LEN(A$)
2400  IF A$[I,I]="=" THEN 2420
2410  NEXT I
2420  IF A$[I+2,I+2]#"(" THEN 2520
2430  FOR Q2=LEN(A$) TO 1 STEP -1
2440  IF A$[Q2,Q2]=")" THEN 2460
2450  NEXT Q2
2460  IF P>Q2 THEN 2520
2470  IF F#2 THEN 2500
2480  GOSUB 8000
2490  GOSUB 4000
2500  GOSUB 5000
2510  GOTO 2460
2520  IF F#2 THEN 2560
2530  B$[2]="["
2540  GOSUB 8000
2550  GOSUB 4000
2560  IF F1=1 THEN 1030
2570  GOSUB 5000
2580  GOTO 2520
2600  GOSUB 5000
2610  IF B$#"USING" THEN 1230
2620  I$=A$[P+1,P+1]
2630  GOSUB 6000
2640  IF K=1 THEN 2750
2650  FOR J=P+2 TO LEN(A$)
2660  I$=A$[J,J]
2670  GOSUB 6000
2680  IF K=1 THEN 2700
2690  NEXT J
2700  I$=A$[P+1,J-1]
2710  P=J
2720  GOSUB 6000
2730  GOSUB 4000
2740  GOTO 2790
2750  GOSUB 5000
2760  IF F#2 THEN 2790
2770  GOSUB 8000
2780  GOSUB 4000
2790  IF P >= LEN(A$) THEN 1030
2800  GOSUB 5000
2805  IF F1#0 THEN 1030
2810  GOSUB 8000
2820  GOSUB 4000
2830  GOTO 2800
3000  I$=""
3010  I1=I/10
3020  I=INT(I1)
3030  I1=10*(I1-I)
3040  I$[1,1]=D$[I1+1,I1+1]
3050  I$[2]=I$
3060  IF I THEN 3010
3070  I$=I$[2]
3080  RETURN 
4000  IF P2-P1>10 THEN 4030
4005  PRINT 
4010  PRINT "PROGRAM TOO LARGE."
4012  PRINT "THE LISTING THUS FAR WILL BE PRODUCED."
4020  GOTO 1046
4030  GOTO Q8 OF 4032,4036,4039
4032  IF I<10000 THEN 4039
4034  RETURN 
4036  IF I >= 10000 THEN 4039
4038  RETURN 
4039  J=1
4040  IF J>P1 THEN 4100
4050  IF A[J]<I THEN 4130
4060  IF A[J]=I THEN 4150
4070  FOR K=P1+1 TO J STEP -1
4080  A[K+2]=A[K]
4090  NEXT K
4100  P1=P1+2
4110  A[J]=I
4120  GOTO 4200
4130  J=J+2
4140  GOTO 4040
4150  J=A[J+1]
4155  IF INT(A[J])#INT(N) THEN 4170
4160  RETURN 
4170  IF A[J+1]#0 THEN 4150
4200  P2=P2-2
4210  A[J+1]=P2
4220  A[P2]=N
4230  RETURN 
5000  F=1
5010  B$=""
5020  F1=0
5030  IF P#LEN(A$) THEN 5060
5040  F1=1
5050  RETURN 
5060  P=P+1
5070  C$=A$[P,P]
5080  IF C$<"A" THEN 5170
5090  IF C$>"Z" THEN 5170
5100  GOTO F OF 5110,5140,5140,5030
5110  IF C$#"E" THEN 5116
5112  IF A$[P-1,P-1]<"0" THEN 5116
5114  IF A$[P-1,P-1] <= "9" THEN 5030
5116  B$=C$
5120  F=2
5130  GOTO 5030
5140  B$[LEN(B$)+1]=C$
5150  F=3
5160  GOTO 5030
5170  IF C$<"0" THEN 5250
5180  IF C$>"9" THEN 5250
5190  GOTO F OF 5030,5200,5210,5030
5200  B$[LEN(B$)+1]=C$
5210  RETURN 
5250  IF C$#"$" THEN 5290
5260  IF F=4 THEN 5030
5270  B$[2]=C$
5275  F=2
5280  RETURN 
5290  IF C$#"[" THEN 5330
5300  IF F#2 THEN 5030
5310  B$[2]=C$
5320  RETURN 
5330  IF C$ <= "!" THEN 5390
5340  IF C$ >= "#" THEN 5390
5350  GOTO F OF 5360,5380,5380,5000
5360  F=4
5370  GOTO 5030
5380  RETURN 
5390  GOTO F OF 5000,5400,5400,5030
5400  RETURN 
6000  I=K=0
6010  FOR J1=1 TO LEN(I$)
6020  C$=I$[J1,J1]
6030  FOR J2=1 TO 10
6040  IF C$=D$[J2,J2] THEN 6060
6050  NEXT J2
6052  K=1
6054  RETURN 
6060  I=I*10+J2-1
6070  NEXT J1
6080  RETURN 
7000  GOSUB 8500
7010  GOSUB 8500
7015  J=1
7020  PRINT "PROGRAM NAME IS:   ";P$
7030  GOSUB 8500
7032  IF Q8=2 THEN 7180
7033  IF A[1]>9999 OR A[1]=0 THEN 7176
7035  GOSUB 8500
7040  PRINT "     CROSS REFERENCE OF LINE NUMBERS (S = GOSUB REFERENCE):"
7050  GOSUB 8500
7060  PRINT TAB(4);"LINE NO.    REFERENCED BY:"
7100  S$="S"
7120  I=A[J]
7130  GOSUB 3000
7140  PRINT TAB(10-LEN(I$));I$;
7150  GOSUB 9000
7160  J=J+2
7170  IF A[J] <= 9999 AND A[J]#0 THEN 7120
7175  IF Q8=1 THEN 7580
7176  IF A[J]>12610 OR A[J]=0 THEN 7335
7180  GOSUB 8500
7200  PRINT "     DICTIONARY OF SIMPLE VARIABLES WITH LINE REFERENCES:"
7205  S$=" "
7210  GOSUB 8500
7250  K=A[J]-10000
7260  I=INT(K/100)
7270  B$=E$[I,I]
7280  IF I*100=K THEN 7300
7285  I=K-I*100
7290  B$[2]=D$[I,I]
7300  PRINT TAB(7);B$;
7302  IF Q5=2 THEN 7310
7304  PRINT 
7310  GOSUB 9000
7320  J=J+2
7330  IF A[J] <= 12610 AND A[J]#0 THEN 7250
7335  IF A[J]>20026 OR A[J]=0 THEN 7455
7340  GOSUB 8500
7360  PRINT "     DICTIONARY OF DIMENSIONED VARIABLES WITH LINE REFERENCES:"
7370  GOSUB 8500
7410  I$=E$[A[J]-20000,A[J]-20000]
7420  PRINT TAB(7);I$;"[]";
7422  IF Q5=2 THEN 7430
7424  PRINT 
7430  GOSUB 9000
7440  J=J+2
7450  IF A[J] <= 20026 AND A[J]#0 THEN 7410
7455  IF A[J]>30026 OR A[J]=0 THEN 7580
7460  GOSUB 8500
7480  PRINT "     DICTIONARY OF STRING VARIABLES WITH LINE REFERENCES:"
7490  GOSUB 8500
7530  I$=E$[A[J]-30000,A[J]-30000]
7540  PRINT TAB(7);I$;"$";
7542  IF Q5=2 THEN 7550
7544  PRINT 
7550  GOSUB 9000
7560  J=J+2
7570  IF A[J] <= 30026 AND A[J]#0 THEN 7530
7580  GOSUB 8500
7590  IF A[J]=0 THEN 7670
7600  PRINT "     LIST OF LINES WITH MORE THAN 72 CHARACTERS"
7602  PRINT "     (AND HENCE UNPROCESSED):"
7610  GOSUB 8500
7620  I=A[J]-40000.
7630  GOSUB 3000
7640  PRINT TAB(10-LEN(I$));I$
7650  J=J+2
7660  IF A[J]#0 THEN 7620
7670  GOSUB 8500
7680  GOSUB 8500
7690  RETURN 
8000  C$=B$[1,1]
8005  IF C$<"A" THEN 8020
8010  IF C$ <= "Z" THEN 8060
8020  I$=B$
8030  GOSUB 6000
8040  RETURN 
8060  FOR J=1 TO 26
8080  IF C$=E$[J,J] THEN 8100
8090  NEXT J
8100  IF LEN(B$)>1 THEN 8130
8110  I=J*100+10000
8120  RETURN 
8130  C$=B$[2,2]
8140  IF C$="[" THEN 8200
8150  IF C$="$" THEN 8220
8160  I$=C$
8170  GOSUB 6000
8180  I=J*100+I+10001
8190  RETURN 
8200  I=J+20000
8210  RETURN 
8220  I=J+30000
8230  RETURN 
8500  PRINT 
8510  PRINT 
8520  RETURN 
9000  J3=J
9005  C=0
9010  J3=A[J3+1]
9020  I=A[J3]
9022  IF I=INT(I) THEN 9028
9024  R$=S$
9026  GOTO 9029
9028  R$=" "
9029  I=INT(I)
9030  GOSUB 3000
9032  IF C#10 THEN 9038
9034  C=0
9036  PRINT 
9038  C=C+1
9040  PRINT TAB(12);" ";Q$[2,5-LEN(I$)];R$;I$;
9050  IF A[J3+1]#0 THEN 9010
9060  PRINT 
9070  RETURN 
9999  END 
