FTN4,L,Q
C 
C  DATE:  SEPTEMBER 10,1979 
C  NAME:  TXCTU 
C  SOURCE: 02145-18014
C  RELOC:  02145-16009
C  PGMR:D.E.B.
C 
C******************************************************************** 
C  (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  ALL RIGHTS
C  RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, 
C  REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT 
C  THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.
C******************************************************************** 
C 
      SUBROUTINE TXCTU(LOGLU), 02145-1X014  REV.2001  800304
C 
C SUBROUTINE TO TEST CARTRIDGE TAPE DRIVES ON 2645, 2675 TERMINALS
C BY INITIATING SELF TEST ON AN OPERATOR SUPPLIED SCRATCH TAPE AND
C READING BACK THE STATUS 
C 
C THIS ROUTINE IS OPTIONALLY CALLED FROM THE FTEST PROGRAM, THE 
C L-SERIES FUNCTIONAL TEST. 
C 
      IMPLICIT INTEGER(A-Z) 
C 
C VARIABLE DESCRIPTIONS:
C 
      INTEGER INBUF(2)
      INTEGER STRES(10) 
      INTEGER ESCSQ(10) 
      INTEGER BR(40)
      INTEGER NUMB(3) 
C 
      R=100001B 
      W=100002B 
      O=LOGLU+20000B
C 
10    CALL REIO(W,O,14H   INSERT TAPE,-14)
      GOTO 9000 
12    CALL REIO(W,O,4H    ,-4)
      GOTO 9000 
13    CALL REIO(W,O,4H    ,-4)
      GOTO 9000 
14    CALL REIO(W,O,43H   ENTER LU # OF TAPE DRIVE.  (/A TO ABORT),-43) 
      GOTO 9000 
15    CALL REIO(R,O+400B,INBUF,-4)
      GOTO 9000 
20    IF(INBUF(1).EQ.2H/A) 9000,30
C 
C CONVERT ASCII INPUT TO INTEGER
30    TEMP1=IAND(INBUF(1),177400B)
      TEMP2=IAND(INBUF(1),377B) 
      COUNT=0 
      FLAG=0
      IF(TEMP2.EQ.40B) 40,50
40    LUNO=TEMP1/256-48 
      GOTO 60 
50    LUNO=((TEMP1/256)-48)*10+(TEMP2-48) 
60    IF((LUNO.GT.64).OR.(LUNO.LE.0)) 90,300
C 
C GENERALIZED UNKNOWN INPUT RESPONSE "??" 
90    CALL REIO(W,O,2H?? ,-2) 
      GOTO 14 
91    GOTO 14 
C 
C CHECK THAT DEVICE TYPE OF LUNO IS 20 (CTU)
300   CALL EXEC(100000B+13,LUNO,STAT1,STAT2,STAT3,STAT4)
      GOTO 90 
302   IF((STAT1.AND.40000B).NE.40000B) GOTO 303 
      CALL STV(BR,1,30H   LU # $$ IS DOWN              ,1,15) 
      GOTO 312
C 
C CHECK FOR DEVICE BUSY 
C 
303   IF((STAT1.AND.100000B).NE.100000B) GOTO 305 
      CALL STV(BR,1,30H   LU # $$ IS BUSY              ,1,15) 
      GOTO 312
C 
C MASK AND SHIFT TO CHECK DEVICE TYPE 
C 
305   STAT1=IAND(STAT1,37400B)
      STAT1=STAT1/256 
      IF(STAT1.NE.20B)310,320 
C 
C LUNO IS NOT A CARTRIDGE TAPE UNIT 
310   CALL STV(BR,1,30H   LU # $$ IS NOT A TAPE UNIT. ,1,15)
312   CALL STV(BR,16,16HPLEASE RE-ENTER ,1,8) 
      CALL CNUMD(LUNO,NUMB) 
      CALL STV(BR,5,NUMB,3,1) 
      CALL REIO(W,O,BR,-48) 
      GOTO 9000 
318   GOTO 90 
C 
320   SIDE=IAND(STAT3,3B) 
      ESCSQ(1)=15446B 
      ESCSQ(2)=70060B+SIDE
      ESCSQ(3)=57021B 
C 
C SET TIME OUT DOWN TO CATCH NON-RESPONSE ERRORS QUICKLY
      CALL ILUTA(ADDR)
      ADDR=ADDR+LUNO-1
      LOLOC=IGET(ADDR)
      TOADR=LOLOC+12
      TMOUT=IGET(TOADR) 
      CALL IPUT(TOADR,-51)
C 
C CALL FOR DRIVE STATUS  CHECK FOR TAPE IN DRIVE, NOT WRITE PROTECTED,
C NOT BUSY
      CALL EXEC(W,120000B+LUNO,ESCSQ,-5,0)
      GOTO 90 
330   CALL EXEC(R,120000B+LUNO,STRES,-8,0,10400B) 
      GOTO 90 
C 
C CHECK FOR IO ERROR ON EXEC CALL, (IE TIME-OUT)
335   CALL ABREG(A,B) 
      CALL IPUT(TOADR,TMOUT)
      IF(A.EQ.2HIO) 340,510 
340   CALL STV(BR,1,22H   IO ERROR TO LU # $$,1,11) 
      CALL CNUMD(LUNO,NUMB) 
      CALL STV(BR,11,NUMB,3,1)
      CALL REIO(W,O,BR,-22) 
      GOTO 10 
341   GOTO 10 
C 
C 
C CHECK FOR TAPE INSERTED 
510   IF((STRES(4).AND.400B).EQ.400B) 520,10
520   IF((STRES(3).AND.4B).EQ.4B) 530,540 
530   CALL REIO(W,O,27H   TAPE IS WRITE PROTECTED.,-27) 
      GOTO 10 
532   CALL STV(BR,1,40H   TAPE TEST REQUIRES WRITING ON SCRATCH,1,20) 
      CALL STV(BR,21,6H TAPE ,1,3)
      CALL REIO(W,O,BR,23)
      GOTO 10 
533   GOTO 10 
C 
540   IF((STRES(3).AND.1B).EQ.1B) 550,560 
C 
C TAPE BUSY PRESUMABLY REWINDING ETC.  WAIT A FEW SECONDS,TRY AGAIN 
550   COUNT=COUNT+1 
      IF(COUNT.GT.20) 553,555 
553   CALL REIO(W,O,42H   TAPE BUSY.  REWIND TAPE AND START AGAIN,-42)
      GOTO 10 
554   GOTO 10 
C 
555   CALL EXEC(12,0,2,0,-3)
      GOTO 300
C 
C TAPE IS IN, NOT PROTECTED, NOT BUSY  INITIATE SELF-TEST 
560   ESCSQ(3)=62067B 
      ESCSQ(4)=41421B 
      CALL EXEC(W,120000B+LUNO,ESCSQ,-7,0)
      GOTO 90 
562   CALL EXEC(R,120000B+LUNO,STRES,-2,0,10400B) 
      GOTO 90 
C 
C CHECK SELF TEST RESULTS 
565   IF(STRES(1).NE.51415B)570,720 
570   ESCSQ(3)=57021B 
C 
C CALL FOR STATUS AND ANALYZE CAUSE OF FAILURE
      CALL EXEC(W,120000B+LUNO,ESCSQ,-5,0)
      GOTO 90 
575   CALL EXEC(R,120000B+LUNO,STRES,-8,0,10400B) 
      GOTO 90 
580   CALL ABREG(A,B) 
      IF(B.LE.6)600,610 
C 
600   CALL REIO(W,O,42H   DRIVE FAILED TO RETURN ANY TEST RESULTS,-42)
      GOTO 10 
601   GOTO 10 
C CHECK FOR PROPER FORM FOR STATUS BYTES: SHOULD BEGIN WITH "0011"
610   IF((STRES(3).AND.170360B).NE.30060B) 615,620
615   CALL STV(BR,1,40H   TAPE DRIVE DOES NOT RETURN STATUS SEQ,20) 
      CALL STV(BR,21,6HUENCE ,1,3)
      CALL REIO(W,O,BR,23)
616   GOTO 10 
C 
620   IF((STRES(3).AND.400B).NE.400B) 630,640 
630   CALL REIO(W,O,41H   WRITE ERROR (WRITE/BACKSPACE/READ MODE,-41) 
      GOTO 10 
631   FLAG=1
C 
640   IF((STRES(3).AND.10B).NE.10B) 650,660 
650   CALL REIO(W,O,26H   SELF TEST NOT PERFORMED,-26)
      GOTO 10 
651   FLAG=1
C 
660   IF((STRES(3).AND.2B).NE.0B) 670,680 
670   CALL REIO(W,O,13H   READ ERROR,-13) 
      GOTO 10 
671   FLAG=1
C 
680   IF((STRES(4).AND.4000B).NE.0B) 690,700
690   CALL REIO(W,O,42H   SOFT ERROR (READ/WRITE ERROR-RECOVERED),-42)
      GOTO 10 
691   FLAG=1
C 
700   IF((STRES(4).AND.2000B).NE.0B) 710,715
710   CALL REIO(W,O,38H   HARD ERROR (10 READ/WRITE FAILURES),-38)
      GOTO 10 
711   FLAG=1
C 
C IF FLAG = 1 THEN AN ERROR HAS OCCURED 
715   IF(FLAG.EQ.1) 10,720
C 
720   CALL STV(BR,1,30H   TAPE TEST SUCCESSFUL, PROCE,1,15) 
      CALL STV(BR,16,16HED TO NEXT DRIVE,1,8) 
      CALL REIO(W,O,BR,-46) 
      GOTO 90 
730   CALL REIO(W,O,2H   ,-2) 
      GOTO 90 
740   CALL REIO(W,O,2H   ,-2) 
      GOTO 90 
750   GOTO 10 
C 
9000  CONTINUE
      RETURN
      END 
                                                                                                            