image of READY prompt

Wang2200.org

Listing of file='MULTIDSK' on disk='vmedia/multidisk_diagnostic.wvd.zip'

# Sector 394, program filename = 'MULTIDSK'
0010 REM % MULTIDSK
   : REM This is MULTIDSK written by Ken LeBaron,
0020 REM \D5\F0\E4\E1\F4\E5\F3; 10/23/84 by Paul J. Hossfeld - Slowed the $GIO
      statement that looks at the drives so it could pick up a Pheonix.  Also
     removed the zero retries GIO statement.  Added $BRAKE so partitions could
      interupt the drive.
0030 REM \D5\D0\C4\C1\D4\C5\D3; 2/2/87 BY Paul J. Hossfeld - slowed GIO 's (fr
     om 68D0 to 4002 88D0) lines 1330, 2340, 2350.
0033 REM \D5\D0\C4\C1\D4\C5\D3; 10/24/89 BY RON MCKEE - SPLIT LINE 170 - ADDED
      TEST FOR THE "W" CHARACTER (80386 CPU).
0050 REM % The rev number is displayed by line 7020
0052 DIM A(100),A$3,A1(100),A1$(100)8,A2$11
0054 DIM B$2,B$(64)4,B1$(64)4
0056 DIM C$1,C1$2,C2$2,C(24)
0058 DIM D$(100)3,D1$1,D,D1
0060 DIM E(100),E1(100),E2(100),E$5,E$(100)7,E9(1)
0062 DIM F$(100)6,F1$(100)3,F
0064 DIM G
0066 DIM H$1,H1$57
0068 DIM I1,I2,I3,I4,I5,I1$(100)3
0070 DIM M$(100)11,M1$22
0072 DIM P$10,P1$14,P2$14,P9$3
0074 DIM R,R$(100)1
0076 DIM S(100),S$5
0078 DIM T$(100)3
0080 DIM V(100),V$(100)3
0082 DIM X
0084 DIM Y
0086 DIM Z,Z1,Z2
0088 DIM A9$8,A9,E8,F9$3,I9$3,V9$3,S9,T9$3
0100 INIT(00)B$,C$,C1$,C2$,E$,F$(),P$,R$,S$,A$,B$(),B1$(),E$(),R$()
0110 REM DEFAULT TEST PARMETERS
   : A9$="infinite"
   : A9=-1
   : E8=99999
   : S9=0
   : V9$,F9$,I9$,T9$=" no"
   : P9$="off"
   : REM NO. OF LINES ON THE SCREEN FOR THE DEVICE LIST
   : D=07
   : REM MAX NUMBER OF DEVICES
   : D1=100
0120 I1,I4,I=1
   : P,E9=0
   : REM MAXIUM NUMBER OF LINES TO PRINT ON PRINTER
   : P1=500
   : H1$=" "
   : REM NO. OF LINES ON THE SCREEN FOR THE DEVICE LIST
   : D=17
   : REM MAX NUMBER OF DEVICES
   : D1=100
   : GOTO 150
0130 D$(I)="DXX"
   : M$(I)="Unknown"
   : E$(I)="       "
   : E(I)=E8
0140 A1$(I)=A9$
   : A1(I)=A9
   : V$(I)=V9$
   : F1$(I)=F9$
   : I1$(I)=I9$
   : T$(I)=T9$
   : S(I)= S9
   : RETURN
0150 SELECT PRINT 005(80)
   : REM % First page
   : PRINT HEX(0306)
   : GOSUB 7020
0160 REM CHECK OS LEVEL
0170 P$=$PSTAT(1)
   : IF STR(P$,9,1)="M" AND STR(P$,10,1)>=HEX(18) THEN 180
   : IF STR(P$,9,1)="V"AND STR(P$,10,1)>=HEX(21)THEN 180
   : IF STR(P$,9,1)="W" THEN 180
0175 PRINT HEX(0E);AT(12,15);"CPU SOFTWARE MUST BE UPGRADED TO 'MVP 1.8' OR HI
     GHER, 'VP 2.1' OR HIGHER";
   : GOSUB '50
   : GOTO 100
0180 IF STR(P$,10,1)>=HEX(30) THEN A$="340"
   : ELSE A$="D10"
0190 PRINT AT(12,20,62);"Mount all devices to be tested"
   : GOSUB 7025
   : GOSUB 7010
   : PRINT AT(22,37);"SF'2 - alter defaults";
0200 GOSUB 7120
   : IF G=1 THEN 7150
   : IF C$=HEX(02) THEN 210
   : IF C$=HEX(0D) AND E9=0 THEN 260
   : IF E9<>3 THEN 200
   : E9=0
   : GOTO 120
0210 GOSUB 130
   : REM RETURN CODE
   : H1$="INITIAL"
0220 I1,I2,I3=1
   : GOSUB 860
   : GOSUB 1050
   : A9$=A1$(1)
   : A9=A1(1)
   : V9$= V$(1)
   : F9$=F1$(1)
   : I9$=I1$(1)
   : T9$=T$(1)
   : E8=E(1)
   : S9=S(1)
   : GOTO 120
0230 IF C$=HEX(42) OR C$=HEX(52) THEN 7150
   : IF C$<>HEX(01) THEN 200
   : GOSUB 3050
0240 GOSUB 7130
   : IF E9<>3 THEN 240
   : GOTO 100
0250 REM % Second page
   : PRINT HEX(06);AT(1,0,1840)
0260 REM % Second page
   : PRINT HEX(06);AT(1,0,1840)
   : REM % Start search for drives
   : GOSUB 7010
   : GOSUB 7100
   : REM Skip first time
   : GOTO 290
0270 IF A$<>"340" THEN 280
   : A$="D10"
   : GOTO 290
0280 IF STR(A$,3,1)="9" THEN STR(A$,3,1)="A"
   : ELSE STR( A$,3,1)=ADD HEX(01)
   : IF STR(A$,3,1) <="F" THEN 290
   : STR(A$,3,1)="0"
   : IF STR(A$,2,1)>="7" THEN 740
   : IF STR(A$,2,1)>"3" THEN STR(A$,2,1)=SUB HEX(03)
   : ELSE STR(A$,2,1)=ADD HEX(04)
0290 REM Get any input
   : GOSUB 7130
   : Y=0
   : IF G=1 THEN 120
   : IF E9=0 THEN 300
   : IF E9<>3 THEN 290
   : E9=0
   : PRINT HEX(03)
   : GOSUB 7100
   : GOSUB 7020
   : GOSUB 7010
0300 PRINT AT(12,25);"please wait"
   : IF P=0 THEN PRINT AT(12,37);"CHECKING ";A$
   : ELSE PRINT AT(12,37);"checking ";A$
   : IF P=0 THEN P=2
   : P=P-1
0310 D$(I)=A$
   : Y=0
   : SELECT #2<D$(I)>
   : ERRORX=ERR
   : GOTO 730
0320 REM SOMETIMES WAIT FOR READY Y=Y+1 IF Y=2 THEN GOTO 690
   : $OPEN 730,#2
   : ERRORX=ERR
   : GOTO 730
0330 IF A$<>"340" THEN 340
   : STR(R$,11,1)=HEX(C0)
   : GOTO 370
0340 INIT(00)R$
   : $GIO SEARCH FOR VALID DEVICES #2(0104 0200 1200 1212 1020 1200 1212 0B00
     70A0 4100 860B,R$)
   : ERRORX=ERR
   : GOTO 730
0350 REM If timeout skip usless addresses
   : IF STR(R$,8,1)<>HEX(10)THEN 360
   : STR(A$,3,1)="F"
   : GOTO 270
0360 IF STR(R$,11,1)>=HEX(D0) THEN 370
   : IF STR(A$,3,1)<"2" THEN 370
   : STR(A$,3,1)="F"
   : GOTO 270
   : REM NO MORE DEVICES ON CO TYPE DEVICES
0370 GOSUB 7670
   : VERIFY T#2,(0,0)E
   : ERRORE=1
   : REM THIS WILL STOP ANY SYSTEM ERROR REPORTS
0380 X=ERR
   : GOSUB 7690
   : IF E=0 OR X=93 OR X=95 OR X=96 THEN 390
   : GOTO 270
0390 R$(I)=STR(R$,11,1)
   : REM % Now lets look for the drive types
0400 E(I)=65407
   : M$(I)="Q2020"
   : GOSUB 600
0410 E(I)=65023
   : M$(I)="2275   WIN "
   : GOSUB 600
0420 E(I)=52607
   : M$(I)="2280"
   : GOSUB 600
0430 E(I)=38911
   : M$(I)="2275   WIN "
   : GOSUB 600
