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