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'. 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,IDEN,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 DOES NOT AGREE WITH BLOCKSIZE SPECIFIED-FREAD 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