C PROGRAM MTFILE.FT C -------------- C C C C C P.LEMKIN C NATIONAL INSTUTUTES OF HEALTH C BETHESDA, MD 20014 C C C AUG 13, 1976 C PURPOSE C -------- C MTAi:==>MTAj: file transfer program C C COMPILE AS: C ----------- C .COMP MTFILE.RL < MAGCMN.FT,MTFILE.FT C C C C C C *************************** P A R A M E T E R S ********* S DUMMY OS8DATE S CPAGE 2 S OS8DATE, 6211 S 7666 S DUMMY MAGBUFFER S CPAGE 2 S MAGBUFFER, 6271 / CDF 70 S 0 C S DUMMY DSKBUFFER S CPAGE 2 S DSKBUFFER, 6261 /CDF 60 S 0 C ************************************************* C * SUBROUTINE M T F I L E C ************************************************* C READ THE NEXT MAGTAPE: FILE INTO C MTAj: FILE "KDEVOUT:KOUTFILE[1:4]". C I.E. *MTAj: <== MTAi: C C IF NO TRANSFER WAS POSSIBLE (I.E. SEARCH FAILED) THEN C RETURN WITH MFLAG=0 ELSE MFLAG=1. C C C SUBROUTINE MTFILE SEARCHES THE MTAi: HEADERS FOR A FILE THAT C MATCHES THE USER INPUT FILE SPEC (SEE MAG10.FT COMMENTS) C FOR WHICH THERE ARE 2 CASES: C 1. NULL SPEC==>TAKE NEXT MTAi: FILE IF EXISTS C 2. F.E, *.E, F.*, *.*==> EXACT MATCH. SEARCH C UNTIL FIND A MATCH OR FAIL. C C WHEN THE MATCHING FILE IS FOUND, TRANSFER IT TO THE OUTPUT C DEVICE USING A FILE NAME DERIVED FROM EITHER: C 1. THE USER SUPPLIED OUTPUT FILE NAME IF NON-NULL C OR C 2. THE NAME READ FROM THE MTAi: HEADER RECORD. C C S ENTRY MTFIL S CPAGE 2 S MTFIL, BLOCK 2 C C [1] INIT COUNTERS AND POINTERS, JRECORD=0 JPARERR=0 JPARFIX=0 JOPR=4 C IRECORD=0 IPARERR=0 IPARFIX=0 IOPR=2 MFLAG=0 C C [1.1] SEARCH AND TEST IF SUCCEED 600 CALL MSEARCH IF (MSFLAG) 603,601,603 S \601, RETRN MTFIL C C C [1.2] CHECK WHETHER OUTPUT FILE NAME SPECIFIED. C READ THE HEADER C IF NONE WAS SPECIFIED, THEN USE THE C FILE NAME IN THE MTA HEADER RECORD. C SET THE FLAG TO TRUE. 603 MFLAG=1 CALL RDHEADER C C COPY THE FILE SIZE IN BLOCKS FROM THE HEADER IBLKCNT=JBLKCNT C C C [1.2.1] IF OUTPUT FILE SPEC = NULL OR HAS * SPEC C THEN OUTPUT FILE SPEC<==HEADER FILE SPEC; C NOTE: MCD IS COPY OF ORIGINAL KOUTFILE. C IT IS SETUP BEFORE THE FIRST CALL TO MTFILE. IF(MCD)606,604,606 C 604 DO 605 I=1,4 605 KOUTFILE(I)=JFILE(I) C C C [1.3] ENTER THE MTAj: HEADER FILE 606 CONTINUE CALL WTHEADER IFILECNT(JUNIT+1)=IFILECNT(JUNIT+1)+1 C C [1.4] OK, PRINT FILE NAME 609 WRITE(1,610)KOUTFILE 610 FORMAT('R: ',3A2,'.',A2) C C [2] READ 1 RECORD FROM MTAi: C READ 1 RECORD==>MAGBUFFER C RESET MAXIMUM NUMBER OF RETRYS ON A PARITY ERROR 620 IPARITY=-10 C DECREMENT THE NUMBER-OF-BLOCKS-LEFT COUNTER IBLKCNT=IBLKCNT-9 C C COMPUTE THE # BLOCKS TO WRITE ON MTAj: IF(IBLKCNT)621,621,622 C <9 BLOCKS 621 IBN=IBLKCNT+9 GOTO 623 C .GE. 9 BLOCKS 622 IBN=9 623 CONTINUE C C INCREMENT THE RECORD COUNTER IRECORD=IRECORD+1 S TAD \IRECORD S DISP1 S CLA /PUT RECORD NUMBER IN THE RQC DISPLAY REGISTER C C C [2.1] READ MTAi: RECORD AND CHECK FOR ERRORS C DO AS SABR CODE SO CAN GET AT MAGBUFFER PTR S CPAGE 16 C COPY BUFFER POINTER S \630, TAD MAGBUFFER S DCA AM2 S TAD MAGBUFFER# S DCA AM2# C S CALL 6,MAGTA S ARG \MWDCT /WORD COUNT S AM2, ARG MAGBUFFER S ARG \IOPR S ARG \MTRS S ARG \IBYTE S ARG \IUNIT C C TEST FOR END OF TAPE (EOT) ERROR S TAD \MTRS S AND (0040 S SZA CLA S JMP \670 /FATAL - PRINT MSG, REWIND AND GIVE UP C C TEST FOR EOF S TAD \MTRS S AND (0100 S SZA CLA S JMP \640 /PREMATURE EOF C S TAD \MTRS S AND (1616 /TST FOR PARITY ERRORS S SNA CLA S JMP \650 /NO ERROR, GO WRITE DATA ONTO MTAj: C C C [2.1.1] NOTE ERRROR AND BACKSPACE THE DRIVE S ISZ \IPARITY /SEE IF > 10 TRYS S SKP /NOPE, CONTINUE TRYING S JMP \635 /YES, FATAL ERROR CALL MAGTAP(1,0,7,MTRS,0,IUNIT) C TRY AGAIN GOTO 630 C C C [2.1.2] FATAL PARITY ERROR 635 WRITE(1,636)IRECORD,IFILECNT(IUNIT+1),KOUTFILE 636 FORMAT('READ PARITY FAILURE AT RECORD ',I4,' FILE 1# ',I4,' OUTPUT FILE:',3A2,'.',A2) IPARERR=IPARERR+1 C JUST CONTINUE ANYWAY AND SALVAGE WHAT WE CAN... C C [2.1.3] PREMATURE END OF FILE REACHED 640 WRITE(1,641)KOUTFILE,IRECORD,JBLKCNT 641 FORMAT('READ PREMATURE EOF IN FILE: ',A3,'.',A2, 1', #REC=',I5,', #BLOCKS=',I5) CALL REMAG10 C C [2.1.4] TEST IF FIXED PARITY ERROR C IF FIXED ERROR (-10 < IPARITY < 0) S\650, TAD \IPARITY S SNA CLA S JMP \700 /FATAL PARITY C S TAD \IPARITY S TAD (D10 S SZA CLA S INC \IPARFIX /YES S CLA C C [2.2] WRITE OUT THE RECORD ON MTAj: 700 CONTINUE C RECORD TRANSFER LOOP. C WRITE 1 MAGTAPE RECORD OF 3456 BYTES FROM MAGBUFFER C AFTER CONVERTING DSKBUFFER ==> MAGBUFFER. C 720 JRECORD=JRECORD+1 S TAD \JRECORD S DISP1 S CLA /OUTPUT RECORD NUMBER IN THE RQC DISPLAY REGISTER C C RESET PARITY COUNTER SPECIFYING # OF RETRIES JPARITY=-10 C C C C [2.2.1] WRITE OUT MAGBUFFER. C COPY BUFFER POINTER S \731, TAD MAGBUFFER S DCA AM3 S TAD MAGBUFFER# S DCA AM3# C S CPAGE 16 S CALL 6,MAGTA S ARG \MWDCT /WORD COUNT S AM3, ARG MAGBUFFER S ARG \JOPR S ARG \MTRS S ARG \IBYTE S ARG \JUNIT C C TEST FOR EOT S TAD \MTRS S AND (0040 S SZA CLA S JMP \750 /FATAL ERROR, PRINT MSG AND REWIND - GIVE UP- C S TAD \MTRS /TEST FOR PARITY ERROR S AND (1616 S SNA CLA S JMP \740 /NO ERRORS C C TEST IF > 10 PARITY RETRIES S ISZ \JPARITY S SKP S JMP \732 /FATAL ERROR C NOT > 10 YET, SO BACKUP AND TRY AGAIN. CALL MAGTAP(1,0,7,MTRS,IBYTE,JUNIT) C SINCE WE HAD AN ERROR, TRY MOVING AHEAD ON THE TAPE C BY WRITING WITH AN EXTENDED GAP. IBYTE=2 GOTO 731 C C C [2.2.2] FATAL PARITY ERROR 732 WRITE(1,733)JRECORD,IFILE(JUNIT+1),KOUTFILE 733 FORMAT('WRITE PARITY FAILURE AT RECORD ',I5 1,' FILE# ',I5,', INPUT FILE:',3A2,'.',A2) JPARERR=JPARERR+1 C C C [2.2.3] TEST IF AT END OF FILE THEN DONE, WRITE C 2 EOFS ON MTA: ELSE GOTO [2.3]. C TEST IF RECOVERABLE PARITY ERROR IF (-10