SUBROUTINE READ C C C AUTHOR: C PAUL D. CLAYTON C REPUBLIC MANAGEMENT SYSTEMS INC. C ONE NESHAMINY INTERPLEX, SUITE 306 C TREVOSE, PA. 19044 C C ******************************************************* C * * C * * C * * C * DIRECT INQUIRIES TO: * C * * C * PAUL D. CLAYTON * C * REPUBLIC MANAGEMENT SYSTEMS * C * ONE NESHAMINY INTERPLEX, SUITE 306 * C * TREVOSE, PA. 19044 C * * C * NO WARRANTY OR REPRESENTATION, EXPRESS OR * C * IMPLIED, IS MADE WITH RESPECT TO THE * C * CORRECTNESS, COMPLETENESS, OR USEFULNESS * C * OF THIS SOFTWARE, NOR THAT USE OF THIS * C * SOFTWARE MIGHT NOT INFRINGE PRIVATELY * C * OWNED RIGHTS. * C * * C * NO LIABILITY IS ASSUMED WITH RESPECT TO * C * THE USE OF, OR FOR DAMAGES RESULTING FROM * C * THE USE OF THIS SOFTWARE * C * * C ******************************************************* C * * C * THIS SOFTWARE WAS DESIGNED FOR USE ON A * C * PDP-11/70 OPERATING UNDER IAS V3.0. * C * * C ******************************************************* C C C THIS MODULE WILL READ IN RT-11 FORMAT TAPES AND WRITE THEM OUT C TO THE DISK WITH THE FILE NAME SPECIFIED ON THE TAPE. C C INCLUDE 'RT11.COM' ! ADD IN THE COMMON VARIABLES C BYTE VTST(9),OUTREC(512) DATA VTST/'V','O','L','1','R','T','1','1','A'/ C OUTLU = 5 !INITIALIZE LOGICAL UNIT FOR TREMINAL IF ( (ISWIT.AND.ILPSW) .NE. 0 ) OUTLU = 6 !PRINTER INSTEAD CALL RDTAPE (MAGLU,BUFF,512,ISTAT,ISW) !READ IN FIRST RECORD IF ( ISTAT(1).GE.0 .AND. ISW.GE.0 ) GOTO 110 WRITE (5,100) 100 FORMAT(/,' ERROR READING VOLUME BLOCK FROM THE TAPE.') RETURN C 110 CONTINUE DO 120 I = 1,9 IF ( BUFF(I) .NE. VTST(I) ) GOTO 130 120 CONTINUE GOTO 150 130 CONTINUE WRITE (5,140) 140 FORMAT (/,' THE VOLUME IS NOT RT-11 FORMAT.') RETURN 150 CONTINUE CALL TIME ( BUFF(10) ) ! GET THE CURRENT TIME CALL DATE ( BUFF(1) ) ! AND CURRENT DATE WRITE (OUTLU,160) IDEV,IDNM,(BUFF(I),I=1,9),(BUFF(I),I=10,17) 160 FORMAT (/,T3,'RT-11 FILES READ FROM ',1A2,O1,/' ',T3,9A1,T15, - 8A1,/) C 170 CONTINUE CALL RDTAPE (MAGLU,BUFF,512,ISTAT,ISW) ! READ NEXT RECORD D WRITE (5,180)ISTAT(1),ISTAT(2) D 180 FORMAT (/,' ERROR CODE FROM READ IS ',I6,3X,I6) IF (((ISTAT(1).GE.0).OR.(ISTAT(1).EQ.-10)).AND.(ISW.GE.0)) - GOTO 210 190 WRITE (5,200) 200 FORMAT (/,' ERROR READING THE TAPE UNIT FOR FILE TRANSFER.') RETURN C 210 CONTINUE IF ( ISTAT(1) .NE. -10 ) GOTO 220 !CHECK FOR TAPE MARK TAPMRK = TAPMRK + 1 IF ( TAPMRK .EQ. 2 ) RETURN GOTO 170 !LOOP BACK FOR NEXT RECORD C C GET HERE IF THERE IS A DATA RECORD RECIEVED FROM THE TAPE. C 220 CONTINUE TAPMRK = 0 !RESET THE TAPE MARK COUNTER C C FIRST IS TO CHECK FOR A BEGINNING FILE LABEL BLOCK C IF ((BUFF(1).NE.'H').OR.(BUFF(2).NE.'D').OR.(BUFF(3).NE.'R') - .OR.(BUFF(4).NE.'1')) GOTO 170 WRITE (OUTLU,230) (BUFF(I),I=5,14) 230 FORMAT (T3,10A1) BUFF(15) = "00 !PUT NULL BYTE IN OPEN (NAME=BUFF(5),UNIT=IDATLU,TYPE='NEW',CARRIAGECONTROL= - 'LIST') 240 CALL RDTAPE (MAGLU,BUFF,512,ISTAT,ISW) !READ IN OTHER RECORD IF(((ISTAT(1).LT.0).AND.(ISTAT(1).NE.-10)).OR.ISW.LT.0) GOTO 190 IF ( ISTAT(1) .NE. -10 ) GOTO 270 !CHECK FOR TAPE MARK TAPMRK = TAPMRK + 1 IF ( TAPMRK .NE. 2 ) GOTO 240 !GO BACK FOR NEXT RECORD 250 WRITE (5,260) !OTHERWISE TELL USER TAPE IS BAD 260 FORMAT (/,' SECOND TAPE MARK ENCOUNTERED UNEXPECTEDLY!!.') CALL EXIT !GET OUT OF HERE C C IF THERE IS A SECOND HEADER, SKIP OVER C 270 CONTINUE TAPMRK = 0 !RESET TAPE MARK COUNTER IF ((BUFF(1).EQ.'H').AND.(BUFF(2).EQ.'D').AND.(BUFF(3).EQ.'R') - .AND.(BUFF(4).EQ.'2')) GOTO 240 280 CONTINUE IPTR = 1 !INITIALIZE BUFFER POINTER 290 CONTINUE IMAX = ISTAT(2) !SET THE TOP OF LOOP POINTER DO 330 I = 1,IMAX !SET UP THE LOOP IF ( BUFF(I).EQ."15 ) GOTO 320 IF ( (BUFF(I).EQ."12).AND.(CRSW.EQ.1) ) GOTO 300 C C FALL THROUGH IF BYTE IS PURE DATA C OUTREC(IPTR) = BUFF(I) !MOVE DATA BYTE IPTR = IPTR + 1 !BUMP BUFFER POINTER CRSW = 0 !RESET THE CARRIAGE RETURN SWITCH GOTO 330 !GOTO FOOT C C GET HERE IF CR + LF FOUND C 300 CONTINUE WRITE (IDATLU,310) (OUTREC(I1),I1=1,IPTR-2) 310 FORMAT (255A1) IPTR = 1 !RESET BUFFER POINTER CRSW = 0 !AND CARRIAGE RETURN SWITCH GOTO 330 !GOTO FOOT C C GET HERE IF A CARRIAGE RETURN IS DETECTED C 320 CONTINUE OUTREC(IPTR) = BUFF(I) !MOVE BYTE IPTR = IPTR + 1 !BUMP POINTER CRSW = 1 !SHOW CARRIAGE RETURN FOUND GOTO 330 !GOTO FOOT C C FOOT OF THE DO LOOP C 330 CONTINUE C C NOW TO READ IN ANOTHER TAPE RECORD C 340 CALL RDTAPE (MAGLU,BUFF,512,ISTAT,ISW) !DO TAPE READ IF((((ISTAT(1).LT.0).AND.ISTAT(1).NE.-10)).OR.ISW.LT.0) GOTO 190 IF ( ISTAT(1).NE.-10 ) GOTO 350 !IF NOT TAPE MARK SKIP OVER TAPMRK = TAPMRK + 1 IF ( TAPMRK .NE. 2 ) GOTO 340 !LOOP BACK FOR NEXT RECORD GOTO 250 !GO DISPLAY THE ERROR C C NOW CHECK FOR 'EOF1' LABEL C 350 CONTINUE TAPMRK = 0 !RESET TAPE MARK COUNTER IF ((BUFF(1).NE.'E').OR.(BUFF(2).NE.'O').OR.(BUFF(3).NE.'F') - .OR.(BUFF(4).NE.'1')) GOTO 290 !LOOP BACK IF NOT EOF CLOSE (UNIT=IDATLU) GOTO 170 END