Back to Main page.
Back to Main tapes page.
10 COM A$[255],B$[255],A[80],B[32],C$[150]
20 REM: PIPU - Peripheral Interchange Program Utility
30 REM: By Steve Spear. All rights reserved.
40 DIM C[80],B1$[255],C1$[11],D$[255],I$[255],O$[255],O1$[255]
45 DIM E$[255],F$[255],G$[10]
50 FILES *,*,*,*,*,*,*
60 DEF FNB(X)=X+500* NOT X
70 IF LEN(C$) THEN 110
80 CHAIN A,"pip.b900"
90 PRINT "?PMM PIP monitor missing."
100 STOP
110 D=1
120 I=3
130 GOSUB 151
140 GOTO 80
150 REM: Switches
151 FOR A=6 TO 80
152 A[A]=0
153 NEXT A
160 ASSIGN C$[49,59],I,A
161 D$="/"
170 IF A[2] THEN 270
180 IF END #I THEN 270
190 READ #I;D$[2]
191 B=POS(D$,"::=")
192 IF NOT B THEN 190
193 O$=D$[B+3]
194 D$=D$[1,B-1]
195 D$[LEN(D$)+1]="/"
200 A=POS(A$,D$)
210 IF NOT A THEN 190
220 I$=B$[A+LEN(D$)]
230 B$[A+1]=O$
240 B$[LEN(B$)+1]=I$
250 A$=UPS$(B$)
260 GOTO 190
270 RESTORE 9790
280 I=O1=1
290 READ D$[2]
300 CONVERT A$[POS(A$,D$)+LEN(D$)] TO A[A],310
310 NEXT A
320 RESTORE 9800
330 D$="/"
335 A=9
340 IF TYP(0)#2 THEN 410
350 READ D$[2]
360 D$[LEN(D$)+1]="/"
370 A=A+1
380 IF NOT POS(A$,D$) OR ( NOT POS(A$,D$[1,LEN(D$)-1]) AND NUM(D$[3])=36) THEN 340
390 A[A]=1
400 GOTO 340
410 D$="/,;"
420 FOR A=1 TO 3
430 I$=D$[A,A]
440 FOR B=0 TO 9
450 CONVERT B TO I$[2]
460 C=POS(A$,I$)
470 IF NOT C THEN 490
480 CONVERT A$[C+1] TO A[6+A],500
490 NEXT B
500 NEXT A
505 O$=""
520 REM: /LCC List Concise Commands
530 IF NOT A[63] THEN 630
531 ASSIGN C$[49,59],I,A
532 IF NOT A THEN 630
533 PRINT '34C$[49,59]'34" Iis not available now."
534 GOTO 630
540 O$="NAME OPTIONS/FUNCTIONS"'13'10"----- ------- ---------"'13'10
550 GOSUB 9500
560 IF END #I THEN 630
570 READ #I;D$
580 A=POS(D$,"::=")
590 IF NOT A THEN 570
600 O$[1,14]=D$[1,A-1]
610 O$[15]=D$[A+3]
620 GOSUB 9500
630 RETURN
640 REM: /A Account
650 IF NOT A[50] THEN 700
660 O$="Account = "
670 O$[11]=C$[1,4]
680 O$[LEN(O$)+1]=" "
690 REM: /DA Current date
700 IF NOT A[59] THEN 750
720 O$[LEN(O$)+1]=C$[82,90]
730 O$[LEN(O$)+1]=" "
740 REM: /TI Time
750 IF NOT A[60] THEN 780
760 O$[LEN(O$)+1]="Time = "
770 O$[LEN(O$)+1]=C$[91,100]
780 GOSUB LEN(O$)>0 OF 9500
790 RETURN
800 REM: /IN Input file name
810 IF NOT A[48] THEN 855
820 O$="Output = "
830 O$[LEN(O$)+1]=C$[60,70]
840 O$[LEN(O$)+1]=" "
850 REM: /OUT Output file name
855 IF NOT A[49] THEN 900
860 O$[LEN(O$)+1]="Input = "
870 O$[LEN(O$)+1]=C$[71,81]
880 O$[LEN(O$)+1]=" "
890 REM: /R Return
900 IF NOT A[47] THEN 930
910 O$[LEN(O$)+1]="Return Variable = "
920 CONVERT I1 TO O$[LEN(O$)+1]
930 GOSUB LEN(O$)>0 OF 9500
940 RETURN
950 REM: Size of input
960 READ #I,1
961 B=0
970 IF END #I THEN 1120
980 FOR A=0 TO 32767
990 READ #I,A+1
1000 B=B+(TYP(I)#3)
1110 NEXT A
1120 RETURN
1130 REM: /BU Blocks Used /TB Total Blocks
1140 IF NOT A[51] THEN 1180
1150 O$="Blocks Used = "
1160 CONVERT B TO O$[LEN(O$)+1]
1170 O$[LEN(O$)+1]=" "
1180 IF NOT A[52] THEN 1210
1190 O$[LEN(O$)+1]="Total Blocks = "
1200 CONVERT A TO O$[LEN(O$)+1]
1210 GOSUB LEN(O$)>0 OF 9500
1220 RETURN
1230 REM: Lookup (start) d$ = Accout info I$ = Entry name
1240 ASSIGN C$[5,15],5,L, NR
1250 IF L THEN 1640
1251 F$="lib-"
1252 E$=""
1260 IF END #5 THEN 1640
1270 READ #5;D$
1272 F=F+1
1275 IF A[71] AND POS(D$[1,4],"A000") THEN 1270
1280 Z=POS(D$,".")
1290 FOR Y=1+500* NOT Z TO 4
1295 X=NUM(A$[Z+Y])
1300 GOTO X#NUM(D$[Y]) AND X#63 MAX (X<48)*2 OF 1270,1320
1310 NEXT Y
1320 D$[5]=C$[11,15]
1330 ASSIGN D$,6,U, NR
1340 IF U>2 THEN 1270
1350 IF END #6 THEN 1270
1360 READ #6;D$
1370 REM: Lookup (normal entry)
1380 IF NOT POS(D$,"A000") OR A[66] THEN 1430
1390 F$[5,10]=E$
1400 SYSTEM E$,F$
1410 IF LEN(E$)<24 THEN 1270
1420 GOTO 1440
1430 READ #6;E$
1440 A=POS(A$,":")
1450 FOR X=1+500* NOT A TO 2+A
1460 Y=NUM(A$[A+X])
1470 Z=NUM(E$[7+X])
1480 GOTO ((Y=Z OR Y=63)*2 MAX (Y<48))+1 OF 1390,1500
1490 NEXT Y
1500 FOR X=1 TO 6
1510 Y=NUM(A$[X])
1520 GOTO ((Y=NUM(G$[X]) OR Y=63)*2 MAX (Y<48))+I OF 1380,1540
1530 NEXT X
1540 IF A[2] AND POS(D$[1,2],C$[1,2]) THEN 1620
1550 G$=" * ***"
1560 G$[1,2]=E$[8,9]
1570 G$[4,4]=E$[9,9]
1580 G$[5,5]=E$[8,8]
1590 FOR X=1 TO 4
1600 IF POS(D$[86],G$[X*2-1,X*2]) THEN 1380
1610 NEXT X
1620 E=0
1630 RETURN
1640 E=1
1650 RETURN
1660 REM: Output < or =
1670 X=POS(A$,"<")
1680 Y=POS(A$,"=")
1690 C$[60,70]="TT:"
1700 IF NOT X AND NOT Y THEN 1856
1710 E$=A$[1,FNB(X) MIN FNB(Y)]
1720 Z=POS(E$,"DF:")
1730 E$=E$[3*(Z>0)+Z* NOT Z]
1740 IF POS("TT:KB:",E$[1,3]) THEN 1856
1750 GOSUB 1890
1760 IF NOT E THEN 1855
1770 Z=POS(E$,";")
1780 IF Z THEN 1810
1790 ASSIGN E$,O,O1, NR
1800 GOTO 1820
1810 ASSIGN E$[1,Z-1],O,O1, NR
1820 IF NOT X OR X=8 THEN 1855
1830 PRINT "?IOD illegal output device "'34D$'34
1840 E=1
1850 RETURN
1855 C$[60,70]=D$
1856 B$=B$[(FNB(X) MIN FNB(Y))+1]
1857 A$=UPS$(B$)
1860 E=0
1870 RETURN
1880 REM: Device to name
1890 IF D$#"SC:" THEN 1920
1900 O1=1
1910 GOTO 1860
1920 F$="cat-"
1930 IF NOT POS(E$,":") THEN 1840
1940 SYSTEM F$[5],F$
1950 IF NOT POS(F$[15,19],E$[1,POS(D$,":")-1]) THEN 1940
1960 E$=F$[5,10]
1970 GOTO 1860
1980 REM: Catalog
1990 FOR A=26 TO 33
2000 IF A[A] THEN 2030
2010 NEXT A
2030 F=L=N=M=0
2040 GOSUB 1240
2050 IF E THEN 2640
2060 IF F=M THEN 2640
2062 J=K=L=J1=K1=0
2063 M=F
2065 O$=""
2070 RESTORE 9900
2080 IF TYP(0)#1 OR A[27] THEN 2150
2090 READ A,B,C,J$
2100 IF NOT A[A] THEN 2080
2110 O$[LEN(O$)+1]=J$
2120 O$[LEN(O$)+1]=J$
2130 O$[LEN(O$)+1]=" "
2140 GOTO 2080
2150 IF A[27] THEN 2170
2160 O$[LEN(O$)+1]='13'10
2170 RESTORE 9870
2180 IF TYP(0)#1 THEN 2260
2190 READ A,B,C,J$
2200 IF ((A=27 OR A=14 OR A=13) AND NOT A[27]) OR NOT A[A] THEN 2180
2220 F$[1,25]=" "
2230 O$[LEN(O$)+1]=F$[1,A[3] MIN 10]
2240 J=J+(LEN(J$)+(A[3] MIN 10))* NOT K
2250 GOTO 2180
2260 K=K+1
2270 IF (K+2) <= A[6] THEN 2180
2275 IF NOT A[78] THEN 2280
2276 O$=""
2280 GOSUB LEN(O$)>0 OF 9500
2290 RESTORE 9870
2300 IF TYP(0)#1 THEN 2590
2310 READ A,B,C,J$
2320 IF ((A=14 OR A=13 OR A=27) AND NOT A[27]) OR A[A] THEN 2180
2330 IF A=26 OR A=28 OR A=31 OR A=33 THEN 2540
2340 GOTO (A#30)*2 MAX NUM(E$[8])#70 OF 2380,2490
2350 ASSIGN E$[1,6],7,Z
2360 CONVERT Z TO O$[LEN(O$)+1,LEN(O$)+7]
2370 GOTO 2300
2380 GOTO (A#32)*2 MAX NUM(E$[8])#70 OF 2520,2490
2390 ASSIGN E$[1,6],7,Z
2400 IF Z>2 THEN 2490
2405 Y=0
2410 IF END #7 THEN 2460
2420 FOR X=0 TO 32767
2430 READ #7,A+1
2440 Y=Y+(TYP(7)#3)
2450 NEXT X
2460 CONVERT Y TO O$[LEN(O$)+1,LEN(O$)+8]
2470 GOTO 2550
2490 F$[1,50]=" "
2500 O$[LEN(O$)+1]=F$[1,LEN(J$)]
2510 GOTO 2560
2520 O$[LEN(O$)+1]=D$[B,C]
2530 GOTO 2550
2540 O$[LEN(O$)+1]=E$[B,C]
2550 F$[1,25]=" "
2560 O$[LEN(O$)+1]=F$[1,A[3] MIN 10]
2570 J1=J1+(LEN(J$)+(A[3] MIN 10))* NOT K1
2580 GOTO 2300
2590 K1=K1+1
2600 IF (K1+1)*J1 <= A[6] THEN 2040
2610 GOSUB 9500
2620 K1=0
2630 GOTO 2040
2640 GOSUB 9500
2650 RETURN
2660 REM: Directory
2670 O$=""
9780 REM: Switch data
9790 DATA "SP","FF","P","W"
9800 DATA "PFA","MWA","FCP","DT","TT","DI","AC","SF","SU","SM","TF","TU"
9810 DATA "TM","AR","SZ","NU","CA","ID","PR","AS","ST","L","BU","RS"
9820 DATA "UNR","LOC","PRO","PRI","D","CRE","CAF","Q","SQ","KE","AD"
9830 DATA "ZE","R","IN","OUT","A","BF","TF","I$","I#","B$","B#","A$","A#"
9840 DATA "DA","TI","NR","ND","LCC","CCL","ST","OA","OV","^","'","CEF"
9850 DATA "SK","SL","LI","CH","NL","CR","AE"
9860 REM: Catalog data
9870 DATA 26,1,6,"Name ",27,1,4,"Idcode",28,7,10,"Prot",30,0,0,"Status"
9880 DATA 31,10,15,"Length",32,0,1,"R Used",33,17,21,"Size "
9890 DATA 14,45,54," Time ",13,36,44," Date ",26,22,21,"","Halt"
9900 DATA 27,1,4,"Idcode: ",14,45,54,"Time Taken: "
9910 DATA 13,36,44,"Date Taken: ","Halt"
9920 REM: Directory data
9930 DATA 25,0,0," /No. ",27,1,4," /Idcode",21,5,9,"Time /Used "
9940 DATA 22,10,14,"Time /Max. ",20,10,5,"Time /Free ",18,15,29,"Space/Used "
9950 DATA 19,20,24,"Space/Max. ",17,20,15,"Space/Free "
9960 DATA 16,25,35," Account /Capabilities",14,45,54," Time / Taken "
9970 DATA 13,36,44," Date / Taken ",45,55,85,"Account /Description"
9980 DATA 23,86,200," /Access Restrictions","Halt"
9990 END