0440 E(I)=32639
   : M$(I)="1004"
   : GOSUB 600
0450 E(I)=19583
   : M$(I)="2260"
   : GOSUB 600
0460 E(I)=16319
   : M$(I)="1002"
   : GOSUB 600
0470 E(I)=9791
   : M$(I)="2230-1"
   : GOSUB 600
0480 E(I)=8127
   : M$(I)="1000"
   : GOSUB 600
0490 E(I)=9599
   : M$(I)="2260-1/2"
   : GOSUB 600
0500 E(I)=4159
   : M$(I)="2275   FLPm"
   : GOSUB 600
0510 E(I)=4799
   : M$(I)="2260-1/4"
   : GOSUB 600
0520 E(I)=3873
   : M$(I)="850 DSDD"
   : GOSUB 600
0530 E(I)=1279
   : M$(I)="2275   FLPk"
   : IF R$(I)=HEX(D0)THEN GOSUB 600
0540 E(I)=1231
   : M$(I)="2270a"
   : GOSUB 600
0550 E(I)=1023
   : M$(I)="2270"
   : GOSUB 600
0560 IF A$<>"340" THEN 580
   : E(I)=65535
   : M$(I)="SYSTEM RAMD"
   : VERIFY T#2,(0,E(I))E(I)
   : ERRORX=ERR
0570 E(I)=E(I)-2
   : GOSUB 600
   : GOTO 730
0580 E(I)=1
   : M$(I)="UNKNOWN"
   : GOSUB 600
   : REM ??????
   : GOTO 730
0590 REM HERE TO AUTO SIZE
0600 VERIFY T#2,(E(I),E(I))E
   : ERRORE=E
0610 X=0
   : IF E=0THEN 620
   : X=ERR
   : IF X<>93AND X<>95AND X<>96THEN RETURN
0620 GOSUB 7670
   : VERIFY T#2,(0,0)E
   : REM RESTORE HEADS
   : ERRORGOTO 630
0630 GOSUB 7690
   : RETURN CLEAR
   : STR(E$(I),,7)="I-   on"
   : IF X<>0 THEN CONVERT XTO STR(E$(I),3,2),(##)
   : ELSE E$(I)="       "
0640 IF I>1 AND M$(I)="Q2020" AND M$(I-1)="Q2020" AND STR(D$(I),1,2)=STR(D$(I-
     1),1,2) THEN  M$(I),M$(I-1)="Q2040"
   : IF STR(M$(I),1,4)="2270" AND STR(D$(I),2,2)="60" THEN STR(A$,3,1)="F"
0650 IF STR(M$(I),1,4)<>"2275" AND M$(I)<>"UNKNOWN" THEN 710
   : R$=" "
   : GOSUB '202
   : $GIOREADSTATUS#2(0600070070A0400288D070406A106816400087051A00C340,R$)R$;S
     TR(H1$,1,VAL(STR(R$,5,1)))
   : ERRORX=ERR
0660 IF STR(H1$,1,1)<>"3" OR STR(R$,6,3)<>HEX(000000) THEN 710
   : IF STR(A$,2,1)>"4" THEN 680
0670 IF STR(A$,3,1)="0" THEN STR(M$(I),1,6)="2200DS"
   : ELSE M$(I)="2200DS WIN "
   : IF STR(A$,3,1)="F" THEN M$(I) ="2200DS WINr"
   : GOTO 710
0680 IF STR(A$,3,1)<>"0" THEN 700
   : M$(I)="2200DS RAMD"
   : VERIFY T#2,(0,65534)E(I)
   : ERRORX=ERR
0690 E(I)=E(I)-2
   : IF E(I)<0 THEN E(I)=0
   : GOTO 710
0700 M$(I)="2200DS WIN "
   : REM TAPE?
   : IF STR(A$,3,1)="F" THEN 730
0710 GOSUB 140
   : IF E8<E(I) THEN E(I)=E8
   : IF S(I)>=(E(I)-7) THEN S(I)=E(I)-7
   : IF S(I)>=0 THEN 720
   : S(I)=0
   : E(I)=7
0720 I=I+1
0730 GOTO 270
0740 I4=I-1
   : IF I4<=D1 THEN 750
   : PRINT AT(12,22); "More than 100 devices mounted"; AT(13,12); "MULTID
     SK can display only 100 devices at one time"
   : GOSUB '50
0750 FOR I=I TO D1
   : GOSUB 130
   : NEXT I
0760 REM RESET 'EM
   : FOR I=1 TO I4
   : IF R$(I)<HEX(D0) THEN 780
   : SELECT #2<D$(I)>
   : ERRORX=ERR
   : GOTO 780
0770 GOSUB '204
0780 NEXT I
0790 I,I2,I3=I4
   : E9=0
   : IF I>D THEN I2=I1+D-1
   : IF I2>I4 THEN I2=I4
   : GOTO 850
0800 DEFFN '15
   : IF I4<D THEN RETURN
   : IF C$=HEX(1F) THEN 810
   : I1=I1+D
   : IF I1>I4 THEN I1=1
   : GOTO 830
0810 I1=I1-D
   : IF I1<=0 THEN 820
   : GOTO 830
0820 I1=MOD(I4,D)
   : IF I1=0 THEN I1=D
   : I1=I4-I1+1
   : GOTO 830
0830 I2=I1+D-1
   : IF I2>I4 THEN I2=I4
   : G=2
   : RETURN
0840 GOSUB 800
0850 GOSUB 860
   : GOTO 970
0860 REM % Print table
   : G=I
   : PRINT HEX(03);"";AT(1,0);"  Test  Frmt  Init   Ver      Address
      Model       Sector Range   Accesses"
   : FOR I=I1TO I2
0870 IF I4<>0THEN 880
   : D$(I),M$(I)="N/A"
   : S(I),E(I)=0
   : T$(I),E$(I)=" "
0880 PRINT AT((I-I1)+2,3);HEX(06); "";
   : PRINTUSING 890, T$(I),F1$(I),I1$(I),V$(I),E$(I),D$(I),M$(I),S(I),E(I),A1$
     (I);""
0890 %###   ###   ###   ###   ####### ###   ###########   #####/#####    #####
     ###
0900 NEXT I
0910 PRINT AT(1,1); BOX(1,78); AT(2,1); BOX(I-I1+1,78); AT(2,7); BOX(I-I1+1,0)
     ; AT(2,13);BOX(I-I1+1,0); AT(2,19); BOX(I-I1+1,0); AT(2,25); BOX(I-I1+1,0
     ); AT(2,39); BOX(I-I1+1,0);AT(2,53);BOX(I-I1+1,0);AT(2,68);BOX(I-I1+1,0)
0920 GOSUB 7100
   : GOSUB 7010
   : IF I4>0THEN 930
   : PRINT HEX(07); AT(20,0,79); AT(20,20); "   PROGRAM ABORTED. NO DISKS
      RESPONDING   "
   : GOSUB 7120
   : GOTO 920
0930 $CLOSE
   : I=I1
   : C1$=" "
   : I=G
   : RETURN
0940 IF I4>D AND E9<>1 THEN PRINT "";AT(22,36); "SF'15/31 - more device
     s"; AT(0,67); "(More)";
   : RETURN
0950 REM %  wait to return screen
   : GOSUB 7120
0960 IF E9<>3 THEN 950
   : E9=0
   : IF H1$<>"INITIAL" THEN 750
   : GOSUB 860
   : GOTO 1050
0970 IF H1$="INITIAL" THEN RETURN
   : REM % Parameters correct???
   : GOSUB 7010
   : C$="N"
0980 PRINT AT(20,0,79); AT(20,20);"Are all the above parameters correct?"
0990 PRINT AT(22,8,53);""; "Y/CONT - 'yes', N - 'no'"
1000 PRINT AT(23,39); "SF'10 - add device ";
1010 GOSUB 940
   : GOSUB 7120
   : IF G=1 THEN 120
   : IF G=2 AND I4>D THEN 840
   : IF E9=3 THEN 960
   : IF E9<>0 THEN 950
1020 IF C$<>HEX(0A) THEN 1030
   : I4=I4+1
   : GOTO 790
1030 IF H1$="INITIAL" THEN 1040
   : ON POS("YyNn"=C$)GOTO 1420,1420,1050,1050
   : IF C$=HEX(84) THEN 1420
   : GOTO 970
1040 IF C$=HEX(84) OR C$="Y" OR C$="y" THEN RETURN
   : IF C$="N" OR C$="n" THEN 1050
   : GOTO 970
1050 REM % ***SET PARAMETERS***
   : I=I1
   : GOSUB 7180
   : PRINT AT(20,20,59)
   : GOTO 1130
1060 DEFFN '250(Y,A2$)
1070 R=I-(I1-1)+1
   : I5=3
   : GOSUB 7190
   : IF STR(A2$,1,1)=" " THEN STR(A2$,1,1)=STR(A2$,2,1)
   : STR(A2$,1,1)=AND HEX(DF)
   : ON POS("YN"=STR(A2$,1,1))GOTO 1080,1090
   : A2$=" no"
   : PRINT AT(I-(I1-1)+1,Y);"   ";
   : GOTO 1070
1080 A2$="yes"
   : GOTO 1100
1090 A2$=" no"
1100 REM PRINT AT(I-(I1-1)+1,Y);"";A2$
   : IF G=2 AND I4>D THEN 1110
   : IF E9<>0 THEN 1120
   : RETURN
1110 RETURN  CLEAR
   : GOTO 840
1120 RETURN  CLEAR
   : GOTO 950
1130 REM %#1
   : GOSUB '250(3,T$(I))
   : T$(I)=A2$
   : GOSUB 7370
   : IF G=1 THEN 970
   : ON G1 GOTO 1130,1150,1140,1130,1130
   : G1=4
   : GOSUB 7370
   : GOTO 1340
1140 G1=4
   : GOSUB 7370
   : GOTO 1340
1150 REM %#2
   : GOSUB '250(9,F1$(I))
   : F1$(I)=A2$
   : GOSUB 7370
   : IF G=1 THEN 970
   : ON G1 GOTO 1130,1160,1130,1150,1150
1160 REM %#3
   : GOSUB '250(15,I1$(I))
   : I1$(I)=A2$
   : GOSUB 7370
   : IF G=1 THEN 970
   : ON G1 GOTO 1130,1170,1150,1160,1160
1170 REM %#4
   : GOSUB '250(21,V$(I))
   : V$(I)=A2$
   : GOSUB 7370
   : IF G=1 THEN 970
   : ON G1 GOTO 1130,1180,1160,1170,1170
   : GOTO 1180
1180 REM %#5
   : IF H1$="INITIAL" THEN 1300
   : A=0
   : A2$=D$(I)
   : I5=3
   : R=I-(I1-1)+1
   : Y=35
   : GOSUB 7190
   : FOR B=1 TO 3
   : H$=STR(A2$,B,1)
   : GOSUB 1200
   : STR(A2$,B,1)=H$
   : NEXT B
1190 IF STR(A2$,2,1)="X" AND STR(A2$,3,1)<>"X" THEN A=1
   : IF STR(A2$,3,1)="X" AND STR(A2$,2,1)<>"X" THEN A=1
   : IF A=1 THEN 1180
   : ELSE GOTO 1220
1200 CONVERT H$ TO E
   : ERRORX=ERR
   : H$=AND HEX(DF)
   : IF H$<"A" OR H$>"F" AND H$<>"X" THEN A=1
1210 IF B=1 AND H$<>"D" AND H$<>"B" AND H$<>"3" THEN A=1
   : RETURN
1220 IF STR(A2$,2,2)="XX" THEN 1270
   : SELECT #2<A2$>
   : E$(I)=" "
   : IF A2$="340" THEN 1240
   : $GIO CHECK VALID ADDRESS #2(0104 0200 1212 1020 1212 0B00 70A0 4100 860B
     4501,R$)
   : ERRORX=ERR
   : GOTO 1180
