100 DIM W5%(200),W6%(30),T5%(200),T6%(200,30) 105 T5%=200% 110 REM LISTS PROGRAMS IN PDP-11 BASIC 120 REM BY NIGEL BEVAN & GRAHAM CLEMOW , NPL TEDDINGTON 1980 130 REM 140 REM I2% COLUMN WIDTH 150 REM I3% NO OF COLUMNS 160 REM I4% PAGE WIDTH -SET TO 85 AT START OF PROGRAM 170 REM I5% 1 - COLUMNS BEFORE TEXT 0 - COLUMNS AFTER TEXT 180 REM I7% 0,1,2 FOR ORDINARY,BLANKED,INDENTED 190 REM ENTER * IN COMMAND FILE 200 I4%=85% 210 X%=TTYSET(255%,255%) 220 PRINT "COMMAND FILE ( =NONE )"; 230 LINPUT C$ 240 IF C$="" THEN 340 250 IF POS(C$,".",2%)=0% THEN C$=C$+".COM" 260 OPEN C$ FOR INPUT AS FILE 2 270 IF END #2% THEN 9120 \ LINPUT #2%:P$ 280 IF SEG$(P$,1%,1%)<>"*" THEN 360 290 I$=SEG$(P$,2%,2%) 300 I1$=SEG$(P$,3%,3%) 310 I3%=VAL(SEG$(P$,4%,255%)) 320 GOSUB 7000 330 GO TO 270 340 PRINT "PROGRAM ( ,FILENAME )"; 350 LINPUT P$ 360 C5%=0% 370 S4%=POS(P$,",",1%) 380 IF S4%=0% THEN 450 390 P6$=SEG$(P$,S4%+1%,255%) 400 IF POS(P6$,".",1%)<>0% THEN 420 410 P6$=P6$+".LST" 420 OPEN P6$ FOR OUTPUT AS FILE 3% 430 P$=SEG$(P$,1%,S4%-1%) 440 C5%=3% 450 IF C$<>"" THEN 540 460 PRINT "HIGHLIGHT OR CROSS-REFERENCE LINE NUMBERS ( =NO )"; 470 LINPUT I$ 480 IF I$<>"Y" THEN 530 490 PRINT "BLANK NON-REFERENCED LINE NUMBERS ( =NO )"; 500 LINPUT I1$ 510 PRINT "NUMBER OF CROSS-REFERENCE COLUMNS (-VE TO RIGHT , 0=NONE )"; 520 LINPUT I3$ \ I3%=VAL(I3$) 530 GOSUB 7000 540 IF POS(P$,".",2%)=0% THEN P$=P$+".BAS" 550 OPEN P$ AS FILE 1% 560 PRINT #C5%:CHR$(12%) 570 PRINT #C5%:P$" "DAT$ \ PRINT #C5%: 580 IF I7%=0% THEN 940 590 W7%=0% 600 W4%=0% 610 FOR I%=1% TO T5% 620 T5%(I%)=0% 630 NEXT I% 640 IF END #1% GO TO 930 \ LINPUT #1%:L$ 650 X%=0% 660 X$="GO" \ GOSUB 4000 670 W8%=0% 680 IF X%=0% THEN 800 690 IF SEG$(L$,X%+2%,X%+2%)="S" THEN W8%=1% 700 X%=X%+6% 710 W1$=SEG$(L$,X%,X%) 720 IF W1$=" " THEN 770 730 IF W1$="," THEN 770 740 W2$=W2$+W1$ 750 X%=X%+1% 760 GO TO 710 770 GOSUB 8000 780 IF W1$=',' THEN 750 790 GO TO 660 800 X%=0% 810 X$="THEN" \ GOSUB 4000 820 IF X%=0% THEN 640 830 X%=X%+5% 840 W1$=SEG$(L$,X%,X%) 850 IF W1$>"9" THEN 900 860 IF W1$<"0" THEN 900 870 W2$=W2$+W1$ 880 X%=X%+1% 890 GO TO 840 900 IF W2$="" THEN 810 910 GOSUB 8000 920 GO TO 810 930 RESTORE #1% 940 K%=0% 950 IF END #1% GO TO 9000 \ LINPUT #1%:L$ 960 N1%=N1%+LEN(L$)+2% \ L1%=L1%+1% 970 P%=POS(L$," ",2%) \ L%=VAL(SEG$(L$,1%,P%)) \ L$=SEG$(L$,P%+1%,255%) 980 GOSUB 5000 \ GO TO 950 4000 Q%=X%+1% 4010 X%=POS(L$,X$,Q%) \ IF X%=0% GO TO 4140 4020 Q1%=POS(L$,'"',Q%) \ Q2%=POS(L$,"'",Q%) \ Q3%=POS(L$,"REM",Q%) 4030 IF Q1%=0% THEN Q1%=255% 4040 IF Q2%=0% THEN Q2%=255% 4050 IF Q3%=0% THEN Q3%=255% 4060 IF Q1%>X% THEN IF Q2%>X% THEN IF Q3%>X% THEN 4140 4070 IF Q3%0% THEN I%=I%+1% \ GO TO 5040 5050 X%=0% \ X$="N FOR" 5060 GOSUB 4000 \ IF X%<>0% THEN I%=I%+1% \ GO TO 5060 5070 IF SEG$(L$,1%,4%)="NEXT" THEN K%=K%-1% \ I%=I%+1% 5080 X%=0% \ X$="NEXT" 5090 GOSUB 4000 \ IF X%<>0% THEN I%=I%-1% \ GO TO 5090 5100 FOR J%=1% TO K% \ L$=" "+L$ \ NEXT J% 5110 K%=K%+I% 5120 IF K%<0% THEN PRINT #C5%:"?? "; \ K%=0% 5130 R5%=0% 5140 IF I7%=0% THEN 5200 5150 FOR J%=1% TO W4% \ IF W5%(J%)=L% THEN R5%=J% \ GO TO 5170 5160 NEXT J% 5170 IF W8%=1% THEN W8%=0% \ GO TO 5200 5180 FOR J%=1% TO W7% \ IF W6%(J%)=L% THEN PRINT #C5%: \ PRINT #C5%: \ GO TO 5200 5190 NEXT J% 5200 L4$=STR$(L%)+" " 5210 L4%=LEN(L4$)-1% 5220 B9$=SEG$(" ",1%,L4%) 5230 IF I7%=2% THEN IF R5%<>0% THEN L4$=B9$+L4$ 5240 IF I7%=2% THEN IF R5%=0% THEN L4$=L4$+B9$ 5250 IF I7%=1% THEN IF R5%=0% THEN L4$=B9$+" " 5260 L$=L4$+L$ 5270 X%=POS(L$,CHR$(9%),1%) 5280 IF X%=0% THEN 5310 5290 L$=SEG$(L$,1%,X%-1%)+SEG$(" ",1%,8%-X%+X%/8%*8%)+SEG$(L$,X%+1%,255%) 5300 GO TO 5270 5310 X%=1% \ R6%=1% \ IF I3%=0% THEN R5%=0% 5320 S8%=2%*K%+L4%+6% \ REM INDENTATION LENGTH OF SECOND LINE 5330 IF I7%=2% THEN S8%=S8%+L4% 5340 P2%=I5%*(I2%*I3%+2%) \ REM START OF TEXT 5350 P3%=I4%-I2%*I3%-3% \ REM LENGTH OF TEXT 5360 P4%=(1%-I5%)*(I4%-I2%*I3%) \ REM START OF LINE NUMBER COLUMNS 5370 S6%=1%+(LEN(L$)-1%-S8%)/(P3%-S8%) \ REM LINES OF TEXT 5380 IF S6%<1% THEN S6%=1% 5390 S5%=0% \ REM LINES OF NUMBERS 5400 IF R5%<>0% THEN S5%=(T5%(R5%)-1%)/I3%+1% 5410 IF S5%=0% THEN IF S6%=0% THEN 5510 5420 IF I5%=1% THEN 5470 5430 GOSUB 6000 5440 IF I3%<>0% THEN PRINT #C5%:TAB(P4%-2%);"|"; 5450 GOSUB 6500 5460 PRINT #C5%: \ GO TO 5410 5470 GOSUB 6500 5480 PRINT #C5%:TAB(I2%*I3%);"|"; 5490 GOSUB 6000 5500 PRINT #C5%: \ GO TO 5410 5510 X%=0% \ X$="IF" \ GOSUB 4000 \ IF X%<>0% THEN RETURN 5520 X%=0% \ X$="RETURN" \ GOSUB 4000 \ IF X%=0% THEN RETURN 5530 PRINT #C5%: \ PRINT #C5%: \ W8%=1% 5540 RETURN 6000 IF S6%T5%(R5%) THEN 6560 6550 NEXT J% 6560 S5%=S5%-1% 6570 RETURN 7000 I7%=0% 7010 I5%=0% 7020 IF I$<>"Y" THEN RETURN 7030 I7%=2% 7040 IF I1$="Y" THEN I7%=1% 7050 IF I3%>0% THEN I5%=1% 7060 IF I3%<0% THEN I3%=-I3% 7070 RETURN 8000 W3%=VAL(W2$) \ W2$="" 8010 FOR I%=1% TO W4% 8020 IF W5%(I%)=W3% THEN W8%=0% \ GO TO 8060 8030 NEXT I% 8040 W4%=W4%+1% \ W5%(W4%)=W3% 8050 I%=W4% 8060 T5%(I%)=T5%(I%)+1% 8070 L1$=SEG$(L$,1%,POS(L$," ",2%)) 8080 T6%(I%,T5%(I%))=VAL(L1$) 8090 IF LEN(L1$)>I2% THEN I2%=LEN(L1$) 8100 IF T5%(I%)<>1% THEN IF T6%(I%,T5%(I%))=T6%(I%,T5%(I%)-1%) THEN T5%(I%)=T5%(I%)-1% 8110 IF W8%=0% THEN RETURN 8120 W7%=W7%+1% \ W6%(W7%)=W3% 8130 RETURN 9000 PRINT #C5%: 9010 PRINT #C5%: 9020 PRINT #C5%:L1%"LINES,"N1%"CHARACTERS" 9030 PRINT #C5%: 9040 N1%=0% \ L1%=0% 9050 IF C$="" THEN 9110 9060 PRINT #C5%: 9070 PRINT #C5%: 9080 IF C5%=3% THEN PRINT #3%:CHR$(12%) \ CLOSE #3% 9090 CLOSE #1% 9100 GO TO 270 9110 PRINT #C5%:CHR$(12%) 9120 CLOSE 10000 END