60000 CLS:CLEAR:S=1:E=59999!:DIM Z$(250),Z1$(250),Z2$(250),Z3$(250):D#=0:TA$=CHR$(9)+CHR$(9)+CHR$(9):REM Varilist  03.05.89 V8
60010 INPUT "Start line number or Auto (A)";P$
60020 IF P$="A"OR P$="a"THEN CLS:GOTO 60040
60030 S=VAL(P$):INPUT "End line number ";E:IF E<S THEN 60030:ELSE IF E=0 THEN E=59999!:CLS:GOTO 60040:ELSE CLS
60040 PRINT CHR$(15);:AD=&H8408:REM This for Extended Basic. Otherwise PEEK(&H2601)+256*PEEK(&H2602)
60050 AE=AD+1:IF AE>32767 THEN AE=AE-65536!
60060 AF=AD+2:IF AF>32767 THEN AF=AF-65536!
60070 AG=AD+3:IF AG>32767 THEN AG=AG-65536!
60080 NA=PEEK(AE)*256+PEEK(AD):IF NA>32767 THEN NA=NA-65536!
60090 LN=PEEK(AG)*256+PEEK(AF)
60100 PRINT@1840,LN;:IF LN<S THEN AD=NA:GOTO 60050
60110 IF AD=0 OR LN>E THEN 60520
60120 J=AD+4:IF J=>32767 THEN J=J-65536!
60130 P=PEEK(J):IF P=34 THEN GOSUB 60450:IF PEEK(J)=0 THEN AD=NA:GOTO 60050:REM If a string skip it
60140 IF P=132 THEN GOSUB 60420:GOTO 60130:REM Skip data
60150 IF P=143 OR P=220 THEN AD=NA:GOTO 60050:REM skip rems
60160 IF P=14 OR P=15 OR P=28 OR P=29 OR P=31 THEN GOSUB 60480:GOTO 60130:REM These precede packed numbers so skip
60170 IF P<65 OR P>90 OR P=32 THEN 60390:REM If a space skip it
60180 P$=""
60190 P$=P$+CHR$(P):J=J+1:IF J=32768! THEN J=-32768!
60200 P=PEEK(J):IF (P>64 AND P<91)OR (P>47 AND P<58)THEN 60190:REM Vars must be U/C or numbers
60210 IF (P=35 OR P=36 OR P=37 OR P=40) THEN P$=P$+CHR$(P):REM If followed by #,$,% or ( put it in.
60220 J=J+1:IF J=32768! THEN J=-32768!
60230 P=PEEK(J):IF P=40 THEN P$=P$+CHR$(P):GOTO 60250:REM If #,$ or % and ( after then add (
60240 J=J-1:IF J=-32769! THEN J=32767:REM If not ( then back one
60250 IF LEFT$(P$,2)="AS"THEN IF LEN(P$)>2 THEN P$=RIGHT$(P$,LEN(P$)-2) ELSE J=J+1:GOSUB 60500:GOTO 60130:REM Sort out Field strings
60260 T=0:FOR I=1 TO K:IF P$=Z$(I)THEN T=I:REM See if we have it already
60270 NEXT
60280 IF T=0 THEN 60370:ELSE M=LEN(Z1$(T))-1:REM Have it so inc.count by 1
60290 IF MID$(Z1$(T),M,1)<>" "THEN M=M-1:GOTO 60290
60300 J$=RIGHT$(Z1$(T),LEN(Z1$(T))-M):IF INSTR(J$,"/")=0 AND VAL(J$)=LN THEN Z1$(T)=Z1$(T)+"/2":GOTO 60330
60310 IF INSTR(J$,"/")<>0 AND VAL(J$)=LN THEN M=INSTR(J$,"/"):A=VAL(RIGHT$(J$,LEN(J$)-M)):A=A+1:Z1$(T)=LEFT$(Z1$(T),LEN(Z1$(T))-LEN(J$)+M)+RIGHT$(STR$(A),LEN(STR$(A))-1):GOTO 60330
60320 Z1$(T)=Z1$(T)+","+STR$(LN)
60330 IF LEN(Z1$(T))>245 THEN Z3$(T)=Z2$(T):Z2$(T)=Z1$(T):Z1$(T)="":ELSE 60370
60340 M=LEN(Z2$(T))-2
60350 IF MID$(Z2$(T),M,1)<>" "THEN M=M-1:GOTO 60350
60360 Z1$(T)=RIGHT$(Z2$(T),LEN(Z2$(T))-M):Z2$(T)=LEFT$(Z2$(T),M-1):Z1$(T)=" "+Z1$(T)
60370 IF T=0 THEN K=K+1:Z$(K)=P$:Z1$(K)=STR$(LN):REM Add new var.
60380 REM IF P=34 THEN GOSUB 60450:GOTO 60130
60390 IF PEEK(J)=0 THEN AD=NA:GOTO 60050
60400 J=J+1:IF J=32768! THEN J=-32768!
60410 GOTO 60130
60420 J=J+1:IF J=32768! THEN J=-32768!:REM Skip data
60430 IF PEEK(J)<>58 AND PEEK(J)<>0 THEN 60420:ELSE IF PEEK(J)=0 THEN RETURN :ELSE IF PEEK(J)=58 THEN J=J+1:IF J=32768! THEN J=-32768!:REM Skip colons
60440 P=PEEK(J):RETURN 
60450 J=J+1:IF J=32768! THEN J=-32768!:REM Skip strings
60460 P=PEEK(J):IF P<>34 AND P<>0 THEN 60450 ELSE IF P=0 THEN RETURN ELSE IF P=34 THEN J=J+1:IF J=32768! THEN J=-32768!
60470 P=PEEK(J):RETURN 
60480 IF P=14 THEN J=J+3:ELSE IF P=15 THEN J=J+2:ELSE IF P=28 THEN J=J+4:ELSE IF P=29 THEN J=J+5:ELSE IF P=31 THEN J=J+9:REM Skip numbers
60500 IF J>32767 THEN J=J-65536!
60510 P=PEEK(J):RETURN
60520 SYSTEM"SORT",K,Z$(1),Z1$,Z2$,Z3$
60690 IF INP(251)<>61 AND INP(251)<>63 THEN CLS:PRINT@1840,"SWITCH PRINTER ON":FOR M=1 TO 400:NEXT:CLS:FOR M=1 TO 400:NEXT:GOTO 60690
60700 CLS:LPRINT CHR$(7):PRINT:PRINT CHR$(14)"Is the printer ready";:INPUT A$:IF A$<>"Y"AND A$<>"y"THEN 60700
60710 LPRINT CHR$(15);:LC=1:LP=66:LINE INPUT "Title?  ";T$
60720 PRINT:PRINT "Do you want line numbers printed?  If so press ENTER.   If you only want the    variables then enter V";
60730 V$=INKEY$ :IF V$=""THEN 60730:ELSE V=ASC(V$):IF V<>13 AND V<>86 AND V<>118 THEN 60730
60740 PRINT CHR$(15):IF V<>13 THEN LPRINT CHR$(14)TAB(20)T$:LPRINT:LC=LC+2:FOR I=1 TO K:GOSUB 60990:LC=LC+1:LPRINT TAB(10)Z$(I):NEXT:GOTO 60960
60750 LPRINT CHR$(14);TAB(15)T$:LPRINT:LC=LC+2
60760 FOR I=1 TO K:GOSUB 60990:LPRINT TAB(10)Z$(I);
60770 IF Z2$(I)=""THEN Y=0:GOTO 60800
60780 IF Z3$(I)=""AND Z2$(I)<>""THEN Z$=Z2$(I):Z2$(I)=Z1$(I):Z1$(I)=Z$:Y=1:Z=1:GOTO 60800
60790 Z$=Z3$(I):Z3$(I)=Z2$(I):Z2$(I)=Z1$(I):Z1$(I)=Z$:Y=2:Z=2
60800 IF LEN(Z1$(I))<71 THEN GOSUB 60990:LC=LC+1:LPRINT TAB(45)Z1$(I):GOTO 60950
60810 J=60
60820 IF MID$(Z1$(I),J,1)<>" "THEN J=J+1:GOTO 60820
60830 A$=LEFT$(Z1$(I),J):GOSUB 60990:LPRINT TAB(45)A$:LC=LC+1
60840 B$=RIGHT$(Z1$(I),LEN(Z1$(I))-J+1):IF LEN(B$)<71 THEN GOSUB 60990:LPRINT TAB(45)B$:LC=LC+1:GOTO 60930
60850 J=60
60860 IF MID$(B$,J,1)<>" "THEN J=J+1:GOTO 60860
60870 C$=LEFT$(B$,J):GOSUB 60990:LPRINT TAB(45)C$:LC=LC+1
60880 D$=RIGHT$(B$,LEN(B$)-J+1):IF LEN(D$)<71 THEN GOSUB 60990:LPRINT TAB(45)D$:LC=LC+1:GOTO 60930
60890 J=60
60900 IF MID$(D$,J,1)<>" "THEN J=J+1:GOTO 60900
60910 E$=LEFT$(D$,J):GOSUB 60990:LPRINT TAB(45)E$:LC=LC+1
60920 F$=RIGHT$(D$,LEN(D$)-J+1):GOSUB 60990:LPRINT TAB(45)F$:LC=LC+1
60930 IF Y=1 AND Z=1 THEN Z$=Z1$(I):Z1$(I)=Z2$(I):Z2$(I)=Z$:Z=Z-1:J=60:GOTO 60800
60940 IF Y=2 AND Z>0 THEN Z$=Z3$(I):Z3$(I)=Z2$(I):Z2$(I)=Z1$(I):Z1$(I)=Z$:Z=Z-1:J=60:GOTO 60800
60950 GOSUB 60990:NEXT 
60960 LPRINT STRING$(LP-LC,10):PRINT:PRINT"Do you want another list? ";:
60970 Y$=INKEY$:IF Y$="" THEN 60970 ELSE IF Y$<>"Y" AND Y$<>"y" THEN PRINT CHR$(14);:END
60980 LC=1:GOTO 60720
60990 IF LC>60 THEN LPRINT STRING$(LP-LC,10):LC=3:LPRINT CHR$(14)TAB(20)T$:LPRINT
61000 RETURN
