FTN4,L,C SUBROUTINE REFMT (ISCTR,IDUM,FLAG,IERR,TEMP2) & ,92067-1X505 REV.2026 800522 C 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 : REFMT C * SOURCE: 92067-18505 C * RELOC: 92067-16505 C * PGMR : R.D C * C * C * C ******************************************************************* C * C * C * C * C C C THIS SUBROUTINE RE-FORMATS DATA TRACKS STORED ON A MAG TAPE C (VIA WRITT) BEFORE RESTORING IT TO A DISC CARTRIDGE (AS INITIATED C BY READT) WHICH HAS A DIFFERENT SEC/TRK VALUE. C THE FULL TRACK (RECORD) IS READ FROM THE MAG TAPE EACH TIME AND THE C LARGEST PORTION OF THAT RECORD IS WRITTEN TO THE DISC EACH TIME. C C THE PARAMETERS ARE: C C ISCTR - SEC/TRK OF MAG TAPE C IDUM - SEC/TRK OF DISC C FLAG - CATCHES FMGR ERROR FOR USE IN CALLS TO SUB. VVALD C IERR - ERROR CODE (AS GAINED FROM SUBROUTINE VVALD) C = 1 END OF FILE ENCOUNTERED (NORMAL TERMINATION) C =-1 ABORT MAIN PROGRAM (READT) C =-2 PARITY ERROR C TEMP2 - THE STARTING FMP TRACK C C C C LOCAL VARIABLES USED: C C ILNTH,JLNTH - WORD/TRK OF MAG TAPE AND DISC C TRK - TRACK ADDRESS C SEC - SECTOR ADDRESS C TOTL - TOTAL # WORDS WRITTEN TO DISC C FILL,FILL2 - SUBPORTIONS (IN WORDS) OF THE MAG TAPE RECORD C C IMPLICIT INTEGER (A-Z) DIMENSION JBUF(8192) COMMON/COMRD/ ILU,ITAPE,NDIR,IDISC,MTLU,TSIZE,IBUF(8193) EQUIVALENCE (JBUF,IBUF(2)) C C INITIALIZE FOR THE DATA TRANSFER C TRK=TEMP2 SEC=0 TOTL=0 FILL2=0 ILNTH=ISCTR*64 JLNTH=IDUM*64 C C GET NEXT RECORD (TRACK) FROM MAG TAPE C 300 CALL EXEC(1,MTLU,IBUF,ILNTH+1) CALL ABREG(IA,IB) C C CALCULATE THE 1ST PORTION OF THE RECORD TO BE RESTORED C FILL=JLNTH-TOTL C C MAKE SURE IT'S NOT TOO BIG C IF(FILL.GT.ILNTH) FILL=ILNTH C C MAKE SURE THAT READ WAS VALID C IERR=0 CALL VVALD(IA,IB,1,FILL,TRK,SEC,ILNTH,FLAG,IERR) IF(IERR.NE.0) RETURN C C EVERYTHING'S O.K. RESTORE THAT PORTION C CALL EXEC(2,IDISC+74000B,JBUF,FILL,TRK,SEC) C C MAKE SURE WRITE WAS O.K. C CALL ABREG(IA,IB) CALL VVALD(IA,IB,-1,FILL,TRK,SEC,0,FLAG,0) C C CALCULATE THE NEXT SECTOR C SEC=SEC+FILL/64 TOTL=TOTL+FILL C C TRACK FULL? C IF(SEC.LT.IDUM) GOTO 300 C C FULL. RESET SECTOR POINTER AND INCREMENT TRACK POINTER C TRK=TRK+1 SEC=0 TOTL=0 C C ANYMORE OF THAT RECORD LEFT? IF YES, GO RESTORE IT. IF NOT, GET C NEXT ONE. C IF(TOTL.EQ.ILNTH) GOTO 300 C C CALCULATE THE REMAINING PORTION OF THE RECORD C 400 FILL2=ILNTH-FILL C C MAKE SURE IT'S NOT BIGGER THAN IT'S SUPPOSED TO BE C IF(FILL2.GT.JLNTH) FILL2=JLNTH IF(FILL2.EQ.0) GOTO 300 C C NOW RESTORE THE SECOND PORTION. C CALL EXEC(2,IDISC+74000B,JBUF(FILL+1),FILL2,TRK,SEC) C C MAKE SURE WRITE WAS O.K. C CALL ABREG(IA,IB) CALL VVALD(IA,IB,-1,FILL2,TRK,SEC,0,FLAG,0) C C UPDATE THE SECTOR POINTER C SEC=SEC+FILL2/64 TOTL=TOTL+FILL2 C C TRACK FULL? C IF(SEC.LT.IDUM) GOTO 460 C C FULL. INCREMENT THE TRACK POINTER AND RESET THE SECTOR POINTER C TRK=TRK+1 SEC=0 TOTL=0 C C KEEP GOING UNTIL DONE C 460 IF((FILL+FILL2).EQ.ILNTH) GOTO 300 FILL=FILL+FILL2 GOTO 400 END END$