10 REM -- DSKTST.BAS
11 REM -- Program to test for disk/disk controllers write-to-the-wrong-
12 REM -- block errors.  It was designed specifically to detect a known
13 REM -- disk controller problem on some AM-410 systems.

20 REM -- This program was written at Victorex, Inc., 1529 Cypress St,
21 REM -- Suite 103, Walnut Creek, California 94596, (415) 943-1023.

30 REM -- This program presents a constant display at the user's term-
31 REM -- inal, and writes a log entry to 'DSKTST.LST' for every error
32 REM -- detected, as well as a status message every 30 minutes.  A
33 REM -- entry is made in log file when the program is terminated with
34 REM -- a Control C.  Restarting the program reinitializes the log
35 REM -- file.

40 REM -- HASH (.RUN-AMOS/L 1.0B): 325-540-742-213

100 MAP1 REC512
105  MAP2 RECNM1,F
106  MAP2 CNTNM1,F
110  MAP2 FILLER,X,488
114  MAP2 CNTNM2,F
115  MAP2 RECNM2,F
120 MAP1 FILSIZ,F,6,29000                       ! Hardwired file size
125 MAP1 FILNAM$,S,24,"DSK5:DSKTST.DAT[1,2]"    ! Hardwired file name
130 MAP1 MSGFIL$,S,10,"DSKTST.LST"
140 MAP1 SYSDATE
142  MAP2 SYSMTH,B,1
144  MAP2 SYSDAY,B,1
146  MAP2 SYSYER,B,1
148  MAP2 SYSFIL,X,1
150 MAP1 SYSDAT,B,4,@SYSDATE
160 MAP1 DSPDATE
162  MAP2 DSPMTH,B,1
164  MAP2 DSPDAY,B,1
166  MAP2 DSPYER,B,1
168  MAP2 DSPFIL,X,1
169 MAP1 DSPDAT,B,4,@DSPDATE
170 MAP1 DSPTIM,F
175 MAP1 TIMMSK$,S,16,"##/#Z/#Z  ##:#Z"
176 MAP1 ERRMSK$,S,38,"  #####  #####  ##### ####### #######"
177 MAP1 CNTMSK$,S,28,"  #,###,### ### ### ### ###"
180 MAP1 ANS$,S,10
181 MAP1 ANS,F
185 MAP1 RDCNT,F
186 MAP1 WTCNT,F
186 MAP1 ERR1,F
187 MAP1 ERR2,F
188 MAP1 RCD1,F
189 MAP1 RCD2,F
190 MAP1 CNT1,F
191 MAP1 CNT2,F

200 REM -- Intro
205 PRINT
210 PRINT "DISK DRIVE READ & WRITE TEST PROGRAM."
215 PRINT
220 PRINT "THIS PROGRAM WRITES AND READS TEST DATA TO ENSURE THAT RECORDS"
222 PRINT "ARE BEING WRITTEN TO THE PROPER BLOCK NUMBERS.  A"FILSIZ"BLOCK"
224 PRINT "RANDOM FILE NAMED "FILNAM$" IS REQUIRED TO RUN THIS PROGRAM."
226 PRINT "THIS PROGRAM MUST BE RUN IN [1,2]."
230 PRINT
232 GOTO 300
235 PRINT "OK TO PROCEED (N)";
240 ANS$="N"
242 INPUT ANS$ :ANS$=UCS(ANS$[1,1])
244 IF ANS$="Y" THEN 300
245 PRINT "RUN ABORTED."
246 END

300 REM -- Does file exist now?
305 LOOKUP FILNAM$,ANS
310 IF ANS=-FILSIZ THEN 400
315 IF ANS=0 THEN 350
320 PRINT
322 PRINT "FOUND EXISTING FILE NAMED "FILNAM$", BUT OF WRONG SIZE."
324 PRINT
326 PRINT "OK TO REINITIALIZE (N)";
330 ANS$="N"
332 INPUT ANS$ :ANS$=UCS(ANS$[1,1])
334 IF ANS$="Y" THEN 345
340 PRINT "RUN ABORTED."
342 END

345 PRINT
346 PRINT "ERASING OLD FILE"
347 KILL FILNAM$

350 REM -- Allocate
355 PRINT
360 PRINT "ALLOCATING NEW FILE"
365 ALLOCATE FILNAM$,FILSIZ

400 REM -- Open
405 OPEN #1,FILNAM$,RANDOM,512,R1
410 OPEN #2,MSGFIL$,OUTPUT                      ! Init message file
415 CLOSE #2

500 REM -- Set up screen
505 PRINT TAB(-1,0);
510 PRINT TAB(4,10);"DSKTST, the Victorex disk drive test program is running.";
512 PRINT TAB(5,11);"This program will result in a temporary degradation in";
514 PRINT TAB(6,11);"system performance for other jobs running concurrently.";
520 GOSUB 1200                                  ! Get current date and time
530 PRINT TAB(08,20);"Test began at:  ";
532 PRINT USING TIMMSK$,DSPMTH,DSPDAY,DSPYER,DSPHRS,DSPMIN;
540 PRINT TAB(09,20);"The time now is:";
545 GOSUB 1400                          ! Display current date and time
550 PRINT TAB(11,15);"Type a Control 'C' to terminate this program.";
555 PRINT TAB(12,14);"Program statistics are being saved in "MSGFIL$;
560 PRINT TAB(14,30);"Tst Count:";
562 PRINT TAB(15,30);"Error #1:";
564 PRINT TAB(16,30);"Error #2:";
565 PRINT TAB(17,30);"Error #3:";
566 PRINT TAB(18,30);"Error #4:";
570 PRINT TAB(20,1);"Last error:  Count:              Rcd Nr:";
574 PRINT TAB(21,1);"             Cnt#1:              Key #1:";
576 PRINT TAB(22,1);"             Cnt#2:              Key #2:";
580 ON ERROR GOTO 3000                  ! To trap Control C

