image of READY prompt

Wang2200.org

Listing of file='MULTIDSK' on disk='vmedia/mvp-diag-2.6.2.wvd.zip'

# Sector 2412, program filename = 'MULTIDSK'
0010 REM % MULTIDSK
   : REM This is MULTIDSK written by Ken LeBaron,
0020 REM \D5\F0\E4\E1\F4\E5\F3; 10/01/81, 08/12/83 by Paul J. Hossfeld - impro
     ved screening, 04/01/84 Corrected read and write count
0030 REM %
0040 DIM A(35),A$(48)3,A1(70),A1$(70)8,A2$8,B$2,B$(64)4,B1$(64)4,B2$(64)4,B3$(
     64)4,C$1,C1$2,C2$2,C(24),D$(70)3,E(70),E1(35),E2(35),E$5,E$(70)7,F$(35)6,
     G,H$1,H1,H2(1),I1,I2,I3,I4,I5,M$1,M$(70)8,P$10,P1$7,P2$(2)7,R,R$(70)1,S(7
     0),S$5,T$(70)3,V(35),X,Y,Z,Z1,Z2
0050 INIT (20)P1$,P2$
0060 DIM I$(10)80,I1$(70)3,V$(70)3,F1$(70)3,M1$22,P9$3,E9(1)
   : INIT (" no")I1$()
   : P9$="off"
   : P,E9=0
0070 REM %
   : REM NO. OF LINES ON THE SCREEN FOR THE DEVICE LIST
   : D=17
   : REM %
   : REM MAXIUM NUMBER OF LINES TO PRINT ON PRINTER
   : P1=500
0080 INIT(00)B$,C$,C1$,C2$,E$,F$(),M$,P$,P1$,R$,S$,A$(),A1$(),B$(),B1$(),B2$()
     ,B3$(),D$(),E$(),I$(),M$(),R$(),T$()
0090 A$()="310B10D10D11D12D13D14D15320B20D20D21D22D23D24D25330B30D30D31D32D33D
     34D35350B50D50D51D52D53D54D55360B60D60D61D62D63D64D65370B70D70D71D72D73D7
     4D75"
   : I,Z=5
   : SELECT PRINT 005(80)
0100 REM % First page
   : PRINT HEX(0306);AT(0,20);"Multi-Disk Exerciser (Rev. 6441)";AT(1,19
     );BOX(0,33)
0110 P$=$PSTAT(1)
   : IF STR(P$,10)>=HEX(18)AND STR(P$,9,1)="M"THEN 120
   : IF STR(P$,9,1)="V"AND STR(P$,10)>=HEX(21)THEN 120
   : PRINT HEX(0E);AT(12,15);"CPU SOFTWARE MUST BE UPGRADED TO RUN THIS PROGRA
     M.";
   : GOTO 110
0120 PRINT AT(12,20,62);"Mount all platters to be tested"
   : GOSUB 7010
   : PRINT AT(23,38,41);
0130 PRINT AT(22,8,32);HEX(06);"RETURN/RUN to continue";
   : KEYIN C$,,140
   : IF C$=HEX(81) THEN 7150
   : IF C$<>HEX(0D) AND C$<>HEX(82) THEN 130
   : GOTO 160
0140 IF C$=HEX(42) OR C$=HEX(52) THEN 7150
   : IF C$<>HEX(01) THEN 130
   : GOSUB 2380
0150 GOSUB 7130
   : IF E9<>3 THEN 150
   : GOTO 10
0160 REM % Start search for drives
   : PRINT HEX(03); AT(12,25); "please wait."
   : I=1
0170 FOR I3=1TO 142STEP 3
   : D$(I)=STR(A$(),I3,3)
   : SELECT #2<D$(I)>
   : $OPEN 390,#2
   : ERRORX=ERR
   : GOTO 390
0180 PRINT AT(12,38);"SEARCHING "
   : $GIO SEARCH FOR VALID DEVICES #2(0100 020D 1200 1212 1020 1200 1212 0B00
     70A0 4100 860B,R$)
   : ERRORX=ERR
   : GOTO 390
0190 REM % List of devices
   : IF STR(R$,8,1)=HEX(10)THEN 390
   : R$(I)=STR(R$,11,1)
0200 E(I)=65407
   : M$(I)="Q2040"
   : GOSUB 340
0210 E(I)=52607
   : M$(I)="2280"
   : GOSUB 340
0215 E(I)=38911
   : M$(I)="2275"
   : GOSUB 340
0220 E(I)=32639
   : M$(I)="1004"
   : GOSUB 340
0230 E(I)=19583
   : M$(I)="2260"
   : GOSUB 340
0240 E(I)=16319
   : M$(I)="1002"
   : GOSUB 340
0250 E(I)=9791
   : M$(I)="2230-1"
   : GOSUB 340
0260 E(I)=8127
   : M$(I)="1000"
   : GOSUB 340
0270 E(I)=4799
   : M$(I)="2260-1/2"
   : GOSUB 340
0280 E(I)=3873
   : M$(I)="850 DSDD"
   : GOSUB 340
0290 E(I)=2399
   : M$(I)="2260-1/4"
   : GOSUB 340
0295 E(I)=1279
   : M$(I)="2275"
   : GOSUB 340
0300 E(I)=1231
   : M$(I)="2270a"
   : GOSUB 340
0310 E(I)=1023
   : M$(I)="2270"
   : GOSUB 340
0320 E(I)=0
   : M$(I)="UNKNOWN"
   : GOSUB 340
0330 GOTO 390
0340 IF R$(I)=HEX(D0)AND STR(D$(I),,1)="D"THEN 350
   : IF R$(I)=HEX(C0)AND STR(D$(I),,1)<>"D"THEN 360
   : RETURN CLEAR
   : GOTO 390
