CAINDMFOPACK -- BUFFERED DIRECT ACCESS OPERATIONS, SUMMARY 00010000 C*********************************************************************** C COPYRIGHT ATLANTIC RICHFIELD COMPANY 1991 * C*********************************************************************** CTITLE FOPACK -- BUFFERED DIRECT ACCESS OPERATIONS, SUMMARY 00020000 C AUTHOR D. W. DAVIS 00030000 C DESIGNER STU NELAN 00040000 C LANGUAGE FORTRAN 00050000 C SYSTEM IBM 00060000 C WRITTEN 04-12-85 00070000 C REVISED 10-17-90 ESN. CHANGE FOCSD TO FOCDD IN FOCDPD CALL00080000 C 00090000 C 00100000 C CALL FOISPD (DCBAD, LEN, WBUF, SSMPL, ESMPL, THL) 00110000 C INPUT DCBAD = ADDRESS OF A BSAM DCB. A4 00120000 C LEN = LENGTH OF EACH RECORD IN BYTES. I4 00130000 C I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00140000 C WBUF(1) = LENGTH OF WBUF IN BYTES 00150000 C WBUF(1) SHOULD EQUAL 47520=4*(12+2*5934) 00160000 C THE FIRST 7 WORDS IN WBUF ARE USED AS 00170000 C CONTROL INFORMATION, AND THE REST SPLIT 00180000 C INTO TWO EQUAL DISK BUFFERS -- ONE FOR 00190000 C WRITE/(READ), ONE FOR READ. 00200000 C INPUT SSMPL = STARTING SAMPLE I4 00210000 C INPUT ESMPL = ENDING SAMPLE I4 00220000 C INPUT THL = TRACE HEADER LENGTH I4 00230000 C PREPARE TO BUILD FILE WITH SEQUENTIAL WRITES (USING FOWSPD). 00240000 C SET THE RECORD LENGTH IN THE BSAM DCB AND OPEN THE FILE. 00250000 C 00260000 C CALL FOWSPD (DCBAD, SEQDA, DATA, WBUF) 00270000 C INPUT DCBAD = BSAM DCB ADDRESS. I4 00280000 C SEQDA = SEQUENTIAL DISK ADDRESS. I4 00290000 C DATA = RECORD TO BE WRITTEN. ANY 00300000 C LENGTH = 'LEN' USED WITH FOISPD. 00310000 C I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00320000 C LENGTH = LENGTH USED WITH FOISPD. 00330000 C BUILD FILE BY WRITING SEQUENTIALLLY WITH BSAM. 00340000 C 00350000 C CALL FOCSPD (DCBAD, WBUF) 00360000 C INPUT DCBAD = ADDRESS OF DCB TO BE CLOSED. I4 00370000 C WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00380000 C LENGTH = LENGTH USED WITH FOISPD. 00390000 C CLOSE THE FILE FOR SEQUENTIAL ACCESS. 00400000 C 00410000 C CALL FOIDPD (DCBAD, LEN, WBUF) 00420000 C INPUT DCBAD = ADDRESS OF BDAM DCB. I4 00430000 C LEN = LENGTH OF EACH RECORD IN BYTES. I4 00440000 C I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00450000 C LENGTH = LENGTH USED WITH FOISPD. 00460000 C OPEN FILE FOR DIRECT ACCESS, AFTER 00470000 C FILE HAS BEEN BUILT WITH FOISPD AND FOWSPD. 00480000 C LEN MUST BE SAME VALUE USED WITH FOISPD. 00490000 C 00500000 C CALL FORDPD (DCBAD, DA, DATA, WBUF) 00510000 C INPUT DCBAD = BDAM DCB ADDRESS. I4 00520000 C DA = RECORD NUMBER IN FILE (1, 2, 3, ...) I4 00530000 C OUTPUT DATA = RECORD NUMBER DA READ FROM FILE. ANY 00540000 C DA = DA + 1 I4 00550000 C I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00560000 C LENGTH = LENGTH USED WITH FOISPD. 00570000 C READ RECORD NUMBER DA AND STORE IN DATA. 00580000 C RECORD LENGTH IS 'LEN' USED IN FOISPD AND FOIDPD. 00590000 C 00600000 C CALL FOWDPD (DCBAD, DA, DATA, WBUF) 00610000 C INPUT DCBAD = BDAM DCB ADDRESS. I4 00620000 C DA = RECORD NUMBER IN FILE (1, 2, 3, ...) I4 00630000 C DATA = RECORD TO BE WRITTEN. ANY 00640000 C OUTPUT DA = DA + 1 I4 00650000 C I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00660000 C LENGTH = LENGTH USED WITH FOISPD. 00670000 C WRITE RECORD GIVEN IN DATA AT LOCATION GIVEN BY DA. 00680000 C RECORD LENGTH IS 'LEN' USED IN FOISPD AND FOIDPD. 00690000 C 00700000 C CALL FOCDPD (DCBAD, WBUF) 00710000 C INPUT DCBAD = ADDRESS OF DCB TO BE CLOSED. I4 00720000 C I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00730000 C LENGTH = LENGTH USED WITH FOISPD. 00740000 C CLOSE THE FILE FOR DIRECT ACCESS. 00750000 C 00760000 C EJECT 00770000 C THE FILE IS CREATED SEQUENTIALLY WITH FOISPD AND FOWSPD. THEN 00780000 C IT CAN BE ACCESSED DIRECTLY WITH FOIDPD, FORDPD, AND FOWDPD. 00790000 C 00800000 C END 00810000 C EJECT 00820000 CTITLE FOISPD -- OPEN FOR BUILDING DIRECT FILE SEQUENTIALLY 00830000 CA AUTHOR D. W. DAVIS 00840000 CA DESIGNER STU NELAN 00850000 CA LANGUAGE S/370 FORTRAN 00860000 CA WRITTEN 04-12-85 00870000 CA 00880000 CA 00890000 CA CALL FOISPD (DCBAD, LEN, WBUF, SSMPL, ESMPL, THL) 00900000 CA INPUT DCBAD = ADDRESS OF A BSAM DCB A4 00910000 CA LEN = LENGTH OF EACH RECORD IN BYTES I4 00920000 CA I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00930000 CA I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00940000 CA WBUF(1) = LENGTH OF WBUF IN BYTES 00950000 CA WBUF(1) SHOULD EQUAL 47520=4*(12+2*5934) 00960000 CA THE FIRST 7 WORDS IN WBUF ARE USED AS 00970000 CA CONTROL INFORMATION, AND THE REST SPLIT 00980000 CA INTO TWO EQUAL DISK BUFFERS -- ONE FOR 00990000 CA WRITE/(READ), ONE FOR READ. 01000000 CA INPUT SSMPL = START SAMPLE I4 01010000 CA INPUT ESMPL = END SAMPLE I4 01020000 CA INPUT THL = TRACE HEADER LENGTH I4 01030000 CA 01040000 CA 01050000 CA PREPARE TO BUILD FILE WITH SEQUENTIAL WRITES (USING FOWSPD). 01060000 CA SET THE RECORD LENGTH IN THE BSAM DCB AND OPEN THE FILE. 01070000 CA 01080000 CA THE FILE IS CREATED SEQUENTIALLY WITH FOISPD AND FOWSPD. THEN 01090000 CA IT CAN BE ACCESSED DIRECTLY WITH FOIDPD, FORDPD, AND FOWDPD. 01100000 CA 01110000 CAEND 01120000 C EJECT 01130000 CTITLE FOWSPD -- WRITE SEQUENTIALLY TO BUILD DIRECT ACCESS FILE 01140000 CA AUTHOR STU NELAN 01150000 CA DESIGNER STU NELAN 01160000 CA LANGUAGE S/370 FORTRAN 01170000 CA WRITTEN 09-8/75 01180000 CA 01190000 CA 01200000 CA CALL FOWSPD (DCBAD, SEQDA, DATA, WBUF) 01210000 CA INPUT DCBAD = BSAM DCB ADDRESS I4 01220000 CA SEQDA = SEQUENTIAL DISK ADDRESS I4 01230000 CA DATA = RECORD TO BE WRITTEN ANY 01240000 CA LENGTH = 'LEN' USED WITH FOISSD 01250000 CA I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 01260000 CA LENGTH = LENGTH USED IN FOISPD. 01270000 CA 01280000 CA 01290000 CA BUILD FILE BY WRITING SEQUENTIALLLY WITH BSAM. 01300000 CA 01310000 CA THE FILE IS CREATED SEQUENTIALLY WITH FOISPD AND FOWSPD. THEN 01320000 CA IT CAN BE ACCESSED DIRECTLY WITH FOIDPD, FORDPD, AND FOWDPD. 01330000 CA 01340000 CAEND 01350000 C EJECT 01360000 CTITLE FOCSPD -- CLOSE SEQUENTIAL ACCESS FILE 01370000 CA AUTHOR STU NELAN 01380000 CA DESIGNER STU NELAN 01390000 CA LANGUAGE S/370 FORTRAN 01400000 CA WRITTEN 09-28-82 01410000 CA 01420000 CA 01430000 CA 01440000 CA CALL FOCSPD (DCBAD, WBUF) 01450000 CA INPUT DCBAD = ADDRESS OF DCB TO BE CLOSED I4 01460000 CA I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 01470000 CA LENGTH = LENGTH USED IN FOISPD. 01480000 CA 01490000 CA CLOSE THE FILE. 01500000 CA 01510000 CA THE FILE IS CREATED SEQUENTIALLY WITH FOISPD AND FOWSPD. THEN 01520000 CA IT CAN BE ACCESSED DIRECTLY WITH FOIDPD, FORDPD, AND FOWDPD. 01530000 CA 01540000 CAEND 01550000 C EJECT 01560000 CTITLE FOIDPD -- OPEN FOR DIRECT ACCESS (AFTER FILE IS BUILT) 01570000 CA AUTHOR STU NELAN 01580000 CA DESIGNER STU NELAN 01590000 CA LANGUAGE S/370 FORTRAN 01600000 CA WRITTEN 09-28-82 01610000 CA 01620000 CA 01630000 CA CALL FOIDPD (DCBAD, LEN, WBUF) 01640000 CA INPUT DCBAD = ADDRESS OF BDAM DCB I4 01650000 CA LEN = LENGTH OF EACH RECORD IN BYTES I4 01660000 CA I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 01670000 CA LENGTH = LENGTH USED IN FOISPD. 01680000 CA OPEN FILE FOR DIRECT ACCESS, AFTER 01690000 CA FILE HAS BEEN BUILT WITH FOISPD AND FOWSPD. 01700000 CA LEN MUST BE SAME VALUE USED WITH FOISPD. 01710000 CA 01720000 CA THE FILE IS CREATED SEQUENTIALLY WITH FOISPD AND FOWSPD. THEN 01730000 CA IT CAN BE ACCESSED DIRECTLY WITH FOIDPD, FORDPD, AND FOWDPD. 01740000 CA 01750000 CAEND 01760000 C EJECT 01770000 CTITLE FORDPD -- READ DIRECT ACCESS FILE 01780000 CA AUTHOR D. W. DAVIS 01790000 CA DESIGNER STU NELAN 01800000 CA LANGUAGE S/370 FORTRAN 01810000 CA WRITTEN 04-12-85 01820000 CA 01830000 CA 01840000 CA CALL FORDPD (DCBAD, DA, DATA, WBUF) 01850000 CA INPUT DCBAD = BDAM DCB ADDRESS I4 01860000 CA DA = RECORD NUMBER IN FILE (1, 2, 3, ...) I4 01870000 CA OUTPUT DATA = RECORD NUMBER DA READ FROM FILE ANY 01880000 CA DA = DA + 1 I4 01890000 CA I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 01900000 CA LENGTH = LENGTH USED IN FOISPD. 01910000 CA 01920000 CA 01930000 CA READ RECORD NUMBER DA AND STORE IN DATA. 01940000 CA RECORD LENGTH IS 'LEN' USED IN FOISPD AND FOIDPD. 01950000 CA 01960000 CA THE FILE IS CREATED SEQUENTIALLY WITH FOISPD AND FOWSPD. THEN 01970000 CA IT CAN BE ACCESSED DIRECTLY WITH FOIDPD, FORDPD, AND FOWDPD. 01980000 CA 01990000 CAEND 02000000 C EJECT 02010000 CTITLE FOWDPD -- WRITE DIRECT ACCESS RECORD 02020000 CA AUTHOR D. W. DAVIS 02030000 CA DESIGNER STU NELAN 02040000 CA LANGUAGE S/370 FORTRAN 02050000 CA WRITTEN 04-12-85 02060000 CA 02070000 CA 02080000 CA CALL FOWDPD (DCBAD, DA, DATA, WBUF) 02090000 CA INPUT DCBAD = BDAM DCB ADDRESS I4 02100000 CA DA = RECORD NUMBER IN FILE (1, 2, 3, ...) I4 02110000 CA DATA = RECORD TO BE WRITTEN ANY 02120000 CA OUTPUT DA = DA + 1 I4 02130000 CA I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 02140000 CA LENGTH = LENGTH USED IN FOISPD. 02150000 CA 02160000 CA 02170000 CA WRITE RECORD GIVEN IN DATA AT LOCATION GIVEN BY DA. 02180000 CA RECORD LENGTH IS 'LEN' USED IN FOISPD AND FOIDPD. 02190000 CA 02200000 CA THE FILE IS CREATED SEQUENTIALLY WITH FOISPD AND FOWSPD. THEN 02210000 CA IT CAN BE ACCESSED DIRECTLY WITH FOIDPD, FORDPD, AND FOWDPD. 02220000 CA 02230000 CAEND 02240000 C EJECT 02250000 CTITLE FOCDPD -- CLOSE DIRECT ACCESS FILE 02260000 CA AUTHOR STU NELAN 02270000 CA DESIGNER STU NELAN 02280000 CA LANGUAGE S/370 FORTRAN 02290000 CA WRITTEN 09-28-82 02300000 CA 02310000 CA 02320000 CA 02330000 CA CALL FOCDPD (DCBAD, WBUF) 02340000 CA INPUT DCBAD = ADDRESS OF DCB TO BE CLOSED I4 02350000 CA I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 02360000 CA LENGTH = LENGTH USED IN FOISPD. 02370000 CA 02380000 CA CLOSE THE FILE. 02390000 CA 02400000 CA THE FILE IS CREATED SEQUENTIALLY WITH FOISPD AND FOWSPD. THEN 02410000 CA IT CAN BE ACCESSED DIRECTLY WITH FOIDPD, FORDPD, AND FOWDPD. 02420000 CA 02430000 CAEND 02440000 C---------------------------------------------- 02450000 SUBROUTINE FOPACK 02460000 C---------------------------------------------- 02470000 IMPLICIT INTEGER (A-Z) 02480000 C 02490000 DIMENSION DATA ( 1) 02500000 DIMENSION LOCVAR( 12) 02510000 DIMENSION WBUF ( 1) 02520000 C 02530000 DATA LENLOC / 12 / 02540000 DATA ZERO / 0 / 02550000 C 02560000 EQUIVALENCE ( LENBUF , LOCVAR(1) ) 02570000 EQUIVALENCE ( LHEADR , LOCVAR(2) ) 02580000 EQUIVALENCE ( NREC , LOCVAR(3) ) 02590000 EQUIVALENCE ( LRECL , LOCVAR(4) ) 02600000 EQUIVALENCE ( CCBLK , LOCVAR(5) ) 02610000 EQUIVALENCE ( CWBLK , LOCVAR(6) ) 02620000 EQUIVALENCE ( WRITEF , LOCVAR(7) ) 02630000 EQUIVALENCE ( HLEN , LOCVAR(8) ) 02640000 EQUIVALENCE ( HSSMPL , LOCVAR(9) ) 02650000 EQUIVALENCE ( HESMPL , LOCVAR(10)) 02660000 EQUIVALENCE ( HTHL , LOCVAR(11)) 02670000 EQUIVALENCE ( SMPLNO , LOCVAR(12)) 02680000 C---------------------------------------------- 02690000 C OPEN FOR SEQUENTIAL WRITE TO THE FILE 02700000 C---------------------------------------------- 02710000 ENTRY FOISPD (DCBAD, LEN, WBUF, SSMPL, ESMPL, THL) 02720000 C 02730000 HLEN = LEN / 4 02740000 LENBUF = WBUF(1) / 4 02750000 LHEADR = LENLOC 02760000 HSSMPL = SSMPL 02770000 HESMPL = ESMPL 02780000 HTHL = THL 02790000 SMPLNO = (HESMPL - HSSMPL) + 1 02800000 LRECL = SMPLNO + HTHL 02810000 NREC = LENBUF - LENLOC 02820000 NREC = NREC / 2 02830000 IF (NREC .GT. 5934) NREC = 5934 02840000 NREC = NREC / LRECL 02850000 CALL FOISSD (DCBAD, 4*NREC*LRECL) 02860000 CCBLK = 0 02870000 CWBLK = 0 02880000 WRITEF = 0 02890000 C 02900000 CALL ARMVE (LOCVAR, WBUF, LENLOC) 02910000 RETURN 02920000 C---------------------------------------------- 02930000 C WRITE SEQUENTIAL TO BUILD THE FILE 02940000 C---------------------------------------------- 02950000 ENTRY FOWSPD (DCBAD, SEQDA, DATA, WBUF) 02960000 C 02970000 CALL ARMVE (WBUF, LOCVAR, LENLOC) 02980000 SWBLK = (SEQDA-1)/NREC + 1 02990000 IF (SWBLK .EQ. CWBLK) GO TO 20 03000000 IF (WRITEF .EQ. 0) GO TO 10 03010000 N = CWBLK 03020000 CALL FOWSSD (DCBAD, N, WBUF(LENLOC+1)) 03030000 WRITEF = 0 03040000 10 CWBLK = SWBLK 03050000 20 IREC = SEQDA - (SWBLK-1) * NREC 03060000 INDEX = (IREC-1) * LRECL + LENLOC + 1 03070000 C-------------------- MOVE HEADER TO WRITE BUFFER 03080000 CALL ARMVE (DATA, WBUF(INDEX), HTHL) 03090000 C-------------------- MOVE SAMPLES TO WRITE BUFFER 03100000 CALL ARMVE (DATA(HTHL+HSSMPL), WBUF(INDEX+HTHL), SMPLNO) 03110000 WRITEF = 1 03120000 C 03130000 CALL ARMVE (LOCVAR, WBUF, LENLOC) 03140000 SEQDA = SEQDA + 1 03150000 RETURN 03160000 C---------------------------------------------- 03170000 C CLOSE SEQUENTIAL ACCESS TO THE FILE 03180000 C---------------------------------------------- 03190000 ENTRY FOCSPD (DCBAD, WBUF) 03200000 C 03210000 CALL ARMVE (WBUF, LOCVAR, LENLOC) 03220000 IF (WRITEF .EQ. 0) GO TO 30 03230000 WRITEF = 0 03240000 N = CWBLK 03250000 CALL FOWSSD (DCBAD, N, WBUF(LENLOC+1)) 03260000 C 03270000 30 CALL FOCSD (DCBAD) 03280000 CALL ARMVE (LOCVAR, WBUF, LENLOC) 03290000 RETURN 03300000 C---------------------------------------------- 03310000 C OPEN FOR DIRECT ACCESS TO THE FILE 03320000 C---------------------------------------------- 03330000 ENTRY FOIDPD (DCBAD, LEN, WBUF) 03340000 C 03350000 CALL ARMVE (WBUF, LOCVAR, LENLOC) 03360000 CALL FOIDSD (DCBAD, 4*NREC*LRECL) 03370000 RETURN 03380000 C--------------------------------------------------------------- 03390000 C READ INTO DATA THE RECORD WITH RELATIVE RECORD NUMBER DA 03400000 C FROM THE FILE. 03410000 C--------------------------------------------------------------- 03420000 ENTRY FORDPD (DCBAD, DA, DATA, WBUF) 03430000 C 03440000 CALL ARMVE (WBUF, LOCVAR, LENLOC) 03450000 SWBLK = (DA-1)/NREC + 1 03460000 IREC = DA - (SWBLK-1) * NREC 03470000 INDEX = (IREC-1) * LRECL + LENLOC + 1 03480000 IF (SWBLK .EQ. CWBLK) GO TO 40 03490000 INDEX = INDEX + NREC * LRECL 03500000 IF (SWBLK .EQ. CCBLK) GO TO 40 03510000 CCBLK = SWBLK 03520000 N = CCBLK 03530000 CALL FORDSD (DCBAD, N, WBUF(LENLOC+1+NREC*LRECL)) 03540000 40 CALL ARSET (DATA, HLEN, ZERO) 03550000 C----------------------- MOVE TRACE HEADER TO CALLERS BUFFER 03560000 CALL ARMVE (WBUF(INDEX), DATA, HTHL) 03570000 C----------------------- MOVE SAMPLES TO CALLERS BUFFER 03580000 CALL ARMVE (WBUF(INDEX+HTHL), DATA(HTHL+HSSMPL), SMPLNO) 03590000 C----------------------- SAVE POINTERS 03600000 CALL ARMVE (LOCVAR, WBUF, LENLOC) 03610000 DA = DA + 1 03620000 RETURN 03630000 C--------------------------------------------------------------- 03640000 C WRITE DIRECT FROM DATA TO THE RELATIVE RECORD NUMBER DA 03650000 C TO THE FILE. 03660000 C--------------------------------------------------------------- 03670000 ENTRY FOWDPD (DCBAD, DA, DATA, WBUF) 03680000 C 03690000 CALL ARMVE (WBUF, LOCVAR, LENLOC) 03700000 SWBLK = (DA-1)/NREC + 1 03710000 IF (SWBLK .EQ. CWBLK) GO TO 60 03720000 IF (WRITEF .EQ. 0) GO TO 50 03730000 N = CWBLK 03740000 CALL FOWDSD (DCBAD, N, WBUF(LENLOC+1)) 03750000 WRITEF = 0 03760000 50 CWBLK = SWBLK 03770000 N = CWBLK 03780000 CALL FORDSD (DCBAD, N, WBUF(LENLOC+1)) 03790000 60 IREC = DA - (SWBLK-1) * NREC 03800000 INDEX = (IREC-1) * LRECL + LENLOC + 1 03810000 C----------------------- MOVE TRACE HEADER TO CALLERS BUFFER 03820000 CALL ARMVE (DATA, WBUF(INDEX), HTHL) 03830000 C----------------------- MOVE SAMPLES TO CALLERS BUFFER 03840000 CALL ARMVE (DATA(HTHL+HSSMPL), WBUF(INDEX+HTHL), SMPLNO) 03850000 WRITEF = 1 03860000 C 03870000 CALL ARMVE (LOCVAR, WBUF, LENLOC) 03880000 DA = DA + 1 03890000 RETURN 03900000 C---------------------------------------------- 03910000 C CLOSE DIRECT ACCESS TO THE FILE 03920000 C---------------------------------------------- 03930000 ENTRY FOCDPD (DCBAD, WBUF) 03940000 C 03950000 CALL ARMVE (WBUF, LOCVAR, LENLOC) 03960000 IF (WRITEF .EQ. 0) GO TO 70 03970000 WRITEF = 0 03980000 N = CWBLK 03990000 CALL FOWDSD (DCBAD, N, WBUF(LENLOC+1)) 04000000 C 04010000 70 CALL FOCDD (DCBAD) 04020000 CALL ARMVE (LOCVAR, WBUF, LENLOC) 04030000 RETURN 04040000 C 04050000 END 04060000