FTN,L,C C SUBROUTINE REDIR(ISCTR,IDUM,FLAG,IERR) & ,92067-1X504 REV.2026 800522 C * C * C ******************************************************************* C * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. ALL RIGHTS RESERVED. C * NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, REPRODUCED, OR C * TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT THE PRIOR WRITTEN C * CONSENT OF HEWLETT-PACKARD COMPANY. C ******************************************************************* C * C * C * NAME : REDIR C * SOURCE: 92067-18504 C * RELOC: 92067-16504 C * PGMR : R.D. C * C * C * C ******************************************************************* C * C * C * C * C C THIS SUBROUTINE IS CALLED BY READT TO FIX AND RESTORE DIRECTORY C ENTRIES WHEN THE SEC/TRK VALUE OF THE MAG TAPE IS NOT THE SAME C AS THAT OF THE DISC. IT CLEARS ALL OPEN FLAGS, AND RESETS C THE STARTING SECTOR AND TRACK ADDRESSES FOR EACH DIRECTORY ENTRY. C (THE FIRST FILE, THEN, WILL BEGIN AT TRACK 0, SECTOR 0). C C THE DIRECTORY ENTRIES ARE WRITTEN USING SECTOR SKIPPING. BECAUSE C OF THIS, THERE IS A TWO SECTOR BLOCK WITH DIRECTORY ENTRIES,THE NEXT C 12 SECTORS ARE SKIPPED, 2 SECTORS WITH DIRECTORY ENTRIES,..., ETC. C AS A RESULT, AS EACH BLOCK OF ENTRIES ARE RESET, THEY ARE C IMMEDIATELY RESTORED TO THE DISC. C C THE PARAMETERS ARE: C C ISCTR - SEC/TRK VALUE OF THE CARTRIDGE ON THE MAG TAPE C IDUM - SEC/TRK VALUE OF THE DISC CARTRIDGE C FLAG - CATCHES FMGR ERROR FOR USE IN CALLS TO SUB. VVALD C IERR - ERROR CODE (AS GAINED FROM SUBROUTINE VVALD) C = 0 NO PROBLEMS (NORMAL TERMINATION) C = 1 END OF FILE ENCOUNTERED C =-1 ABORT MAIN PROGRAM (READT) C =-2 PARITY ERROR C C C C LOCAL VARIABLES USED: C C ILNTH,JLNTH - WORD/TRK OF MAG TAPE AND DISC C TOTL - TOTAL LENGTH FROM ALL DIRECTORY ENTRIES (IN SECTORS) C SEC - SECTOR ADDRESS OF BLOCK TO BE WRITTEN TO DISC C DIRTK - CURRENT DIRECTORY TRACK COUNT C SECTR - # SECTORS WRITTEN TO THE DISC C OFSET - FIRST WORD OF JBUF TO BE WRITTEN NEXT C ENTRY - # DIRECTORY ENTRIES FOUND (8 IN EACH BLOCK) C SKIP - # WORDS TO SKIP FOR SECTOR SKIPPING THRU DIRECTORY TRACK C FIRST - =0, FIRST DIRECTORY TRACK FROM THE MAG TAPE C C C AREAS OF CONCERN IN THE DIRECTORY ENTRIES ARE: C C JBUF(1) - STATUS A.K.A. JBUF(N-8) C = 0 LAST DIRECTORY ENTRY C JBUF(5) - STARTING TRACK A.K.A. JBUF(N-4) C JBUF(6) - (RIGHT BYTE) STARTING SEC. A.K.A. JBUF(N-3) C C C *** NOTE *** C C IN CASES WHERE THE RATIO OF INTEGER VARIABLES ARE COMPUTED, EACH IS C FLOATED BEFORE THE OPERATION. THIS IS TO AVOID THE TRUNCATION AFTER C EACH INTEGER OPERATION WHICH NORMALLY OCCURS. C C IMPLICIT INTEGER(A-Z) DOUBLE PRECISION TOTL(2) DIMENSION JBUF(8192) COMMON/COMRD/ ILU,ITAPE,NDIR,IDISC,MTLU,TSIZE,IBUF(8193) EQUIVALENCE (JBUF,IBUF(2)) FIRST=0 SEC=0 DIRTK=1 SKIP=12*64 ENTRY=1 SECTR=0 OFSET=1 N=9 ILNTH=ISCTR*64 JLNTH=IDUM*64 C MNDIR=JBUF(9) TEMP=0 CNTR=0 C C C GET READY TO SET ENTRIES. (4 DIRECTORY ENTRIES/SECTOR) C 10 DO 46 I=1,ISCTR*4 C C LAST DIRECTORY ENTRY? C C C C IF THIS IS THE FIRST TIME THROUGH; SKIP. C IF(FIRST.NE.0) GOTO 450 IF((DIRTK.EQ.1).AND.(N.EQ.9)) GOTO 455 C C IF IT'S THE FIRST DIRECTORY ENTRY, GO SET TRACK AND SECTOR ADDRESSES C TO ZERO. C IF((DIRTK.EQ.1).AND.(N.EQ.25)) GOTO 445 GOTO 450 C C FIRST DIRECTORY ENTRY. THIS FILE WILL START AT 0,0. C 445 TA=JBUF(5) SA=0 TOTL=FLOAT(JBUF(5))*FLOAT(IDUM) C C C INTIALIZE THE PREVIOUS FILE'S TRACK AND SECTOR POINTER C OLDTA=JBUF(5) OLDSA=0 OLDSZ=0 C C TIME TO CLEAR ALL OPEN FLAGS. C 450 DO 45 J=1,7 JBUF(N+J)=0 45 CONTINUE C C IF FILE DIRECTORY ENTRY IS TYPE 0 FILE C THEN DON'T COMPUTE TRACK/SECTOR. C IF(JBUF(N-5).EQ.0)GO TO 455 C C GRAB CURRENT FILE TRACK AND SECTOR ADRRESSES BEFORE UPDATE C TA1=JBUF(N-4) SA1=IAND(JBUF(N-3),000377B) SZ1=JBUF(N-2) IF(SZ1.LT.0)SZ1=IABS(SZ1)*128 C C C NOW COMPUTE DIFFERENCE BETWEEN OLD AND CURRENT TRACK AND C SECTOR LOCATION C DIFTA=TA1-OLDTA DIFSA=SA1-OLDSA SIZE=FLOAT(DIFTA)*FLOAT(ISCTR)+DIFSA C IF(SIZE.LE.OLDSZ)GO TO 452 TOTL=(TOTL)-FLOAT(ISEC)+FLOAT(SIZE) C C REFIGURE TRACK AND SECTOR BASED ON NEW SIZE C TA=(TOTL)/FLOAT(IDUM) SA=(TOTL)-(FLOAT(TA)*FLOAT(IDUM)) C C SET CURRENT DIRECTORY ENTRIES. C 452 JBUF(N-4)=TA JBUF(N-3)=IAND(JBUF(N-3),177400B) JBUF(N-3)=IOR(JBUF(N-3),SA) C OLDTA=TA1 OLDSA=SA1 OLDSZ=SZ1 C C CALCULATE STARTING SECTOR AND TRACK FOR NEXT FILE. (DON'T NEED TO C INCREMENT, ALWAYS START AT SECTOR ZERO). WATCH OUT FOR POSSIBLE C NEGATIVE LENGTH OF FILE. C ISEC=JBUF(N-2) IF(ISEC.LT.0) ISEC=IABS(ISEC)*128 TOTL=(TOTL)+FLOAT(ISEC) TA=(TOTL)/FLOAT(IDUM) SA=(TOTL)-(FLOAT(TA)*FLOAT(IDUM)) C C CHECK NUMBER OF DIRECTORY ENTRIES WHICH HAVE BEEN RESET. MAY C HAVE TO INCREMENT "N" TO GET THE NEXT DIRECTORY ENTRY DUE TO C SECTOR SKIPPING. C 455 ENTRY=ENTRY+1 IF(ENTRY.LE.8) GOTO 456 C C ALL DONE WITH THIS 2 SECTOR BLOCK OF DIRECTORY ENTRIES RESTORE IT. C TEMP=TEMP+1 C CALL EXEC(2,IDISC+74000B,JBUF(OFSET),128,TSIZE-DIRTK,SEC) C C MAKE SURE WRITE WAS O.K. C CALL ABREG(IA,IB) CALL VVALD(IA,IB,-1,128,TSIZE-DIRTK,SEC,0,FLAG,0) C C UPDATE ALL POINTERS SO CAN GET NEXT SET OF DIRECTORY ENTRIES C IN THE PROPER ORDER. C ENTRY=1 SEC=SEC+14 IF(SEC.GE.IDUM) SEC=SEC-IDUM OFSET=OFSET+128+SKIP IF(OFSET.GT.ILNTH) OFSET=OFSET-ILNTH N=N+SKIP IF(N.GT.ILNTH) N=N-ILNTH C C CHECK TO SEE IF DISC TRACK FULL. C SECTR=SECTR+2 IF(SECTR.LT.IDUM) GOTO 456 C C RAN OUT OF DISC TRACK. START A NEW ONE. C DIRTK=DIRTK+1 SEC=0 SECTR=0 C C INCREMENT "N" TO POINT TO NEXT DIRECTORY ENTRY TO BE FOUND ON C THE MAG TAPE. C 456 N=N+16 46 CONTINUE C C IF LOOP ENDS NATURALLY, NEED NEXT DIRECTORY TRACK FROM MAG TAPE. C MNDIR=MNDIR+1 IF(MNDIR)550,600,600 550 CALL EXEC(1,MTLU,IBUF,ILNTH+1) CALL ABREG(IA,IB) C C MAKE SURE READ WAS O.K. C IERR=0 CALL VVALD(IA,IB,OFSET,128,TSIZE-DIRTK,SEC,ILNTH,FLAG,IERR) IF(IERR.NE.0) GOTO 600 C C RESET NECESSARY POINTERS AND GO AGAIN. C OFSET=1 N=9 FIRST=-1 GOTO 10 C C DONE. NOW CLEAR OUT OLD ENTRIES WHICH MAY BE LEFT ON THE DISC. C 600 IF(SECTR.GE.IDUM) GOTO 900 DO 42 I=1,128 JBUF(I)=0 42 CONTINUE C C WANT TO CLEAR OFF OLD DIRECTORY ENTRIES FROM DISC. C 48 CALL EXEC(2,IDISC+74000B,JBUF,128,TSIZE-DIRTK,SEC) C C MAKE SURE WRITE WAS O.K. C CALL ABREG(IA,IB) CALL VVALD(IA,IB,-1,128,TSIZE-DIRTK,SEC,0,FLAG,0) SEC=SEC+14 IF(SEC.GE.IDUM) SEC=SEC-IDUM SECTR=SECTR+2 IF(SECTR.LT.IDUM) GOTO 48 C C DID THE NUMBER OF DIRECTORY TRACKS CHANGE? IF YES, UPDATE INFO ALREADY C RESTORED TO THE DISC. C 900 IF(DIRTK.EQ.NDIR) RETURN CALL EXEC(1,IDISC,JBUF,128,TSIZE-1,0) C TEMP=TEMP*2 C 910 CNTR=CNTR+1 C C TEMP HAS TOTAL NUMBER OF SECTORS WRITTEN TO DISC DIRECTORY C TEMP=TEMP-IDUM IF(TEMP.GT.0)GO TO 910 JBUF(9)=-CNTR JBUF(8)=TSIZE-CNTR C CALL EXEC (2,IDISC+74000B,JBUF,128,TSIZE-1,0) C C MAKE SURE WRITE WAS O.K. C CALL ABREG(IA,IB) CALL VVALD(IA,IB,-1,128,TSIZE-1,0,0,FLAG,0) RETURN END END$