0350 IF M$(I)="2280"THEN 370
   : IF STR(D$(I),2,1)>"3" THEN RETURN
   : IF STR(M$(I),,3)="100" THEN 370
   : IF M$(I)="850 DSDD" THEN 370
   : IF M$(I)="Q2040" THEN 370
   : IF M$(I)="2275" THEN 370
   : RETURN
0360 IF R$(I)=HEX(C0) AND M$(I)="2275" THEN RETURN
0365 IF E(I)>1231THEN 370
   : IF STR(D$(I),,1)="3"THEN 370
   : IF STR(D$(I),,1)="B"AND STR(D$(I),2,1)<=HEX(33)THEN 370
   : RETURN CLEAR
   : GOTO 390
0370 PRINT AT(12,38);" searching"
   : X=0
   : VERIFY T#2,(E(I),E(I))E
   : IF E=0THEN 380
   : X=ERR
   : IF X<>93AND X<>95AND X<>96THEN RETURN
0380 RETURN CLEAR
   : STR(E$(I),,7)="I-   on"
   : CONVERT XTO STR(E$(I),3,2),(##)
   : IF X=0THEN E$(I)="       "
   : A1$(I)="infinite"
   : V$(I),F1$(I),I1$(I),T$(I)=" no"
   : S(I)=0
   : I=I+1
0390 NEXT I3
   : FOR I3=1 TO 48
   : IF M$(I3)<>"850 DSDD" THEN 395
   : SELECT #2<D$(I3)>
   : $GIO RESET #2(4501)
0395 NEXT I3
   : I4=I-1
   : IF I4<=34 THEN 400
   : PRINT AT(15,22); "More than 35 devices mounted"; AT(16,12); "MULTIDS
     K can control only 34 devices at one time"
   : GOTO 120
0400 I,I3=I4
   : I1=1
   : I2=I3
   : E9=0
   : IF I>D THEN I2=D
   : GOTO 460
0410 REM Restore data for chart
   : X=0
   : FOR G=1 TO I4
   : SELECT #2<D$(G)>
   : $GIO RESET #2(4501)
   : IF T$(G+35)=" no" THEN 420
   : X=X+1
   : I1$(G+35)=I1$(X)
0420 NEXT G
0430 FOR G=1 TO I4
   : I=G+35
   : GOSUB 900
   : NEXT G
   : GOTO 400
0440 DEFFN '0
   : IF I4<=D THEN RETURN
   : IF I1=1 THEN I1=D+1
   : ELSE I1=1
   : IF I1=1 THEN I2=D
   : ELSE I2=I4
   : G=2
   : RETURN
0450 GOSUB 440
0460 GOSUB 470
   : GOTO 570
0470 REM % Print table
   : G=I
   : PRINT HEX(03);"";AT(1,0);"  Test  Frmt  Init   Ver      Address
      Model    Sector Range   Accesses"
   : FOR I=I1TO I2
0480 IF I2<>0THEN 490
   : D$(I),M$(I)="N/A"
   : S(I),E(I)=0
   : T$(I),E$(I)=" "
0490 PRINT AT((I-I1)+2,3);HEX(06); "";
   : PRINTUSING 500, T$(I),F1$(I),I1$(I),V$(I),E$(I),D$(I),M$(I),S(I),E(I),A1$
     (I);""
0500 %###   ###   ###   ###   ####### ###   ########   #####/#####    ########
0510 NEXT I
0520 PRINT AT(1,1); BOX(1,75); AT(2,1); BOX(I-I1+1,75); 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,50);BOX(I-I1+1,0);AT(2,65);BOX(I-I1+1,0)
0530 GOSUB 7010
   : IF I3>0THEN 540
   : PRINT HEX(07); AT(20,0,79); AT(20,20); "   PROGRAM ABORTED. NO DISKS
      RESPONDING   "
   : GOSUB 7120
   : GOTO 530
0540 $CLOSE
   : I=I1
   : C1$=" "
   : I=G
0550 IF I4>D AND E9<>1 THEN PRINT "";AT(23,55); ", SF'0 - more devices"
     ; AT(0,67); "(More)";
   : GOTO 7100
0560 REM %  wait to return screen
   : GOSUB 7130
   : IF E9<>3 THEN 560
   : E9=0
   : GOTO 400
0570 REM % Parameters correct???
   : GOSUB 7010
   : C$="N"
   : PRINT AT(20,0,79); AT(20,20);"Are all the above parameters correct?";"
     "; AT(22,8,49); "Y/CONT/CTNUE for 'yes' or N for 'no'";
   : GOSUB 550
   : GOSUB 7120
   : IF G=1 THEN 10
   : IF G=2 AND I4>D THEN 450
   : IF E9<>0 THEN 560
0580 ON POS("YyNn"=C$)GOTO 910,910,590,590
   : IF C$=HEX(84) THEN 910
   : GOTO 570
0590 REM % ***SET PARAMETERS***
   : I=I1
   : PRINT AT(20,20,59)
0600 REM %#1
   : R=I-(I1-1)+1
   : Y=3
   : I5=3
   : A2$=T$(I)
   : GOSUB 7190
   : ON POS("YyNn"=STR(A2$,1,1))GOTO 610,610,620,620
   : ON POS(" N n"=STR(A2$,1,2))GOTO 620,620
   : GOTO 600
0610 T$(I)="yes"
   : GOTO 630
0620 T$(I)=" no"
0630 PRINT AT(I-(I1-1)+1 ,3);""; T$(I)
   : GOSUB 7370
   : IF G=1 THEN 570
   : IF G=2 AND I4>D THEN 450
   : IF E9<>0 THEN 560
   : ON G1 GOTO 600,650,640,600,600
0640 G1=4
   : GOSUB 7370
   : GOTO 830
