Listing of file='2229FR' on disk='vmedia/mvp-diag-2.6.2.wvd.zip'
# Sector 1625, program filename = '2229FR' 0010 COM F9$8 : F9$="2229FR" : LOAD T"2229STRT" 0020 REM % FILE "2229FR" - Part of 2229 utilities package 0030 REM % Recover all files from tape(s) - ST 01/21/1983 0040 COM D$3,O$3 : DIM T$30,V$(16),F$(16),K$1,A1$(16,16)64,E$20,V$8,C$2,M$70,V1$8,F2$8,I1$5, L$2,F1$8,Y$1,F3$8,Z$1,M3$15,J$8,C(4),S4$1,S$30 0050 LOAD T#1,"2229SUB"5000,8999BEG 60 0060 C1=0 : REM EXP BC : C2=0 : REM CONTINUATION FLAG OFF : C3=0 : REM FIRST VOL IN SERIES : S=0 : REM FIRST SECTOR TO WRITE : T2=0 : REM EXPECTED TAPE FILE SECTION NUMBER : V=1 : REM EXPECTED TAPE SEQUENCE NUMBER 0070 I1$="INDEX" : ADD(STR(I1$),80) : S4$="M" : REM MVP (2200) FILES 0080 T$="RECOVER FILES FROM TAPE" : $OPEN #4 : GOSUB '151 0090 REM % GET OUTPUT DISK ADDRESS : PRINT HEX(0F); : IF D$=" "THEN D$="D11" : PRINT AT(3,0); : LINPUT "File output address ",D$ : SELECT #2<D$> : ERRORA=1 : GOTO 140 0100 VERIFY T#2,(0,0)A : ERRORA=1 : GOTO 140 0110 $OPEN #2 : DATA LOAD BA T#2,(0)V$() : ERRORA=1 : GOTO 140 0120 DATA SAVE BA T#2,(0)V$() : ERRORA=1 : GOTO 140 0130 $CLOSE#2 : IF A=0THEN 150 0140 $CLOSE#2 : PRINT AT(3,30);"ERROR ";ERR;HEX(07); : GOTO 90 0150 PRINT HEX(06);AT(3,35,),AT(5,0); : PRINTUSING 160,"INDEX SECTORS = ",VAL(STR(V$(1),2,2)) : PRINTUSING 160,"END CAT. AREA = ",VAL(STR(V$(1),5,2),2)-1 : PRINTUSING 160,"CURRENT END = ",VAL(STR(V$(1),3,2),2)-1 0160 %############### ##### 0170 K$="Y" : PRINT AT(09,0); : LINPUT "Is this the correct output platter?",K$ : ERRORGOTO 170 0180 IF K$="Y" OR K$="y"THEN 190 : GOTO 80 0190 PRINT HEX(06),AT(5,0,) 0200 M$="Insert tape cartridge and press ONLINE" : GOSUB '160 : GOSUB '152 0210 PRINT HEX(06);AT(5,0,); : GOSUB '104 : REM LOAD TAPE 0220 REM % FILE MARK SHOULD BE FIRST : GOSUB '112 : M$="File mark expected" : IF F3<>1THEN 9100 0230 REM % READ LABEL : GOSUB '112 : M$="File mark expected" : IF F3=1THEN 9100 : M$="Label is not 256 bytes" : IF B<>256THEN 9100 : MAT COPY STR(A1$(),1,256)TO V$() : M$="First record is not Volume Header" : IF STR(V$(),1,4)<>"VHDR"THEN 9100 0240 IF V>1THEN 250 : PRINT AT(05,0,);"Tape volume name";AT(5,21);STR(V$(),5,8) : PRINT AT(6,0);"Date";AT(6,21);STR(V$(),17,6) : PRINT AT(7,0);"Time ";AT(7,21);STR(V$(),23,6) : PRINT "Comments" : PRINT AT(8,21);STR(V$(),202) 0250 T1=1 : REM EXP TAPE FILE SEQUENCE NUMBER 0260 IF C2=1THEN 270 : IF C3=1THEN 270 : IF V1$<>" "THEN 270 : REM CONT FLAG OR VOL : K$="Y" : M$="Is this the correct volume? " : GOSUB '160 : PRINT AT(10,28); : LINPUT -K$ : IF K$="Y" OR K$="y"THEN 270 : GOTO 280 0270 CONVERT STR(V$(),13,2)TO V1 : IF V1=VTHEN 290 : PRINT AT(14,0);"Volume mounted is tape sequence number";V1 : PRINT "Expected sequence number";V : PRINT : PRINT "PRESS RETURN TO UNLOAD TAPE" : GOSUB '154 : PRINT HEX(06),AT(4,0,) 0280 GOSUB '105 : REM UNLOAD TAPE : GOTO 200 0290 V=V+1 : REM EXP SEQ # : M$=" " : GOSUB '160 : GOSUB '112 : REM LOOK FOR NEXT FILE MARK : M$="Expected file mark" : IF F3<>1THEN 9100 : GOSUB '112 : REM READ FILE LABEL 0295 IF VAL(STR(A1$(),5,2),2)=0THEN 300 : PRINT HEX(06),AT(8,0,);"Cartridge is platter backup, not file backup" : PRINT "Run 'Recover platter from tape' utility" : GOSUB '153 : STOP : GOTO 10 0300 M$="File label is not 256 bytes" : IF B<>256THEN 9100 : MAT COPY STR(A1$(),1,256)TO F$() : I=0 : IF VAL(STR(F$(),5,2),2)=T1THEN 330 : M$="Tape file sequence number out of order" : IF T1>1THEN 9100 : REM ERROR IF NOT INDEX 0310 I=1 : REM INDEX FILE : M$="Do you want to examine tape index?" : GOSUB '160 : PRINT AT(10,35); : K$="Y" : K1=0 : LINPUT -K$ : IF K$="Y"OR K$="y"THEN K1=1 : C1=0 : GOTO 340 0320 REM 0330 T1=T1+1 : IF C2=0THEN 340 : REM CHECK TAPE FILE SECTION NUMBER FOR CONTINUED TAPES 0340 M$="File header block count not = 0" : IF STR(F$(),28,2)<>HEX(0000)THEN 9100 : M$="Record format byte wrong" : IF STR(F$(),30,1)<>HEX(FF)THEN 9100 : M$="Record/Block count incorrect" : IF MOD(VAL(STR(F$(),31,2),2),VAL(STR(F$(),33,2),2))<>2THEN 9100 : IF STR(F$(),35,1)<>HEX(11)THEN S4$="O" : REM NOT 2200 0350 IF I=1THEN 560 : IF C2=0THEN 360 : REM JUMP IF NEW FILE : IF STR(F$(),69,8)=F2$THEN 540 : REM CHECK CONT FILE FOR PROPER NAME : REM CONTINUED FILE INCORRECT 0360 F1$=STR(F$(),69,8) : ON KGOTO 370,400,430,440,450 0370 REM ADD ONLY : GOSUB '57 : IF A=0THEN 380 : PRINT AT(10,0,79);F1$;" is already on disk" : $GIO(75FF 75FF) : GOTO 510 0380 IF STR(F$(),36,1)="D"THEN GOSUB '51 : ELSE GOSUB '50 : REM OPEN NEW FILE 0390 GOTO 520 0400 REM REPLACE ONLY : GOSUB '57 : IF A<>0THEN 410 : PRINT AT(10,0,79);F1$;" is not on disk" : $GIO(75FF 75FF) : GOTO 510 0410 IF R<=R1THEN 520 : REM JUMP IF ROOM ON DISK : GOSUB '54 : REM GET JUNK FILE NAME 0420 GOSUB '52 : REM JUNK FILE : GOTO 380 : REM JUMP TO CREATE NEW FILE AND RECOVER 0430 REM ADD/REPLACE : GOSUB '57 : REM GET LIMITS : IF A=0THEN 380 : REM JUMP IF NOT ON DISK : GOTO 410 : REM ELSE REPLACE 0440 REM SINGLE FILE RECOVERY : IF F3$<>F1$THEN 510 : K=4.5 : REM SHOW THAT FILE FOUND 0450 REM QUERY EACH FILE : PRINT AT(10,0,79);"Do you want to retrieve file ";F1$;" ? "; : Y$="Y" : LINPUT -Y$ : IF Y$="Y"THEN 460 : IF Y$<>"N"THEN 450 : GOTO 510 0460 GOSUB '57 : REM GET LIMITS : IF A=0THEN 490 : REM JUMP IF NOT ON DISK 0470 PRINT HEX(06),AT(10,0,79) : PRINT F1$;" is already on disk - OK to overwrite?"; : LINPUT -Y$ : IF Y$="Y"THEN 480 : IF Y$<>"N"THEN 470 : GOTO 500 0480 IF R<=R1THEN 520 : REM JUMP IF SIZE OK : GOSUB '54 : GOSUB '56 : IF Y$="Y"THEN 420 : GOTO 500 0490 GOSUB '53 : IF Y$="Y"THEN 380 : REM JUMP TO CREATE FILE 0500 REM NEGATIVE RESPONSE FROM USER - GET RETURN BEFORE PROCEEDING : PRINT HEX(06),AT(10,0,) : PRINT "Press return to continue" : GOSUB '154 0510 REM SPACE FILE MARK : GOSUB '110 : GOTO 750 0520 LIMITS T#2,F1$,H1,H2,A,A : R1=H2-H1+1 : REM FILE SIZE ON DISK : R=VAL(STR(F$(),42,2),2) : REM FILE SIZE ON TAPE 0530 S=H1 : G3=H2 0540 REM % START READING DATA : REM NEXT SECTOR TO WRITE IS S : PRINT HEX(06);AT(10,0,); 0550 C1=0 : REM EXPECTED PHYSICAL RECORD COUNT : M$=" " : GOSUB '160 : PRINT AT(10,0);"Recovering file ";VAL(STR(F$(),5,2),2) : PRINT AT(11,0);HEX(020402000E);STR(F$(),69,MAX(POS(STR(F$(),69,80)=HEX(00 )),80));HEX(0F) 0560 GOSUB '112 : IF F3=1THEN 650 : REM JUMP IF LABEL IS HIT : M$="Data not on page boundary" : IF MOD(B,256)<>0THEN 9100 0570 IF I=0THEN 620 : IF K1=0THEN 560 : REM PRINT FILE NAMES IN INDEX : PRINT HEX(06),AT(6,0,) : PRINT "Files on this volume:" : MAT SEARCHSTR(A1$(),1,MIN(B,16321)),=HEX(00)TO L$STEP 80 : L=(VAL(L$,2)-1)/80 : REM # OF NAMES : L5,L6=1 : REM POINT TO FIRST NAME 0580 PRINT HEX(06);AT(8,0,); : L4=0 0590 PRINT AT(L4+8,0);STR(A1$(),L5,80) : L6=L6+1 : IF L6>LTHEN 600 : REM JUMP IF DONE : L5=L5+80 : REM POINTER INTO ARRAY : IF L5>=16320THEN 560 : REM READ NEXT RECORD : L4=L4+1 : IF L4<=09THEN 590 : IF K1=0THEN 580 0600 PRINT : PRINT "Press RETURN to see next screen" : PRINT "Press RUN to skip rest of index" : GOSUB '154 : IF K$=HEX(82)THEN 610 : IF L6>LTHEN 560 : GOTO 580 0610 K1=0 : GOTO 560 0620 B1=1 : REM POINTER INTO ARRAY : $OPEN #2 0630 DATA SAVE BA T#2,(S,S)STR(A1$(),B1,256) : ERRORGOTO 9000 0640 B1=B1+256 : IF B1<BTHEN 630 : $CLOSE#2 : GOTO 560 : REM GET NEXT BLOCK 0650 REM % FILE MARK JUMPS HERE, SHOULD BE END LABEL : IF I=0THEN 670 : PRINT HEX(06),AT(4,0,);"Tape volume name";AT(4,21);STR(V$(),5,8);AT(5,0); : PRINTUSING 660,V-1 0660 %Tape sequence number # 0670 GOSUB '112 : MAT COPY STR(A1$(),1,256)TO F$() : M$="File trailer label not 256 bytes" : IF B<>256THEN 9100 : M$="File trailer block count incorrect" : IF VAL(STR(F$(),28,2),2)<>C1THEN 9100 0680 IF I=0THEN 740 0690 PRINT HEX(06),AT(6,0,) : PRINT AT(7,0);"1 - Add" : PRINT "2 - Replace" : PRINT "3 - Add/Replace" : PRINT "4 - Recover single file" : PRINT "5 - Query each file" 0700 PRINT AT(13,0); : INPUT "Select recovery option",K : ERRORGOTO 700 0710 IF K<1OR K>5THEN 700 : IF K<>4THEN 730 0720 PRINT : LINPUT "File name ",-F3$ 0730 PRINT HEX(06),AT(6,0,) : RESTORE LINE950,K : READ M3$ : PRINT AT(3,40);"Recovery option: ";M3$ : GOTO 770 0740 C2=0 : IF STR(F$(),44,1)=HEX(00)THEN 750 : C2=1 : REM CONTINUATION FLAG : F2$=STR(F$(),69,8) 0750 IF F3$=F1$AND C2=0AND K=4.5THEN 800 0770 GOSUB '110 : REM LOOK FOR FILE MARK : M$="Expected file mark" : IF F3<>1THEN 9100 0780 GOSUB '112 : IF STR(A1$(),1,4)<>"VEND"THEN 300 : REM JUMP IF NOT VOL LABEL : MAT COPY STR(A1$(),1,256)TO V$() : V1$=STR(V$(),39,8) 0790 M$="File is not on tape" : IF C2=0AND K=4 AND V1$=" "THEN 9100 0800 GOSUB '105 : REM UNLOAD TAPE : IF E<>0THEN 9050 0810 IF C2=1THEN 830 : IF F3$=F1$AND K=4.5THEN 820 : IF K=5AND C2=0THEN 820 : IF V1$<>" "THEN 830 0820 M$="File recovery done - Remove cartridge" : GOSUB '160 : GOSUB '153 : STOP 0830 M$="Files are continued on next cartridge - Remove this cartridge" : GOSUB '160 0840 PRINT "Insert next cartridge and press ONLINE" : GOSUB '152 : GOTO 210 0850 DEFFN'50 : REM OPEN NEW PROGRAM FILE : SAVE DC T#2,(R-3)F1$10,10 : RETURN 0860 DEFFN'51 : REM OPEN NEW DATA FILE : DATA SAVE DC OPEN T#2,(R)F1$ : RETURN 0870 DEFFN'52 : REM JUNK FILE : SCRATCH T#2,F1$ : DATA SAVE DC OPEN T#2,F1$,J$ : SCRATCH T#2,J$ : RETURN 0880 DEFFN'53 0890 PRINT HEX(06),AT(10,0,79);F1$;" does not exist - OK to create new file (Y /N) "; : Y$="Y" : LINPUT -Y$ : IF Y$="Y"OR Y$="N"THEN RETURN : GOTO 890 0900 DEFFN'54 : PRINT HEX(06),AT(10,0,79);"Old file is too small" : J$="JUNKAAA" 0910 LIMITS T#2,J$,A,A,A,A : IF A=0THEN RETURN : A=POS(-J$<"Z") : STR(J$,A,1)=ADDHEX(01) : IF A<8THEN STR(J$,A+1)=ALL("A") : GOTO 910 0920 DEFFN'56 0930 PRINT HEX(06),AT(11,0);"Can the file be junked (renamed to ";J$;" & scrat ched)?"; : Y$="Y" : LINPUT -Y$ : IF Y$="Y"OR Y$="N"THEN RETURN : GOTO 930 0940 DEFFN'57 : REM CHECK FOR FILE ON DISK : LIMITS T#2,F1$,H1,H2,A,A : R1=H2-H1+1 : REM FILE SIZE ON DISK : R=VAL(STR(F$(),42,2),2) : REM FILE SIZE ON TAPE : RETURN 0950 DATA "Add","Replace","Add/Replace","Single file","Query each file" 9000 $CLOSE : PRINT AT(10,0,79);"Disk error "; ERR : STOP : GOTO 20 9050 $CLOSE : PRINT AT(10,0,79);"Tape error ";E : PRINT E$ : STOP : GOTO 20 9100 REM FATAL ERROR TERMINATOR : PRINT AT(10,0,80);M$ : $CLOSE : STOP : GOTO 20