600 REM -- Begin main loop
610 GOSUB 1800                          ! Update display
620 FOR X1=1 TO 10                      ! Loop for 20 writes/reads
625  GOSUB 1600                         ! Do 2 writes and reads
630 NEXT X1
640 GOSUB 1200                          ! Get current date and time
645 IF DSPMIN=LAST'MIN THEN 600         ! Loop around
650 GOSUB 1400                          ! Redisplay date and time
655 IF DSPMIN=0 OR DSPMIN=30 THEN GOSUB 2200    ! Update the statistics file
660 GOTO 600                            ! Loop till get Control C

1200 REM -- Get current date and time
1210 DSPDAT=DATE
1215 DSPTIM=TIME
1216 DSPTIM=DSPTIM*60                   ! For AMOS/L
1220 DSPHRS=INT(DSPTIM/216000)
1225 DSPMIN=DSPTIM-DSPHRS*216000
1226 DSPMIN=INT((DSPMIN+30)/3600)
1230 RETURN

1400 REM -- Display current date and time
1405 PRINT TAB(09,36);
1410 PRINT USING TIMMSK$,DSPMTH,DSPDAY,DSPYER,DSPHRS,DSPMIN;
1415 LAST'MIN=DSPMIN                    ! Save to update time each min
1420 RETURN

1600 REM -- Do two writes and reads
1610 R1=INT(RND(1)*FILSIZ)              ! Calc first blk nr
1612 WTCNT=WTCNT+1                      ! Incr write counter
1615 RECNM1=R1 :RECNM2=R1               ! Store rcd nr in rcd (2)
1616 CNTNM1=WTCNT :CNTNM2=WTCNT         ! Store write cnt in rcd (2)
1620 WRITE #1,REC512                    ! Write the rcd
1625 RCD1=R1                            ! Save rcd nr
1627 CNT1=WTCNT                         ! Save count
1630 R1=INT(RND(1)*FILSIZ)              ! Now, do same for 2nd rcd
1631 IF R1=RCD1 THEN 1630               ! Don't do two writes to same blk
1632 WTCNT=WTCNT+1
1635 RECNM1=R1 :RECNM2=R1
1636 CNTNM1=WTCNT :CNTNM2=WTCNT
1640 WRITE #1,REC512
1645 RCD2=R1
1646 CNT2=WTCNT
1650 R1=RCD1 :FILERR=0
1655 READ #1,REC512
1660 RDCNT=RDCNT+1
1665 IF RECNM1#RCD1 THEN FILERR=-1 :ERR1=ERR1+1
1670 IF RECNM2#RCD1 THEN FILERR=-1 :ERR2=ERR2+1
1672 IF CNTNM1#CNT1 THEN FILERR=-1 :ERR3=ERR3+1
1674 IF CNTNM2#CNT1 THEN FILERR=-1 :ERR4=ERR4+1
1675 IF FILERR GOSUB 2000               ! Display error & update file
1680 R1=RCD2 :FILERR=0
1685 READ #1,REC512
1690 RDCNT=RDCNT+1
1695 IF RECNM1#RCD2 THEN FILERR=-1 :ERR1=ERR1+1
1700 IF RECNM2#RCD2 THEN FILERR=-1 :ERR2=ERR2+1
1701 IF CNTNM1#CNT2 THEN FILERR=-1 :ERR3=ERR3+1
1702 IF CNTNM2#CNT2 THEN FILERR=-1 :ERR4=ERR4+1
1705 IF FILERR GOSUB 2000               ! Display error & update file
1710 RETURN

1800 REM -- Update counts
1810 PRINT TAB(14,41);RDCNT;
1815 PRINT TAB(15,41);ERR1;
1820 PRINT TAB(16,41);ERR2;
1822 PRINT TAB(17,41);ERR3;
1824 PRINT TAB(18,41);ERR4;
1825 RETURN

2000 REM -- Display error/update disk
2010 PRINT TAB(20,21);SPACE$(10);TAB(20,21);RDCNT;
2012 PRINT TAB(20,42);SPACE$(10);TAB(20,42);R1;
2015 PRINT TAB(21,21);SPACE$(10);TAB(21,21);CNTNM1;
2016 PRINT TAB(21,42);SPACE$(10);TAB(21,42);RECNM1;
2020 PRINT TAB(22,21);SPACE$(10);TAB(22,21);CNTNM2;
2025 PRINT TAB(22,42);SPACE$(10);TAB(22,42);RECNM2;
2030 OPEN #2,MSGFIL$,APPEND
2035 PRINT #2 USING TIMMSK$,DSPMTH,DSPDAY,DSPYER,DSPHRS,DSPMIN;
2040 PRINT #2 USING CNTMSK$,RDCNT,ERR1,ERR2;ERR3;ERR4;
2040 PRINT #2 USING ERRMSK$,R1,RECNM1,RECNM2;CNTNM1;CNTNM2
2045 CLOSE #2
2050 RETURN

2200 REM -- Update message file on 30 minute intervals
2200 OPEN #2,MSGFIL$,APPEND
2205 PRINT #2 USING TIMMSK$,DSPMTH,DSPDAY,DSPYER,DSPHRS,DSPMIN;
2210 PRINT #2 USING CNTMSK$,RDCNT,ERR1,ERR2,ERR3,ERR4
2215 CLOSE #2
2220 RETURN

3000 REM -- Error wrapup, usually Control C
3010 GOSUB 2200                         ! Update message file
3020 GOSUB 1800                         ! Update screen
3030 PRINT TAB(23,1);"Run terminated."

9999 END