0650 REM %#2
   : R=I-(I1-1)+1
   : Y=9
   : I5=3
   : A2$=F1$(I)
   : GOSUB 7190
   : IF STR(A2$,1,1)="Y" OR STR(A2$,1,1)="y" THEN F1$(I)="yes"
   : IF STR(A2$,1,1)="N" OR STR(A2$,1,1)="n" OR STR(A2$,1,2)=" N" OR STR(A2$,1
     ,2)=" n" THEN F1$(I)=" no"
0660 PRINT AT(I-(I1-1)+1,9);""; F1$(I)
   : GOSUB 7370
   : IF G=1 THEN 570
   : IF G=2 AND I4>D THEN 450
   : IF E9<>0 THEN 560
   : ON G1 GOTO 600,670,600,650,650
0670 REM %#3
   : R=I-(I1-1)+1
   : Y=15
   : I5=3
   : A2$=I1$(I)
   : GOSUB 7190
   : IF STR(A2$,1,1)="Y" OR STR(A2$,1,1)="y" THEN I1$(I)="yes"
   : IF STR(A2$,1,1)="N" OR STR(A2$,1,1)="n" OR STR(A2$,1,2)=" N" OR STR(A2$,1
     ,2)=" n" THEN I1$(I)=" no"
0680 PRINT AT(I-(I1-1)+1,15);""; I1$(I)
   : GOSUB 7370
   : IF G=1 THEN 570
   : IF G=2 AND I4>D THEN 450
   : IF E9<>0 THEN 560
   : ON G1 GOTO 600,690,650,670,670
0690 REM %#4
   : R=I-(I1-1)+1
   : Y=21
   : I5=3
   : A2$=V$(I)
   : GOSUB 7190
   : IF STR(A2$,1,1)="Y" OR STR(A2$,1,1)="y" THEN V$(I)="yes"
   : IF STR(A2$,1,1)="N" OR STR(A2$,1,1)="n" OR STR(A2$,1,2)=" N" OR STR(A2$,1
     ,2)=" n" THEN V$(I)=" no"
0700 PRINT AT(I-(I1-1)+1,21);""; V$(I)
   : GOSUB 7370
   : IF G=1 THEN 570
   : IF G=2 AND I4>D THEN 450
   : IF E9<>0 THEN 560
   : ON G1 GOTO 600,710,670,690,690
0710 REM %#5
   : H2=0
   : A2$=D$(I)
   : I5=3
   : R=I-(I1-1)+1
   : Y=35
   : GOSUB 7190
   : FOR H1=1 TO 3
   : H$=STR(A2$,H1,1)
   : GOSUB 720
   : NEXT H1
   : IF H2 = 1 THEN GOTO 710
   : D$(I)=A2$
   : GOTO 740
0720 CONVERT H$ TO H
   : ERRORX=ERR
   : IF H$<"A" OR H$>"F" THEN H2=1
0730 RETURN
0740 SELECT #2<D$(I)>
   : $GIO CHECK FOR VALID ADDRESS #2(0100 020D 1212 1020 1212 0B00 70A0 4100 8
     60B 4501,R$)
   : ERRORX=ERR
   : GOTO 710
0750 IF STR(R$,8,1)=HEX(10)THEN 710
   : R$(I)=STR(R$,11,1)
0760 GOSUB 7370
   : IF G=1 THEN 570
   : IF G=2 AND I4>D THEN 450
   : IF E9<>0 THEN 560
   : ON G1 GOTO 600,770,690,710,710
0770 REM %#6
   : A2$=M$(I)
   : I5=8
   : R=I-(I1-1)+1
   : Y=41
   : GOSUB 7190
   : M$(I)=A2$
   : GOSUB 7370
   : IF G=1 THEN 570
   : IF G=2 AND I4>D THEN 450
   : IF E9<>0 THEN 560
   : ON G1 GOTO 600,790,710,770,770
0780 REM %#7
   : PRINT AT(20,22); "'Sector range must be greater than 8'"
