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