TABLE OF CONTENTS ----------------- I. INTRODUCTION II. ROUTINES III. PARAMETER DESCRIPTIONS TO ALL ROUTINES IV. CALL DESCRIPTIONS V. ERROR MESSAGES VI. EXAMPLES ******************************************************************* I. INTRODUCTION A SET OF FORTRAN I/O ROUTINES HAVE BEEN DEVELOPED FOR THE PDP 11/70 SIMILAR IN NATURE TO THOSE AVAILABLE IN THE IBM 360 FTIO PACKAGE. THIS NEW PACKAGE OPERATES UNDER THE RSX-11D VERSION 6.2 OPERATING SYSTEM WITH ANY NUMBER OF DUAL DENSITY 9-TRACK TAPE DRIVES. ITS MAIN PURPOSE IS TO READ IBM UNFORMATTED BINARY TAPES(NL OR SL) IN BOTH THE VARIABLE BLOCK AND FIXED BLOCK FORMAT. UNBLOCKING OF RECORDS IS PROVIDED FOR IN EITHER FORMAT. IT IS THE USERS RESPONSIBILITY TO PERFORM THE NECESSARY BYTE ADJUSTMENTS TO MAKE A 360 GENERATED TAPE COMPATIBLE WITH THE 11/70. THE ROUTINES ARE ADDITIONALLY CAPABLE OF READING AND WRITING 11/70 GENERATED TAPES WHICH ARE 360 COMPATIBLE. THESE TAPES CAN ONLY BE WRITTEN IN THE FIXED BLOCK FORMAT. AN EXTENSIVE ERROR MESSAGE CAPABILITY IS ALSO PROVIDED. ALL TAPES HANDLED BY THIS PACKAGE MUST BE CLASSIFIED AS FOREIGN VOLUMES. ALL NON-FOREIGN VOLUMES ARE ASSUMED TO HAVE THE ANSI STANDARD FORMAT. ***************************************************************** II. ROUTINES A. DCB SETS UP DATA CONTROL BLOCK-- MUST IMMEDIATELY FOLLOW THE CALL TO MOUNT. B. FREAD READS LOGICAL BLOCKS. C. FWRITE WRITES LOGICAL BLOCKS. D. FPOSN POSITIONS TO A SPECIFIED FILE OR WRITES EOF MARK. E. MOUNT MOUNT A SPECIFIED VOLUME. F. DISMNT DISMOUNT A SPECIFIED VOLUME. G. SWABI SWAP A SPECIFIED NUMBER OF BYTES. ********************************************************************** III. PARAMETER DESCRIPTION TO ALL ROUTINES ------->> NOTE THAT ALL REFERENCES TO FB OR VB REFER TO THE IBM 360 'RECFM' PARAMETER IN THE JCL. FB = FIXED BLOCK RECORDS VB = VARIABLE BLOCK RECORDS -----> NOTE: ALL ARGUMENTS ARE I*2 EXCEPT THOSE THAT REFER TO ADDRESSES. N = LOGICAL UNIT NUMBER (USER SPECIFIED) IVSN = ADDRESS OF VOLUME SERIAL NUMBER (SIX BYTE ASCII CODE LEFT-JUSTIFIED BLANK FILLED) NF = PARAMETER WHICH CONTAINS THE FILE NUMBER TO BE PROCESSED NEXT ON THE SPECIFIED UNIT. LEN = NUMBER OF BYTES TO WRITE. THIS MUST BE AN EVEN NUMBER > OR EQUAL TO 14 BYTES. THE MAXIMUM RECORD SIZE IS 65535 BYTES. ADR = ADDRESS OF DATA AREA WHERE BYTES ARE TO BE SWAPPPED. NUMB = NUMBER OF BYTES TO BE SWAPPED. EVEN NUMBERS ONLY. LABEL = DESCRIBES THE TYPE OF VOLUME TO PROCESS. LABEL = 'NL' -> NL TAPE LABEL = 'SL' -> SL TAPE IO = DESCRIBES THE NEXT TYPE OF I/O OPERATION ON THE SPECIFIED UNIT IO = 'R' -> READ OPERATION IO = 'W' -> WRITE OPERATION ( THE 'W' OPERATION IS ONLY USED FOR WRITING EOF MARKS) MODE = TYPE OF TAPE YOU ARE PROCESSING. CHOICES ARE 'FB' AND 'VB'. NOTE THAT WHEN ADDRESSING 'VB' TAPES, THE LRECL PARAMETER SHOULD NOT BE A MULTIPLE OF THE BLKSIZE. --- A = ADDRESS OF DATA AREA . THIS PARAMETER IS SPECIFIED IN THE CALL TO FREAD AND IS THE DATA AREA INTO WHICH RECORDS OR BLOCKS ARE READ. DATA AREA A SHOULD BE AS LARGE AS YOUR LARGEST UNBLOCKED RECORD. THE SIZE OF THIS REGION IS SPECIFIED IN THE 'LRECL' PARAMETER IN THE CALL TO DCB. LR = PARAMETER RETURNED TO USER WHICH INDICATES THE NUMBER OF BYTES READ IN THE LAST READ OPERATION. IOST = STATUS OF READ OR WRITE OPERATION. POSITIVE NUMBERS INDICATE SUCCESS. NEGATIVE NUMBERS INDICATE EITHER AN EOF OR ERROR. IOST = -10 IS AN EOF ALL OTHER ERRORS ARE LISTED IN APPENDIX I OF THE I/O OPERATIONS REFERENCES MANUAL. BUFF = ADDRESS OF DATA AREA . THIS PARAMETER IS SPECIFIED IN THE CALL TO DCB. THIS DATA AREA MUST BE LARGE ENOUGH TO CONTAIN YOUR LARGEST BLOCK. WHEN UNBLOCKING OCCURS, THE FIRST CALL TO FREAD READS THE DATA BLOCK FROM THE TAPE INTO DATA AREA BUFF AND UNBLOCKS THE FIRST RECORD INTO DATA AREA A . SUBSEQUENT CALLS TO FREAD UNBLOCKS THE REST OF THE DATA, RECORD BY RECORD, INTO AREA A UNTIL ALL DATA IS UNBLOCKED. NOW AN ADDITIONAL CALL TO FREAD WILL READ IN A NEW BLOCK INTO BUFF AND AGAIN UNBLOCK THE FIRST RECORD INTO AREA A. WHEN UNBLOCKING IS NOT DESIRED, DATA AREA BUFF SHOULD BE THE SAME AREA AS DATA AREA A. WHEN 'VB' IS SPECIFIED THE SIZE OF THIS REGION SHOULD INCLUDE SPACE FOR THE BLOCK DESCRIPTOR WORD AND THE RECORD DESCRIPTOR WORDS WHICH ARE NESTED IN ALL IBM 360 VARIABLE BLOCK TAPES. THE SIZE OF THIS REGION IS SPECIFIED IN THE IBM 360 JOB CONTROL LANGUAGE PARAMETER BLKSIZE, AND IN THE BLKSIZE PARAMETER IN THE CALL TO DCB. BLKSIZE = SIZE OF YOUR LARGEST BLOCK. LRECL = LENGTH OF YOUR LARGEST RECORD. THIS NUMBER SHOULD EQUAL THE BLKSIZE IF YOU ARE NOT UNBLOCKING YOUR TAPE. IDEN = DENSITY OF YOUR TAPE. CHOICES ARE 800 AND 1600. ***************************************************************** IV. CALL DESCRIPTIONS A. CALL MOUNT (N,IVSN,NF,LABEL,IDEN) THIS ROUTINE DETERMINES IF ANY OF THE TAPE DRIVES ARE AVAILABLE. IF ONE IS AVAILABLE THE ROUTINE LOGICALLY CONNECTS THE TAPE DRIVE TO THE USER TASK AND THEN SUSPENDS THE CALLING TASK UNTIL THE USER CONTINUES HIS TASK WITH THE COMMAND: 'MCR> CON TASKNAME'. APPROPRIATE ERROR MESSAGES ARE GIVEN FOR SUCH CASES AS NO TAPE DRIVES BEING AVAILABLE. FOR EACH CALL TO THIS ROUTINE THERE SHOULD BE A FINAL CALL TO DISMNT ON THE SAME UNIT. B. CALL DISMNT(N) THIS ROUTINE REWINDS THE SPECIFIED VOLUME TO THE LOAD POINT AND LOGICALLY DISCONNECTS THE TAPE DRIVE FROM THE USER TASK. THE CALLING TASK IS THEN SUSPENDED UNTIL THE USER CONTINUES HIS TASK VIA THE: 'MCR>CON TASKNAME' COMMAND. C. CALL FPOSN(IO,N,NF) THIS ROUTINE POSITIONS THE TAPE ON UNIT N TO THE BEGINNING OF THE FILE SPECIFIED BY NF. WHEN PROCESSING AN NL TAPE THE FOLLOWING APPLY: 1. WHEN AN END-OF-FILE IS DETECTED DURING A READ OPERATION ON AN NL TAPE AND THE NEXT SEQUENTIAL FILE IS TO BE READ, IT IS NOT NECESSARY TO CALL FPOSN TO POSITION TO THE NEXT FILE; JUST CONTINUE CALLS TO FREAD. 2. TO CLOSE OUT A FILE FOLLOWING CALLS TO FWRITE (OR FPOSN), CALL FPOSN WITH THE WRITE OPTION IN THE IO PARAMETER. THIS WRITES AN END-OF-FILE AND POSITIONS THE TAPE SUCH THAT SUBSEQUENT CALLS TO FWRITE GENERATE THE FILE NF. FOR EXAMPLE TO WRITE AN END-OF-FILE AFTER FILE 3 ON AN NL TAPE: CALL FPOSN('W',3,4) 3. TO WRITE AN END-OF-VOLUME, THE USER WOULD CALL FPOSN WITH THE WRITE OPTION TWICE. FOR EXAMPLE , TO WRITE AN END-OF -VOLUME AFTER TWO FILES HAVE BEEN WRITTEN: CALL FPOSN('W',2,3) CALL FPOSN('W',2,4) WHEN PROCESSING AN SL TAPE THE FOLLOWING APPLY: 1. WHEN AN SL TAPE IS BEING READ, AND AN END-OF-FILE IS DETECTED, IT IS NECESSARY TO CALL FPOSN TO INSURE THAT THE TAPE IS AT THE BEGINNING OF THE NEXT FILE TO BE READ. 2. PRESENTLY, PDP 11/70 FTIO DOES NOT PROCESS THE SL VOLUME, HEADER OR TRAILER LABELS.  D. CALL FREAD(A,N,LR,IOST) THIS ROUTINES READS 11/70 FTIO GENERATED TAPES AS WELL AS FB AND VB TAPES GENERATED ON THE IBM 360. THIS ROUTINE IS CALLED EACH TIME A NEW BLOCK OR RECORD IS DESIRED. E. CALL DCB(BUFF,N,BLKSIZE,LRECL,MODE) THIS ROUTINE SETS UP THE DATA CONTROL INFORMATION FOR ALL FTIO CALLS ON A PARTICULAR UNIT. IF YOU ARE DOING SIMULTANEOUS PROCESSING ON TWO DIFERENT UNITS YOU WOULD NEED TWO CALLS TO DCB. THIS ROUTINE MUST FOLLOW THE CALL TO MOUNT. IN GENERAL, THE ORDER SHOULD BE A CALL TO MOUNT FOLLOWED BY A CALL TO DCB, THEN ALL SUBSEQUENT FTIO CALLS. NOTE: WHEN YOU ARE DOING A WRITE OPERATION (CALL FWRITE) THE ONLY VALID VALUE FOR THE PARAMETER MODE IF FB . ADDITIONALLY, THE BLKSIZE AND LRECL ARGUMENTS SHOULD BE EQUAL. SEE EXAMPLE 4. F. CALL FWRITE(BUFF,N,LEN,IOST) THIS ROUTINE WRITES THE NUMBER OF BYTES IN DATA AREA A ONTO THE UNIT N. H. CALL SWABI(ADR,NUMB) THIS ROUTINE SWAPS THE NUMBER OF BYTES(NUMB) LOCATED IN THE DATA REGION ADR. ************************************************************************** V. ERROR MESSAGES NOTE: ALL ERRORS ABORT THE TASK ERROR NUMBER REASON **************** **************** 1 INCORRECT NUMBER OF ARGUMENTS IN CALL TO MOUNT 2 ** TIME OUT ON ATTEMPT TO READ DEVICE DIRECTORY 3 ALL DRIVES ARE IN USE 4 ** DRIVE NOT LOCATED IN TABLE 5 ** MOUNT-INSUFFICIENT POOL NODES (STUFF) 6 ** MOUNT-PARTITION TOO SMALL (STUFF) 12 LOGICAL UNIT NUMBER SPECIFIED IS INCONSISTENT-MOUNT 13 INCORRECT NUMBER OF ARGUMENTS IN CALL TO DISMNT 14 LOGICAL UNIT NUMBER SPECIFIED IS INCONSISTENT-DISMNT 15 ** INSUFFICIENT POOL NODES (STUFF) -DISMNT 16 ** PARTITION TOO SMALL (STUFF) -DISMNT 17 INCORRECT NUMBER OF ARGUMENTS IN CALL TO FPOSN 20 INVALID "NF" SPECIFICATION IN CALL TO FPOSN 21 INCONSISTENT LOGICAL UNIT NUMBER IN CALL TO FPOSN 22 INVALID "IO" SPECIFICATION IN CALL TO FPOSN 23 ILLEGAL TO SPECIFY A "W" IN THE "IO" PARAMETER WHEN TAPE IS SL 24 INCORRECT NUMBER OF ARGUMENTS IN CALL TO FREAD 25 INVALID LOGICAL UNIT NUMBER SPECIFIED IN CALL TO FREAD 26 DATA OVERRUN - FREAD BUFFER TOO SMALL FOR AMOUNT OF DATA READ. SOME DATA IS LOST. 27 NUMBER OF BYTES READ IS NOT A MULTIPLE OF LRECL 30 AN ODD NUMBER OF BYTES HAS BEEN SPECIFIED. ONLY AN EVEN NUMBER IS ACCEPTABLE - FREAD 31 ** NUMBER OF BYTES READ DOES NOT AGREE WITH BDW ON IBM TAPE-FREAD 32 THE RECORD JUST READ IS LARGER THAN THE MAXSIZE SPECIFIED IN LRECL - FREAD 33 INCORRECT NUMBER OF ARGUMENTS IN CALL TO DCB 34 INCONSISTENT LOGICAL UNIT NUMBER SPECIFIED IN CAL TO DCB 35 INVALID DENSITY SPECIFICATION IN CAL TO DCB 36 INVALID MODE SPECIFICATION IN CALL TO DCB 37 BLKSIZE MUST BE A MULTIPLE OF LRECL IN FB TAPES - DCB 40 INCORRECT NUMBER OF ARGUMENTS IN CALL TO REWIND 41 INCONSISTENT LOGICAL UNIT NUMBER IN CALL TO REWIND 42 INCORRECT NUMBER OF ARGUMENTS IN CALL TO FWRITE 43 INVALID LOGICAL UNIT NUMBER IN CALL TO FWRITE 44 CANNOT WRITE SL TAPES 45 INCORRECT NUMBER OF ARGUMENTS IN CALL TO SKIPREC 50 ** DRIVE HAS BECOME ALLOCATED 51 INVALID LABEL SPECIFICATION IN CALL TO MOUNT 54 INCORRECT NUMBER OF ARGUMENTS IN CALL TO SKIP 55 INCORRECT NUMBER OF ARGUMENTS IN CALL TO SWABI ------->>>>> NOTE: ASTERIKS BEFORE AN ERROR INDICATE POSSIBLE HARDWARE ERRORS. PLEASE CONTACT SYSTEM MANAGER IF ANY OF THESE ERRORS OCCUR. ************************************************************************** VI. EXAMPLES THE FOLLOWING PROGRAMS ARE EXAMPLES OF HOW TO USE THE FTIO PACKAGE. 1. THE FIRST SAMPLE PROGRAM READS THE FIRST FILE OF AN IBM 360 VARIABLE BLOCK TAPE AND OUTPUTS THE RECORDS. EACH BLOCK IS 382 WORDS OR 764 BYTES AND IS COMPOSED OF 15 RECORDS PER BLOCK WHICH VARY IN SIZE FROM A MINIMUM OF 20 BYTES TO A MAXIMUM OF 80 BYTES. C------> DECLARE VARIABLES C IMPLICIT INTEGER(A-Z) LOGICAL*1 IVSN(6) INTEGER*2 LR, RKRD(40), BLK(382) C C------> SET UP DATA FOR TAPE LABEL C DATA IVSN/'M','A','E','0','6',' '/ C C------> NOW CALL MOUNT. C------> THE LOGICAL UNIT NUMBER CHOSEN IS 4 C------> AND THE TAPE IS NL. C CALL MOUNT(4,IVSN,1,'NL',1600) C C------> NOW CALL DCB TO SET UP THE INTERNAL DATA AREA C------> FOR FREAD. C------> NOTE THAT THE ARRAY BLK IS THE DATA AREA INTO WHICH C------> THE BLOCK WILL BE READ BEFORE UNBLOCKING C------> OCCURS. ALSO NOTE THAT 80 IS THE SIZE C------> OF THE LARGEST RECORD . C CALL DCB(BLK,4,764,80,'VB') C C------> NOW CALL FREAD TO GET THE INDIVIDUAL RECORDS. C------> IF THE NUMBER OF FREAD CALLS EXCEEDS THE C------> NUMBER OF RECORDS WITHIN THAT BLOCK, A NEW C------> BLOCK WILL BE READ IN AUTOMATICALLY PROVIDED C------> ANOTHER BLOCK EXISTS ON THE TAPE. C------> THE THIRD PARAMETER, LR, WILL TELL YOU HOW MANY C------> BYTES WERE READ IN THE LAST CALL TO FREAD. C 10 CONTINUE CALL FREAD(RKRD,4,LR,IOST) IF(IOST .EQ. -10) GO TO 200 WRITE(6,70) LR 70 FORMAT(1H0,'LR=',I5) C C------> SWAP THE BYTES IN THE DATA REGION RKRD C C CALL SWABI(RKRD,LR) C------> GET THE NUMBER OF WORDS. C L=LR/2 C C------> NOW WRITE OUT THE RECORD JUST READ C WRITE(6,20) (RKRD(I),I=1,L) 20 FORMAT(4(10I7//)) WRITE(6,30) 30 FORMAT('0', 'END OF RECORD') GO TO 10 C C------> DISMOUNT THE TAPE ON LOGICAL UNIT 4 C 200 CONTINUE CALL DISMNT(4) STOP END 2. THE SECOND PROGRAM READS THE FIRST FILE OF AN IBM 360 FIXED BLOCK TAPE WITH 800 BYTE BLOCKS AND UNBLOCKS IT AT A RECORD LENGTH OF 80 BYTES. C------> DECLARE VARIABLES C IMPLICIT INTEGER(A-Z) LOGICAL*1 IVSN(6) INTEGER*2 LR, REC(40), DAT(400) C C------> SET UP DATA FOR TAPE LABEL C DATA IVSN/'I','N','P','U','T',' '/ C C------> CALL MOUNT WITH LOGICAL UNIT NUMBER 5 C------> THE TAPE IS SL C CALL MOUNT(5,IVSN,1,'SL',1600) C C------> CALL DCB TO SET UP THE INTERNAL DATA C------> FOR FREAD. C------> DAT IS THE DATA AREA INTO WHICH C------> THE BLOCK IS READ BEFORE UNBLOCKING C------> INTO RECORDS OCCURS. C CALL DCB(DAT,5,800,80,'FB') C C------> NOW CALL FREAD TO GET THE RECORDS OF 80 BYTES. C 10 CONTINUE CALL FREAD(REC,5,LR,IOST) IF(IOST .EQ. -10) GO TO 700 WRITE(6,100) LR 100 FORMAT(1H0,'LR=', I5) C C------> SWAP BYTES C CALL SWABI(REC,LR) C C C------> GET THE NUMBER OF WORDS. C L=LR/2 C------> WRITE OUT THE RECORD C WRITE(6,200) (REC(I),I=1,L) 200 FORMAT(4(10I7//)) WRITE(6,300) 300 FORMAT('0','END OF RECORD') GO TO 10 C C------> DISMOUNT THE TAPE ON LOGICAL UNIT 5 C 700 CONTINUE CALL DISMNT(5) STOP END 3. THIS PROGRAM READS THE SECOND FILE OF AN IBM 360 FIXED BLOCK TAPE AND OUTPUTS TO THE USER THE WHOLE BLOCK WITHOUT UNBLOCKING. THE BLOCKSIZE IS 800 BYTES. C------> DECLARE VARIABLES C IMPLICIT INTEGER(A-Z) LOGICAL*1 IVSN(6) INTEGER*2 LR, BLOCK(400) C C------> SET UP DATA FOR TAPE LABEL C DATA IVSN/'D','A','T','A','1','5'/ C C------> CALL MOUNT WITH LOGICAL UNIT NUMBER 5 C------> TAPE IS NL C CALL MOUNT(5,IVSN,2,'NL',1600) C C------> CALL DCB TO SET UP INTERNAL DATA C------> FOR FREAD. C------> NOTE THAT THE THIRD AND FOURTH PARAMETERS C------> ARE IDENTICAL, MEANING THAT THE BLOCKSIZE C------> AND RECORD SIZE ARE THE SAME. THIS INDICATES C------> TO FTIO THAT NO UNBLOCKING IS TO OCCUR. C CALL DCB(BLOCK,5,800,800,'FB') C C------> NOW CALL FREAD TO READ THE BLOCK. C------> IT IS NOT NECESSARY TO SET UP AN ADDITINAL C------> DATA AREA WHEN UNBLOCKING IS NOT DESIRED. C 10 CONTINUE CALL FREAD(BLOCK,5,LR,IOST) IF(IOST .EQ. -10) GO TO 800 WRITE(6,80) LR 80 FORMAT(1H0,'LR=',I5) C C------> SWAP THE BYTES IN THE DATA REGION C CALL SWABI(BLOCK,LR) C C C------> GET THE NUMBER OF WORDS. C L=LR/2 C------> WRITE OUT THE BLOCK C WRITE(6,55) (BLOCK(I),I=1,L) 55 FORMAT(4(10I7//)) WRITE(6,78) 78 FORMAT('0', 'END OF RECORD') GO TO 10 C C------> DISMOUNT THE TAPE ON LOGICAL UNIT 5 C 800 CONTINUE CALL DISMNT(5) STOP END 4. THIS PROGRAM WRITES A PDP TAPE WITH A BLOCKSIZE OF 800 BYTES. TWO FILES, EACH WITH ONLY ONE RECORD, ARE WRITTEN AND AN END-OF-VOLUME IS PLACED AFTER THE LAST FILE. TAPE DENSITY IS 1600 BPI. C------> DECLARE VARIABLES C IMPLICIT INTEGER(A-Z) LOGICAL*1 IVSN(6) INTEGER*2 INDAT(400) C C------> SET UP DATA FOR TAPE LABEL C DATA IVSN/'O','U','T','P','U','T'/ C C------> CALL MOUNT WITH LOGICAL UNIT NUMBER 3 TO FILE 1 C------> TAPE IS NL C CALL MOUNT(3,IVSN,1,'NL',1600) C C------> CALL DCB TO SET UP DATA BLOCK INFORMATION C CALL DCB(INDAT,3,800,800,'FB') C C------> SET UP DATA BLOCK TO BE WRITTEN C DO 100 I=1,400 INDAT(I)= 5 100 CONTINUE C C------> NOW WRITE THE DATA OUT TO TAPE C CALL FWRITE(INDAT,3,800,IOST) C C------> WRITE AN END-OF-FILE MARK C CALL FPOSN('W',3,2) C C------> GENERATE SOME MORE DATA C DO 200 I=1,400 INDAT(I)=6 200 CONTINUE C C------> WRITE THIS DATA INTO FILE 2 C CALL FWRITE(INDAT,3,800,IOST) C C------> NOW WRITE AN END-OF-VOLUME MARK C CALL FPOSN('W',3,3) CALL FPOSN('W',3,4) C C------> DISMOUNT THE TAPE C CALL DISMNT(3) C STOP END 5. THIS PROGRAM OPERATES ON A PDP 11/70 FTIO GENERATED TAPE WHICH HAS THREE FILES ON IT. EACH BLOCK IS 800 BYTES IN LENGTH. UNBLOCKING OF RECORDS IS NOT DESIRED. THE PROGRAM FIRST POSTIONS TO FILE 3 VIA THE CALL TO MOUNT. IT THEN READS THE FIRST RECORD OF FILE 3 AND THEN POSITIONS TO THE BEGINNING OF FILE 2. FINALLY, IT READS THE FIRST RECORD OF FILE 2 AND TERMINATES. C------> DECLARE VARIABLES C IMPLICIT INTEGER (A-Z) LOGICAL*1 IVSN(6) INTEGER*2 DATA(400) C C------> SET UP DATA FOR TAPE LABEL C DATA IVSN/'O','U','T','P','U','T'/ C C------> CALL MOUNT WITH LOGICAL UNIT NUMBER 5 TO FILE 3. C CALL MOUNT(5,IVSN,3,'NL',1600) C C------> SET UP DCB C CALL DCB(DATA,5,800,800,'FB') C C------> READ DATA C CALL FREAD(DATA,5,LR,IOST) C C------> NOW POSITION TO THE SECOND FILE C CALL FPOSN('R',5,2) C C------> NOW READ THIS FILE C CALL FREAD(DATA,5,LR,IOST) C C------> DISMOUNT THE UNIT C CALL DISMNT(5) STOP END