0790 CONVERT S(I)TO A2$,(#####)
   : I5=5
   : R=I-(I1-1)+1
   : Y=52
   : GOSUB 7190
   : S$=A2$
   : CONVERT S$TO S(I)
   : ERRORX=ERR
   : GOTO 790
0800 IF G1=0 OR G1=2 AND G<>1 AND G<>2 THEN 810
   : IF S(I)+7>E(I) THEN 790
   : GOSUB 7370
   : IF G=1 THEN 570
   : IF G=2 AND I4>D THEN 450
   : IF E9<>0 THEN 560
   : ON G1 GOTO 600,810,770,790,790
0810 REM %#8
   : CONVERT E(I)TO A2$,(#####)
   : R=I-(I1-1)+1
   : Y=58
   : I5=5
   : GOSUB 7190
   : E$=A2$
   : CONVERT E$TO E(I)
   : ERRORX=ERR
   : GOTO 810
0820 IF G1=3 THEN 790
   : IF S(I)+7>E(I) THEN 780
   : GOSUB 7370
   : IF G=1 THEN 570
   : IF G=2 AND I4>D THEN 450
   : IF E9<>0 THEN 560
   : ON G1 GOTO 600,830,790,810,810
0830 PRINT AT(20,0,79)
   : REM %#9
   : IF A1$(I)<>"infinite" THEN CONVERT A1(I)TO A1$(I),(########)
0840 IF A1$(I)="INFINITE" THEN A1$(I)="infinite"
0850 R=I-(I1-1)+1
   : Y=67
   : I5=8
   : A2$=A1$(I)
   : GOSUB 7190
   : A1$(I)=A2$
   : IF A1$(I)="INFINITE" THEN A1$(I)="infinite"
   : IF A1$(I)="infinite" THEN 880
   : CONVERT A1$(I)TO A1(I)
   : ERRORX=ERR
   : GOTO 830
0860 CONVERT A1(I) TO A1$(I),(########)
0870 IF A1(I)<8THEN 830
   : REM CLEAR PREV MESSAGE (LINE 1030)
   : PRINT AT(20,0,79)
0880 GOSUB 7370
   : IF G=1 THEN 570
   : IF G=2 AND I4>D THEN 450
   : IF E9<>0 THEN 560
   : ON G1 GOTO 600,890,810,830,830
0890 G1=1
   : GOSUB 7370
   : GOTO 600
0900 REM Used to save data for initial screen
   : A1(G)=A1(I)
   : A1$(G)=A1$(I)
   : E(G)=E(I)
   : S(G)=S(I)
   : M$(G)=M$(I)
   : D$(G)=D$(I)
   : E$(G)=E$(I)
   : R$(G)=R$(I)
   : T$(G)=T$(I)
   : I1$(G)=I1$(I)
   : V$(G)=V$(I)
   : RETURN
0910 REM % ***FORMAT***
   : REM Get and/or check the password
   : PRINT AT(23,45,34);
   : GOSUB 550
   : GOSUB 7400
   : IF E9<>0 THEN 920
   : IF G=1 THEN 570
   : I=1
   : IF G<>2 THEN 930
   : GOSUB 440
   : GOSUB 470
   : GOTO 910
0920 GOSUB 7130
   : IF E9<>3 THEN 920
   : E9=0
   : GOSUB 470
   : GOTO 910
0930 IF T$(I)=" no" OR F1$(I)=" no" THEN 990
0940 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"
0950 $FORMATDISK T#2
   : ERRORX=ERR
   : IF X<>92THEN 980
   : PRINT AT(20,20,59); "Press the format button for ";D$(I);""; AT(22,1,78
     ); "Press: CONT when the format is completted"
   : GOTO 970
0960 GOTO 980
0970 GOSUB 7120
   : PRINT AT(20,20,)
   : IF G=1 THEN 570
   : IF E9<>0 THEN 920
   : IF C$<>HEX(84) THEN 970
0980 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 570
0990 E$(I)="       "
   : I=I+1
   : IF I<=I4 THEN 930
1000 REM % ***SET PARAMETERS***
   : I=1
   : PRINT AT(20,20,59)
1010 I1=0
   : FOR I=1TO I3
   : G=I+35
   : GOSUB 900
   : IF T$(I)<>"yes"THEN 1020
   : I1=I1+1
   : G=I1
   : GOSUB 900
   : F$(G)="----"
1020 NEXT I
   : I3=I1
   : Z1=1
   : Z2=I3
   : IF I3>D THEN Z2=D
1030 IF I3<>0THEN 1050
1040 REM % Parameter error
   : PRINT AT(20,15,64);"RECHECK PERAMETERS, NO DEVICES ARE SELECTED"
   : GOSUB 7010
   : GOSUB '50
   : GOTO 400
1050 REM % ***START TEST***
1060 Z=1
   : S=RND(0)
   : REM For testing; IF STR(P$,9,1)="V"THEN 1130; GOTO 1130; $RELEASETERMINAL
     TO 3
1070 IF Z=0THEN 400
   : FOR I=1TO I3
   : A(I),E1(I),E2(I),V(I),V=0
   : NEXT I
   : M1$=ALL(" ")
1080 FOR I=1TO I3
   : IF R$(I)<>HEX(D0)OR M$(I)="2280"THEN 1090
   : SELECT #2<D$(I)>
   : GOSUB '202
   : $GIO NO RETRIES #2,(0600 0700 70A0 4002 88D0 7040 6A10 6817 4000,R$)
   : ERRORREM
1090 NEXT I
   : GOSUB 1100
   : GOTO 1130
1100 IF E9=1 THEN RETURN
   : IF Z=0THEN 400
   : 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
1110 IF I3>D AND E9<>1 THEN PRINT "";AT(23,55); ", SF'0 - more devices"
     ; AT(0,67); "(More)";
   : GOTO 7100
1120 %  ###     ######        ##,###,###,###     #####/#####     #####
     #####
1130 I=1
   : M1$="INITIALIZING"
   : REM LOOP TO I3 (1420)
1140 C$=" "
   :  FOR G=1 TO I3
   : IF V$(G) ="yes" OR I1$(G)="yes" THEN C$="Y"
   : NEXT G
   : G=0
   : IF C$=" " THEN 1150
   : GOSUB '220
   : B$(2)=D$(I)
   : SELECT #2<D$(I)>
   : IF V$(I)="yes" OR I1$(I)="yes" THEN F$(I)="INIT "
   : GOSUB 1870
1150 IF I1$(I)<>"yes" AND V$(I)<>"yes" THEN 1470
   : STR(F$(I),6,1)="w"
   : PRINT AT(0,25);M1$
1160 IF R$(I)<>HEX(D0)THEN 1300
   : B$(1)=BIN(S(I),2)
   : L=S(I)-1
   : B=INT((E(I)-S(I)+1)/4)
   : IF I1$(I)=" no" THEN 1260
   : GOSUB 2860
1170 FOR C=1 TO B
   : IF INT(C/2)<>C/2THEN GOSUB '200
   : Q=0
1180 REM %INIT (sequentially fill disk)
   : GOSUB 1500
1190 B$=B$(1)
   : L=VAL(B$(1),2)
   : DATA SAVE BA T#2,(B$(1),B$(1))B$()
   : ERRORX=ERR
   : GOTO 1560
1200 L=L+1
   : DATA SAVE BA T#2,(B$(1),B$(1))B$()
   : ERRORX=ERR
   : GOTO 1560
1210 L=L+1
   : DATA SAVE BA T#2,(B$(1),B$(1))B$()
   : ERRORX=ERR
   : GOTO 1560
1220 L=L+1
   : DATA SAVE BA T#2,(B$(1),B$(1))B$()
   : ERRORX=ERR
   : GOTO 1560
1230 IF INT(C/2)<>C/2THEN 1240
   : GOSUB '202
   : $GIO END MSG WRITE #2,(0600 0700 70A0 68D0 7040 6A10 6811 4000 8B67,R$)
   : IF STR(R$,6,3)=HEX(000000)THEN 1240
   : B$(1)=B$
   : GOTO 1180
1240 NEXT C
   : C=(E(I)-S(I)+1)-(B*4)
   : IF C=0 THEN 1410
   : FOR B=1 TO C
   : L=VAL(B$(1),2)
   : DATA SAVE BA T#2,(B$(1),B$(1))B$()
   : ERRORX=ERR
   : GOTO 1560
1250 NEXT B
1260 STR(F$(I),6,1)="r"
   : GOSUB 2860
   : IF V$(I)=" no" THEN 1410
   : S=S(I)
1270 B$=BIN(S,2)
   : L=L+1
   : DATA LOAD BA T#2,(S,S)B$()
   : ERRORX=ERR
   : GOTO 1560
1280 GOSUB 1530
   : GOSUB 1500
1290 IF S<=E(I)THEN 1270
   : GOTO 1470
1300 IF E(I)<1232THEN 1310
   : 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 1320
1310 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
1320 IF I1$(I)<>"yes" THEN 1360
   : GOSUB 2860
   : FOR A=INT(S(I)/C)TO ((E(I)+1)/C)-1
   : FOR B=1TO C
   : IF A*C+C(B)<S(I)OR A*C+C(B)>E(I)THEN 1350
1330 B$(1)=BIN(A*C+C(B),2)
   : GOSUB 1500
1340 L=VAL(B$(1),2)
   : DATA SAVE BA T#2,(B$(1))B$()
   : ERRORX=ERR
   : GOTO 1560
1350 NEXT B,A
1360 STR(F$(I),6,1)="r"
   : GOSUB 2860
   : IF V$(I)=" no" THEN 1410
1370 FOR A=INT(S(I)/C)TO ((E(I)+1)/C)-1
   : FOR B=1TO C
   : IF A*C+C(B)<S(I)OR A*C+C(B)>E(I)THEN 1400
   : B$=BIN(A*C+C(B),2)
   : GOSUB 1500
1380 L=VAL(B$,2)
   : DATA LOAD BA T#2,(B$)B$()
   : ERRORX=ERR
   : GOTO 1560
1390 GOSUB 1530
1400 NEXT B,A
   : GOTO 1470
1410 B$=BIN(S(I),2)
   : L=S(I)
   : DATA LOAD BA T#2,(S(I))B$()
   : ERRORX=ERR
   : B$(1)=B$
   : GOTO 1560
1420 GOSUB 1530
1430 B$=BIN(E(I),2)
   : L=E(I)
   : DATA LOAD BA T#2,(E(I))B$()
   : ERRORX=ERR
   : B$(1)=B$
   : GOTO 1560
1440 GOSUB 1530
1450 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 1560
1460 GOSUB 1530
1470 STR(F$(I),6,1)=" "
   : I=I+1
   : IF I<=I3 THEN 1140
   : REM Set printer counter to 1
   : P=1
1480 G=1
   : GOSUB 1860
   : M1$="    TESTING"
   : PRINT AT(0,25,16); M1$
   : GOTO 1750
1490 REM % Check for input during init and act on it
1500 GOSUB 7130
   : IF E9<>3 THEN 1510
   : E9,G=0
   : GOSUB 1100
   : GOTO 1860
1510 IF G<>1 THEN 1520
   : RETURN  CLEAR  ALL
   : GOTO 410
1520 IF G<>2 THEN RETURN
   : G=0
   : GOTO 1850
1530 IF B$=B$(1)AND D$(I)=B$(2)THEN RETURN
1540 REM % Error report
   : REM % #1 read errors
   : PRINT AT(21,1,78);"Last error: on disk ";D$(I);"/sector"; VAL(B$,2);"
     during a ";F$(I)
1550 G=1
   : GOTO 1660
1560 REM % #2 for INIT errors
   : RETURN  CLEAR  ALL
   : E$=ALL(" ")
1570 $IF OFF /005,1580
   : PRINT "";AT(21,1,78);"Last error: I-";X;"on disk ";D$(I);"/sect
     or ";L;"during a ";F$(I);
   : E$="HARD"
   : G=O
   : GOSUB 1660
   : FOR G=35 TO 70
   : Y=G
   : IF D$(I)=D$(G) THEN G=70
   : NEXT G
1580 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 2860
   : GOTO 1470
1590 GOSUB 1610
   : GOTO 1730
1600 REM % Check for input during testing and act on it
1610 GOSUB 7130
   : IF E9<>3 THEN 1620
   : E9=0
   : G=1
   : GOSUB 1100
   : GOTO 1860
1620 IF G<>1 THEN 1630
   : RETURN  CLEAR  ALL
   : GOTO 410
1630 IF G<>2 THEN RETURN
   : GOSUB 1850
   : GOTO 2830
1650 REM % #3 hard/soft errors
   : $IF OFF /005,1660
   : PRINT AT(21,1,78);"Last error: I-";X;"on disk ";D$(I); "/sector"; VA
     L(B$(1),2);"during a ";STR(F$(I),,6); " and was ";E$;
   : G=0
   : GOSUB 1660
   : GOTO 1730
1660 REM % PRINT ERROR
   : IF P9$="off" THEN 1720
   : REM IF MAX NUMBER OF LINES PRINTED OR PRINTER NOT SELECED THEN RETURN
   : IF P9$="215" THEN 1680
1670 REM % 204 Printer
   : $OPEN 1710,/204
   : PRINT AT(0,25,16); "Printer 204 - buffer full";
   : SELECT PRINT 204
   : $IF OFF /204,1710
   : GOTO 1690
1680 REM % 215 Printer
   : $OPEN 1710,/215
   : $GIO/215(410D)
   : $IF OFF /215,1710
   : PRINT AT(0,25,16); "Printer 215 - buffer full";
   : SELECT PRINT 215
   : REM %
1690 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 "----- ";
1700 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
1710 SELECT PRINT 005
   : $CLOSE/215
   : $CLOSE/204
1720 PRINT AT(0,25,25);M1$
   : IF P=P1 THEN 7090
   : RETURN
1730 $CLOSE#2
   : RETURN  CLEAR  ALL
   : C=0
   : $IF OFF /005,1750
1740 GOSUB 2840
1750 REM % End of test
   : I=INT((RND(1)*I3)+1)
   : IF A1$(I)="infinite"OR A(I)<A1(I)AND T$(I)<> " no" THEN 1770
   : IF V(I)=1THEN 1750
   : ELSE V(I)=1
   : V=V+V(I)
   : IF V<I3THEN 1750
   : PRINT AT(0,25,54); "TEST COMPLETE"
   : GOSUB '50
   : GOTO 410
1760 GOSUB '50
   : IF G<>2 THEN 410
   : GOSUB 1850
   : GOTO 1760
1770 SELECT #2<D$(I)>
   : GOSUB '220
   : B$(2)=D$(I)
   : $OPEN 1750,#2
   : IF A(I)>99999999991 THEN A(I)=0
1780 S,S1=INT(RND(1)*E(I))
   : IF S<S(I)OR S+07>E(I) OR T$(I)=" no" THEN 1780
   : B$,B$(1)=BIN(S,2)
   : R=RND(1)
   : IF R<=.40THEN 1830
   : IF R<=.45THEN 1810
   : IF R<=.90THEN 1800
1790 REM % Verify
   : F$(I)="VERIFY"
   : GOSUB 2830
   : GOSUB 1890
   : GOTO 1590
1800 REM % Read
   : F$(I)="READ"
   : GOSUB 2830
   : GOSUB 1910
   : GOSUB 1910
   : GOTO 1590
1810 REM % R/A/W
   : F$(I)="R/A/W"
   : GOSUB 2830
1820 GOSUB 1990
   : IF Q=1 THEN GOSUB '201
   : IF Q=2 THEN GOSUB 2050
   : GOSUB 1910
   : GOSUB 1990
   : IF Q=1 THEN GOSUB '201
   : IF Q=2 THEN GOSUB 2050
   : GOSUB 1910
   : GOTO 1590
1830 REM % Write
   : F$(I)="WRITE"
   : GOSUB 2830
1840 GOSUB 1990
   : GOSUB 1990
   : IF Q=1 THEN GOSUB '201
   : IF Q=2 THEN GOSUB 2050
   : GOTO 1590
1850 REM % CHANGE PAGE
   : IF I3<=D THEN RETURN
   : IF Z1=1 THEN Z1=D+1
   : ELSE Z1=1
   : IF Z1=1 THEN Z2=D
   : ELSE Z2=I3
1860 REM % Print page
   : PRINT AT(2,0,(D*79))
   : IF G=0 THEN 1870
   : G=I
   : FOR I=Z1 TO Z2
   : GOSUB 2840
   : NEXT I
   : GOTO 1880
1870 G=I
   : FOR I=Z1 TO Z2
   : GOSUB 2860
   : NEXT I
1880 I=G
   : G=0
   : RETURN
1890 L=0
1900 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 2050
   : RETURN
1910 REM %Read 4 * 2 Sectors
   : L=S
1920 A(I)=A(I)+1
   : DATA LOAD BA T#2,(S,S)B$()
   : ERRORX=ERR
   : GOTO 2050
1930 A(I)=A(I)+1
   : L=S
   : DATA LOAD BA T#2,(S,S)B1$()
   : ERRORX=ERR
   : GOTO 2050
1940 A(I)=A(I)+1
   : L=S
   : DATA LOAD BA T#2,(S,S)B2$()
   : ERRORX=ERR
   : GOTO 2050
1950 A(I)=A(I)+1
   : L=S
   : DATA LOAD BA T#2,(S,S)B3$()
   : ERRORX=ERR
   : GOTO 2050
1960 IF B$(1)<>B$OR B$(2)<>D$(I)THEN 1980
   : ADDC(B$,01)
   : IF B1$(1)<>B$OR B1$(2)<>D$(I)THEN 1980
   : ADDC(B$,01)
   : IF B2$(1)<>B$OR B2$(2)<>D$(I)THEN 1980
   : ADDC(B$,01)
   : IF B3$(1)<>B$OR B3$(2)<>D$(I)THEN 1980
   : ADDC(B$,01)
1970 RETURN
1980 GOSUB 1540
   : E1(I)=E1(I)+1
   : RETURN  CLEAR
   : GOTO 1730
1990 REM %Write 4 * 2 Sectors
   : IF Q=0 AND R$(I)=HEX(D0) THEN GOSUB '200
   : L=VAL(B$(1),2)
2000 A(I)=A(I)+1
   : DATA SAVE BA T#2,(B$(1),B$(1))B$()
   : ERRORX=ERR
   : GOTO 2050
2010 L=VAL(B$(1),2)
   : A(I)=A(I)+1
   : DATA SAVE BA T#2,(B$(1),B$(1))B$()
   : ERRORX=ERR
   : GOTO 2050
2020 L=VAL(B$(1),2)
   : A(I)=A(I)+1
   : DATA SAVE BA T#2,(B$(1),B$(1))B$()
   : ERRORX=ERR
   : GOTO 2050
2030 L=VAL(B$(1),2)
   : A(I)=A(I)+1
   : DATA SAVE BA T#2,(B$(1),B$(1))B$()
   : ERRORX=ERR
   : GOTO 2050
2040 RETURN
2050 GOSUB 1610
   : $IF OFF /005,2060
   : PRINT AT(0,25,16);"CHECKING ERROR"
2060 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 2070
   : VERIFY T#2,(L,L)L
   : IF L=0THEN 2120
   : X=ERR
   : GOTO 2130
2070 IF F$(I)<>"READ"THEN 2090
   : DATA LOAD BA T#2,(S)B$()
   : ERRORX=ERR
   : GOTO 2130
2080 GOTO 2120
2090 IF F$(I)<>"WRITE"THEN 2110
   : DATA SAVE BA T#2,(B$(1))B$()
   : ERRORX=ERR
   : GOTO 2130
2100 GOTO 2120
2110 IF F$(I)<>"R/A/W"THEN STOP "ERROR ??????? "#
   : DATA SAVE BA T#2,(B$(1))B$()
   : ERRORX=ERR
   : GOTO 2130
2120 E$="SOFT "
   : E2(I)=E2(I)+1
   : IF E2(I)>99999THEN E2(I)=99999
   : GOTO 1650
2130 IF C<10 THEN 2050
   : $IF OFF /005,2380
   : PRINT AT(0,25,16);M1$
2140 E$="HARD "
   : E1(I)=E1(I)+1
   : IF E1(I)>99999THEN E1(I)=99999
   : GOTO 1650
2150 DEFFN'200
   : REM %'200
   : GOSUB '202
   : $GIO BEGIN MSG WRITE #2(0600 0700 70A0 68D0 7040 6A10 6810 4000,R$)
   : Q=1
   : GOSUB '203
   : IF Q=2 THEN Q=0
   : RETURN
2160 DEFFN'201
   : REM %'201
   : GOSUB '202
   : $GIO END MSG WRITE #2,(0600 0700 70A0 68D0 7040 6A10 6811 4000 8B67,R$)
   : Q=0
   : GOSUB '203
   : RETURN
2170 DEFFN'202
   : REM %'202
   : STR(R$,,1)=STR(D$(I),3)
   : IF STR(D$(I),3)<>"0"THEN STR(R$,,1)=AND HEX(0F)SUBHEX(01)OR HEX(20)
   : RETURN
2180 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 2190
   : PRINT HEX(03);AT(12,27);
   : STOP "ERROR ?????????? "#
2190 B$(1)=BIN(S1,2)
   : Q=2
   : RETURN
2200 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 2240
   : ON INT((RND(1)*3)+1)GOTO 2210,2220,2230
2210 B$()=HEX(DB6DB6)&STR(B$())
   : RETURN
2220 B$()=HEX(B6DB6D)&STR(B$())
   : RETURN
2230 B$()=HEX(6DB6DB)&STR(B$())
   : RETURN
2240 IF M$(I)<>"2280"THEN 2290
   : ON INT((RND(1)*4)+1)GOTO 2250,2260,2270,2280
2250 B$()=HEX(3B63B63B)&STR(B$())
   : RETURN
2260 B$()=HEX(E255FE25)&STR(B$())
   : RETURN
2270 B$()=HEX(FFFFA924)&STR(B$())
   : RETURN
2280 B$()=HEX(FE254A80)&STR(B$())
   : RETURN
2290 ON INT((RND(1)*8)+1)GOTO 2300,2310,2320,2330,2340,2350,2360,2370
2300 B$()=HEX(55AAA55A)&STR(B$())
   : RETURN
2310 B$()=HEX(A55AAA55)&STR(B$())
   : RETURN
2320 B$()=HEX(5A55AAA5)&STR(B$())
   : RETURN
2330 B$()=HEX(55A55AAA)&STR(B$())
   : RETURN
2340 B$()=HEX(A55A55AA)&STR(B$())
   : RETURN
2350 B$()=HEX(AA55A55A)&STR(B$())
   : RETURN
2360 B$()=HEX(AAA55A55)&STR(B$())
   : RETURN
2370 B$()=HEX(5AAA55A5)&STR(B$())
   : RETURN
2380 DEFFN'1
   : IF E9=1 THEN 2810
   : IF E9<>4 THEN 2390
   : PRINT HEX(06);
   : RETURN  CLEAR
   : GOTO 2810
   : REM % Help messages for errors
   : REM %'1
2390 IF X<90 OR X>99 THEN X=90
   : PRINT HEX(03); AT(22,0); BOX(2,79); " Press: RETURN to continue, or
      SF'1 to return to normal screen"; AT(20,25,54);
   : CONVERT X TO C1$,(##)
   : E9=4
   : LINPUT "Define error I-"? C1$
   : E9=0
   : CONVERT C1$ TO X
   : ERRORX=ERR
   : GOTO 2390
2400 E9=1
   : PRINT HEX(030A0A0A0A)
   : ON X-89GOTO 2410,2440,2490,2520,2560,2590,2630,2690,2730,2770
   : GOTO 2390
2410 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."
2420 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."
2430 GOTO 2820
2440 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"
2450 PRINT HEX(0C);"            on, for example, the disk is not in file-ready
      position and a disk              hardware error is generated."
2460 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";
2470 PRINT "            RUN mode by using the RUN/LOAD selection switch."
2480 GOTO 2820
2490 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."
2500 PRINT HEX(0D);"Recovery:   Run the program again. If the error persists,
     be sure that the disk             platter has been formatted."
2510 GOTO 2820
2520 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"
2530 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."
2540 PRINT HEX(0D);"Recovery:   Format the disk platter again. If the error pe
     rsists, replace the               media."
2550 GOTO 2820
2560 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."
2570 PRINT HEX(0A);"Recovery:   Turn off the format key."
2580 GOTO 2820
2590 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"
2600 PRINT "            write to a write-protected platter."
2610 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."
2620 GOTO 2820
2630 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-"
2640 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"
2650 PRINT "            disk was incorrect. The data has not been written."
2660 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"
2670 PRINT "            connections are properly made and are tight."
2680 GOTO 2820
2690 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-"
2700 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."
2710 PRINT "Recovery:   Run the program again. If the error persists, rewrite
     the flawed                sector."
2720 GOTO 2820
2730 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"
2740 PRINT HEX(0C);"            platter is not mounted. (The maximum legal sec
     tor address depends               upon the disk model used.)"
2750 PRINT HEX(0A);"Recovery:   Mount a platter in the specified drive."
2760 GOTO 2820
2770 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-"
2780 PRINT HEX(0C);"            ing that the information was not written prope
     rly. This error usual-            ly indicates that the disk platter is d
     efective."
2790 PRINT "Recovery:   Write the information again. If the error persists, tr
     y a new plat-             ter."
2800 GOTO 2820
2810 E9=3
   : RETURN
2820 PRINT AT(22,0);BOX(2,79); " Press: SF'1 to return to normal screen"
     ; HEX(06);AT(0,25);M1$
   : RETURN
2830 PRINT ""
2840 $IF OFF /005,2870
   : IF E9=1 OR (I-Z1)>=D OR (I-Z1)<0 THEN  2870
   : IF T$(I)=" no" THEN 2860
   : PRINT AT(I-Z1+2,0);
   : PRINTUSING 1120,D$(I),F$(I),A(I),S1,S1+7,E1(I),E2(I)
2850 GOTO 2870
2860 $IF OFF /005,2870
   : IF E9=1 OR (I-Z1)>=D OR (I-Z1)<0 THEN 2870
   : IF STR(F$(I),6,1)<>" " THEN PRINT ""
   : PRINT AT(I-Z1+2,0);
   : PRINTUSING 1120,D$(I),F$(I), HEX(20),S(I),E(I)
2870 PRINT ""
   : RETURN
7000 DEFFN'50
   : REM %'50
   : PRINT AT(22,8,71);HEX(06);"RETURN/RUN to continue";
   : 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 AT(22,0); BOX(2,79); " Press:"; ""; AT(23,8);"CLEAR/PREV SCR
     N - prev. screen";AT(23,57);"SF'14 - printer"; AT(22,57);"SF'1 - exp
     lain errors";
   : RETURN
7030 DEFFN '0
   : G=2
   : REM % Change page
   : RETURN
7040 DEFFN '1
   : REM % Print error information
   : GOTO 2380
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
   : 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(00) THEN GOTO 7030
   : IF C$=HEX(01) THEN GOTO 7040
   : IF C$=HEX(42) OR C$=HEX(52) THEN 7060
   : IF C$=HEX(0E) THEN 7070
   : RETURN
7150 REM % Reload menu
   : 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; "              "
7160 GOSUB 7010
   : PRINT AT(23,38,41);
   : GOSUB 7120
   : IF G=1 THEN 30
   : GOTO 7160
7170 LOAD RUN  T"START"
7180 REM % Text input meaasge
   : PRINT ""; AT(22,8,72); "RETURN, TAB/FN or arrows to change fi
     elds, then edit as required"; AT(23,8,32); "CONT/CTNUE to continu
     e ";
   : RETURN
7190 REM % Input and edit data
   : REM R,Y are screen cords. and A$ is data to edit
   : Z2,Z1=1
   : G,G1=0
   : GOSUB 7180
   : PRINT "";AT(R,Y); A2$; ""; AT(R,Y); HEX(05);
   : 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(4D5D4C5C7F7E4555465600010E)=C$)GOTO 7230,7230,7240,7240,7340,7
     350,7320,7320,7330,7330,7250,7300,7270
   : GOTO 7280
7270 GOSUB '14
7280 ON Z1 GOTO 7190,7200
7290 G=1
   : RETURN
7300 GOSUB 2380
7310 GOSUB 7130
   : IF E9<>3 THEN 7310
   : E9=0
   : GOSUB 470
   : 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 500, 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
   : RETURN
7400 P2$(1)="DEPT52"
   : P2$(2)="DEPT 52"
   : G=0
7410 REM % Input password
   : IF P1$=P2$(1) OR P1$=P2$(2) THEN 7460
   : GOSUB 7010
   : PRINT AT(22,8,70); "appropriate keys or RETURN to reenter passwor
     d"; AT(20,20,59);"Enter the password ";
   : P1$="       "
   : FOR B=1TO 7
7420 KEYIN C$,,7440
   : IF C$=HEX(81) THEN 7440
   : IF C$<>HEX(0D) THEN 7430
   : B=7
   : C$=" "
7430 STR(P1$,B,1)=C$
   : PRINT "*";
   : IF STR(P1$,1,6)="DEPT52" THEN B=7
   : NEXT B
   : IF P1$=P2$(1) OR P1$=P2$(2) THEN 7460
   : PRINT HEX(07)
   : GOTO 7400
7440 IF C$<>HEX(01) AND C$<>HEX(14) AND C$<>HEX(30) AND C$<>HEX(81) AND C$<>HE
     X(42) AND C$<>HEX(52) AND C$<>HEX(00) THEN GOTO 7430
   : IF C$=HEX(01) THEN 7450
   : IF C$=HEX(00) THEN G=2
   : IF C$=HEX(00) 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=7
   : NEXT B
   : IF C$=HEX(01) THEN 2380
   : 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,49); "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(01) THEN 7490
   : IF C$=HEX(0E) THEN GOTO 7455
   : IF C$<>HEX(00) THEN 7470
   : G=2
   : RETURN
7490 GOSUB 2380
7500 GOSUB 7130
   : IF E9<>3 THEN 7500
   : E9=0
   : GOSUB 470
   : GOTO 7460