Listing of file='MULTIDSK' on disk='vmedia/cs386_host_1.2.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