FTN4,L PROGRAM TXMT0(3,89),91711-16018 REV 1926 790501 C C GET INPUT PARAMETERS C RU,TXMT0,LIST,TESTLU,LOOPS C WHERE LIST=LOGICAL UNIT FOR LOG DEVICE. DEFAULT IS THE C SYSTEM CONSOLE, LU 1 C TESTLU=MAGNETIC TAPE UNIT TO BE TESTED C LOOPS=NUMBER OF TEST ITERATIONS. DEFAULT IS ONE. C C MODIFIED 790201 BY ED COPE C VIRGIN TAPE READ TEST ADDED C C TEST MAGNETIC TAPE LOGICAL UNIT C C TEST SEQUENCE IS: C 1. REWIND C 2. TEST WRITE RING STATUS C 3. TEST START OF TAPE(SOT) STATUS C 4. WRITE RECORD, LENGTH EQUAL 1024 WORDS C 5. WRITE RECORD, LENGTH EQUAL 512 WORDS C 6. WRITE RECORD, LENGTH EQUAL 256 WORDS C 7. WRITE END OF FILE RECORD C 8. WRITE RECORD, LENGTH EQUAL 1024 WORDS C 9. WRITE RECORD, LENGTH EQUAL 512 WORDS C 10. WRITE RECORD, LENGTH EQUAL 256 WORDS C 11. WRITE END OF FILE RECORD C 12. REWIND C 13. TEST STATUS=SOT C 14. READ RECORD C 15. VERIFY RECORD C 16. READ RECORD C 17. VERIFY RECORD C 18. READ RECORD C 19. VERIFY RECORD C 20. READ RECORD C 21. VERIFY END OF FILE STATUS C 22. READ RECORD C 23. VERIFY RECORD C 24. READ RECORD C 25. VERIFY RECORD C 26. READ RECORD C 27. VERIFY RECORD C 28. READ RECORD C 29. VERIFY END OF FILE STATUS C 30. BACKWARD SPACE RECORD C 31. BACKWARD SPACE RECORD C 32. READ RECORD C 33. VERIFY RECORD C 34. READ RECORD C 35. VERIFY END OF FILE STATUS C 36. REWIND C 37. VERIFY START OF TAPE STATUS C 38. FORWARD SPACE FILE C 39. VERIFY END OF FILE STATUS C 40. READ RECORD C 41. VERIFY RECORD C 42. BACKWARD SPACE FILE C 43. VERIFY END OF FILE STATUS C 44. REWIND C 45. READ RECORD C 46. BACKSPACE RECORD C 47. READ RECORD C 48. VERIFY RECORD C 49. REWIND C 50. VERIFY START OF TAPE STATUS C 51. ERASE 32 INCHES OF TAPE C 52. REWIND C 53. READ RECORD C 54. VERIFY ZERO LENGTH XMISSION LOG C 55. **TERMINATE TEST** C C C INTEGER IPARMS(5) INTEGER LULIST,LU INTEGER EQT5,EQT4,EQTST INTEGER ERASE INTEGER CODE13 INTEGER NDTYPE INTEGER IREG(2) INTEGER REGA,REGB INTEGER GO,AB INTEGER LOCKOP,UNLOCK INTEGER PNAME(3) INTEGER MAXSTP,CONWD INTEGER REWND,WEOF INTEGER IOCONE,WRITEE,READE INTEGER IOCON,DYNSTA,TEMP INTEGER BUFFER(1024) INTEGER BUFLEN,BUFL(8),TBUF(1026) INTEGER BKSPR,FWSPR,BKSPF,FWSPF INTEGER NERROR,RN INTEGER ST(75) INTEGER LUCMD(33),LLUCMD INTEGER EQOFF( 5),EQON(5),LEQOFF,LEQON INTEGER EMASK(2),EQTASC INTEGER CHAR,CHRMSK(2) INTEGER BUFST EQUIVALENCE (IREG(1),REGA,REG),(IREG(2),REGB) C C C INDEX STMT NO. OPERATION C ----- -------- --------- C 1 500 REWIND C 2 510 WRITE RECORD C 3 520 VERIFY DATA BUFFER C 4 530 WRITE END OF FILE C 5 6000 NO OPERATION C 6 550 BACKWARD SPACE RECORD OPERATION C 7 560 FORWARD SPACE RECORD OPERATION C 8 570 CHECK STATUS FOR WRITE RING C 9 580 CHECK STATUS FOR END OF FILE C 10 590 READ RECORD FROM TAPE C 11 600 CHECK STATUS FOR SOT(START OF TAPE) C 12 610 FORWARD SPACE FILE C 13 620 BACKWARD SPACE FILE C 14 7600 **TERMINATE TEST** C 15 630 ERASE 32 INCHES OF TAPE C 16 640 VERIFY ZERO LENGTH XMISSION LOG C DATA ST( 1),ST( 2),ST( 3),ST( 4),ST( 5)/ 1, 8,11, 2, 2/ DATA ST( 6),ST( 7),ST( 8),ST( 9),ST(10)/ 2, 4, 2, 2, 2/ DATA ST(11),ST(12),ST(13),ST(14),ST(15)/ 4, 1,11,10, 3/ DATA ST(16),ST(17),ST(18),ST(19),ST(20)/10, 3,10, 3,10/ DATA ST(21),ST(22),ST(23),ST(24),ST(25)/ 9,10, 3,10, 3/ DATA ST(26),ST(27),ST(28),ST(29),ST(30)/10, 3,10, 9, 6/ DATA ST(31),ST(32),ST(33),ST(34),ST(35)/ 6,10, 3,10, 9/ DATA ST(36),ST(37),ST(38),ST(39),ST(40)/ 1,11,12, 9,10/ DATA ST(41),ST(42),ST(43),ST(44),ST(45)/ 3,13, 9, 1,10/ DATA ST(46),ST(47),ST(48),ST(49),ST(50)/ 6,10, 3, 1,11/ DATA ST(51),ST(52),ST(53),ST(54),ST(55)/15, 1,10,16,14/ DATA IPARMS/5*0/ DATA LULIST/1/ DATA EQT5,EQT4,EQTST/3*0/ DATA CODE13/13/ DATA GO/2HGO/,AB/2HAB/ DATA LOCKOP/0140001B/,UNLOCK/0100000B/ DATA PNAME/2HTX,2HMT,2H0 / DATA MAXSTP/55/ DATA REWND/0400B/,WEOF/0100B/,BKSPR/0200B/,FWSPR/0300B/ DATA IOCON/3/,DYNSTA/0600B/ DATA BKSPF/001400B/,FWSPF/001300B/ DATA IOCONE/0100003B/,WRITEE/0100002B/,READE/0100001B/ DATA BUFFER/512*012525B,256*017777B,256*052525B/ DATA BUFL/1024,512,256,0,1024,512,256,0/ DATA TBUF/1026*0/ DATA NERROR/0/,RN/1/ DATA LUCMD/2HLU,2H, ,2HXX,30*2H / DATA LLUCMD/8/ DATA EQON/2HEQ,2H, ,2HXX,2H,B,2HU / DATA LEQON/10/ DATA EQOFF/2HEQ,2H, ,2HXX,2H,U,2HN / DATA LEQOFF/10/ DATA EMASK/000105B,042400B/ DATA CHRMSK/00377B,177400B/ DATA ERASE/1200B/ C C C C C GET INPUT PARAMETER FOR LIST LU AND MAG TAPE LU. C CALL RMPAR(IPARMS) IF (IPARMS(1).GT.0) LULIST=IPARMS(1) C C GET ITERATION COUNT C LOOPS = 1 IF(IPARMS(3) .GT. 0) LOOPS = IPARMS(3) C C GET MAG TAPE LU. C IF (IPARMS(2).GT.0) LU=IPARMS(2) IF ((LU.GT.0).AND.(LU.LT.64)) GO TO 40 C ILLEGAL LOGICAL UNIT SPECIFIED WRITE(LULIST,30) (PNAME(J),J=1,3) 30 FORMAT(/,2X,3A2,"- LU# SPECIFIED FOR MAG TAPE IS ILLEGAL."/ 1" RERUN TEST SPECIFYING AN INTEGER >0 AND <64 FOR LU#.") C ERROR EXIT. ABORT MESSAGE. GO TO 1000 C C TEST TO SEE IF LU IS ASSIGNED TO A TAPE. C C GET MAG TAPE STATUS C 40 CALL EXEC(CODE13,LU,EQT5,EQT4,EQTST) C IF CHANNEL NUMBER = 0, LU IS NOT ASSIGNED TO ANY DEVICE. IF (IAND(EQT4,077B).NE.0) GO TO 50 C LU IS NOT ASSIGNED. DO NOT TEST THIS LU. WRITE(LULIST,4005) (PNAME(J),J=1,3),LU 4005 FORMAT(/,2X,3A2,"- LU#",I3,": NOT ASSIGNED, NOT TESTED!"/) C NORMAL EXIT. NO ABORT MESSAGE GO TO 9900 C C MAKE SURE DEVICE IS ASSIGNED TO A MAGNETIC TAPE. C 50 NDTYPE = IAND(EQT5,037400B) NDTYPE = NDTYPE/0400B IF ((NDTYPE.EQ.023B)) GO TO 80 C C LU IS NOT ASSIGNED TO A 7970 MAG TAPE. C WRITE(LULIST,55) (PNAME(J),J=1,3),LU 55 FORMAT(/,2X,3A2,"- LU#",I3," IS NOT ASSIGNED TO MAG TAPE."/ 1" RERUN TEST SPECIFYING CORRECT LU#.") C ERROR EXIT. ABORT MESSAGE GO TO 1000 C C MAKE SURE LU IS NOT DOWN. C 80 CONTINUE N = EQT5/040000B IF ((N.NE.01).AND.(IAND(EQTST,100000B).EQ.0)) GO TO 83 C LU OR EQT IS DOWN WRITE(LULIST,8101) (PNAME(J),J=1,3),LU 8101 FORMAT(/,2X,3A2,"- LU#",I3,": EQT OR LU FOR TEST MAG TAPE" 1" IS DOWN."/" UP EQT AND RERUN TEST.") C ABORT MESSAGE GO TO 1000 C C C LU IS CORRECTLY ASSIGNED. ISSUE MESSAGE TO MOUNT SCRATCH TAPE. C 83 CONTINUE WRITE(LULIST,8301) (PNAME(J),J=1,3),LU 8301 FORMAT(/,2X,3A2,"- LU#",I3,":"/ 1" MOUNT SCRATCH TAPE WITH WRITE RING ON TEST UNIT AND"/ 2" SET UNIT ON-LINE. TYPE /C TO CONTINUE TEST OR" 3" TYPE /A"/" TO ABORT THIS TEST: _") C C RETRIEVE OPERATOR RESPONSE C CALL EXEC(1,LULIST+400B,IBUF,1) IF(IBUF.EQ.2H/C) GOTO 200 IF(IBUF.EQ.2H/A) GOTO 1000 GOTO 83 C C SCRATCH TAPE IS READY. LOCK THE MAGNETIC TAPE LU AND PROCEED C WITH THE TEST. C 200 CONTINUE CALL LURQ(LOCKOP,LU,1) C ERROR RETURN IF LU COULD NOT BE LOCKED GO TO 9000 C C CHECK CURRENT BUFFERING STATUS OF THE LU C 402 CONWD = LU + DYNSTA C FORCE DEVICE TO BE ACCESSED TO GET OFFLINE STATUS CALL EXEC(IOCON,CONWD) CALL EXEC(CODE13,LU,EQT5,EQT4,EQTST) IF (IAND(EQT5,1).EQ.0) GO TO 210 C UNIT IS OFFLINE WRITE(LULIST,2001) (PNAME(J),J=1,3),LU 2001 FORMAT(/,2X,3A2,"- LU#",I3,": TEST MAG TAPE UNIT OFF-LINE."/ 1" SET UNIT ON-LINE AND RERUN TEST.") GO TO 1000 210 CONTINUE BUFST=IAND(EQT4,040000B) IF (BUFST.EQ.0) GO TO 400 C C DEVICE IS BUFFERED. GET EQT ENTRY FROM LU COMMAND. THEN C FORM AN OPERATOR COMMAND TO FORCE THE DEVICE TO BE UNBUFFERED. C LUCMD(3) = KCVT(LU) N=MESSS(LUCMD,LLUCMD) DO 300 I=1,-N J=MOD(I,2)+1 CHAR = IAND(LUCMD((I+1)/2),CHRMSK(J)) IF (IAND(CHAR,EMASK(J)).EQ.CHAR) GO TO 320 300 CONTINUE C IF CONTROL GETS HERE, THERE IS AN ERROR IN THE SCAN LOOP PAUSE 10 C C I = INDEX INTO COMMAND FOR E, J=LEFT/RIGHT BYTE C 320 GO TO (322,321),J C C 'E' IS IN RIGHT BYTE. EQT ENTRY IS NEXT WORD. C 322 EQTASC =LUCMD((I+2)/2) GO TO 330 C C 'E' IN LEFT BYTE C 321 EQTASC = LUCMD((I+1)/2)*0400B+LUCMD((I+2)/2)/0400B C 330 CONTINUE C EQTASC = EQT ENTRY IN ASCII EQOFF(3) = EQTASC N=MESSS(EQOFF,LEQOFF) 400 CONTINUE C NORMAL RETURN. LU IS LOCKED TO THIS PROGRAM. START TEST. C C*************************************************************** C MAIN PROGRAM LOOP FOR TEST C*************************************************************** C WRITE(LULIST,3001) (PNAME(J),J=1,3),LU 3001 FORMAT(/,2X,3A2,"- LU#",I3,": MAG TAPE TEST RUNNING") C DO 8100 LOOP = 1,LOOPS DO 8000 I=1,MAXSTP C C GET STATUS AND FORCE LAST OPERATION TO BE COMPLETED. C CONWD = LU + DYNSTA CALL EXEC(IOCON,CONWD) CALL ABREG(EQT5,TEMP) C LABEL=ST(I) GO TO (500,510,520,530,6000,550,560,570,580,590, 600,610, 1 620,7600,630,640), LABEL C C**************************************************************** C REWIND THE MAGNETIC TAPE C**************************************************************** C 500 CONWD = LU + REWND CALL EXEC(IOCONE,CONWD) C ERROR RETURN - A-REGISTER = DEVICE STATUS. GO TO 7000 C NORMAL RETURN - GO TO END OF LOOP C REWIND SECOND TIME TO FORCE SOT STATUS TO BE STORED 405 CALL EXEC(IOCONE,CONWD) C ERROR RETURN - A-REG = DEVICE STATUS GO TO 7000 C NORMAL RETURN - GO TO END OF LOOP WITH SOT STATUS SET 410 RN=0 GO TO 6000 C C**************************************************************** C WRITE RECORD TO TAPE C**************************************************************** C 510 CONTINUE CONWD = LU RN = RN + 1 BUFLEN = BUFL(RN) CALL EXEC(WRITEE,CONWD,BUFFER,BUFLEN) C ERROR RETURN. A-REG = DEVICE STATUS. B=TRANSMISSION LOG GO TO 7000 C NORMAL RETURN 515 CONTINUE GO TO 6000 C C*************************************************************** C READ A RECORD FROM THE TAPE C*************************************************************** C 590 CONTINUE CONWD = LU RN = RN + 1 BUFLEN = BUFL(RN)+2 CALL EXEC(READE,CONWD,TBUF,BUFLEN) C ERROR RETURN. A=REG=DEVICE STATUS. B=TRANSMISSION LOG GO TO 7000 C NORMAL RETURN. A-REG=STATUS. B-REG=NUMBER OF WORDS READ. C VERIFY NUMBER OF WORDS. 415 CALL ABREG(REGA,REGB) GO TO 6000 C C**************************************************************** C VERIFY THE DATA BUFFER C**************************************************************** C C REGB = NUMBER OF WORDS TO VERIFY 520 CONTINUE IF (REGB.EQ.BUFL(RN)) GO TO 521 C RECORD LENGTHS DO NOT VERIFY WRITE(LULIST,5221) (PNAME(J),J=1,3),LU,BUFL(RN),REGB GO TO 7500 C COMPARE DATA BUFFERS 521 CONTINUE DO 522 N=1,REGB IF (BUFFER(N).EQ.TBUF(N)) GO TO 522 C DATA VERIFICATION ERROR NERROR = NERROR + 1 WRITE(LULIST,5221) (PNAME(J),J=1,3),LU 5221 FORMAT(/,2X,3A2,"- LU#",I3,": READ/WRITE DATA DOES NOT VERIFY!") IF (NERROR.GE.6) GO TO 7500 C END OF DATA VERIFICATION LOOP 522 CONTINUE GO TO 6000 C C C**************************************************************** C WRITE END OF FILE C**************************************************************** C 530 CONTINUE CONWD = LU + WEOF CALL EXEC(IOCONE,CONWD) C ERROR RETURN. A-REG=STATUS GO TO 7000 C NORMAL RETURN 420 RN = RN + 1 GO TO 6000 C C**************************************************************** C CHECK STATUS. END OF FILE SHOULD BE SET. (EOF) C**************************************************************** C 580 CONTINUE IF (IAND(EQT5,0200B).EQ.0200B) GO TO 6000 C C ERROR -- END OF FILE NOT DETECTED C REGA = EQT5 GO TO 7001 C C C**************************************************************** C BACKWARD SPACE RECORD OPERATION C**************************************************************** C 550 CONTINUE CONWD = LU + BKSPR CALL EXEC(IOCONE,CONWD) C ERROR RETURN. A-REG=STATUS GO TO 7000 C NORMAL RETURN 425 RN = RN - 1 GO TO 6000 C C C**************************************************************** C FORWARD SPACE RECORD OPERATION C**************************************************************** C 560 CONTINUE CONWD = LU + FWSPR CALL EXEC(IOCONE,CONWD) C ERROR RETURN -- A-REG = STATUS GO TO 7000 C NORMAL RETURN 430 RN = RN + 1 GO TO 6000 C C**************************************************************** C CHECK STATUS FOR WRITE RING C**************************************************************** C 570 CONTINUE IF (IAND(EQT5,4).EQ.0) GO TO 6000 C NO WRITE RING WRITE(LULIST,5701) (PNAME(J),J=1,3),LU 5701 FORMAT(/,2X,3A2,"- LU#",I2,": NO WRITE RING ON SCRATCH TAPE!"/ 1" INSTALL WRITE RING AND UP EQT FOR MAG TAPE. THE TEST"/ 2" WILL CONTINUE.") GO TO 6000 C C C**************************************************************** C TEST START OF TAPE STATUS (SOT) C**************************************************************** C 600 CONTINUE IF (IAND(EQT5,0100B).EQ.0100B) GO TO 6000 C C ERROR -- START OF TAPE NOT DETECTED IN STATUS C REGA = EQT5 GO TO 7001 C C**************************************************************** C FORWARD SPACE FILE C**************************************************************** C 610 CONTINUE CONWD = LU + FWSPF CALL EXEC(IOCONE,CONWD) C ERROR RETURN GO TO 7000 C NORMAL RETURN 435 GO TO 6000 C C C**************************************************************** C BACKWARD SPACE FILE C**************************************************************** C 620 CONTINUE CONWD = LU + BKSPF CALL EXEC(IOCONE,CONWD) C ERROR RETURN GO TO 7000 C NORMAL RETURN 440 IF (RN-4) 621,622,622 C BACKSPACE TO START OF TAPE 621 RN = 0 GO TO 623 C C C BACKSPACE FILE TO A SUBFILE ON TAPE C 622 RN = ((RN-4)/4)*4+3 623 GO TO 6000 C C C********************************************************************* C ERASE 32 INCHES OF TAPE C********************************************************************* C C 630 CONTINUE CONWD = LU + ERASE DO 633 NERASE = 1,64 CALL EXEC(IOCONE,CONWD) C C ERROR RETURN C GO TO 7000 C C NORMAL RETURN C 633 CONTINUE GO TO 6000 C C C********************************************************************* C VERIFY ZERO RECORD LENGTH C********************************************************************* C C 640 CONTINUE IF(REGB .EQ. 0) GO TO 6000 C C WRITE DIAGNOSTIC MESSAGE C WRITE(LULIST,641) (PNAME(J),J=1,3),LU 641 FORMAT(/,2X,3A2,"- LU#",I3,": EXPECTED ZERO XMISSION LOG NOT " 1 ,"ENCOUNTERED") WRITE(LULIST,642) PNAME,LU,REGB 642 FORMAT(2X,3A2,"- LU#",I3,": XMISSION LOG = ",I6) NERROR = NERROR + 1 GO TO 6000 C C ERROR POINT TO PRINT STATUS BITS. REG B = STATUS FROM EQT5 C 7000 CONTINUE CALL ABREG(REGA,REGB) 7001 CONTINUE WRITE(LULIST,7002) (PNAME(J),J=1,3),LU,REGA 7002 FORMAT(/,2X,3A2,"- LU#",I3,": HARDWARE ERROR, STATUS = ",O6) IF (IAND(REGA,2).NE.0) WRITE(LULIST,7005) (PNAME(J),J=1,3),LU 7005 FORMAT(2X,3A2,"- LU#",I3,": PARITY/TIMING ERROR!") WRITE(LULIST,7007) (PNAME(J),J=1,3),LU,I 7007 FORMAT(2X,3A2,"- LU#",I3,": TEST STEP ",I2) WRITE(LULIST,7008) (PNAME(J),J=1,3),LU,LABEL 7008 FORMAT(2X,3A2,"- LU#",I3,": TEST INDEX",I3) C C INCREMENT ERROR COUNT 7500 CONTINUE NERROR = NERROR + 1 C C**************************************************************** C END OF MAIN LOOP. TEST FOR MAXIMUM ERRORS EXCEEDED. C**************************************************************** 6000 CONTINUE IF (NERROR.GE.6) GO TO 7600 8000 CONTINUE C C MAIN LOOP TERMINATION C 7600 CONTINUE C C PRINT LOOP COUNT C WRITE(LULIST,8110) (PNAME(I),I=1,3),LOOP 8110 FORMAT(2X,3A2," - COMPLETED LOOP NUMBER ",I5) 8100 CONTINUE C C UNLOCK MAG TAPE LU C C C RESTORE ORIGINAL DEVICE BUFFERING STATUS C IF (BUFST.EQ.0) GO TO 7605 C SEND COMMAND TO BUFFER THE EQT ENTRY. EQON(3) = EQTASC N=MESSS(EQON,LEQON) 7605 CONTINUE CALL LURQ(UNLOCK,LU,1) C PRINT TEST FINISHED MESSAGE C WRITE(LULIST,7601) (PNAME(J),J=1,3),LU,NERROR 7601 FORMAT(/,2X,3A2,"- LU#",I3,": MAG TAPE TEST FINISHED ",I4, 1" ERRORS"/) GO TO 9900 C C ERROR PATH FOR RESOURCE NOT LOCKED C 9000 CALL ABREG(REGA,REGB) WRITE(LULIST,9001) (PNAME(J),J=1,3),LU 9001 FORMAT(/,2X,3A2,"- LU#",I3,": MAG TAPE COULD NOT BE LOCKED!") IF (REGA) 9002,1000,9005 C 9002 WRITE(LULIST,9003) (PNAME(J),J=1,3),LU 9003 FORMAT(2X,3A2,"- LU#",I3,": NO RESOURCE NUMBER AVAILABLE!") GO TO 1000 C 9005 WRITE(LULIST,9006) (PNAME(J),J=1,3),LU 9006 FORMAT(2X,3A2,"- LU#",I3,": MAG TAPE ALREADY LOCKED!") C C WRITE TEST ABORT MESSAGE C 1000 WRITE(LULIST,1999) (PNAME(J),J=1,3),LU 1999 FORMAT(/,2X,3A2,"- LU#",I3,": MAG TAPE TEST ABORTED!"/) C C PROGRAM EXIT C 9900 CONTINUE END