FTN4,L PROGRAM TXMV1(3,100),91711-16033 REV 2001 791024 C C C *********************************************** C * SYSTEM AND PERIPHERAL DISC TEST PROGRAM * C * "TXMV1" * C *********************************************** C C C C C DESCRIPTION: C ------------ C C THE PROGRAM "TXMV1" VERIFIES THE PROPER OPERATION C OF THE SYSTEM DISC OR ANY PERIPHERAL DISC. C C C C OPERATING PROCEDURE: C -------------------- C C SCHEDULE THE PROGAM "TXMV1" FOR EXECUTION WITH THE RUN COMMAND. C C ENTER: RU,TXMV1,LOGLU,DISCLU,ST,MT,XXX C MM C C WHERE C C LOGLU IS THE LU FOR LOGGING AND ERROR MESSAGES. C C DISCLU IS THE DISC LU TO BE TESTED. C C ST RUN OPTIONAL SELF-TEST. C (DEFAULT NO SELF-TEST). C C MT OPTIONAL MEDIA TEST (TESTFILE REST OF CARTRIDGE). C (DEFAULT TESTFILE SIZE 24 BLOCKS). C MM OPTIONAL MEDIA TEST WITH MESSAGES. SAME AS MEDIA C TEST ABOVE. THE FOLLOWING MESSAGE WILL BE REPORTED C EVERY 15-25 SECONDS: C TXMV1 - LU# XX: DISC TEST XX.X% COMPLETE C C XXX OPTIONAL NUMBER OF PASSES. C (DEFAULT RUN ONCE). C C C NOTE: SET BREAK FLAG TO STOP THE DISC TEST. C (USING BR COMMAND) C C C C C C C C TEST SEQUENCE: C -------------- C C 1. RUN THE SELF-TEST (FOR IDC DISC ONLY). C C 2. BINARY SEEK-TEST ACROSS THE ENTIRE SURFACE. C C 3. CREATE TESTFILE "@TEST@" ON DISC LU (FILE TYPE 1). FILE C SIZE IS 24 BLOCKS. IF MT (MEDIA TEST) WAS SPECIFIED IN C RUN COMMAND, REST OF CARTRIDGE IS ALLOCATED TO TESTFILE C "@TEST@". C C 4. WRITE WORST CASE TEST PATTERN EACH CONSISTING OF 128 WORDS C TO TESTFILE "@TEST@" USING FMP CALLS. C C 5. READ AND READ/VERIFY THE WRITTEN DATA PATTERN USING DISC C OPERATION LIBRARY SUBROUTINES. REPORT ALL ERRORS. C C 6. REPEAT STEP 4 AND 5 UNTIL THE TESTFILE "@TEST@" IS FILLED. C 17 WORST CASE TEST PATTERN ARE USED AND ROTATED. C C 7. PURGE THE TESTFILE "@TEST@". C C 8. THE ENTIRE TEST IS REPEATED AS MANY TIMES AS SPECIFIED BY C THE OPTIONAL PARAMETER XXX (DEFAULT ONCE). C C C C C C C C C C LIST OF ALL INFORMATION MESSAGES: C --------------------------------- C C C C TXMV1 - LU# XX: DISC TEST RUNNING C C C TXMV1 - LU# 10: DISC TEST XX.X% COMPLETE C (OPTIONAL MESSAGE REPORTED EVERY 15 TO 25 SECONDS) C C C TXMV1 - LU# XX: SELF-TEST PASSED C C C TXMV1 - LU# XX: SELF-TEST NOT AVAILABLE! C C C TXMV1 - LU# XX: DISC TEST FINISHED XXXX PASSES XXXX ERRORS C C C C C C LIST OF ALL ERROR MESSAGES: C --------------------------- C C C C TXMV1 - LU# SPECIFIED FOR TEST DISC IS ILLEGAL. C RERUN TEST SPECIFYING AN INTEGER >0 AND <64 FOR LU#. C C TXMV1 - DISC TEST ABORTED! C C C TXMV1 - LU# XX: NOT ASSIGNED, NOT TESTED! C C C TXMV1 - LU# XX IS NOT A LEGAL DISC. C RERUN TEST SPECIFYING CORRECT LU#. C C C TXMV1 - LU# XX: EQT OR LU FOR TEST DISC IS DOWN. C UP EQT AND RERUN TEST. C C C TXMV1 - LU# XX: CARTRIDGE NOT MOUNTED. C MOUNT CARTRIDGE AND RERUN TEST. C C C TXMV1 - LU# XX: DISC TEST ABORTED! C C C TXMV1 - LU# XX: DRIVE NOT READY! C C C TXMV1 - LU# XX: DISC TRACK MAP TABLE ERROR! C C C TXMV1 - LU# XX: SELF-TEST FAILED! C C C TXMV1 - LU# XX: LOCK/UNLOCK ERROR! C C C TXMV1 - LU# XX: POWER-ON ERROR, RERUN TEST! C C C TXMV1 - LU# XX: HP-IB PARITY ERROR, RERUN TEST! C C C TXMV1 - LU# XX: TIME-OUT ERROR, RERUN TEST! C C C TXMV1 - LU# XX: ERROR FMP-XXX ON TEST FILE @TEST@! C (REFER TO FMP ERROR NUMBER DESCRIPTION IN THE BATCH SPOOL C MONITOR REFERENCE MANUAL) C C C TXMV1 - LU# XX: WRITE/READ DATA COMPARE ERROR! C TRACK# XXX, CYL# XXX, HEAD# X, UNIT# X C DATA XXXXXXB SHOULD BE XXXXXXB C NUMBER OF DATA COMPARE ERRORS: XXX C (ONLY THE FIRST THREE ERRORS ARE DISPLAYED) C C C TXMV1 - LU# XX: DISC STATUS ERROR! S1=XXXXXXB S2=XXXXXXB C (SEE NOTE) C C C TXMV1 - LU# XX: DISC READ ERROR! S1=XXXXXXB S2=XXXXXXB C TRACK# XXX, CYL# XXX, HEAD# X, UNIT# X C (SEE NOTE) C C C TXMV1 - LU# XX: DISC VERIFY ERROR! S1=XXXXXXB S2=XXXXXXB C TRACK# XXX, CYL# XXX, HEAD# X, UNIT# X C (SEE NOTE) C C C C POSSIBLE STATUS-1 ERRORS: C C STATUS-1 ERROR: ILLEGAL OPCODE C C STATUS-1 ERROR: ILLEGAL DRIVE TYPE C C STATUS-1 ERROR: CYLINDER MISCOMPARE C C STATUS-1 ERROR: UNCORRECTABLE DATA ERROR C C STATUS-1 ERROR: HEAD/SECTOR MISCOMPARE C C STATUS-1 ERROR: I/O PROGRAM ERROR C C STATUS-1 ERROR: END OF CYLINDER C C STATUS-1 ERROR: DATA OVERRUN C C STATUS-1 ERROR: ILLEGAL ACCESS TO SPARE TRACK C C STATUS-1 ERROR: DEFECTIVE TRACK C C STATUS-1 ERROR: ACCESS NOT READY DURING OPERATION C C STATUS-1 ERROR: STATUS-2 ERROR C C STATUS-1 ERROR: ATTEMPT TO WRITE ON PROTECTED TRACK C C STATUS-1 ERROR: UNIT UNAVAILABLE C C STATUS-1 ERROR: DRIVE ATTENTION C C C C POSSIBLE STATUS-2 ERRORS: C C STATUS-2 ERROR: DRIVE BUSY C C STATUS-2 ERROR: DRIVE NOT READY C C STATUS-2 ERROR: NO DISC OR HEADS UNLOADED C C STATUS-2 ERROR: SEEK OUT OF BOUND C C STATUS-2 ERROR: FIRST STATUS BIT SET C C STATUS-2 ERROR: DRIVE FAULT C C C C C NOTE: ALL POSSIBLE STATUS-1 AND STATUS-2 ERRORS C ARE REPORTED AFTER THE MAIN ERROR MESSAGE. C C C C C C C COMMON NAME(3),ISTAT(2),ISIZE(2) COMMON LULOG,NERR,LOOP,LMAX,NEXT,INCR,MASK,LOG COMMON ITYPE,LUDSK,IDVID,LTRK,ICYL,IHEAD,ISECT,IER DIMENSION ICART(125),IPRAM(5),MAP(5) C C************************* RECOVER PARAMETERS ************************ C CALL RMPAR(IPRAM) LULOG=1 IF (IPRAM(1) .GT. 0) LULOG=IPRAM(1) LUDSK=IPRAM(2) ISELF=0 IF (IPRAM(3) .EQ. 2HST) ISELF=1 ISIZE(1)=24 ISIZE(2)=0 IF ((IPRAM(4) .EQ. 2HMT) .OR. (IPRAM(4) .EQ. 2HMM)) ISIZE(1)=-1 LOG=0 IF (IPRAM(4) .EQ. 2HMM) LOG=1 LMAX=1 IF (IPRAM(5) .GT. 0) LMAX=IPRAM(5) C C************** STORE NAME FOR LOGGING AND ERROR MESSAGES ************ C NAME(1)=2HTX NAME(2)=2HMV NAME(3)=2H1 C C************************* ILLEGAL DISC LU *************************** C IF (IAND(LUDSK,177700B) .EQ. 0) GO TO 200 WRITE(LULOG,100) NAME 100 FORMAT(/,2X,3A2,"- LU# SPECIFIED FOR TEST DISC IS ", 1 "ILLEGAL."/,10X,"RERUN TEST SPECIFYING AN INTEGER", 2 " >0 AND <64 FOR LU#.") WRITE(LULOG,110) NAME 110 FORMAT(/,2X,3A2,"- DISC TEST ABORTED!",/) GO TO 820 C C************************ GET STATUS OF DISC LU ********************** C 200 CALL EXEC(13,LUDSK,IEQT5,IEQT4,LUSTAT) C C********************* CHECK IF DISC LU IS ENABLED ******************* C IF (IAND(IEQT4,77B) .NE. 0) GO TO 220 WRITE(LULOG,210) NAME,LUDSK 210 FORMAT(/,2X,3A2,"- LU#",I3,": NOT ASSIGNED, NOT TESTED!",/) GO TO 820 C C******************* CHECK IF DISC DRIVER TYPE IS 32 ***************** C 220 IF (IAND(IEQT5,37400B) .EQ. 15000B) GO TO 260 WRITE(LULOG,230) NAME,LUDSK 230 FORMAT(/,2X,3A2,"- LU#",I3," IS NOT A LEGAL DISC.",/, 1 10X,"RERUN TEST SPECIFYING CORRECT LU#.") 240 WRITE(LULOG,250) NAME,LUDSK 250 FORMAT(/,2X,3A2,"- LU#",I3,": DISC TEST ABORTED!",/) GO TO 820 C C*********************** CHECK IF DISC IS UP ************************* C 260 IF (IAND(IEQT5,140000B) .EQ. 40000B) GO TO 270 IF (IAND(LUSTAT,100000B) .EQ. 0) GO TO 300 270 WRITE(LULOG,280) NAME,LUDSK 280 FORMAT(/,2X,3A2,"- LU#",I3,": EQT OR LU FOR TEST DISC IS ", 1 "DOWN."/,10X,"UP EQT AND RERUN TEST.") GO TO 240 C C***************** GET DEVICE IDENTIFICATION (IDVID) ***************** C BITS 0-7 HP-IB ADDRESS C BITS 8-15 UNIT# OF DRIVE C 300 CALL EXEC(1,LUDSK+2200B,MAP,5,0,5) IDVID=IAND(MAP(5),16000B)/4 IDVID=IDVID+IAND(MAP(3),17B) C C************************** GET DISC STATUS ************************** C IER=0 CALL XSTAT(LUDSK,IDVID,ISTAT(1),ISTAT(2),IER) IF (IER .GT. 2) GO TO 310 IF (IAND(ISTAT(2),100000B) .EQ. 0) GO TO 330 310 WRITE(LULOG,320) NAME,LUDSK 320 FORMAT(/,2X,3A2,"- LU#",I3,": DRIVE NOT READY!") GO TO 240 C C************************** GET DRIVE TYPE *************************** C C ITYPE=1 FOR 7906 48 SECT/TRK, 4 HEADS, 411 CYL C ITYPE=2 FOR 7920 48 SECT/TRK, 5 HEADS, 823 CYL C ITYPE=3 FOR 7905 48 SECT/TRK, 3 HEADS, 411 CYL C ITYPE=4 FOR 7925 64 SECT/TRK, 9 HEADS, 823 CYL C ITYPE=5 FOR 7910 32 SECT/TRK, 2 HEADS, 748 CYL C ITYPE=6 FOR 9895 30 SECT/TRK, 2 HEADS, 77 CYL C 330 ITYPE=0 MASK=177B IF (IFDVR(LUDSK) .EQ. 0) MASK=377B C C********************* CHECK FOR 7905/7906/7920 ********************** C IDT=IAND(ISTAT(2),17000B)/1000B IF (MAP(1) .NE. 96) GO TO 400 IF (IDT .EQ. 0) ITYPE=1 IF (IDT .EQ. 1) ITYPE=2 IF (IDT .EQ. 2) ITYPE=3 C C************************** CHECK FOR 7925 *************************** C 400 IF (MAP(1) .NE. 128) GO TO 410 IF (IDT .EQ. 3) ITYPE=4 C C************************** CHECK FOR 9895 *************************** C 410 IF (MAP(1) .NE. 60) GO TO 420 ITYPE=6 MASK=37B C C************************** CHECK FOR 7910 *************************** C 420 IF (MAP(1) .EQ. 64) ITYPE=5 C C****************** ILLEGAL DISC TYPE, REPORT EROR ******************* C IF (ITYPE .NE. 0) GO TO 500 WRITE(LULOG,430) NAME,LUDSK 430 FORMAT(/,2X,3A2,"- LU#",I3,": DISC TRACK MAP TABLE ERROR!") GO TO 240 C C*************** CHECK TO SEE IF CARTRIDGE IS MOUNTED **************** C 500 CALL FSTAT(ICART) DO 510 I=1,125,4 IF (LUDSK .EQ. ICART(I)) GO TO 600 IF (ICART(I) .EQ. 0) GO TO 520 510 CONTINUE 520 WRITE(LULOG,530) NAME,LUDSK 530 FORMAT(/,2X,3A2,"- LU#",I3,": CARTRIDGE NOT MOUNTED."/, 1 10X,"MOUNT CARTRIDGE AND RERUN TEST.") GO TO 240 C C************************** START TESTING **************************** C 600 WRITE(LULOG,610) NAME,LUDSK 610 FORMAT(/,2X,3A2,"- LU#",I3,": DISC TEST RUNNING") C C****************** INITIALIZE PROGRAM PARAMETERS ******************** C INCR=1 NEXT=1 LOOP=1 C C****************** RESET NUMBER OF ERRORS (NERR) ******************** C NERR=0 C C************************ CALL TEST SUBROUTINES ********************** C 700 IF (ISELF .EQ. 1) CALL STEST CALL BSEEK CALL WRTST IF (LOOP .EQ. LMAX) GO TO 800 LOOP=LOOP+1 GO TO 700 C C************** TESTING COMPLETED, REPORT NUMBER OF ERRORS *********** C 800 WRITE(LULOG,810) NAME,LUDSK,LOOP,NERR 810 FORMAT(/,2X,3A2,"- LU#",I3,": DISC TEST FINISHED",I5, 1 " PASSES",I5," ERRORS",/) 820 END SUBROUTINE STEST C C C ********************************* C * SELF-TEST SUBROUTINE * C ********************************* C C C COMMON NAME(3),ISTAT(2),ISIZE(2) COMMON LULOG,NERR,LOOP,LMAX,NEXT,INCR,MASK,LOG COMMON ITYPE,LUDSK,IDVID,LTRK,ICYL,IHEAD,ISECT,IER DIMENSION IBUF(20) C C******************* EXECUTE SELF-TEST (IDC ONLY) ******************* C IF (IFDVR(LUDSK) .NE. 0) GO TO 1100 WRITE(LULOG,1000) NAME,LUDSK 1000 FORMAT(/,2X,3A2,"- LU#",I3,": SELF-TEST NOT AVAILABLE!") RETURN C 1100 ID=IAND(IDVID,7) IBUF(1)=440B+ID CALL XPRTY(IBUF(1)) IBUF(2)=577B IBUF(3)=0 IBUF(4)=1004B IBUF(5)=100677B C C************************* INITIATE SELF TEST ************************ C CALL EQTLK(1) CALL EXEC(1,LUDSK+2200B,IBUF,5,1,0) C C*************************** PARALLEL POLL *************************** C 1200 CALL EXEC(1,LUDSK+2200B,IPOLL,1,6,0) IC=IAND(2**(7-ID),IPOLL) IF (IAND(2**(7-ID),IPOLL) .EQ. 0) GO TO 1200 C C*********************** READ SELF TEST RESULT *********************** C IBUF(1)=500B+ID CALL XPRTY(IBUF(1)) IBUF(2)=100577B LEN=-2 CALL EXEC(1,LUDSK+2200B,IBUF,LEN,2,0) CALL EQTLK(0) IF (IAND(IBUF(17),200B) .NE. 0) GO TO 1400 WRITE(LULOG,1300) NAME,LUDSK 1300 FORMAT(/,2X,3A2,"- LU#",I3,": SELF-TEST PASSED") CALL XSTAT(LUDSK,IDVID,ISTAT(1),ISTAT(2),IER) RETURN 1400 CALL XEND(LUDSK,IDVID) WRITE(LULOG,1500) NAME,LUDSK 1500 FORMAT(/,2X,3A2,"- LU#",I3,": SELF-TEST FAILED!") WRITE(LULOG,1600) NAME,LUDSK 1600 FORMAT(/,2X,3A2,"- LU#",I3,": DISC TEST ABORTED!",/) CALL EXEC(6) END SUBROUTINE BSEEK C C C ********************************* C * BINARY SEEK TEST * C ********************************* C C C COMMON NAME(3),ISTAT(2),ISIZE(2) COMMON LULOG,NERR,LOOP,LMAX,NEXT,INCR,MASK,LOG COMMON ITYPE,LUDSK,IDVID,LTRK,ICYL,IHEAD,ISECT,IER DIMENSION NCYL02(8),NCYL05(11),NCYL10(12),NCYL20(12) DATA NCYL02 / 0,1,2,4,8,16,32,64 / DATA NCYL05 / 0,1,2,4,8,16,32,64,128,256,410 / DATA NCYL10 / 0,1,2,4,8,16,32,64,128,256,512,747 / DATA NCYL20 / 0,1,2,4,8,16,32,64,128,256,512,822 / C C GET PHYSICAL ADDRESSES: C LTRK=0 LSEC=0 CALL XGTAD(LUDSK,IDVID,LTRK,LSEC,ICYL,IHEAD,ISECT) C GO TO (1000,2000,1000,2000,3000,4000), ITYPE C C****************** BINARY SEEK TEST FOR 7905/7906 ******************* C 1000 DO 1100 I=1,11 ICYL=NCYL05(I) CALL EQTLK(1) CALL XSEEK(LUDSK,IDVID,ICYL,IHEAD,ISECT,ISTAT(1),ISTAT(2),IER) CALL EQTLK(0) CALL CKSTA(1) 1100 CONTINUE RETURN C C******************* BINARY SEEK TEST FOR 7920/7925 ****************** C 2000 DO 2100 I=1,12 ICYL=NCYL20(I) CALL EQTLK(1) CALL XSEEK(LUDSK,IDVID,ICYL,IHEAD,ISECT,ISTAT(1),ISTAT(2),IER) CALL EQTLK(0) CALL CKSTA(1) 2100 CONTINUE RETURN C C********************* BINARY SEEK TEST FOR 7910 ********************* C 3000 DO 3100 I=1,12 ICYL=NCYL10(I) CALL EQTLK(1) CALL XSEEK(LUDSK,IDVID,ICYL,IHEAD,ISECT,ISTAT(1),ISTAT(2),IER) CALL EQTLK(0) CALL CKSTA(1) 3100 CONTINUE RETURN C C********************* BINARY SEEK TEST FOR 9895 ********************* C 4000 DO 4100 I=1,8 ICYL=NCYL02(I) CALL EQTLK(1) CALL XSEEK(LUDSK,IDVID,ICYL,IHEAD,ISECT,ISTAT(1),ISTAT(2),IER) CALL EQTLK(0) CALL CKSTA(1) 4100 CONTINUE RETURN END SUBROUTINE WRTST C C C ********************************* C * WRITE/READ TEST * C ********************************* C C C COMMON NAME(3),ISTAT(2),ISIZE(2) COMMON LULOG,NERR,LOOP,LMAX,NEXT,INCR,MASK,LOG COMMON ITYPE,LUDSK,IDVID,LTRK,ICYL,IHEAD,ISECT,IER DIMENSION IDCB(144),IBUFR(144),IBUFW(128) DIMENSION IPAT(17),NFILE(3) C C********************** WORST CASE DATA PATTERN ********************** C DATA IPAT / 155555B,177777B,175767B,055555B,002010B,170360B, 1 162745B,000000B,163346B,022222B,033066B,052525B, 2 125252B,106615B,133333B,143306B,007417B/ C C********************** NAME FOR TEST FILE @TEST@ ******************** C DATA NFILE / 2H@T,2HES,2HT@ / C C*********************** CREATE FMP TEST FILE ************************ C IERR=0 ITYP=1 ISECU=0 ICR=-LUDSK CALL CREAT(IDCB,IERR,NFILE,ISIZE,ITYP,ISECU,ICR) IF (IERR .LT. 0) GO TO 3100 MAX=IERR/2 LTRK=IDCB(4) LSEC=IDCB(5) NSPT=IDCB(9) C C*********************** WRITE/READ TEST LOOP ************************ C LEN=128 NUM=0 DO 3000 J=1,MAX C C*********************** TEST THE BREAK FLAG ************************* C IF SET - STOP TESTING AND REPORT FINISHED MESSAGE C IF (IFBRK (IDUMY)) 1000,1200 1000 CALL PURGE(IDCB,IERR,NFILE,ISECU,ICR) IF (IERR .LT. 0) GO TO 3100 WRITE(LULOG,1100) NAME,LUDSK,LOOP,NERR 1100 FORMAT(/,2X,3A2,"- LU#",I3,": DISC TEST FINISHED",I5, 1 " PASSES",I5," ERRORS",/) GO TO 3300 C C****************** REPORT XX.X% COMPLETE MESSAGE ******************* C 1200 IF (LOG .EQ. 0) GO TO 1400 INCR=INCR+1 IF (IAND(INCR,MASK) .NE. 0) GO TO 1400 PASS=FLOAT(J)+(FLOAT(MAX)*FLOAT(LOOP-1)) PRCNT=100.0*PASS/(FLOAT(LMAX)*FLOAT(MAX)) WRITE(LULOG,1300) NAME,LUDSK,PRCNT 1300 FORMAT(/,2X,3A2,"- LU#",I3,": DISC TEST",F6.1,"% COMPLETE") C C****************** WRITE DATA PATTERN TO THE DISC ******************* C USING FMP CALLS C WRITE BUFFER IBUFW(128) C 1400 DO 1500 I=1,128 IBUFW(I)=IPAT(NEXT) 1500 CONTINUE CALL WRITF(IDCB,IERR,IBUFW,LEN,NUM) IF (IERR .LT. 0) GO TO 3100 C C********************** READ DATA FROM THE DISC ********************** C USING DISC OPERATION LIBRARY SUBROUTINES C READ BUFFER IBUFR(144) C CALL XGTAD(LUDSK,IDVID,LTRK,LSEC,ICYL,IHEAD,ISECT) CALL EQTLK(1) CALL XSEEK(LUDSK,IDVID,ICYL,IHEAD,ISECT,ISTAT(1),ISTAT(2),IER) CALL CKSTA(1) C CALL XDRED(LUDSK,IDVID,IBUFR,LEN,ISTAT(1),ISTAT(2),IER) CALL EQTLK(0) CALL CKSTA(2) C C****************** COMPARE WRITE/READ BUFFER ************************ C DISPLAY ONLY THE FIRST THREE ERRORS C N3=0 DO 2500 I=17,144 IF (IBUFR(I) .EQ. IPAT(NEXT)) GO TO 2500 NERR=NERR+1 N3=N3+1 GO TO (2000,2300,2300,2500), N3 2000 WRITE(LULOG,2100) NAME,LUDSK 2100 FORMAT(/,2X,3A2,"- LU#",I3,": WRITE/READ DATA COMPARE ERROR!") IUNIT=IAND(IDVID,7) WRITE(LULOG,2200) LTRK,ICYL,IHEAD,IUNIT 2200 FORMAT(18X,"TRACK#",I4,", CYL#",I4,", HEAD#",I2,", UNIT#",I2) 2300 WRITE(LULOG,2400) IBUFR(I),IPAT(NEXT) 2400 FORMAT(18X,"DATA ",@6,"B SHOULD BE ",@6,"B") 2500 CONTINUE IF (N3 .NE. 0) WRITE(LULOG,2600) N3 2600 FORMAT(18X,"NUMBER OF DATA COMPARE ERRORS:",I4) C C************************* READ VERIFY DATA ************************** C USING DISC OPERATION LIBRARY SUBROUTINES C CALL XGTAD(LUDSK,IDVID,LTRK,LSEC,ICYL,IHEAD,ISECT) CALL EQTLK(1) CALL XSEEK(LUDSK,IDVID,ICYL,IHEAD,ISECT,ISTAT(1),ISTAT(2),IER) CALL CKSTA(1) NSEC=1 CALL XVRFY(LUDSK,IDVID,NSEC,ISTAT(1),ISTAT(2),IER) CALL EQTLK(0) CALL CKSTA(3) NEXT=NEXT+1 IF (NEXT .GT. 17) NEXT=1 LSEC=LSEC+2 IF (LSEC .LT. NSPT) GO TO 3000 LSEC=LSEC-NSPT LTRK=LTRK+1 3000 CONTINUE C C*********************** PURGE FMP TEST FILE ************************* C CALL PURGE(IDCB,IERR,NFILE,ISECU,ICR) IF (IERR .LT. 0) GO TO 3100 RETURN C C************************* REPORT FMP ERROR ************************** C 3100 IFMP=KCVT(-IERR) IF (IAND(IFMP,157400B) .EQ. 0) IFMP=IFMP+10000B WRITE(LULOG,3200) NAME,LUDSK,IFMP 3200 FORMAT(/,2X,3A2,"- LU#",I3,": ERROR FMP-0",A2, 1 " ON TEST FILE @TEST@!") 3300 WRITE(LULOG,3400) NAME,LUDSK 3400 FORMAT(/,2X,3A2,"- LU#",I3,": DISC TEST ABORTED!",/) CALL EXEC(6) END SUBROUTINE CKSTA(ICOM) COMMON NAME(3),ISTAT(2),ISIZE(2) COMMON LULOG,NERR,LOOP,LMAX,NEXT,INCR,MASK,LOG COMMON ITYPE,LUDSK,IDVID,LTRK,ICYL,IHEAD,ISECT,IER C C THIS SUBROUTINE CHECKS THE STATUS AFTER THE C FOLLOWING DISC OPERATION LIBRARY SUBROUTINES: C C - SEEK COMMAND (ICOM=1) C - READ COMMAND (ICOM=2) C - VERIFY COMMAND (ICOM=3) C C C C******************** CHECK ERROR RETURN (IER) *********************** C C IER: C 0 DSJ=0 NORMAL COMPLETION C 1 DSJ=1 ABNORMAL COMPLETION C 2 DSJ=2 POWER-ON OR COMPLETION OF SELF-TEST C 3 DSJ=3 HP-IB PARITY ERROR C 4 LU HAS TIMED-OUT C C IF ((IER .EQ. 0) .OR. (IER .EQ. 1)) GO TO 2000 C IF (IER .EQ. 2) WRITE(LULOG,1000) NAME,LUDSK 1000 FORMAT(/,2X,3A2,"- LU#",I3,": POWER-ON ERROR, RERUN TEST!") C IF (IER .EQ. 3) WRITE(LULOG,1100) NAME,LUDSK 1100 FORMAT(/,2X,3A2,"- LU#",I3,": HP-IB PARITY ERROR, RERUN TEST!") C IF (IER .EQ. 4) WRITE(LULOG,1200) NAME,LUDSK 1200 FORMAT(/,2X,3A2,"- LU#",I3,": TIME-OUT ERROR, RERUN TEST!") C WRITE(LULOG,1300) NAME,LUDSK 1300 FORMAT(/,2X,3A2,"- LU#",I3,": DISC TEST ABORTED!",/) CALL EXEC(6) C C***************** CHECK STATUS AFTER READ OR VERIFY ***************** C STATUS-1: IDC STAT SHOULD BE ZERO C 2000 IF (ICOM .EQ. 1) GO TO 2100 IF (IAND(ISTAT(1),17400B) .EQ. 0) RETURN GO TO 2300 C C****************** CHECK STATUS AFTER SEEK COMMAND ****************** C C 7910 ONLY !! *** IGNORE IDC STAT 20B (ILLEGAL ACCESS TO SPARE TRACK) C 2100 IF (ITYPE .NE. 5) GO TO 2200 IF (ISTAT(1) .EQ. 110000B) ISTAT(1)=17400B C C STATUS-2: E-BIT SHOULD BE ZERO C STATUS-1: IDC STAT SHOULD BE 37B C 2200 IF (IAND(ISTAT(2),100000B) .NE. 0) GO TO 2300 IF (IAND(ISTAT(1),17400B) .EQ. 17400B) RETURN C C CHECK FOR NORMAL COMPLETION (ICD STAT 0) C IF (ISTAT(1) .EQ. 0) RETURN C C***************** STATUS ERROR, REPORT ERROR MESSAGE **************** C 2300 CALL ERMSG(ICOM) RETURN END SUBROUTINE ERMSG(ICOM) COMMON NAME(3),ISTAT(2),ISIZE(2) COMMON LULOG,NERR,LOOP,LMAX,NEXT,INCR,MASK,LOG COMMON ITYPE,LUDSK,IDVID,LTRK,ICYL,IHEAD,ISECT,IER C C THIS SUBROUTINE DETERMINES THE ERROR AND REPORTS C ALL POSSIBLE STATUS ERRORS TO THE LOG DEVICE. C C IUNIT=IAND(IDVID,7) C C********************* INCREMENT NUMBER OF ERRORS ******************** C NERR=NERR+1 C C************************ STATUS ERROR MESSAGE *********************** C IF (ICOM .EQ. 1) WRITE(LULOG,9010) NAME,LUDSK,ISTAT(1),ISTAT(2) 9010 FORMAT(/,2X,3A2,"- LU#",I3,": DISC STATUS ERROR! ", 1 "S1=",@6,2X,"S2=",@6) IF (ICOM .EQ. 1) GO TO 9050 C C************************* READ ERROR MESSAGE ************************ C IF (ICOM .EQ. 2) WRITE(LULOG,9020) NAME,LUDSK,ISTAT(1),ISTAT(2) 9020 FORMAT(/,2X,3A2,"- LU#",I3,": DISC READ ERROR! ", 1 "S1=",@6,2X,"S2=",@6) C C************************ VERIFY ERROR MESSAGE *********************** C IF (ICOM .EQ. 3) WRITE(LULOG,9030) NAME,LUDSK,ISTAT(1),ISTAT(2) 9030 FORMAT(/,2X,3A2,"- LU#",I3,": DISC VERIFY ERROR! ", 1 "S1=",@6,2X,"S2=",@6) C C************* REPORT LOGICAL AND PHYSICAL DISC ADDRESS ************* C WRITE(LULOG,9040) LTRK,ICYL,IHEAD,IUNIT 9040 FORMAT(18X,"TRACK#",I4,", CYL#",I4,", HEAD#",I2,", UNIT#",I2) C C*********************** PROCESS STATUS-1 ERROR ********************** C 9050 IS1=IAND(ISTAT(1),17400B) IS1=IS1/400B C IF (IS1 .EQ. 1) WRITE(LULOG,9101) IF (IS1 .EQ. 3) WRITE(LULOG,9103) IF (IS1 .EQ. 7) WRITE(LULOG,9107) IF (IS1 .EQ. 10B) WRITE(LULOG,9110) IF (IS1 .EQ. 11B) WRITE(LULOG,9111) IF (IS1 .EQ. 12B) WRITE(LULOG,9112) IF (IS1 .EQ. 14B) WRITE(LULOG,9114) IF (IS1 .EQ. 16B) WRITE(LULOG,9116) IF (IS1 .EQ. 20B) WRITE(LULOG,9120) IF (IS1 .EQ. 21B) WRITE(LULOG,9121) IF (IS1 .EQ. 22B) WRITE(LULOG,9122) IF (IS1 .EQ. 23B) WRITE(LULOG,9123) IF (IS1 .EQ. 26B) WRITE(LULOG,9126) IF (IS1 .EQ. 27B) WRITE(LULOG,9127) IF (IS1 .EQ. 37B) WRITE(LULOG,9137) C C********************** PROCESS STATUS-2 ERROR *********************** C IS2=IAND(ISTAT(2),37B) C C C C IF (IAND(IS2,3) .EQ. 1) WRITE(LULOG,9201) IF (IAND(IS2,3) .EQ. 2) WRITE(LULOG,9202) IF (IAND(IS2,3) .EQ. 3) WRITE(LULOG,9203) IF (IAND(IS2,4) .EQ. 4) WRITE(LULOG,9204) IF (IAND(IS2,10B) .EQ. 10B) WRITE(LULOG,9210) IF (IAND(IS2,20B) .EQ. 20B) WRITE(LULOG,9220) RETURN C C************************** STATUS-1 ERRORS ************************** C 9101 FORMAT(18X,"STATUS-1 ERROR: ILLEGAL OPCODE") 9103 FORMAT(18X,"STATUS-1 ERROR: ILLEGAL DRIVE TYPE") 9107 FORMAT(18X,"STATUS-1 ERROR: CYLINDER MISCOMPARE") 9110 FORMAT(18X,"STATUS-1 ERROR: UNCORRECTABLE DATA ERROR") 9111 FORMAT(18X,"STATUS-1 ERROR: HEAD/SECTOR MISCOMPARE") 9112 FORMAT(18X,"STATUS-1 ERROR: I/O PROGRAM ERROR") 9114 FORMAT(18X,"STATUS-1 ERROR: END OF CYLINDER") 9116 FORMAT(18X,"STATUS-1 ERROR: DATA OVERRUN") 9120 FORMAT(18X,"STATUS-1 ERROR: ILLEGAL ACCESS TO SPARE TRACK") 9121 FORMAT(18X,"STATUS-1 ERROR: DEFECTIVE TRACK") 9122 FORMAT(18X,"STATUS-1 ERROR: ACCESS NOT READY DURING OPERATION") 9123 FORMAT(18X,"STATUS-1 ERROR: STATUS-2 ERROR") 9126 FORMAT(18X,"STATUS-1 ERROR: ATTEMPT TO WRITE ON PROTECTED TRACK") 9127 FORMAT(18X,"STATUS-1 ERROR: UNIT UNAVAILABLE") 9137 FORMAT(18X,"STATUS-1 ERROR: DRIVE ATTENTION") C C************************** STATUS-2 ERRORS ************************** C 9201 FORMAT(18X,"STATUS-2 ERROR: DRIVE BUSY") 9202 FORMAT(18X,"STATUS-2 ERROR: DRIVE NOT READY") 9203 FORMAT(18X,"STATUS-2 ERROR: NO DISC OR HEADS UNLOADED") 9204 FORMAT(18X,"STATUS-2 ERROR: SEEK OUT OF BOUND") 9210 FORMAT(18X,"STATUS-2 ERROR: FIRST STATUS BIT SET") 9220 FORMAT(18X,"STATUS-2 ERROR: DRIVE FAULT") 9240 FORMAT(18X,"STATUS-2 ERROR: DISC WRITE PROTECTED") END SUBROUTINE EQTLK(IOPTN) C C THIS SUBROUTINE LOCKS THE PROGRAM INTO MEMORY AND LOCKS C THE DISC EQT DURING CRITICAL DISC I/O OPERATIONS. C C COMMON NAME(3),ISTAT(2),ISIZE(2) COMMON LULOG,NERR,LOOP,LMAX,NEXT,INCR,MASK,LOG COMMON ITYPE,LUDSK,IDVID,LTRK,ICYL,IHEAD,ISECT,IER IF (IOPTN .EQ. 1) CALL EXEC(22,IOPTN) CALL EQTRQ(IOPTN,LUDSK) CALL ABREG(IA,IB) IF (IOPTN .EQ. 0) CALL EXEC(22,IOPTN) IF (IA .EQ. 0) RETURN WRITE(LULOG,1000) NAME,LUDSK 1000 FORMAT(/,2X,3A2,"- LU#",I3,": LOCK/UNLOCK ERROR!") WRITE(LULOG,1100) NAME,LUDSK 1100 FORMAT(/,2X,3A2,"- LU#",I3,": DISC TEST ABORTED!",/) CALL EXEC(6) END END$