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