90  GOTO 400
100  PRINT "LOAD FROM TAPE"
110  GOSUB 800
120  GOTO 3530
400  DIM N[33]
410  DIM T[33]
420  DIM A[32]
425  DIM U[1,33]
430  DIM Y$[10]
440  DIM Z$[72]
450  DIM A$[72],B$[72],C$[72],D$[72],E$[72]
460  DIM F$[72],G$[72],H$[72],I$[72],J$[72]
500  PRINT "** FILE MAINTENANCE **"
505  N1=N2=0
510  PRINT 
515  GOSUB 800
520  PRINT "NEW OR OLD FILE";
530  INPUT Z$
535  PRINT 
540  IF Z$[1,1]="O" THEN 790
545  IF Z$[1,1]#"N" THEN 520
550  PRINT "DESCRIBE RECORD STRUCTURE"
560  PRINT "TO CORRECT PREVIOUS MISTAKES, INPUT 9999"
570  PRINT 
580  PRINT "HOW MANY ELEMENTS IN EACH RECORD";
590  INPUT N1
600  IF N1=9999 THEN 550
610  IF N1<33 THEN 640
620  PRINT "32 IS MAXIMUM NUMBER OF ELEMENTS/RECORD"
630  GOTO 580
640  PRINT "FOR EACH ELEMENT, INPUT ITS TYPE:"
645  PRINT "          A - ALPHANUMERIC STRING"'13'10"          N - NUMBER"
655  N[1]=0
660  FOR I=1 TO N1
670  PRINT "#"I;
680  INPUT Z$
690  IF Z$="9999" THEN 550
695  IF I=1 THEN 700
696  N[I]=N[I-1]
700  IF Z$[1,1]="A" THEN 730
705  IF Z$[1,1]#"N" THEN 670
710  T[I]=1
720  GOTO 740
730  T[I]=2
735  N[I]=N[I]+1
737  IF N[I]<11 THEN 740
738  PRINT "THIS PROGRAM ONLY ALLOWS 10 STRINGS PER RECORD"
739  STOP 
740  NEXT I
745  IF N2=1 THEN 3600
750  GOTO 1000
790  REM****OLD FILE
795  GOTO 815
800  REM  SUBROUTINE
801  I1=0
802  IF  END #1 THEN 809
803  FOR I=1 TO 128
804  READ #1,I
805  IF TYP(-1)>2 THEN 807
806  I1=I
807  I4=I
808  NEXT I
809  PRINT "FILE HAS"I4"RECORDS AVAILABLE"'13'10I1"ARE USED"
810  RETURN 
815  PRINT "DESCRIBE RECORD STRUCTURE (YES/NO)";
820  INPUT Z$
825  READ #1,1
830  N1=N[1]=0
840  N1=N1+1
841  IF N1=1 THEN 845
842  N[N1]=N[N1-1]
845  T[N1]=TYP(-1)
850  GOTO TYP(-1) OF 855,885,930,935
855  READ #1;A
860  IF Z$[1,1]#"Y" THEN 840
870  PRINT "#"N1"N"
880  GOTO 840
885  READ #1;A$
886  N[N1]=N[N1]+1
887  IF N[N1]>10 THEN 738
890  IF Z$[1,1]#"Y" THEN 840
900  PRINT "#"N1;"A"
910  GOTO 840
930  PRINT "FILE ENDS AT END OF RECORD 1"
935  IF Z$[1,1]#"Y" THEN 950
940  PRINT "END OF RECORD"
950  N1=N1-1
1000  REM****BEGIN OPERATIONS
1010  PRINT 
1015  I=15
1020  PRINT "OPERATIONS:";
1030  RESTORE 1040
1040  DATA "HELP","LIST","MODIFY","CREATE","DESTROY","TAPE","STOP"
1050  FOR J=1 TO 7
1060  READ Z$
1070  PRINT TAB(I);Z$
1080  NEXT J
1100  PRINT 
1105  PRINT "WHICH OPERATION";
1110  INPUT Z$
1115  IF Z$="9999" THEN 1190
1120  RESTORE 1040
1130  FOR O1=1 TO 7
1140  READ Y$
1150  IF Z$[1,1]=Y$[1,1] THEN 1175
1155  NEXT O1
1160  PRINT "PLEASE CHECK YOUR SPELLING"
1170  GOTO 1000
1175  PRINT Y$
1180  GOTO O1 OF 1200,1300,1350,1400,1470,3500,1190
1190  STOP 
1200  PRINT 
1210  PRINT "'LIST' READS THE SPECIFIED ELEMENT(S) FROM THE SPECIFIED RECORD(S)"
1220  PRINT "'MODIFY' CHANGES THE SPECIFIED ELEMENT(S) OF THE SPECIFIED RECORD(S)"
1230  PRINT "'CREATE' WRITES ALL ELEMENTS INTO EACH RECORD"
1240  PRINT "'DESTROY' ERASES ALL ELEMENTS OF THE SPECIFIED RECORD"
1250  PRINT "'TAPE' LOADS FROM OR DUMPS ONTO PAPER TAPE"
1255  PRINT "'STOP' HALTS EXECUTION"
1260  PRINT 
1263  PRINT "'LIST' AND 'MODIFY' REQUEST A RECORD NUMBER AND AN ELEMENT"
1264  PRINT "   NUMBER.  '0' RESPONSE SPECIFIES ALL RECORDS OR ELEMENTS."
1270  PRINT 
1280  PRINT "'9999' RESPONSE TO ANY OPERATION REQUEST ABORTS THE OPERATION"
1290  PRINT 
1295  GOTO 1100
1300  REM****LIST
1320  GOTO 1600
1350  REM****MODIFY
1370  GOTO 1600
1400  REM****CREATE
1410  PRINT "# OF FIRST RECORD TO BE WRITTEN";
1430  INPUT R1
1440  R2=0
1450  GOTO 1630
1470  REM****DESTROY
1490  PRINT "# OF RECORD TO BE ERASED";
1500  INPUT R1
1510  IF R1=9999 THEN 3400
1520  PRINT #1,R1
1524  READ #1,(R1#1)+(R1=1)*2
1525  PRINT "ERASED"
1530  GOTO 1100
1600  REM****LIST & MODIFY & CREATE
1610  PRINT "RECORD #, ELEMENT #";
1620  INPUT R1,R2
1630  IF R1=9999 OR R2=9999 THEN 3400
1640  S1=R1
1650  S2=R2
1700  IF  END #1 THEN 3350
1705  IF O1=4 THEN 1720
1710  IF R1#0 THEN 1730
1720  FOR S1=1+(O1=4)*(R1-1) TO 128
1730  READ #1,S1
1735  PRINT "RECORD #"S1
1740  FOR I=1 TO N1
1750  IF (O1=4) OR ((O1=3) AND (R2=0)) THEN 1920
1760  IF TYP(-1)>2 THEN 3350
1775  IF T[I]#TYP(1) THEN 3370
1780  GOTO T[I] OF 1790,1840
1790  READ #1;A[I]
1800  IF ((R2#I) AND (R2#0)) OR O1#2 THEN 1880
1810  PRINT "#"I;A[I]
1830  GOTO 1880
1840  READ #1;Z$
1850  GOSUB 2500
1860  IF ((R2#I) AND (R2#0)) OR O1#2 THEN 1880
1870  PRINT "#"I;Z$
1880  REM CONTINUE
1890  NEXT I
1900  IF O1=2 THEN 2080
1905  I=R2
1910  IF R2#0 THEN 1930
1920  FOR I=1 TO N1
1930  PRINT "#"I;
1940  GOTO T[I] OF 1950,1980
1950  INPUT A[I]
1960  IF A[I]=9999 THEN 3400
1970  GOTO 2010
1980  INPUT Z$
1990  IF Z$="9999" THEN 3400
2000  GOSUB 2500
2010  IF R2#0 THEN 2030
2020  NEXT I
2030  REM  PRINT ONE RECORD
2040  READ #1,S1
2050  GOSUB 3000
2060  READ #1,(S1#1)+2*(S1=1)
2080  IF R1#0 AND O1#4 THEN 2100
2090  NEXT S1
2100  PRINT "END OF "Y$
2110  GOTO 1100
2500  REM   SUBROUTINE TO ASSIGN Z$ TO A$-J$
2510  GOTO N[I] OF 2520,2540,2560,2580,2600,2620,2640,2660,2680,2700
2520  A$=Z$
2530  RETURN 
2540  B$=Z$
2550  RETURN 
2560  C$=Z$
2570  RETURN 
2580  D$=Z$
2590  RETURN 
2600  E$=Z$
2610  RETURN 
2620  F$=Z$
2630  RETURN 
2640  G$=Z$
2650  RETURN 
2660  H$=Z$
2670  RETURN 
2680  I$=Z$
2690  RETURN 
2700  J$=Z$
2710  RETURN 
3000  FOR I=1 TO N1
3020  GOTO T[I] OF 3030,3050
3030  PRINT #1;A[I]
3040  GOTO 3300
3050  GOSUB 3075
3060  PRINT #1;Z$
3070  GOTO 3300
3075  GOTO N[I] OF 3080,3100,3120,3140,3160,3180,3200,3220,3240,3260
3080  Z$=A$
3090  RETURN 
3100  Z$=B$
3110  RETURN 
3120  Z$=C$
3130  RETURN 
3140  Z$=D$
3150  RETURN 
3160  Z$=E$
3170  RETURN 
3180  Z$=F$
3190  RETURN 
3200  Z$=G$
3210  RETURN 
3220  Z$=H$
3230  RETURN 
3240  Z$=I$
3250  RETURN 
3260  Z$=J$
3270  RETURN 
3300  NEXT I
3310  RETURN 
3350  REM  END OF REC/END OF FILE 
3360  PRINT "ENCOUNTERED END OF RECORD OR END OF FILE"
3365  GOTO 3400
3370  PRINT "ENCOUNTERED DATA OF WRONG TYPE"
3380  GOTO 1880
3400  REM  ABORT (9999) ROUTINE
3410  PRINT "OPERATION ABORTED"
3420  GOTO 1100
3500  REM****TAPE
3510  PRINT "LOAD OR PUNCH";
3520  INPUT Z$
3525  IF Z$="9999" THEN 3400
3526  IF Z$[1,1]="P" THEN 4100
3527  IF Z$[1,1]#"L" THEN 3510
3528  REM****LOAD
3530  PRINT "WAS FILE DUMPED BY THIS PROGRAM (YES/NO)";
3540  INPUT Z$
3550  IF Z$="9999" THEN 3400
3560  IF Z$[1,1]="Y" THEN 3620
3570  IF Z$[1,1]#"N" THEN 3530
3580  N2=1
3590  GOTO 550
3600  PRINT "TURN ON TAPE READER"
3610  GOTO 3800
3620  PRINT "TURN ON TAPE READER"
3630  INPUT R1
3640  IF I4 >= R1 THEN 3680
3650  PRINT "FILE HAS"I4"RECORDS AVAILABLE"
3660  PRINT "TAPE REQUIRES"R1"RECORDS"
3670  GOTO 3400
3680  INPUT N1
3690  MAT U=ZER[1,N1]
3700  MAT  INPUT U
3710  FOR I=1 TO N1
3720  T[I]=U[1,I]
3722  IF I>1 THEN 3725
3723  N[1]=(T[1]=2)
3724  GOTO 3730
3725  N[I]=N[I-1]+(T[I]=2)
3730  NEXT I
3800  REM  LOAD REC #, ELEMENTS
3810  INPUT R1
3815  IF R1=9999 THEN 4010
3820  PRINT "RECORD #"R1
3825  I2=0
3830  FOR I=1 TO N1
3840  IF T[I]=2 THEN 3890
3850  IF T[I-(I#1)]=1 THEN 3870
3860  I2=I-1
3870  GOTO 3980
3890  IF I=1 THEN 3960
3900  IF T[I-1]=2 THEN 3960
3910  MAT U=ZER[1,I-I2-1]
3920  MAT  INPUT U
3930  FOR J=I2+1 TO I-1
3940  A[J]=U[1,J-I2]
3950  NEXT J
3960  INPUT Z$
3965  I2=I
3970  GOSUB 2500
3980  NEXT I
3981  IF I2=N1 THEN 3990
3982  MAT U=ZER[1,I-I2-1]
3983  MAT  INPUT U
3984  FOR J=I2+1 TO I-1
3986  A[J]=U[1,J-I2]
3988  NEXT J
3990  READ #1,R1
3992  GOSUB 3000
3994  READ #1,(R1#1)+2*(R1=1)
4000  GOTO 3800
4010  PRINT "FILE IS LOADED"
4020  GOTO 1100
4100  REM****PUNCH
4110  PRINT "# OF FIRST RECORD TO BE PUNCHED";
4120  INPUT N3
4130  IF N3=9999 THEN 3400
4135  IF  END #1 THEN 4170
4140  FOR I=N3 TO 129
4150  READ #1,I
4155  IF TYP(-1)>2 THEN 4170
4160  NEXT I
4170  N4=I-1
4220  PRINT "TAPE LEADER OK (YES/NO)";
4230  INPUT Z$
4240  IF Z$="9999" THEN 3400
4250  IF Z$[1,1]="Y" THEN 4310
4260  IF Z$[1,1]#"N" THEN 4220
4270  PRINT "AFTER THIS PROGRAM HALTS, TURN ON TAPE PUNCH."
4280  PRINT "PUNCH SUFFICIENT LEADER, THEN TURN OFF PUNCH."
4290  PRINT "THEN RUN THIS PROGRAM AGAIN."
4300  STOP 
4310  PRINT "YOU HAVE 5 SECONDS TO TURN ON TAPE PUNCH."
4320  FOR I=1 TO 15000
4330  NEXT I
4340  PRINT N4
4342  PRINT N1
4345  FOR I=1 TO N1
4348  PRINT T[I];
4350  IF I=N1 OR I=8 OR I=16 OR I=24 THEN 4354
4352  PRINT ",";
4353  GOTO 4356
4354  PRINT 
4356  NEXT I
4357  READ #1,1
4358  IF  END #1 THEN 4650
4360  FOR R=N3 TO N4
4370  READ #1,R
4372  IF TYP(-1)>2 THEN 4650
4375  PRINT R
4378  I2=0
4380  FOR I=1 TO N1
4390  IF TYP(1)#T[I] THEN 4650
4400  GOTO T[I] OF 4410,4450
4410  READ #1;A[I]
4420  IF T[I-(I#1)]=1 THEN 4440
4430  I2=I-1
4440  GOTO 4550
4450  IF I=1 THEN 4530
4460  IF T[I-1]=2 THEN 4530
4480  FOR J=I2+1 TO I-1
4484  PRINT A[J];
4485  J0=J-I2
4486  IF J0=I-I2-1 OR J0=8 OR J0=16 OR J0=24 THEN 4490
4487  PRINT ",";
4488  GOTO 4495
4490  PRINT 
4495  NEXT J
4530  READ #1;Z$
4540  PRINT Z$
4545  I2=I
4550  NEXT I
4560  IF I2=N1 THEN 4600
4570  FOR J=I2+1 TO N1
4575  PRINT A[J];
4577  J0=J-I2
4578  IF J0=N1-I2 OR J0=8 OR J0=16 OR J0=24 THEN 4583
4580  PRINT ",";
4581  GOTO 4590
4583  PRINT 
4590  NEXT J
4600  NEXT R
4650  PRINT 9999
4660  PRINT '10'10'10'10'10
9999  END 
