CAINDMFOBLOK -- BUFFERED DIRECT ACCESS OPEN, READ, WRITE, CLOSE 00000100 C*********************************************************************** C COPYRIGHT ATLANTIC RICHFIELD COMPANY 1991 * C*********************************************************************** CTITLE FOBLOK -- BUFFERED DIRECT ACCESS OPERATIONS, SUMMARY 00000200 C AUTHOR STU NELAN 00000300 C DESIGNER STU NELAN 00000400 C LANGUAGE VS FORTRAN 00000500 C SYSTEM IBM OR CRAY 00000510 C WRITTEN 09-29-82 00000600 C REVISED XX-XX-XX XXX. ... 00000700 C REVISED 04-29-86 JMP. DUAL IBM/CRAY VERSION 00000710 C REVISED 12-09-86 JMP. CLOSE FILE USING FOCDD ON CRAY SINCE 00000720 C FOCSD IS A NOOP ON CRAY. 00000730 C REVISED 01-21-87 JMP. CHANGE CALCULATION OF RECORD LENGTH ON 00000740 C CRAY. 00000750 C 00000800 C 00000900 C CALL FOISBD (DCBAD, LEN, WBUF) 00001000 C INPUT DCBAD = ADDRESS OF A BSAM DCB. A4 00001100 C LEN = LENGTH OF EACH RECORD IN BYTES. I4 00001200 C I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00001300 C WBUF(1) = LENGTH OF WBUF IN BYTES 00001400 C WBUF(1) SHOULD EQUAL SYBYPW*(7+2*8000) 00001500 C THE FIRST 7 WORDS IN WBUF ARE USED AS 00001600 C CONTROL INFORMATION, AND THE REST SPLIT 00001700 C INTO TWO EQUAL DISK BUFFERS -- ONE FOR 00001800 C WRITE/(READ), ONE FOR READ. 00001900 C PREPARE TO BUILD FILE WITH SEQUENTIAL WRITES (USING FOWSBD). 00002000 C SET THE RECORD LENGTH IN THE BSAM DCB AND OPEN THE FILE. 00002100 C 00002200 C CALL FOWSBD (DCBAD, SEQDA, DATA, WBUF) 00002300 C INPUT DCBAD = BSAM DCB ADDRESS. I4 00002400 C SEQDA = SEQUENTIAL DISK ADDRESS. I4 00002500 C DATA = RECORD TO BE WRITTEN. ANY 00002600 C LENGTH = 'LEN' USED WITH FOISBD. 00002700 C I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00002800 C LENGTH = LENGTH USED WITH FOISBD. 00002900 C BUILD FILE BY WRITING SEQUENTIALLLY WITH BSAM. 00003000 C 00003100 C CALL FOCSBD (DCBAD, WBUF) 00003200 C INPUT DCBAD = ADDRESS OF DCB TO BE CLOSED. I4 00003300 C WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00003400 C LENGTH = LENGTH USED WITH FOISBD. 00003500 C CLOSE THE FILE FOR SEQUENTIAL ACCESS. 00003600 C 00003700 C CALL FOIDBD (DCBAD, LEN, WBUF) 00003800 C INPUT DCBAD = ADDRESS OF BDAM DCB. I4 00003900 C LEN = LENGTH OF EACH RECORD IN BYTES. I4 00004000 C I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00004100 C LENGTH = LENGTH USED WITH FOISBD. 00004200 C OPEN FILE FOR DIRECT ACCESS, AFTER 00004300 C FILE HAS BEEN BUILT WITH FOISBD AND FOWSBD. 00004400 C LEN MUST BE SAME VALUE USED WITH FOISBD. 00004500 C 00004600 C CALL FORDBD (DCBAD, DA, DATA, WBUF) 00004700 C INPUT DCBAD = BDAM DCB ADDRESS. I4 00004800 C DA = RECORD NUMBER IN FILE (1, 2, 3, ...) I4 00004900 C OUTPUT DATA = RECORD NUMBER DA READ FROM FILE. ANY 00005000 C DA = DA + 1 I4 00005100 C I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00005200 C LENGTH = LENGTH USED WITH FOISBD. 00005300 C READ RECORD NUMBER DA AND STORE IN DATA. 00005400 C RECORD LENGTH IS 'LEN' USED IN FOISBD AND FOIDBD. 00005500 C 00005600 C CALL FOWDBD (DCBAD, DA, DATA, WBUF) 00005700 C INPUT DCBAD = BDAM DCB ADDRESS. I4 00005800 C DA = RECORD NUMBER IN FILE (1, 2, 3, ...) I4 00005900 C DATA = RECORD TO BE WRITTEN. ANY 00006000 C OUTPUT DA = DA + 1 I4 00006100 C I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00006200 C LENGTH = LENGTH USED WITH FOISBD. 00006300 C WRITE RECORD GIVEN IN DATA AT LOCATION GIVEN BY DA. 00006400 C RECORD LENGTH IS 'LEN' USED IN FOISBD AND FOIDBD. 00006500 C 00006600 C CALL FOCDBD (DCBAD, WBUF) 00006700 C INPUT DCBAD = ADDRESS OF DCB TO BE CLOSED. I4 00006800 C I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00006900 C LENGTH = LENGTH USED WITH FOISBD. 00007000 C CLOSE THE FILE FOR DIRECT ACCESS. 00007100 C 00007200 C EJECT 00007300 C THE FILE IS CREATED SEQUENTIALLY WITH FOISBD AND FOWSBD. THEN 00007400 C IT CAN BE ACCESSED DIRECTLY WITH FOIDBD, FORDBD, AND FOWDBD. 00007500 C 00007600 C END 00007700 C EJECT 00007800 CTITLE FOISBD -- OPEN FOR BUILDING DIRECT FILE SEQUENTIALLY 00007900 CA AUTHOR STU NELAN 00008000 CA DESIGNER STU NELAN 00008100 CA LANGUAGE S/370 FORTRAN 00008200 CA WRITTEN 09-28-82 00008300 CA 00008400 CA 00008500 CA CALL FOISBD (DCBAD, LEN, WBUF) 00008600 CA INPUT DCBAD = ADDRESS OF A BSAM DCB A4 00008700 CA LEN = LENGTH OF EACH RECORD IN BYTES I4 00008800 CA I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00008900 CA I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00009000 CA WBUF(1) = LENGTH OF WBUF IN BYTES 00009100 CA WBUF(1) SHOULD EQUAL SYBYPW*(7+2*8000) 00009200 CA THE FIRST 7 WORDS IN WBUF ARE USED AS 00009300 CA CONTROL INFORMATION, AND THE REST SPLIT 00009400 CA INTO TWO EQUAL DISK BUFFERS -- ONE FOR 00009500 CA WRITE/(READ), ONE FOR READ. 00009600 CA 00009700 CA 00009800 CA PREPARE TO BUILD FILE WITH SEQUENTIAL WRITES (USING FOWSBD). 00009900 CA SET THE RECORD LENGTH IN THE BSAM DCB AND OPEN THE FILE. 00010000 CA 00010100 CA THE FILE IS CREATED SEQUENTIALLY WITH FOISBD AND FOWSBD. THEN 00010200 CA IT CAN BE ACCESSED DIRECTLY WITH FOIDBD, FORDBD, AND FOWDBD. 00010300 CA 00010400 CAEND 00010500 C EJECT 00010600 CTITLE FOWSBD -- WRITE SEQUENTIALLY TO BUILD DIRECT ACCESS FILE 00010700 CA AUTHOR STU NELAN 00010800 CA DESIGNER STU NELAN 00010900 CA LANGUAGE S/370 FORTRAN 00011000 CA WRITTEN 09-8/75 00011100 CA 00011200 CA 00011300 CA CALL FOWSBD (DCBAD, SEQDA, DATA, WBUF) 00011400 CA INPUT DCBAD = BSAM DCB ADDRESS I4 00011500 CA SEQDA = SEQUENTIAL DISK ADDRESS I4 00011600 CA DATA = RECORD TO BE WRITTEN ANY 00011700 CA LENGTH = 'LEN' USED WITH FOISSD 00011800 CA I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00011900 CA LENGTH = LENGTH USED IN FOISBD. 00012000 CA 00012100 CA 00012200 CA BUILD FILE BY WRITING SEQUENTIALLLY WITH BSAM. 00012300 CA 00012400 CA THE FILE IS CREATED SEQUENTIALLY WITH FOISBD AND FOWSBD. THEN 00012500 CA IT CAN BE ACCESSED DIRECTLY WITH FOIDBD, FORDBD, AND FOWDBD. 00012600 CA 00012700 CAEND 00012800 C EJECT 00012900 CTITLE FOCSBD -- CLOSE SEQUENTIAL ACCESS FILE 00013000 CA AUTHOR STU NELAN 00013100 CA DESIGNER STU NELAN 00013200 CA LANGUAGE S/370 FORTRAN 00013300 CA WRITTEN 09-28-82 00013400 CA 00013500 CA 00013600 CA 00013700 CA CALL FOCSBD (DCBAD, WBUF) 00013800 CA INPUT DCBAD = ADDRESS OF DCB TO BE CLOSED I4 00013900 CA I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00014000 CA LENGTH = LENGTH USED IN FOISBD. 00014100 CA 00014200 CA CLOSE THE FILE. 00014300 CA 00014400 CA THE FILE IS CREATED SEQUENTIALLY WITH FOISBD AND FOWSBD. THEN 00014500 CA IT CAN BE ACCESSED DIRECTLY WITH FOIDBD, FORDBD, AND FOWDBD. 00014600 CA 00014700 CAEND 00014800 C EJECT 00014900 CTITLE FOIDBD -- OPEN FOR DIRECT ACCESS (AFTER FILE IS BUILT) 00015000 CA AUTHOR STU NELAN 00015100 CA DESIGNER STU NELAN 00015200 CA LANGUAGE S/370 FORTRAN 00015300 CA WRITTEN 09-28-82 00015400 CA 00015500 CA 00015600 CA CALL FOIDBD (DCBAD, LEN, WBUF) 00015700 CA INPUT DCBAD = ADDRESS OF BDAM DCB I4 00015800 CA LEN = LENGTH OF EACH RECORD IN BYTES I4 00015900 CA I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00016000 CA LENGTH = LENGTH USED IN FOISBD. 00016100 CA OPEN FILE FOR DIRECT ACCESS, AFTER 00016200 CA FILE HAS BEEN BUILT WITH FOISBD AND FOWSBD. 00016300 CA LEN MUST BE SAME VALUE USED WITH FOISBD. 00016400 CA 00016500 CA THE FILE IS CREATED SEQUENTIALLY WITH FOISBD AND FOWSBD. THEN 00016600 CA IT CAN BE ACCESSED DIRECTLY WITH FOIDBD, FORDBD, AND FOWDBD. 00016700 CA 00016800 CAEND 00016900 C EJECT 00017000 CTITLE FORDBD -- READ DIRECT ACCESS FILE 00017100 CA AUTHOR STU NELAN 00017200 CA DESIGNER STU NELAN 00017300 CA LANGUAGE S/370 FORTRAN 00017400 CA WRITTEN 09-28-82 00017500 CA 00017600 CA 00017700 CA CALL FORDBD (DCBAD, DA, DATA, WBUF) 00017800 CA INPUT DCBAD = BDAM DCB ADDRESS I4 00017900 CA DA = RECORD NUMBER IN FILE (1, 2, 3, ...) I4 00018000 CA OUTPUT DATA = RECORD NUMBER DA READ FROM FILE ANY 00018100 CA DA = DA + 1 I4 00018200 CA I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00018300 CA LENGTH = LENGTH USED IN FOISBD. 00018400 CA 00018500 CA 00018600 CA READ RECORD NUMBER DA AND STORE IN DATA. 00018700 CA RECORD LENGTH IS 'LEN' USED IN FOISBD AND FOIDBD. 00018800 CA 00018900 CA THE FILE IS CREATED SEQUENTIALLY WITH FOISBD AND FOWSBD. THEN 00019000 CA IT CAN BE ACCESSED DIRECTLY WITH FOIDBD, FORDBD, AND FOWDBD. 00019100 CA 00019200 CAEND 00019300 C EJECT 00019400 CTITLE FOWDBD -- WRITE DIRECT ACCESS RECORD 00019500 CA AUTHOR STU NELAN 00019600 CA DESIGNER STU NELAN 00019700 CA LANGUAGE S/370 FORTRAN 00019800 CA WRITTEN 09-28-82 00019900 CA 00020000 CA 00020100 CA CALL FOWDBD (DCBAD, DA, DATA, WBUF) 00020200 CA INPUT DCBAD = BDAM DCB ADDRESS I4 00020300 CA DA = RECORD NUMBER IN FILE (1, 2, 3, ...) I4 00020400 CA DATA = RECORD TO BE WRITTEN ANY 00020500 CA OUTPUT DA = DA + 1 I4 00020600 CA I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00020700 CA LENGTH = LENGTH USED IN FOISBD. 00020800 CA 00020900 CA 00021000 CA WRITE RECORD GIVEN IN DATA AT LOCATION GIVEN BY DA. 00021100 CA RECORD LENGTH IS 'LEN' USED IN FOISBD AND FOIDBD. 00021200 CA 00021300 CA THE FILE IS CREATED SEQUENTIALLY WITH FOISBD AND FOWSBD. THEN 00021400 CA IT CAN BE ACCESSED DIRECTLY WITH FOIDBD, FORDBD, AND FOWDBD. 00021500 CA 00021600 CAEND 00021700 C EJECT 00021800 CTITLE FOCDBD -- CLOSE DIRECT ACCESS FILE 00021900 CA AUTHOR STU NELAN 00022000 CA DESIGNER STU NELAN 00022100 CA LANGUAGE S/370 FORTRAN 00022200 CA WRITTEN 09-28-82 00022300 CA 00022400 CA 00022500 CA 00022600 CA CALL FOCDBD (DCBAD, WBUF) 00022700 CA INPUT DCBAD = ADDRESS OF DCB TO BE CLOSED I4 00022800 CA I/O WBUF = MEMORY BUFFER FOR MULTIPLE RECORDS ANY 00022900 CA LENGTH = LENGTH USED IN FOISBD. 00023000 CA 00023100 CA CLOSE THE FILE. 00023200 CA 00023300 CA THE FILE IS CREATED SEQUENTIALLY WITH FOISBD AND FOWSBD. THEN 00023400 CA IT CAN BE ACCESSED DIRECTLY WITH FOIDBD, FORDBD, AND FOWDBD. 00023500 CA 00023600 CAEND 00023700 SUBROUTINE FOBLOK 00023800 C 00023900 IMPLICIT INTEGER (A-Z) 00024000 C 00024001 COMMON /SYSTEM/ SYSTEM, SYBYPW, SYLOCF, JAPNMS 00024002 C 00024003 DIMENSION DATA ( 1) 00024200 DIMENSION LOCVAR( 7) 00024300 DIMENSION WBUF ( 1) 00024400 DIMENSION ICDP(9) 00024500 C 00024700 EQUIVALENCE ( LENBUF , LOCVAR(1) ) 00024800 EQUIVALENCE ( LHEADR , LOCVAR(2) ) 00024900 EQUIVALENCE ( NREC , LOCVAR(3) ) 00025000 EQUIVALENCE ( LRECL , LOCVAR(4) ) 00025100 EQUIVALENCE ( CCBLK , LOCVAR(5) ) 00025200 EQUIVALENCE ( CWBLK , LOCVAR(6) ) 00025300 EQUIVALENCE ( WRITEF , LOCVAR(7) ) 00025400 C 00025410 DATA LENLOC / 7 / 00025420 C 00025500 C ************************************* 00025600 C OPEN FOR SEQUENTIAL WRITE TO THE FILE 00025700 C ************************************* 00025800 C 00025900 ENTRY FOISBD (DCBAD, LEN, WBUF) 00026000 C 00026100 LENBUF = WBUF(1) / 4 00026200 LHEADR = LENLOC 00026300 LRECL = LEN / 4 00026400 NREC = LENBUF - LENLOC 00026500 NREC = NREC / 2 00026600 IF (SYBYPW .NE. 8 .AND. NREC .GT. 8000) NREC = 8000 00026700 NREC = NREC / LRECL 00026800 CALL FOISSD (DCBAD, 4*NREC*LRECL, 0) 00026900 CCBLK = 0 00027000 CWBLK = 0 00027100 WRITEF = 0 00027200 C 00027300 CALL ARMVE (LOCVAR, WBUF, LENLOC) 00027400 RETURN 00027500 C 00027600 C ********************************** 00027700 C WRITE SEQUENTIAL TO BUILD THE FILE 00027800 C ********************************** 00027900 C 00028000 ENTRY FOWSBD (DCBAD, SEQDA, DATA, WBUF) 00028100 C 00028200 CALL ARMVE (WBUF, LOCVAR, LENLOC) 00028300 SWBLK = (SEQDA-1)/NREC + 1 00028400 IF (SWBLK .EQ. CWBLK) GO TO 20 00028500 IF (WRITEF .EQ. 0) GO TO 10 00028600 N = CWBLK 00028700 CALL FOWSSD (DCBAD, N, WBUF(LENLOC+1)) 00028800 WRITEF = 0 00028900 10 CWBLK = SWBLK 00029000 20 IREC = SEQDA - (SWBLK-1) * NREC 00029100 INDEX = (IREC-1) * LRECL + LENLOC + 1 00029200 CALL ARMVE (DATA, WBUF(INDEX), LRECL) 00029300 WRITEF = 1 00029400 C 00029500 CALL ARMVE (LOCVAR, WBUF, LENLOC) 00029600 SEQDA = SEQDA + 1 00029700 RETURN 00029800 C 00029900 C *********************************** 00030000 C CLOSE SEQUENTIAL ACCESS TO THE FILE 00030100 C *********************************** 00030200 C 00030300 ENTRY FOCSBD (DCBAD, WBUF) 00030400 C 00030500 CALL ARMVE (WBUF, LOCVAR, LENLOC) 00030600 IF (WRITEF .EQ. 0) GO TO 30 00030700 WRITEF = 0 00030800 N = CWBLK 00030900 CALL FOWSSD (DCBAD, N, WBUF(LENLOC+1)) 00031000 C 00031100 30 CALL FOCSD (DCBAD) 00031200 CALL ARMVE (LOCVAR, WBUF, LENLOC) 00031300 RETURN 00031400 C 00031500 C ********************************** 00031600 C OPEN FOR DIRECT ACCESS TO THE FILE 00031700 C ********************************** 00031800 C 00031900 ENTRY FOIDBD (DCBAD, LEN, WBUF) 00032000 C 00032100 CALL ARMVE (WBUF, LOCVAR, LENLOC) 00032200 CALL FOIDSD (DCBAD, 4*NREC*LRECL) 00032300 RETURN 00032400 C 00032500 C ******************************************************** 00032600 C READ INTO DATA THE RECORD WITH RELATIVE RECORD NUMBER DA 00032700 C FROM THE FILE. 00032800 C ******************************************************** 00032900 C 00033000 ENTRY FORDBD (DCBAD, DA, DATA, WBUF) 00033100 C 00033200 CALL ARMVE (WBUF, LOCVAR, LENLOC) 00033300 SWBLK = (DA-1)/NREC + 1 00033400 C PRINT 10101,DA,SWBLK,CWBLK,CCBLK 00033410 10101 FORMAT(' FORDBD: DA, SWBLK, CWBLK, CCBLK=',4(I8,1X)) 00033420 C DO 10102 JMP=1,9 00033430 C CALL USRTHV(WBUF(LENLOC+1+(JMP-1)*LRECL),'THCDPN ',ICDP(JMP)) 00033440 10102 CONTINUE 00033450 C PRINT 10103,(ICDP(JMP),JMP=1,9) 00033460 10103 FORMAT(' 1ST HALF OF BUFFER: ',9(I6,1X)) 00033470 C DO 10104 JMP=1,9 00033471 C CALL USRTHV(WBUF(LENLOC+1+(NREC+JMP-1)*LRECL),'THCDPN ', 00033472 C * ICDP(JMP)) 00033473 10104 CONTINUE 00033474 C PRINT 10105,(ICDP(JMP),JMP=1,9) 00033475 10105 FORMAT(' 2ND HALF OF BUFFER: ',9(I6,1X)) 00033476 00033480 IREC = DA - (SWBLK-1) * NREC 00033500 INDEX = (IREC-1) * LRECL + LENLOC + 1 00033600 IF (SWBLK .EQ. CWBLK) GO TO 40 00033700 INDEX = INDEX + NREC * LRECL 00033800 IF (SWBLK .EQ. CCBLK) GO TO 40 00033900 CCBLK = SWBLK 00034000 N = CCBLK 00034100 CALL FORDSD (DCBAD, N, WBUF(LENLOC+1+NREC*LRECL)) 00034200 40 CALL ARMVE (WBUF(INDEX), DATA, LRECL) 00034300 C 00034400 CALL ARMVE (LOCVAR, WBUF, LENLOC) 00034500 DA = DA + 1 00034600 RETURN 00034700 C 00034800 C ******************************************************* 00034900 C WRITE DIRECT FROM DATA TO THE RELATIVE RECORD NUMBER DA 00035000 C TO THE FILE. 00035100 C ******************************************************* 00035200 C 00035300 ENTRY FOWDBD (DCBAD, DA, DATA, WBUF) 00035400 C 00035500 CALL ARMVE (WBUF, LOCVAR, LENLOC) 00035600 SWBLK = (DA-1)/NREC + 1 00035700 IF (SWBLK .EQ. CWBLK) GO TO 60 00035800 IF (WRITEF .EQ. 0) GO TO 50 00035900 N = CWBLK 00036000 CALL FOWDSD (DCBAD, N, WBUF(LENLOC+1)) 00036100 WRITEF = 0 00036200 50 CWBLK = SWBLK 00036300 N = CWBLK 00036400 CALL FORDSD (DCBAD, N, WBUF(LENLOC+1)) 00036500 C PRINT 20202 00036510 20202 FORMAT(' &&&&&&&& FORDSD CALLED FROM FOWDBD &&&&&&&&&&') 00036520 60 IREC = DA - (SWBLK-1) * NREC 00036600 INDEX = (IREC-1) * LRECL + LENLOC + 1 00036700 CALL ARMVE (DATA, WBUF(INDEX), LRECL) 00036800 WRITEF = 1 00036900 C 00037000 CALL ARMVE (LOCVAR, WBUF, LENLOC) 00037100 DA = DA + 1 00037200 RETURN 00037300 C 00037400 C ******************************* 00037500 C CLOSE DIRECT ACCESS TO THE FILE 00037600 C ******************************* 00037700 C 00037800 ENTRY FOCDBD (DCBAD, WBUF) 00037900 C 00038000 CALL ARMVE (WBUF, LOCVAR, LENLOC) 00038100 IF (WRITEF .EQ. 0) GO TO 70 00038200 WRITEF = 0 00038300 N = CWBLK 00038400 CALL FOWDSD (DCBAD, N, WBUF(LENLOC+1)) 00038500 C 00038600 C CLOSE USING FOCDD ON CRAY BECAUSE FOCSD IS A NOOP 00038601 C 00038602 70 CONTINUE 00038603 CALL FOCDD(DCBAD) 00038620 C 00038720 CALL ARMVE (LOCVAR, WBUF, LENLOC) 00038800 RETURN 00038900 C 00039000 END 00039100