FTN4,L
      SUBROUTINE RDATK(LU,LTRK,LSEC,LEN,ISUBC,IXBUF,IBT,LOG),92067-1X545  
     X REV.2001 791101
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 PROGRAMMING LANGUAGE     *
C*  WITHOUT THE PRIOR WRITTEN CONSENT OF THE HEWLETT-PACKARD     *
C*  COMPANY.                                                     *
C*                                                               *
C*****************************************************************
C 
C     NAME:  RDATK
C   SOURCE:  92067-18545  
C    RELOC:  PART OF 92067-12003
C     PGMR:  J.S.W
C 
C THIS SUBROUTINE READS ONE TRACK FROM THE DISC BY USING THE
C DISC LIBRARY SUBROUTINES. THE TARGET DISC TRACK ADDRESS IS IN 
C LTRK AND LSEC. THE 5 WORD ARRAY ISUBC CONTAINS THE SUBCHANNEL 
C TRACK MAP DEFINITION.  THIS SUBROUTINE CONVERTS THE LOGICAL 
C LTRAK AND LSEC INTO PHYSICAL CYLINDER ,HEAD AND SECTOR (ICYL,IHD
C ISEC) AND CALLS THE DISC LIBRARY TO DO THE READ 
C EQTRQ IS CALLED AT ENTRY TO LOCK THE EQT AND UNLOCK AT EXIT 
C 
C CALLING SEQUENCE: 
C   LU -  DISK LU 
C   LTRK- LOGICAL TRACK # 
C   LSEC- LOGICAL SECTOR #
C   LEN - TRANSFER LENGTH, # OF WORDS REQUESTED 
C   ISUBC- 5 WORD ARRAY CONTAINING CURRENT SUBCHANNEL DEFINITION
C   IXBUF- BUFFER TO HOLD ONE TRACK OF DATA (PLUS 16 WORDS HEADER)
C   IBT-   IF 1 BAD TRACK EXISTS, IF 0 NO BAD TRACKS
C   LOG-   LOG LU 
C 
C 
      IMPLICIT INTEGER(A-Z) 
      DIMENSION ISUBC(1),IXBUF(1),ITEMP(6),LINE(60) 
C 
C 
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C 
C READ A TRACK -- ON LINE SAVE
C 
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C 
C 
C 
C 
C  CONVERT LOGICAL TO PHYSICAL TRK ADDRESS
C    CHECK STATUS 
C 
      RETRY=0 
      CALL MXGTA(LU,IDVID,LTRK,LSEC,ICYL,IHD,ISEC,ISUBC)
10    CALL XSTAT(LU,IDVID,ISTAT1,ISTAT2,IER)
      IF(IER.EQ.4) GO TO 950
      IF(ISTAT2.LT.0) GO TO 950 
C 
C LOCK EQT WITH WAIT
C 
C IF A REG RETURNED IS NON-ZERO ERROR 
C ELSE THE LOCK IS GOOD 
C 
15    IOPT=1
      CALL EQTRQ(IOPT,LU) 
      CALL ABREG(IA,IB) 
      IF(IA.EQ.0) GO TO 50
      IF(IA.EQ.-1) GO TO 980
      CALL EXEC(2,LOG,15HEQT LOCK FAILED,-15) 
C 
C 
C 
C FILE MASK, SEEK, READ TO TARGET CYL,HEAD SECTOR 
C 
50    MSK=4 
      CALL XFMSK(LU,IDVID,MSK,IER)
      CALL XSEEK(LU,IDVID,ICYL,IHD,ISEC,ISTAT1,ISTAT2,IER)
      IF(IER.EQ.2) GO TO 10 
      IF(IER.EQ.4) GO TO 950
      IF(ISTAT2.LT.0) GO TO 900 
C 
C 
      CALL XDRED(LU,IDVID,IXBUF,LEN,ISTAT1,ISTAT2,IER)
      IF(IER.EQ.2) GO TO 10 
      IF(IER.EQ.4) GO TO 950
C 
D     WRITE(1,9999) ISTAT1,ISTAT2 
D9999 FORMAT("ST1 ST2=",2@7)
C NOW CHECK STATUS
      IS1=IAND(ISTAT1,17400B)/256 
      IF(IS1.NEQ.0) GO TO 800 
      IF(IAND(ISTAT1, 20000B).NEQ.0) GO TO 850
      IF(IAND(ISTAT1,40000B).NEQ.0) IXBUF(16)=IOR(IXBUF(16),100000B)
C 
C 
C EXIT POINT
C CALL XEND TO SEND END COMMAND AND UNLOCK EQT
C 
500   CALL XEND(LU,IDVID) 
      IOPT=0
      CALL EQTRQ(IOPT,LU) 
      RETURN
C 
C 
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 
C 
C ERROR HANDLING ROUTINES 
C 
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C 
C 
800   IF(IS1.GT.16B.AND.IS1.GT.20B) GO TO 850 
      RETRY=RETRY+1 
      IF( RETRY.GE.10) GO TO 850
      GO TO 15
C 
C 
C 
900   CALL EXEC(2,LOG,10HSEEK ERROR,-10)
      GO TO 15
950   CALL EXEC(2,LOG,15HDRIVE NOT READY,-15) 
      CALL EXEC(2,LOG,48HREADY DISC AND ENTER "GO "  TO CONTINUE         ,
     X ,-48)
      ITTY=LOGLU(ISES)
      CALL EXEC(1,ITTY+400B,IXX,-2) 
      IF(IXX.EQ.2HGO) GO TO 10
      IF(IXX.EQ.2H/E.OR.IXX.EQ.2HEN.OR.IXX.EQ.2HEX) STOP
      GO TO 950 
C 
C 
850   IXBUF(16)=IOR(IXBUF(16),40000B) 
      DO 880 I=1,60 
880   LINE(I)=2H
C 
      CALL EXEC(2,LOG,18H SOURCE SUBCHANNEL,-18)
      CALL EXEC(2,LOG,
     X      47H BAD TRACK AT:  TRACK#  CYL  HEAD  UNIT/ADDRESS,-47) 
      IUNIT=IAND(IDVID,77B) 
      CALL XDCAS(LINE( 9),2,LTRK) 
      CALL XDCAS(LINE(13),2,ICYL) 
      CALL XDCAS(LINE(15),2,IHD)
      CALL XDCAS(LINE(18),2,IUNIT)
      CALL EXEC(2,LOG,LINE,-60) 
C 
C SET BAD TRACK INDICATOR 
C 
      IBT=1 
      GO TO 500 
C 
C 
980   CALL EXEC(2,LOG,19HEQT LOCK TABLE FULL,-19) 
      GO TO 500 
      END 
                    