10  REM*** THIS PROGRAM MAINTAINS FILE 'MASTER' FOR TSB BILLING
20  REM***
30  REM***
40  FILES *,*,*
50  DIM A$[72],B$[72],G$[72],L$[72]
60  REM*** ASSIGN AND VERIFY STATUS OF FILES
70  GOSUB 4950
80  REM*** COUNT ENTRIES IN FILE 'MASTER'
90  C1=0
95  B$="A0000"
100  IF  END #1 THEN 150
110  PRINT "COUNTING ENTRIES, RELAX A MINUTE."
120  READ #1;A$,A1,A2,A3,A4,A5
122  IF A$>B$ THEN 130
124  PRINT "SEQUENCE ERROR IN 'MASTER', NO PROCESSING POSSIBLE."
126  PRINT B$[1,5]" >= "A$[1,5]
128  STOP 
130  C1=C1+1
135  B$=A$
140  GOTO 120
150  PRINT "COUNT ="C1
160  PRINT 
170  PRINT "ENTER OPTION (0 FOR LIST)";
180  INPUT I
190  IF I#6 THEN 210
200  STOP 
210  GOTO I OF 320,550,870,2070,2640
220  PRINT "1 = DISPLAY RECORD (LOGICAL)"
230  PRINT "2 = DISPLAY RECORD(S) (PHYSICAL)"
240  PRINT "3 = ADD"
250  PRINT "4 = DELETE"
260  PRINT "5 = MODIFY"
270  PRINT "6 = END"
280  GOTO 160
290  REM
300  REM
310  REM
320  REM*** ROUTINE TO DISPLAY A LOGICAL RECORD
330  REM
340  REM
350  REM
360  REM*** GET ID/SYS
370  GOSUB 3970
380  IF E9=1 THEN 170
390  REM*** CALL BINARY SEARCH TO FIND RECORD
400  GOSUB 3630
410  IF F9=1 THEN 440
420  PRINT "ENTRY NOT FOUND - SHOULD BE IN RECORD"R5
430  GOTO 360
440  PRINT "FOUND IN RECORD"R5
450  PRINT B$
460  PRINT B1;B2;B3;B4;B5
470  GOTO 360
480  REM
490  REM
500  REM
510  REM*** END OF ROUTINE TO DISPLAY A LOGICAL RECORD
520  REM
530  REM
540  REM
550  REM*** ROUTINE TO DISPLAY PHYSICAL RECORD(S)
560  REM
570  REM
580  REM
590  PRINT "LIST RANGE (BEGIN,END)";
600  INPUT B9,E9
610  IF  END #1 THEN 630
620  GOTO 650
630  PRINT "PHYSICAL EOF ENCOUNTERED"
640  GOTO 170
650  B8=B9
660  PRINT "RECORD"B8
670  READ #1,B8
680  IF TYP(-1)=4 THEN 740
690  IF TYP(-1)=3 THEN 780
700  READ #1;A$,A1,A2,A3,A4,A5
710  PRINT A$
720  PRINT A1;A2;A3;A4;A5
730  GOTO 680
740  PRINT "EOR"
750  B8=B8+1
760  IF B8>E9 THEN 170
770  GOTO 660
780  PRINT "EOF"
790  GOTO 750
800  REM
810  REM
820  REM
830  REM*** END OF ROUTINE TO DISPLAY PHYSICAL RECORDS
840  REM
850  REM
860  REM
870  REM*** ROUTINE TO ADD DATA
880  REM
890  REM
900  REM
910  V0=0
920  L$=""
930  PRINT #3,1; END 
940  REM*** GET ID/SYS
950  GOSUB 3970
960  IF E9=1 THEN 1380
970  REM*** USE BINARY SEARCH TO VERIFY ENTRY NOT ALREADY PRESENT
980  GOSUB 3630
990  IF F9=0 THEN 1020
1000  PRINT "ENTRY ALREADY PRESENT IN RECORD"R5
1010  GOTO 940
1020  REM*** VERIFY ASCENDING SEQUENCE
1030  IF G$>L$ THEN 1060
1040  PRINT "ID/SYS MUST BE ENTERED IN ASCENDING ORDER"
1050  GOTO 940
1060  L$=G$
1070  REM*** GET THE REST OF THE DATA
1080  A$[1,5]=G$
1090  REM*** NAME
1100  GOSUB 4200
1110  REM*** IF CHARGES ABSORBED, OTHER DATA IS AUTOMATIC
1120  IF E8=1 THEN 1290
1130  A$[6,25]=G$
1140  REM*** DIV/LOC
1150  GOSUB 4430
1160  A$[26,31]=G$
1170  REM*** BLDG
1180  GOSUB 4580
1190  A$[32,45]=G$
1200  REM*** BILL CODE
1210  GOSUB 4650
1220  A$[46,48]=G$
1230  REM*** PASSWORD
1240  GOSUB 4810
1250  A$[49,60]=G$
1260  REM*** PHONE
1270  GOSUB 4880
1280  A$[61,72]=G$
1290  REM*** PUT DATA TO BE ADDED IN HOLDING FILE.
1300  IF  END #3 THEN 1320
1310  GOTO 1350
1320  PRINT "FILE 'ADEL' IS FULL."
1330  PRINT "DATA FOR "A$[1,5]" NOT INCLUDED."
1340  GOTO 1380
1350  PRINT #3;A$, END 
1360  V0=V0+1
1370  IF V0<50 THEN 940
1380  PRINT V0"ITEMS HAVE BEEN ADDED"
1390  IF V0=0 THEN 170
1400  REM*** RE-ENTRY POINT IF 'MASCOP' IS TOO SMALL
1410  PRINT "MERGING 'MASTER' AND 'ADEL' TO 'MASCOP'."
1420  GOSUB 4950
1430  READ #1,1
1440  READ #2,1
1450  READ #3,1
1460  IF  END #2 THEN 1480
1470  GOTO 1520
1480  PRINT "FILE 'MASCOP' IS TOO SMALL. TO RECOVER YOUR ADDITIONS,"
1490  PRINT "KILL AND RE-OPEN 'MASCOP' TO A LARGER SIZE.  THEN, GET-CUS"
1500  PRINT "AND RUN-1400"
1510  STOP 
1520  IF  END #1 THEN 1690
1530  IF  END #3 THEN 1750
1540  A0=B0=0
1550  READ #1;A$,A1,A2,A3,A4,A5
1560  A0=1
1570  READ #3;B$
1580  B0=1
1590  IF A$[1,5]<B$[1,5] THEN 1640
1600  REM*** B$(1,5)<A$(1,5) HERE, AS BINARY SEARCH PREVENTS DUPLICATES
1610  PRINT #2;B$,0,0,0,0,0, END 
1620  B0=0
1630  GOTO 1570
1640  PRINT #2;A$,A1,A2,A3,A4,A5, END 
1650  A0=0
1660  READ #1;A$,A1,A2,A3,A4,A5
1670  A0=1
1680  GOTO 1590
1690  REM*** EOF 1. FILL FILE 2 WITH REST OF FILE 3
1700  IF  END #3 THEN 1810
1710  IF B0=0 THEN 1730
1720  PRINT #2;B$,0,0,0,0,0, END 
1730  READ #3;B$
1740  GOTO 1720
1750  REM*** EOF 3. FILL FILE 2 WITH REST OF FILE 1
1760  IF  END #1 THEN 1810
1770  IF A0=0 THEN 1790
1780  PRINT #2;A$,A1,A2,A3,A4,A5, END 
1790  READ #1;A$,A1,A2,A3,A4,A5
1800  GOTO 1780
1810  REM*** COPY 'MASCOP' TO 'MASTER'. RE-ENTER HERE IF 'MASTER' TOO SMALL.
1820  PRINT "RE-COPYING 'MASCOP' TO 'MASTER'"
1830  GOSUB 4950
1840  IF  END #2 THEN 1950
1850  IF  END #1 THEN 1870
1860  GOTO 1900
1870  PRINT "FILE 'MASTER' IS TOO SMALL. KILL AND RE-OPEN IT TO A"
1880  PRINT "LARGER SIZE, GET-CUS, AND RUN-1810"
1890  STOP 
1900  C1=0
1910  READ #2;A$,A1,A2,A3,A4,A5
1920  PRINT #1;A$,A1,A2,A3,A4,A5, END 
1930  C1=C1+1
1940  GOTO 1910
1950  REM*** FORCE BUFFERS TO DISK
1960  READ #1,2
1970  READ #1,1
1980  PRINT "RE-COPY COMPLETE, ADDITIONS NOW IN 'MASTER'."
1990  GOTO 170
2000  REM
2010  REM
2020  REM
2030  REM*** END OF ADD ROUTINE
2040  REM
2050  REM
2060  REM
2070  REM*** ROUTINE FOR DELETIONS
2080  REM
2090  REM
2100  REM
2110  V0=0
2120  REM*** DOUBLE BUFFER
2130  ASSIGN "MASTER",2,R8
2140  REM*** GET ID/SYS
2150  GOSUB 3970
2160  IF E9=1 THEN 2380
2170  REM*** USE BINARY SEARCH TO SEE IF ENTRY PRESENT
2180  GOSUB 3630
2190  IF F9=1 THEN 2220
2200  PRINT "ENTRY NOT PRESENT - SHOULD BE IN RECORD"R5
2210  GOTO 2140
2220  IF B$[46,48]#"DEL" THEN 2226
2222  PRINT "DELETION ALREADY REQUESTED FOR "B$[1,5]
2224  GOTO 2140
2226  REM*** PLUG IN DELETE CODE (46,48)
2230  READ #2,R5
2240  READ #1,R5
2250  IF TYP(-2)=4 THEN 2350
2260  IF TYP(-2)=3 THEN 2340
2270  READ #2;A$,A1,A2,A3,A4,A5
2280  IF A$[1,5]=G$ THEN 2310
2290  PRINT #1;A$,A1,A2,A3,A4,A5
2300  GOTO 2250
2310  A$[46,48]="DEL"
2320  V0=V0+1
2330  GOTO 2290
2340  PRINT #1; END 
2350  REM*** FORCE BUFFERS
2360  GOSUB 5090
2370  GOTO 2140
2380  REM*** DELETE CODED ITEMS
2390  PRINT V0"ITEMS DELETED"
2400  IF V0=0 THEN 2550
2410  PRINT "ELIMINATING ITEMS FROM FILE 'MASTER'"
2420  READ #2,1
2430  PRINT #1,1; END 
2440  IF  END #2 THEN 2510
2450  C1=0
2460  READ #2;A$,A1,A2,A3,A4,A5
2470  IF A$[46,48]="DEL" THEN 2460
2480  PRINT #1;A$,A1,A2,A3,A4,A5, END 
2490  C1=C1+1
2500  GOTO 2460
2510  REM*** FORCE BUFFERS
2520  GOSUB 5090
2530  PRINT "DELETIONS NOW MADE FROM FILE 'MASTER'."
2540  REM*** RE-ASSIGN FILES
2550  GOSUB 4950
2560  GOTO 170
2570  REM
2580  REM
2590  REM
2600  REM*** END OF ROUTINE FOR DELETIONS
2610  REM
2620  REM
2630  REM
2640  REM*** ROUTINE FOR MODIFICATION
2650  REM
2660  REM
2670  REM
2680  REM*** DOUBLE BUFFER
2690  ASSIGN "MASTER",2,R8
2700  REM*** GET I.D./SYS
2710  GOSUB 3970
2720  IF E9=1 THEN 3530
2730  REM*** FIND ITEM WITH BINARY SEARCH
2740  GOSUB 3630
2750  IF F9=1 THEN 2780
2760  PRINT "ENTRY NOT FOUND - SHOULD BE IN REC"R5
2770  GOTO 2700
2780  REM*** GET ITEM TO MODIFY
2790  PRINT "ITEM TO MODIFY (0 FOR LIST)";
2800  INPUT M
2810  IF M=12 THEN 3370
2820  GOTO M OF 2930,2970,3010,3050,3090,3130,3170,3210,3250,3290,3330
2830  PRINT "1 = NAME",TAB(20),"7 = TIME"
2840  PRINT "2 = DIV/LOC",TAB(20),"8 = STORAGE"
2850  PRINT "3 = BLDG",TAB(20),"9 = TIME $"
2860  PRINT "4 = BILL CODE",TAB(20),"10 = STORAGE $"
2870  PRINT "5 = PASSWORD",TAB(20),"11 = SPECIAL CHARGES"
2880  PRINT "6 = PHONE",TAB(20),"12 = DONE FOR THIS ID/SYS"
2890  GOTO 2790
2900  REM*** MODIFICATIONS MADE HERE; B$,B1,B2,B3,B4,B5 CONTAINS DATA
2910  REM*** BEING MODIFIED (FROM BINARY SEARCH)
2920  REM***
2930  REM*** NAME
2940  GOSUB 4200
2950  B$[6,25]=G$
2960  GOTO 2790
2970  REM*** DIV/LOC
2980  GOSUB 4430
2990  B$[26,31]=G$
3000  GOTO 2790
3010  REM*** BLDG
3020  GOSUB 4580
3030  B$[32,45]=G$
3040  GOTO 2790
3050  REM*** BILL CODE
3060  GOSUB 4650
3070  B$[46,48]=G$
3080  GOTO 2790
3090  REM*** PASSWORD
3100  GOSUB 4810
3110  B$[49,60]=G$
3120  GOTO 2790
3130  REM*** PHONE
3140  GOSUB 4880
3150  B$[61,72]=G$
3160  GOTO 2790
3170  REM*** TIME (MINUTES)
3180  PRINT "TIME (MINUTES)";
3190  INPUT B1
3200  GOTO 2790
3210  REM*** DISC STORAGE (BLOCKS)
3220  PRINT "DISC STORAGE (BLOCKS)";
3230  INPUT B2
3240  GOTO 2790
3250  REM*** TIME $
3260  PRINT "TIME $";
3270  INPUT B3
3280  GOTO 2790
3290  REM*** DISC $
3300  PRINT "DISC $";
3310  INPUT B4
3320  GOTO 2790
3330  REM*** SPECIAL $
3340  PRINT "SPECIAL $";
3350  INPUT B5
3360  GOTO 2790
3370  REM*** UPDATE RECORD WITH MODIFIED DATA
3380  READ #2,R5
3390  READ #1,R5
3400  IF TYP(-2)=4 THEN 3490
3410  IF TYP(-2)=3 THEN 3480
3420  READ #2;A$,A1,A2,A3,A4,A5
3430  IF A$[1,5]=B$[1,5] THEN 3460
3440  PRINT #1;A$,A1,A2,A3,A4,A5
3450  GOTO 3400
3460  PRINT #1;B$,B1,B2,B3,B4,B5
3470  GOTO 3400
3480  PRINT #1; END 
3490  REM*** FORCE BUFFER
3500  GOSUB 5090
3510  PRINT "MODIFICATION COMPLETE"
3520  GOTO 2700
3530  REM*** RE-ASSIGN FILES & EXIT MODIFICATION ROUTINE
3540  GOSUB 4950
3550  GOTO 170
3560  REM
3570  REM
3580  REM
3590  REM*** END OF MODIFICATION ROUTINE
3600  REM
3610  REM
3620  REM
3630  REM*** BINARY SEARCH FOR FILE 'MASTER'
3640  REM*** RECORD WHERE FOUND (OR WHERE SHOULD BE FOUND)
3650  REM*** RETURNED AS R5
3660  F9=S9=0
3670  R5=L9=1
3680  IF C1=0 THEN 3960
3690  U9=INT((C1-1)/5)+1
3700  IF (U9-L9)>1 THEN 3840
3710  REM*** SEARCH RECORDS L9 THROUGH U9
3720  FOR J9=L9 TO U9
3730  R5=J9
3740  READ #1,J9;B$,B1,B2,B3,B4,B5
3750  IF B$[1,5]<G$ THEN 3780
3760  IF B$[1,5]>G$ THEN 3960
3770  GOTO 3940
3780  IF TYP(-1)=4 THEN 3820
3790  IF TYP(-1)=3 THEN 3960
3800  READ #1;B$,B1,B2,B3,B4,B5
3810  GOTO 3750
3820  NEXT J9
3830  GOTO 3960
3840  S9=INT((U9+L9)/2)
3850  R5=S9
3860  READ #1,S9;B$,B1,B2,B3,B4,B5
3870  IF B$[1,5]<G$ THEN 3900
3880  IF B$[1,5]>G$ THEN 3920
3890  GOTO 3940
3900  L9=S9
3910  GOTO 3700
3920  U9=S9
3930  GOTO 3700
3940  REM*** F9=1 IF ITEM FOUND
3950  F9=1
3960  RETURN 
3970  REM*** THIS GOSUB INPUTS AND VERIFIES ID/SYS
3980  REM***
3990  E9=0
4000  PRINT "ID/SYS ('/' TO EXIT)";
4010  INPUT G$
4020  IF G$#"/" THEN 4050
4030  E9=1
4040  RETURN 
4050  IF LEN(G$)=5 THEN 4080
4060  PRINT "5 CHARS, PLEASE."
4070  GOTO 4000
4080  IF G$[1,1]<"A" THEN 4100
4090  IF G$[1,1] <= "Z" THEN 4120
4100  PRINT "1ST CHAR A - Z, PLEASE."
4110  GOTO 4000
4120  FOR S=2 TO 5
4130  IF G$[S,S]<"0" THEN 4150
4140  IF G$[S,S] <= "9" THEN 4170
4150  PRINT "LAST 4 CHARS NUMERIC, PLEASE."
4160  GOTO 4000
4170  NEXT S
4180  REM*** IT'S VALID
4190  RETURN 
4200  REM*** THIS GOSUB GETS NAME
4210  REM*** E8 = 1 IF CHARGES ABSORBED
4220  REM***
4230  E8=0
4240  PRINT "NAME (LAST, FIRST)";
4250  INPUT G$
4260  IF G$#"US" THEN 4390
4270  REM*** ABSORB ONLY IF IN ADD MODE
4280  IF I=3 THEN 4310
4290  PRINT "'US' VALID ONLY IN ADD MODE."
4300  GOTO 4240
4310  A$[6,25]="BAEDP TIMESHARE"
4320  A$[26,31]="004009"
4330  A$[32,45]="3L"
4340  A$[46,48]="A"
4350  A$[49,60]="***ABSORB***"
4360  A$[61,72]="2079"
4370  E8=1
4380  RETURN 
4390  IF LEN(G$) <= 20 THEN 4420
4400  G$=G$[1,20]
4410  PRINT "WARNING - NAME TRUNCATED TO "G$
4420  RETURN 
4430  REM*** THIS GOSUB INPUTS DIV/LOC
4440  REM***
4450  PRINT "DIV LOC";
4460  INPUT G$
4470  IF LEN(G$)=6 THEN 4500
4480  PRINT "6 NUMERICS, PLEASE."
4490  GOTO 4450
4500  FOR S=1 TO 6
4510  IF G$[S,S]<"0" THEN 4530
4520  IF G$[S,S] <= "9" THEN 4550
4530  PRINT "NUMERICS ONLY, PLEASE."
4540  GOTO 4450
4550  NEXT S
4560  REM*** VALID
4570  RETURN 
4580  REM*** THIS GOSUB INPUTS BLDG
4590  PRINT "BLDG";
4600  INPUT G$
4610  IF LEN(G$) <= 14 THEN 4640
4620  G$=G$[1,14]
4630  PRINT "WARNING - BLDG TRUNCATED TO "G$
4640  RETURN 
4650  REM*** THIS GOSUB INPUTS BILL CODE
4660  PRINT "BILL CODE";
4670  INPUT G$
4680  IF G$="B" THEN 4800
4690  IF G$="R" THEN 4800
4700  IF G$="A" THEN 4800
4710  IF G$[1,1]="M" THEN 4730
4720  IF G$[1,1]#"G" THEN 4770
4730  IF LEN(G$)#3 THEN 4770
4740  FOR S=2 TO 3
4750  IF G$[S,S]<"0" THEN 4770
4760  IF G$[S,S] <= "9" THEN 4790
4770  PRINT "A, B, R, G00-G99, OR M00-M99, PLEASE."
4780  GOTO 4660
4790  NEXT S
4800  RETURN 
4810  REM*** THIS GOSUB INPUTS PASSWORD
4820  PRINT "PASSWORD";
4830  INPUT G$
4840  IF LEN(G$) <= 12 THEN 4870
4850  PRINT "<= 12 CHARS, PLEASE"
4860  GOTO 4820
4870  RETURN 
4880  REM*** THIS GOSUB INPUTS PHONE
4890  PRINT "PHONE";
4900  INPUT G$
4910  IF LEN(G$) <= 12 THEN 4940
4920  PRINT "<=12 CHARS, PLEASE"
4930  GOTO 4890
4940  RETURN 
4950  REM*** THIS GOSUB ASSIGNS AND STATUS CHECKS FILES
4960  ASSIGN "MASCOP",2,R8
4970  IF R8=0 THEN 5000
4980  PRINT "FILE 'MASCOP' STATUS ="R8
4990  STOP 
5000  ASSIGN "MASTER",1,R8
5010  IF R8=0 THEN 5040
5020  PRINT "FILE 'MASTER' STATUS = "R8
5030  STOP 
5040  ASSIGN "ADEL",3,R8
5050  IF R8=0 THEN 5080
5060  PRINT "FILE 'ADEL' STATUS ="R8
5070  STOP 
5080  RETURN 
5090  REM*** THIS GOSUB FORCES DOUBLE BUFFERED RECORD TO DISC
5100  REM*** 2 IS READ BUFFER, 1 IS PRINT BUFFER
5110  ASSIGN "ADEL",2,R8
5120  ASSIGN "ADEL",1,R8
5130  ASSIGN "MASTER",2,R8
5140  ASSIGN "MASTER",1,R8
5150  RETURN 
9999  END 