1230 IF STR(R$,8,1)<>HEX(10)THEN 1240
   : E$(I)="I-91 on"
   : GOTO 1260
1240 VERIFY T#2,(0,0)E
   : ERRORE=1
1250 IF E=0 THEN 1260
   : E$(I)="I-   on"
   : CONVERT ERR TO STR(E$(I),3,2),(##)
1260 R$(I)=STR(R$,11,1)
1270 D$(I)=A2$
   : GOSUB 7370
   : IF G=1 THEN 970
   : IF G=2 AND I4>D THEN 840
   : IF E9<>0 THEN 950
   : ON G1 GOTO 1130,1280,1170,1180,1180
1280 REM %#6
   : IF H1$="INITIAL" THEN 1170
   : A2$=M$(I)
   : I5=11
   : R=I-(I1-1)+1
   : Y=41
   : GOSUB 7190
   : M$(I)=A2$
   : GOSUB 7370
   : IF G=1 THEN 970
   : IF G=2 AND I4>D THEN 840
   : IF E9<>0 THEN 950
   : ON G1 GOTO 1130,1300,1180,1280,1280
1290 REM %#7
   : PRINT AT(20,22); "'Sector range must be greater than 8'"
1300 CONVERT S(I)TO A2$,(#####)
   : I5=5
   : R=I-(I1-1)+1
   : Y=55
   : GOSUB 7190
   : S$=A2$
   : PRINT AT(20,0,79);
   : CONVERT S$TO S(I)
   : ERRORX=ERR
   : GOTO 1300
1310 IF G1=0 OR G1=2 AND G<>1 AND G<>2 THEN 1320
   : IF S(I)+7>E(I) THEN 1300
   : GOSUB 7370
   : IF G=1 THEN 970
   : IF G=2 AND I4>D THEN 840
   : IF E9<>0 THEN 950
   : ON G1 GOTO 1130,1320,1280,1300,1300
   : GOTO 1320
1320 REM %#8
   : CONVERT E(I)TO A2$,(#####)
   : R=I-(I1-1)+1
   : Y=61
   : I5=5
   : GOSUB 7190
   : E$=A2$
   : CONVERT E$TO E(I)
   : ERRORX=ERR
   : GOTO 1320
1330 IF G1=3 THEN 1300
   : IF S(I)+7>E(I) THEN 1290
   : GOSUB 7370
   : IF G=1 THEN 970
   : IF G=2 AND I4>D THEN 840
   : IF E9<>0 THEN 950
   : ON G1 GOTO 1130,1340,1300,1320,1320
1340 REM %#9
   : PRINT AT(20,0,79)
1350 IF A1$(I)<>"infinite" THEN CONVERT A1(I)TO A1$(I),(########)
   : ELSE A1(I)=-1
1360 R=I-(I1-1)+1
   : Y=70
   : I5=8
   : A2$=A1$(I)
   : GOSUB 7190
   : A1$(I)=A2$
   : IF A1$(I)<>"INFINITE" AND A1$(I)<>"infinite"AND A1$(I)<>"        " THEN 1
     370
   : A1$(I)="infinite"
   : GOTO 1400
1370 CONVERT A1$(I) TO A1(I)
   : ERRORX=ERR
   : GOTO 1340
1380 CONVERT A1(I) TO A1$(I),(########)
1390 REM CLEAR PREV MESSAGE (LINE 1030)
   : PRINT AT(20,0,79)
   : IF A1(I)>7 OR A1(I)=0 THEN 1400
   : PRINT AT(20,20); "'Accesses must be 0 or greater than 7'"
   : GOTO 1350
1400 GOSUB 7370
   : IF G=1 THEN 970
   : IF G=2 AND I4>D THEN 840
   : IF E9<>0 THEN 950
   : ON G1 GOTO 1130,1410,1320,1340,1340
1410 G1=1
   : GOSUB 7370
   : GOTO 1130
1420 REM % ***FORMAT***
   : REM Get and/or check the password
   : PRINT AT(23,39,34);
   : GOSUB 940
   : GOSUB 7400
   : IF E9<>0 THEN 1430
   : IF G=1 THEN 970
   : I=1
   : IF G<>2 THEN 1440
   : GOSUB 800
   : GOSUB 860
   : GOTO 1420
1430 GOSUB 7130
   : IF E9<>3 THEN 1430
   : E9=0
   : GOSUB 860
   : GOTO 1420
1440 IF T$(I)=" no" OR F1$(I)=" no" OR D$(I)="340" THEN 1510
1450 PRINT AT(20,20,);"Formatting device ";D$(I);"";
   : SELECT #2<D$(I)>
   : PRINT ""; AT(22,1); "CHECK: to ensure that the device is formatting
      and the system isn't hung"
1460 $FORMATDISK T#2
   : ERRORX=ERR
   : IF X<>92THEN 1490
   : PRINT AT(20,20,59); "Press the format button for ";D$(I);""; AT(22,1,78
     ); "Press: CONT when the format is completted"
   : GOTO 1480
1470 GOTO 1490
1480 GOSUB 7120
   : PRINT AT(20,20,)
   : IF G=1 THEN 970
   : IF E9<>0 THEN 1430
   : IF C$<>HEX(84) THEN 1480
1490 DATA LOAD BA T#2,(E(I))B$()
   : ERRORX=ERR
   : CONVERT I TO C1$,(##)
   : PRINT AT(20,20,59);"";
   : IF X=93THEN PRINT "Device #"; D$(I); " still has a format error";
   : ELSE PRINT "ERROR I-";X;" on DEVICE #";D$(I);""
   : GOSUB 7010
   : GOSUB '50
   : GOTO 970
1500 E$(I)=ALL(" ")
1510 I=I+1
   : IF I<=I4 THEN 1440
1520 REM % ***SET PARAMETERS***
   : PRINT AT(20,20,59)
1530 X=0
   : FOR I=1TO I4
   : A(I),E1(I),E2(I),V(I)=0
   : REM  G=I+35
   : REM GOSUB 760
   : IF T$(I)<>"yes" OR STR(D$(I),2,2)="XX" THEN 1540
   : X=X+1
   : V(I)=X
   : REM   G=X GOSUB 760
   : F$(I)="----"
1540 NEXT I
   : I3=X
   : V=I4-X
   : Z1=1
   : Z2=1
1550 IF X<>0THEN 1570
1560 REM % Parameter error
   : PRINT AT(20,15,64);"RECHECK PERAMETERS, NO DEVICES ARE SELECTED"
   : GOSUB 7010
   : GOSUB '50
   : GOTO 790
1570 REM % ***START TEST***
1580 Z=1
   : S=RND(0)
   : REM For testing; IF STR(P$,9,1)="V"THEN 1130; GOTO 1130; $RELEASETERMINAL
     TO 3
1590 IF Z=0 THEN 760
   : M1$=ALL (" ")
1600 GOSUB 1610
   : GOTO 1640
1610 IF E9=1 THEN RETURN
   : IF Z=0THEN 760
   : REM % Print test header
   : PRINT HEX(03);""; AT(1,0);"Address  Function          Accesses
         Sectors    Hard Errors  Soft Errors";HEX(0D);BOX(0,80); AT(0,29); M1$
   : GOSUB 7010
1620 IF I3>D AND E9<>1 THEN PRINT "";AT(22,36); "SF'15/31 - more device
     s"; AT(0,67); "(More)";
   : GOTO 7100
1630 %  ###     ######        ##,###,###,###     #####/#####     #####
     #####
1640 I=1
   : M1$=HEX(02040B000E)& "INITIALIZING"&HEX(020402000F)
   : REM LOOP TO I3 (1420)
   : GOSUB 2490
1650 C$=" "
   : IF T$(I)=" no" THEN 1960
   : FOR G=1 TO I4
   : IF V$(G) ="yes" OR I1$(G)="yes"  AND T$(G)="yes" THEN C$="Y"
   : NEXT G
   : G=0
   : IF C$=" " THEN 1670
1660 GOSUB '220
   : B$(2)=D$(I)
   : SELECT #2<D$(I)>
   : IF V$(I)="yes" OR I1$(I)="yes" THEN F$(I)="INIT "
1670 IF I1$(I)<>"yes" AND V$(I)<>"yes" THEN 1960
   : STR(F$(I),6,1)="w"
   : PRINT AT(0,25);M1$
1680 GOSUB 2490
   : IF R$(I)<>HEX(D0)THEN 1790
   : B$(1)=BIN(S(I),2)
   : L=S(I)-1
   : B=INT((E(I)-S(I)+1)/4)
   : IF I1$(I)=" no" THEN 1750
   : GOSUB 7630
1690 Q=0
   : FOR C=1 TO B
1700 REM %INIT (sequentially fill disk)
   : GOSUB 1990
1710 B$=B$(1)
   : GOSUB 2600
   : REM CLEAR THIS
   : A(I)=0
   : IF X<>0 THEN GOTO 2050
1720 IF INT(C/2)<>C/2 OR Q=0 THEN 1730
   : IF Q=1 THEN GOSUB '201
   : IF Q=0 THEN 1730
   : B$(1)=B$
   : GOTO 1700
1730 NEXT C
   : C=(E(I)-S(I)+1)-(B*4)
   : IF C=0 THEN 1750
   : FOR B=1 TO C
   : L=VAL(B$(1),2)
   : DATA SAVE BA T#2,(B$(1),B$(1))B$()
   : ERRORX=ERR
   : GOTO 2050
1740 NEXT B
1750 STR(F$(I),6,1)="r"
   : GOSUB 7630
   : IF V$(I)=" no" THEN 1900
   : S=S(I)
1760 B$=BIN(S,2)
   : L=L+1
   : DATA LOAD BA T#2,(S,S)B$()
   : ERRORX=ERR
   : GOTO 2050
1770 GOSUB 2020
   : GOSUB 1990
1780 IF S<=E(I)THEN 1760
   : GOTO 1960
1790 IF I1$(I)=" no" THEN STR(F$(I),6,1)="r"
1800 REM THIS IS INTERLEAVING OF THE SECTORS
1810 IF E(I)<1232THEN 1820
   : C=24
   : C(1)=0
   : C(2)=20
   : C(3)=17
   : C(4)=12
   : C(5)=9
   : C(6)=4
   : C(7)=1
   : C(8)=21
   : C(9)=16
   : C(10)=13
   : C(11)=8
   : C(12)=5
   : C(13)=2
   : C(14)=22
   : C(15)=19
   : C(16)=14
   : C(17)=11
   : C(18)=6
   : C(19)=3
   : C(20)=23
   : C(21)=18
   : C(22)=15
   : C(23)=10
   : C(24)=7
   : GOTO 1830
1820 C=16
   : C(1)=0
   : C(2)=8
   : C(3)=1
   : C(4)=9
   : C(5)=2
   : C(6)=10
   : C(7)=3
   : C(8)=11
   : C(9)=4
   : C(10)=12
   : C(11)=5
   : C(12)=13
   : C(13)=6
   : C(14)=14
   : C(15)=7
   : C(16)=15
1830 IF I1$(I)=" no" AND V$(I)=" no" THEN 1900
   : GOSUB 7630
   : FOR A=INT(S(I)/C) TO (E(I)+1)/C
   : FOR B=1TO C
   : GOSUB 1990
   : IF A*C+C(B)<S(I)OR A*C+C(B)>E(I)THEN 1880
1840 IF STR(F$(I),6,1)="r" THEN 1860
   : B$(1)=BIN(A*C+C(B),2)
   : L=VAL(B$(1),2)
   : DATA SAVE BA T#2,(B$(1))B$()
   : ERRORX=ERR
   : GOTO 2050
1850 GOTO 1880
1860 B$=BIN(A*C+C(B),2)
   : L=VAL(B$,2)
   : DATA LOAD BA T#2,(B$)B$()
   : ERRORX=ERR
   : GOTO 2050
1870 GOSUB 2020
1880 NEXT B,A
1890 IF STR(F$(I),6,1)="r" THEN 1960
   : IF V$(I)=" no" THEN 1900
   : STR(F$(I),6,1)="r"
   : GOTO 1830
1900 B$=BIN(S(I),2)
   : L=S(I)
   : DATA LOAD BA T#2,(S(I))B$()
   : ERRORX=ERR
   : B$(1)=B$
   : GOTO 2050
1910 GOSUB 2020
1920 B$=BIN(E(I),2)
   : L=E(I)
   : DATA LOAD BA T#2,(E(I))B$()
   : ERRORX=ERR
   : B$(1)=B$
   : GOTO 2050
1930 GOSUB 2020
1940 B$=BIN((E(I)-S(I))/2+S(I),2)
   : L=VAL(B$,2)
   : DATA LOAD BA T#2,((E(I)-S(I))/2+S(I))B$()
   : ERRORX=ERR
   : B$(1)=B$
   : GOTO 2050
1950 GOSUB 2020
1960 STR(F$(I),6,1)=" "
   : I=I+1
   : IF I<=I4 THEN 1650
   : REM Set printer counter to 1
   : P=1
1970 G=1
   : GOSUB 2470
   : M1$="    TESTING"
   : PRINT AT(0,25,16); M1$
   : GOTO 2250
1980 REM % Check for input during init and act on it
1990 GOSUB 7130
   : IF E9<>3 THEN 2000
   : E9,G=0
   : GOSUB 1610
   : GOTO 2470
2000 IF G<>1 THEN 2010
   : RETURN  CLEAR  ALL
   : GOTO 760
2010 IF G<>2 THEN RETURN
   : G=0
   : GOTO 2400
2020 IF B$=B$(1)AND D$(I)=B$(2)THEN RETURN
   : GOTO 2150
2030 REM % Error report
   : PRINT AT(21,1,78);"Last error: ";H1$;" on disk ";D$(I);"/sector"; VAL(
     B$,2);"during a ";F$(I); " and was ";E$;
   : Q,G=0
   : GOSUB 2160
   : RETURN
2040 REM #1 Read Errors
   : H1$="DATA COMPARE,"
   : E$="SOFT"
   : GOSUB 2030
   : G=1
   : RETURN
2050 REM % #2 for INIT errors
   : RETURN  CLEAR  ALL
2060 E$="HARD"
   : H1$="I-"
   : CONVERT X TO STR(H1$,3,2),(##)
   : GOSUB 2030
   : FOR G=35 TO 70
   : Y=G
   : IF D$(I)=D$(G) THEN G=70
   : NEXT G
2070 STR(E$(Y),,7)="I-   on"
   : F$(I)="I-     "
   : CONVERT X TO STR(E$(Y),3,2),(##)
   : STR(F$(I),3,2)=STR(E$(Y),3,2)
   : T$(I)=" no"
   : T$(Y)=" no"
   : GOSUB 7630
   : GOTO 1960
2080 GOSUB 2110
   : GOSUB 7690
2090 GOTO 2230
2100 REM % Check for input during testing and act on it
2110 GOSUB 7130
   : IF E9<>3 THEN 2120
   : E9=0
   : G=1
   : GOSUB 1610
   : GOTO 2470
2120 IF G<>1 THEN 2130
   : RETURN  CLEAR  ALL
   : GOSUB 7650
   : GOTO 760
2130 IF G<>2 THEN RETURN
   : GOSUB 2400
   : GOTO 7600
2140 REM % #3 hard/soft errors
   : H1$="I-"
   : CONVERT X TO STR(H1$,3,2),(##)
   : GOSUB 2030
   : GOTO 2230
2150 REM % Seek Errors
   : H1$="SEEK ERRORS,"
   : E$="SOFT"
   : GOSUB 2030
   : RETURN
2160 REM % PRINT ERROR
   : IF P9$="off" THEN 2220
   : REM IF MAX NUMBER OF LINES PRINTED OR PRINTER NOT SELECED THEN RETURN
   : IF P9$="215" THEN 2180
2170 REM % 204 Printer
   : $OPEN 2210,/204
   : PRINT AT(0,25,16); "Printer 204 - buffer full";
   : SELECT PRINT 204
   : $IF OFF /204,2210
   : GOTO 2190
2180 REM % 215 Printer
   : $OPEN 2210,/215
   : $GIO/215(410D)
   : $IF OFF /215,2210
   : PRINT AT(0,25,16); "Printer 215 - buffer full";
   : SELECT PRINT 215
   : REM %
2190 P=P+1
   : IF G=1 THEN PRINT "COMPARE";
   : ELSE PRINT TAB(3); E$;
   : PRINT " ERROR ";
   : IF G<>1 THEN PRINT "I-";X;
   : ELSE PRINT "----- ";
2200 PRINT  " disk "; D$(I);" sec";VAL(B$(1),2);TAB(40);"during ";STR(F$(I),,6
     );
   : IF STR(F$(I),1,4)<>"INIT" THEN PRINT TAB(54);" -- accesses=";A(I);
   : PRINT
2210 SELECT PRINT 005
   : $CLOSE/215
   : $CLOSE/204
2220 PRINT AT(0,25,25);M1$
   : IF P=P1 THEN 7090
   : RETURN
2230 $CLOSE#2
   : $BREAK
   : RETURN  CLEAR  ALL
   : C=0
   : $IF OFF /005,2250
2240 GOSUB 7610
2250 REM Check for End of test
   : X=INT((RND(1)*(I4-V))+1)
   : I=0
2260 I=I+1
   : IF I>I4 THEN 2250
   : IF V(I)<>0 THEN X=X-1
   : IF X>0 THEN 2260
   : IF T$(I)=" no" OR A1(I)=0 THEN 2270
   : IF A1$(I)="infinite" OR A(I)<A1(I) THEN 2290
2270 REM % End of test
   : IF V(I)<>0 THEN 2280
   : I=I+1
   : IF I>I4 THEN I=1
   : GOTO 2260
2280 V(I)=0
   : V=V+1
   : IF V<I4 THEN 2250
   : PRINT AT(0,25,54); "TEST COMPLETE"
   : GOSUB 7650
   : GOSUB '50
   : GOTO 760
2290 SELECT #2<D$(I)>
   : GOSUB '220
   : GOSUB 7670
   : B$(2)=D$(I)
   : $OPEN 2250,#2
   : IF A(I)>99999999991 THEN A(I)=0
2300 S,S1=INT(RND(1) * ((E(I)-S(I))-7)+S(I))
   : IF S<S(I)OR S+07>E(I) THEN 2300
   : IF T$(I)=" no" THEN 2250
   : B$,B$(1)=BIN(S,2)
   : R=RND(1)
   : IF R<=.25THEN 2380
   : IF R<=.50THEN 2330
   : IF R<=.75THEN 2320
2310 REM % Verify
   : F$(I)="VERIFY"
   : GOSUB 7600
   : GOSUB 2520
   : GOTO 2080
2320 REM % Read
   : F$(I)="READ"
   : GOSUB 7600
   : GOSUB 2540
   : GOSUB 2540
   : GOTO 2080
2330 REM % R/A/W
   : F$(I)="R/A/W"
   : GOSUB 7600
2340 REM WRITE 00 AS DATA
   : INIT (00) B$()
   : B$(2)=D$(I)
   : B$(1),B$=BIN(S,2)
2350 GOSUB 2600
   : IF Q=1 THEN GOSUB '201
   : IF Q=2 THEN GOSUB 2630
   : GOSUB 2540
   : GOSUB 2600
   : IF X<>0 THEN 2630
2360 IF Q=1 THEN GOSUB '201
   : IF Q=2 THEN GOSUB 2630
   : GOSUB 2540
   : GOSUB 2110
   : REM WRITE DATA PATTERN
   : GOSUB '220
   : S=S1
   : B$(2)=D$(I)
   : B$(1),B$=BIN(S,2)
2370 GOSUB 2600
   : IF X<>0 THEN 2630
   : IF Q=1 THEN GOSUB '201
   : IF Q=2 THEN GOSUB 2630
   : GOSUB 2540
   : GOSUB 2600
   : IF Q=1 THEN GOSUB '201
   : IF Q=2 THEN GOSUB 2630
   : GOSUB 2540
   : GOTO 2080
2380 REM % Write
   : F$(I)="WRITE"
   : GOSUB 7600
2390 GOSUB 2600
   : IF X<>0 THEN 2630
   : GOSUB 2600
   : IF X<>0 THEN 2630
   : IF Q=1 THEN GOSUB '201
   : IF Q=2 THEN GOSUB 2630
   : GOTO 2080
2400 REM % CHANGE PAGE
   : IF I3<D THEN RETURN
   : X=0
   : IF C$=HEX(1F) THEN 2420
2410 IF Z1+D<=I3 THEN 2430
   : Z1,Z2=1
   : GOTO 2470
2420 Y=D
   : IF Z1-D>=0 THEN 2450
   : Z1=I4
   : Z2=INT(I3/D)
   : IF MOD(I3,D)=0 THEN Z2=Z2+1
   : ELSE Z2=Z2+2
   : REM GET SIZE OF LAST PAGE
   : Y=MOD(I3,D)
   : IF Y=0 THEN Y=D
   : GOTO 2450
2430 Z1=Z1+1
   : IF Z1<=I4 THEN 2440
   : Z1,Z2=1
   : GOTO 2470
2440 IF V(Z1)<>0 THEN X=X+1
   : IF X<D THEN 2430
   : Z2=Z2+1
   : GOTO 2470
2450 Z1=Z1-1
   : IF Z1>0 THEN 2460
   : Z1,Z2=1
   : GOTO 2470
2460 IF V(Z1)<>0 THEN X=X+1
   : IF X<Y THEN 2450
   : Z2=Z2-1
2470 REM % Print page
   : PRINT AT(2,0,(D*80))
   : IF G=0 THEN 2490
   : X=0
   : G=I
   : FOR I=Z1 TO I4+1
   : IF V(I)=0 THEN GOTO 2480
   : GOSUB 7610
   : X=X+1
   : IF X>=D THEN I=I4+1
2480 NEXT I
   : GOTO 2510
2490 G=I
   : X=0
   : FOR I=Z1 TO I4
   : IF V(I)=0 THEN GOTO 2500
   : GOSUB 7630
   : X=X+1
   : IF X>=D THEN I=I4+1
2500 NEXT I
   : GOTO 2510
2510 I=G
   : G=0
   : RETURN
2520 L=0
2530 VERIFY T#2,(S,S+07)L
   : IF L=0THEN A(I)=A(I)+08
   : ELSE A(I)=A(I)+L-S1
   : IF L<>0THEN 2630
   : RETURN
2540 REM %Read 4 * 2 Sectors
   : F=1
   : FOR X=1 TO 4
2550 L=S
   : A(I)=A(I)+1
   : DATA LOAD BA T#2,(S,S)B1$()
   : ERRORX=ERR
   : RETURN  CLEAR  ALL
   : GOTO 2630
2560 IF B1$(1)<>B$ OR B1$(2)<>D$(I) THEN 2580
2570 IF B$(15)<>HEX(00) THEN 2590
   : IF STR(B1$(),15,240)=STR(B$(),15,240) THEN 2590
2580 GOSUB 2150
   : E2(I)=E2(I)+1
   : RETURN  CLEAR
   : GOTO 2230
2590 ADDC(B$,01)
   : NEXT X
   : X=0
   : RETURN
2600 REM %Write 4 * 2 Sectors
   : IF Q=0 AND R$(I)=HEX(D0) THEN GOSUB '200
   : F=2
   : FOR X=1 TO 4
2610 L=VAL(B$(1),2)
   : A(I)=A(I)+1
   : DATA SAVE BA T#2,(B$(1),B$(1))B$()
   : ERRORX=ERR
   : RETURN
2620 NEXT X
   : X=0
   : RETURN
2630 GOSUB '204
2640 GOSUB 2110
   : $IF OFF /005,2650
   : PRINT AT(0,25,16);"CHECKING ERROR"
2650 A(I)=A(I)+1
   : C=C+1
   : IF L>E(I) OR F$(I)="VERIFY" THEN L=L-1
   : B$(1)=BIN(L,2)
   : S=L
   : IF F$(I)<>"VERIFY"THEN 2660
   : VERIFY T#2,(L,L)L
   : IF L=0THEN 2740
   : X=ERR
   : GOTO 2750
2660 IF F$(I)<>"READ"THEN 2690
2670 DATA LOAD BA T#2,(S)B$()
   : ERRORX=ERR
   : GOTO 2750
2680 GOTO 2740
2690 IF F$(I)<>"WRITE"THEN 2720
2700 L=VAL(B$(1),2)
   : DATA SAVE BA T#2,(B$(1))B$()
   : ERRORX=ERR
   : GOTO 2750
2710 GOTO 2740
2720 IF F$(I)<>"R/A/W"THEN STOP "ERROR ??????? "#
   : IF F=1 THEN 2670
   : IF F=2 THEN 2700
2730 E$="HARD "
   : E1(I)=E1(I)+1
   : IF E1(I)>99999THEN E1(I)=99999
   : PRINT AT(0,25,16);M1$
   : GOTO 2040
2740 E$="SOFT "
   : E2(I)=E2(I)+1
   : IF E2(I)>99999THEN E2(I)=99999
   : GOTO 2770
2750 IF C<1 THEN 2640
   : $IF OFF /005,3050
   : PRINT AT(0,25,16);M1$
2760 E$="HARD "
   : E1(I)=E1(I)+1
   : IF E1(I)>99999THEN E1(I)=99999
2770 GOTO 2140
2780 DEFFN'200
   : REM %'200
   : IF D$(I)="340" THEN RETURN
   : GOSUB '202
   : $GIO BEGIN MSG WRITE #2(0600 0700 70A0 4002 88D0 7040 6A10 6810 4000,R$)
   : Q=1
   : GOSUB '203
   : IF Q=2 THEN Q=0
   : RETURN
2790 DEFFN'201
   : REM %'201
   : IF D$(I)="340" THEN RETURN
   : GOSUB '202
   : $GIO END MSG WRITE #2,(0600 0700 70A0 4002 88D0 7040 6A10 6811 4000 8B67,
     R$)
   : Q=0
   : GOSUB '203
   : RETURN
2800 DEFFN '202
   : REM FORMAT THE DRIVE NUMBER FOR GO STATEMENT
   : IF STR(D$(I),1,1)="B" THEN 2820
   : IF STR(D$(I),1,1)="D" AND STR(D$(I),3,1)="0" THEN 2820
2810 HEXPACK STR(R$,1,1) FROM STR(D$(I),2,2)
   : STR(R$,1,1)=AND HEX(0F) SUB HEX(01)
   : GOTO 2830
2820 STR(R$,1,1)=HEX(10)
2830 STR(R$,1,1)=OR HEX(20)
   : RETURN
2840 DEFFN'203
   : REM %'203
   : IF STR(R$,6,3)=HEX(000000)THEN RETURN
   : IF STR(R$,6,1)=HEX(01)OR STR(R$,6,1)=HEX(02)OR STR(R$,6,1)=HEX(04)OR STR(
     R$,7,1)=HEX(01)OR STR(R$,7,1)=HEX(02)OR STR(R$,7,1)=HEX(04)OR STR(R$,8,1)
     =HEX(04)THEN 2850
   : PRINT HEX(03);AT(12,27);
   : STOP "ERROR ?????????? "#
2850 B$(1)=BIN(S1,2)
   : Q=2
   : RETURN
2860 DEFFN'204
   : REM %'204
   : REM also at line 500
   : Q=0
   : IF D$(I)<>"340" THEN $GIO RESET #2,(4501)
   : RETURN
2870 DEFFN'220
   : REM %'220     select data to write to disk
   : IF M$(I)<>"850 DSDD"AND STR(M$(I),,3)<>"100"AND M$(I)<>"Q2040"THEN 2910
   : ON INT((RND(1)*3)+1)GOTO 2880,2890,2900
2880 B$()=HEX(DB6DB6)&STR(B$())
   : RETURN
2890 B$()=HEX(B6DB6D)&STR(B$())
   : RETURN
2900 B$()=HEX(6DB6DB)&STR(B$())
   : RETURN
2910 IF M$(I)<>"2280"THEN 2960
   : ON INT((RND(1)*4)+1)GOTO 2920,2930,2940,2950
2920 B$()=HEX(3B63B63B)&STR(B$())
   : RETURN
2930 B$()=HEX(E255FE25)&STR(B$())
   : RETURN
2940 B$()=HEX(FFFFA924)&STR(B$())
   : RETURN
2950 B$()=HEX(FE254A80)&STR(B$())
   : RETURN
2960 ON INT((RND(1)*8)+1)GOTO 2970,2980,2990,3000,3010,3020,3030,3040
2970 B$()=HEX(55AAA55A)&STR(B$())
   : RETURN
2980 B$()=HEX(A55AAA55)&STR(B$())
   : RETURN
2990 B$()=HEX(5A55AAA5)&STR(B$())
   : RETURN
3000 B$()=HEX(55A55AAA)&STR(B$())
   : RETURN
3010 B$()=HEX(A55A55AA)&STR(B$())
   : RETURN
3020 B$()=HEX(AA55A55A)&STR(B$())
   : RETURN
3030 B$()=HEX(AAA55A55)&STR(B$())
   : RETURN
3040 B$()=HEX(5AAA55A5)&STR(B$())
   : RETURN
3050 DEFFN '0
   : REM % Help messages for errors
   : IF C$=HEX(0D) AND E9<>4 THEN 3060
   : IF E9=1 THEN 3480
   : IF E9<>4 THEN 3060
   : PRINT HEX(06);
   : RETURN  CLEAR
   : GOTO 3480
3060 IF X<90 OR X>99 THEN X=90
   : PRINT HEX(03);AT(22,0);BOX(2,79)
   : GOSUB 7025
   : PRINT AT(22,31 ); "or SF'0 to return to normal screen"; AT(20,25);
   : CONVERT X TO C1$,(##)
   : E9=4
   : LINPUT "Define error I-"? C1$
   : E9=0
   : CONVERT C1$ TO X
   : ERRORX=ERR
   : GOTO 3060
3070 E9=1
   : PRINT HEX(06);AT(1,0,1600); AT(4,0);
   : ON X-89GOTO 3080,3110,3160,3190,3230,3260,3300,3360,3400,3440
   : GOTO 3060
3080 PRINT "ERR I-90";HEX(0A0A0D);"Error:      DISK HARDWARE ERROR";HEX(
     0A0D);"Cause:      The disk did not respond properly to the system at the
      beginning of             a read or write operation; the operation has no
     t been performed."
3090 PRINT HEX(0D);"Recovery:   Run the program again. If the error persists,
     ensure that disk unit             is powered on and that all cables are p
     roperly connected."
3100 GOTO 3490
3110 PRINT "ERR I-91";HEX(0A0A0D);"Error:      DISK HARDWARE ERROR";HEX(
     0A0D);"Cause:      A disk hardware error occurred because the disk is not
      in file-ready            position. If the disk is in LOAD mode or if the
      power is not turned"
3120 PRINT HEX(0C);"            on, for example, the disk is not in file-ready
      position and a disk              hardware error is generated."
3130 PRINT HEX(0D);"Recovery:   Run the program again. If the error recurs, be
      sure the disk is                 turned on, properly set up for operatio
     n, and that all cables are               properly connected. Set the disk
      into LOAD mode and then back into";
3140 PRINT "            RUN mode by using the RUN/LOAD selection switch."
3150 GOTO 3490
3160 PRINT "ERR I-92";HEX(0A0A0D);"Error:      TIMEOUT ERROR";HEX(0A0D);
     "Cause:      The device did not respond to the system in the proper amoun
     t of                time (time-out). The read or write operation has not
     been performed."
3170 PRINT HEX(0D);"Recovery:   Run the program again. If the error persists,
     be sure that the disk             platter has been formatted."
3180 GOTO 3490
3190 PRINT "ERR I-93";HEX(0A0A0D);"Error:      FORMAT ERROR";HEX(0A0D);"
     Cause:      A format error was detected during a disk operation. This err
     or in-             dicates that certain sector-control information is inv
     alid. If this"
3200 PRINT HEX(0C);"            error occurs during a read or write operation,
      the platter may need             to be reformatted. If this error occurs
      during formatting, there may            be a flaw on the platter's surfa
     ce."
3210 PRINT HEX(0D);"Recovery:   Format the disk platter again. If the error pe
     rsists, replace the               media."
3220 GOTO 3490
3230 PRINT "ERR I-94";HEX(0A0A0D);"Error:      FORMAT KEY ENGAGED";HEX(0
     A0D);"Cause:      The disk format key is engaged. The key should be engag
     ed only when             formatting a disk."
3240 PRINT HEX(0A);"Recovery:   Turn off the format key."
3250 GOTO 3490
3260 PRINT "ERR I-95";HEX(0A0A0D);"Error:      DEVICE ERROR";HEX(0A0D);"
     Cause:      A device fault occurred indicating that the disk could not pe
     rform              the requested operation. This error may result from an
      attempt to"
3270 PRINT "            write to a write-protected platter."
3280 PRINT HEX(0A);"Recovery:   If writing, make sure the platter is not write
     -protected. Repeat the            operation. If the error persists, power
      the disk off and then on,               and then repeat the operation."
3290 GOTO 3490
3300 PRINT "ERR I-96";HEX(0A0A0D);"Error:      DATA ERROR (CRC)";HEX(0A0
     D);"Cause:      For read operations, the checksum calculations (CRC or EC
     C) indicate            that the data read is incorrect. The sector read m
     ay have been writ-"
3310 PRINT HEX(0C);"            ten incorrectly. For disk drives that perform
     error correction                  (ECC), the error correction attempt was
      unsuccessful. For write op-             erations, the LRC calculation in
     dicates that the data sent to the"
3320 PRINT "            disk was incorrect. The data has not been written."
3330 PRINT HEX(0A);"Recovery:   For read errors, rewrite the data. If read err
     ors persist, the disk             platter should be reformatted. For writ
     e errors, the write operation            should be repeated. If write err
     ors persist, ensure that all cable"
3340 PRINT "            connections are properly made and are tight."
3350 GOTO 3490
3360 PRINT "ERR I-97";HEX(0A0A0D);"Error:      LONGITUDINAL REDUNDANCY C
     HECK ERROR";HEX(0A0A0D);"Cause:      A longitudinal redundancy check erro
     r occurred when reading or writ-"
3370 PRINT HEX(0C);"            ing a sector. Usually, this error indicates a
     transmission error                between the disk and the CPU. However,
     the sector being accessed                may have been previously written
      incorrectly."
3380 PRINT "Recovery:   Run the program again. If the error persists, rewrite
     the flawed                sector."
3390 GOTO 3490
3400 PRINT "ERR I-98";HEX(0A0A0D);"Error:      PLATTER NOT MOUNTED";HEX(
     0A0A0D);"Cause:      The disk sector being addressed is not on the disk,
     or the disk"
3410 PRINT HEX(0C);"            platter is not mounted. (The maximum legal sec
     tor address depends               upon the disk model used.)"
3420 PRINT HEX(0A);"Recovery:   Mount a platter in the specified drive."
3430 GOTO 3490
3440 PRINT "ERR I-99";HEX(0A0A0D);"Error:      READ-AFTER-WRITE ERROR";H
     EX(0A0A0D);"Cause:      The comparison of read-after-write to a disk sect
     or failed, indicat-"
3450 PRINT HEX(0C);"            ing that the information was not written prope
     rly. This error usual-            ly indicates that the disk platter is d
     efective."
3460 PRINT "Recovery:   Write the information again. If the error persists, tr
     y a new plat-             ter."
3470 GOTO 3490
3480 E9=3
   : RETURN
3490 PRINT HEX(06);AT(0,25);M1$
   : RETURN
7000 DEFFN'50
   : REM %'50
   : REM WAIT FOR RETURN OR CONTINUE
   : PRINT AT(22,8,71)
   : GOSUB 7025
   : GOSUB 7120
   : IF C$<>HEX(0D) AND C$<> HEX(82) AND G<>1 AND G<>2 THEN 7000
   : INIT(00)C$
   : RETURN
7010 REM % PREV SCRN message
   : PRINT HEX(06);AT(22,0); BOX(2,79); " Press:"; ""; AT(23,8);"CLEAR/
     PREV SCRN - prev. scrn";AT(23,61);"SF'14 - printer"; AT(22,61);"SF'0
      - define err";
   : RETURN
7020 REM % Header message
   : PRINT AT(0,22);HEX(0A08);BOX(0,32);HEX(090C);"Multi-Disk Exerciser
     Rev. 69C1";
   : RETURN
7025 REM % RETURN MESSAGE
   : PRINT HEX(06); AT(22,1);HEX(06);"Press: RETURN/RUN to continue";
   : RETURN
7030 DEFFN '15
   : REM % Change page
7031 DEFFN '31
   : G=2
   : RETURN
7050 DEFFN '42
7060 DEFFN '52
   : REM % Check for PREV SCRN or change of page
   : G=1
   : RETURN
7070 DEFFN '14
   : REM SET PRINT COUNTER TO 1
   : P=1
   : REM % Change printer
   : IF P9$="204" THEN 7080
   : IF P9$="215" THEN 7090
   : P9$="204"
   : GOTO 7100
7080 P9$="215"
   : GOTO 7100
7090 P9$="off"
7100 IF E9<>1 THEN PRINT AT(0,2); "Printer "; P9$;"";
   : RETURN
7110 REM % Check for CLEAR
   : IF C$=HEX(81) THEN G=1
   : IF C$=HEX(0D) AND E9=1 THEN 3050
   : RETURN
7120 REM % Wait for input
   : G=0
   : KEYIN C$,,7140
   : GOTO 7110
7130 REM % Input no wait
   : G=0
   : KEYIN C$,7110,7140
   : RETURN
7140 IF C$=HEX(0F) OR C$=HEX(1F) THEN GOTO 7030
   : IF C$=HEX(00) THEN GOTO 3050
   : IF C$=HEX(42) OR C$=HEX(52) THEN 7060
   : IF C$=HEX(0E) THEN 7070
   : RETURN
7150 REM % Reload menu
   : PRINT HEX(03); AT(12,25); " EXITING MULTIDSK";
7155 LOAD T"@MENU"
   : ERRORX=ERR
   : PRINT HEX(03); AT(12,18); "";
   : IF X=(82) THEN PRINT "        NO PREVIOUS MENU IS AVAILABLE        ";
   : ELSE PRINT "               DISK ERROR "; X; "              "
7180 REM % TEXT INPUT MESSAGE
   : PRINT ""; AT(22,8,72);"RETURN,TAB/FN or arrows to change fiel
     ds"; AT(23,8,28);"CONT to continue";
   : RETURN
7190 REM % Input and edit data with header printed
   : REM R,Y are screen cords. and A$ is the data to edit
   : Z1,Z2=1
   : G,G1=0
   : PRINT "";AT(R,Y);A2$;"";AT(R,Y);HEX(05);
7195 KEYIN C$,,7260
   : PRINT HEX(06);
   : IF C$ = HEX(0D) THEN 7360
   : IF C$=HEX(84) THEN 7290
   : A2$="        "
   : PRINT AT(R,Y,I5);
   : Z1=2
   : GOTO 7210
7200 PRINT HEX(05);
   : IF Z2=I5+1 THEN PRINT AT(R,Y+Z2-2);
   : G1=0
   : PRINT HEX(05);
   : KEYIN C$,,7260
   : PRINT HEX(06);
   : IF C$=HEX(0D) THEN 7360
   : IF C$=HEX(08) THEN 7220
   : IF C$=HEX(84) THEN 7290
7210 IF Z2=I5+1 THEN Z2=Z2-1
   : STR(A2$,Z2,1)=C$
   : PRINT AT(R,Y+Z2-1); ""; C$;"";
   : Z2=Z2+1
   : GOTO 7200
7220 IF Z2 <> 1 THEN Z2=Z2-1
   : C$=" "
   : STR(A2$,Z2,1)=C$
   : PRINT AT(R,Y+Z2-1); C$; HEX(08);
   : GOTO 7200
7230 IF Z2=I5+1 THEN Z2=Z2-1
   : IF Z2<>1 THEN Z2=Z2-1
   : ELSE GOTO 7340
   : PRINT HEX(08);
   : GOTO 7200
7240 IF Z2<I5 THEN Z2=Z2+1
   : ELSE GOTO 7350
   : PRINT HEX(09);
   : GOTO 7200
7250 IF C$=HEX(00) AND I4<=D THEN 7280
   : GOTO 7030
   : REM goto '0
7260 PRINT HEX(06);
   : ON POS(HEX(0D4D5D0C4C5C7F7E0545550646560F1F000E)=C$)GOTO 7230, 7230, 7230
     , 7240, 7240, 7240, 7340, 7350, 7320, 7320, 7320, 7330, 7330, 7330, 7250,
      7250, 7300, 7270
   : GOTO 7280
7270 GOSUB '14
7280 ON Z1 GOTO 7190,7200
7290 G=1
   : RETURN
7300 GOSUB 3050
7310 GOSUB 7130
   : IF E9<>3 THEN 7310
   : E9=0
   : GOSUB 860
   : GOSUB 7180
   : PRINT AT(R,Y+Z2-1);
   : IF Z2=1 THEN 7190
   : GOTO 7200
7320 G1=G1+1
7330 G1=G1+1
7340 G1=G1+1
7350 G1=G1+1
7360 G1=G1+1
   : RETURN
7370 PRINT AT(I-(I1-1)+1,3);HEX(06); "";
   : PRINTUSING 890, T$(I),F1$(I),I1$(I),V$(I),E$(I),D$(I),M$(I),S(I),E(I),A1$
     (I);""
7380 IF G1=2 OR G1=3 THEN RETURN
7390 IF G1=1 OR G1=5 THEN I=I+1
   : IF G1=4 THEN I=I-1
   : IF I1=1 AND I4<=D AND I>I4 THEN I=I1
   : IF I1=1 AND I4>D AND I>D THEN I=I1
   : IF I1=D+1 AND I>I4 THEN I=I1
   : IF I<I1 AND I1=1 AND I4>D THEN I=D
   : IF I<I1 AND I1=D+1 THEN I=I4
   : IF I<I1 AND I4<D THEN I=I4
   : IF I<I1 AND I1=1 AND I4>D THEN I=D
7395 IF I<1 THEN I=1
   : RETURN
7400 P2$="ENABLE WRITING"
   : G=0
7410 REM % Input password
   : IF P1$=P2$ THEN 7460
   : GOSUB 7010
   : INIT(00)P1$
   : PRINT AT(22,8,70); "appropriate keys or RETURN to reenter phrase"
     ; AT(20,20,59);"To procede type '";P2$;"'";AT(20,37);HEX(05);
   : FOR B=1TO 14
7420 KEYIN C$,,7440
   : IF C$=HEX(81) THEN 7440
   : IF C$<>HEX(0D) THEN 7430
   : B=99
   : C$=HEX(0F)
   : GOTO 7437
7430 IF C$<>HEX(08) THEN 7435
   : B=B-2
   : IF B>=0 THEN 7437
   : C$=HEX(0F)
   : B=B+1
   : GOTO 7437
7435 STR(P1$,B,1)=C$
   : IF STR(P1$,1,6)=P2$ THEN B=99
7437 PRINT C$;
   : NEXT B
   : IF P1$=P2$ THEN 7460
   : PRINT HEX(07)
   : GOTO 7400
7440 PRINT HEX(06)
   : IF C$<>HEX(00) AND C$<>HEX(14) AND C$<>HEX(30) AND C$<>HEX(81) AND C$<>HE
     X(42) AND C$<>HEX(52) AND C$<>HEX(0F) THEN GOTO 7430
7445 IF C$=HEX(00) THEN 7450
   : IF C$=HEX(00) THEN G=2
   : IF C$=HEX(0F) AND I4<=D THEN 7420
   : IF C$=HEX(14) OR C$=HEX(30) THEN 7420
   : IF C$=HEX(81) OR C$=HEX(42) OR C$=HEX(52) THEN G=1
7450 B=99
   : NEXT B
   : IF C$=HEX(00) THEN 3050
   : PRINT HEX(06)
   : RETURN
7455 GOSUB '14
7460 REM % Print warning message and wait for operator response
   : GOSUB 7010
   : PRINT ""; AT(20,7);"WARNING: All resident data will be DESTROYED
     by this exercise ";AT(22,8,51); "CONT/CTNUE to continue "
7470 KEYIN C$,,7480
   : IF C$<>HEX(84) AND C$<>HEX(81) THEN 7470
   : PRINT AT(20,0,)
   : IF C$=HEX(84) THEN RETURN
   : GOTO 7290
7480 IF C$=HEX(42) OR C$=HEX(52) THEN 7290
   : IF C$=HEX(00) THEN 7490
   : IF C$=HEX(0E) THEN GOTO 7455
   : IF C$<>HEX(0F) THEN 7470
   : G=2
   : RETURN
7490 GOSUB 3050
7500 GOSUB 7130
   : IF E9<>3 THEN 7500
   : E9=0
   : GOSUB 860
   : GOTO 7460
7600 REM % PRINT DISPLAY LINE DURING TEST
   : PRINT ""
7610 $IF OFF /005,7640
   : IF E9=1 OR (V(I)-((Z2-1)*D))>D OR (V(I)-((Z2-1)*D))<=0 THEN  7640
   : IF T$(I)=" no" THEN 7630
   : PRINT AT(V(I)-((Z2-1)*D)+1,0);
   : IF A1(I)=0 THEN F$(I)=" DONE "
   : PRINTUSING 1630,D$(I),F$(I),A(I),S1,S1+7,E1(I),E2(I)
7620 GOTO 7640
7630 $IF OFF /005,7640
   : IF E9=1 OR (V(I)-((Z2-1)*D))>D OR (V(I)-((Z2-1)*D))<=0 THEN 7640
   : IF STR(F$(I),6,1)<>" " THEN PRINT ""
   : PRINT AT(V(I)-((Z2-1)*D)+1,0);
   : PRINTUSING 1630,D$(I),F$(I), HEX(20),S(I),E(I)
7640 PRINT ""
   : RETURN
7650 REM % RESET ALL SELECTED DRIVES
   : FOR I=1 TO I4
   : IF T$(I)<> "yes" OR D$(I)= "340" THEN 7660
   : SELECT #2<D$(I)>
   : $GIO RESET #2(4501)
   : ERRORX=ERR
7660 NEXT I
   : RETURN
7670 REM % DISABLE RETRIES
   : IF D$(I)="340" THEN 7680
   : GOSUB '202
   : $GIO DISABLE RETRIES  #2(0600 0700 70A0 4002 88D0 7040 6A10 6817 4000,R$)
   : ERRORX=ERR
7680 RETURN
7690 REM % ENABLE RETRIES
   : IF D$(I)="340"  THEN 7700
   : GOSUB '202
   : $GIO ALLOW RETRIES  #2(0200 0330 1221 1222 0600 0700 70A0 4002 88D0 7040
     6A10 6824 4000,R$)
   : ERRORX=ERR
   : REM PASS OVER ERROR
7700 RETURN
7710 REM % FORMAT THE DRIVE NUMBER FOR GIO STATEMENT
   : IF STR(D$(I),1,1)="B" THEN 7730
   : IF STR(D$(I),1,1)="D" AND STR(D$(I),3,1)="0" THEN 7730
7720 HEXPACK STR(R$,1,1) FROM STR(D$(I),2,2)
   : STR(R$,1,1)=AND HEX(0F)
   : STR(R$,1,1)=SUB HEX(01)
   : GOTO 7740
7730 STR(R$,1,1)=HEX(10)
7740 STR(R$,1,1)=OR HEX(20)
   : RETURN