|
Another example (maybe a bit more easy to follow) of
how to use the low-level SEPT calls to do I/O.
The following (not so itty-bitty) program copies
a member of a file to another member of the file.
It is straightforward to extend it to use other files
in different libraries.
/* CALL THISPGM PARM(FROM-FILE FROM-MBR TO-MBR); */
DCL SPCPTR .PARM1 PARM;
DCL DD PARM-FROM-FILE CHAR(10) BAS(.PARM1);
DCL SPCPTR .PARM2 PARM;
DCL DD PARM-FROM-MBR CHAR(10) BAS(.PARM2);
DCL SPCPTR .PARM3 PARM;
DCL DD PARM-TO-MBR CHAR(10) BAS(.PARM3);
DCL OL PARAMETERS(.PARM1, .PARM2, .PARM3) EXT PARM MIN(3);
ENTRY * (PARAMETERS) EXT;
CPYBLAP FROM-FILE-NAME, PARM-FROM-FILE, " ";
CPYBLAP FROM-MBR-NAME , PARM-FROM-MBR , " ";
CPYBLAP TO-MBR-NAME , PARM-TO-MBR , " ";
CALLI OPEN-FROM-MBR, *, .OPEN-FROM-MBR;
CALLI OPEN-TO-MBR , *, .OPEN-TO-MBR;
COPY-NEXT-RECORD:
CALLI READ-FROM-RECORD, *, .READ-FROM-RECORD;
CPYBLA TO-DATA, FROM-DATA;
CALLI WRITE-TO-RECORD, *, .WRITE-TO-RECORD;
B COPY-NEXT-RECORD;
END-OF-FILE:
CALLI CLOSE-FROM-MBR, *, .CLOSE-FROM-MBR;
CALLI CLOSE-TO-MBR, *, .CLOSE-TO-MBR;
RTX *;
/************* COMMON FILE HANDLING ****************/
DCL SYSPTR .SEPT(6440) BAS(@SEPT);
DCL DD PCO CHAR(16) BASPCO;
DCL SPCPTR @SEPT DEF(PCO) POS( 1);
DCL CON CLOSE-ENTRY BIN(2) INIT(11);
DCL CON OPEN-ENTRY BIN(2) INIT(12);
DCL CON *LIBL BIN(2) INIT(-75);
DCL CON *FIRST BIN(2) INIT(-71);
DCL CON LIB-ID BIN(2) INIT(72);
DCL CON MBR-ID BIN(2) INIT(73);
DCL SPCPTR .NULL;
DCL SPCPTR .ODP-ROOT;
DCL SPC ODP-ROOT BAS(.ODP-ROOT);
DCL DD ODP-STATUS CHAR(4) DIR;
DCL DD ODP-DEV-LENGTH BIN(4) DIR;
DCL DD ODP-OPEN-SIZE BIN(4) DIR;
DCL DD ODP.OPEN-FEEDBCK BIN(4) DIR;
DCL DD ODP.DEV-NAMELIST BIN(4) DIR;
DCL DD ODP....MORE.... CHAR(1) DIR;
DCL SPCPTR .DEV-CONTROL-BLOCK;
DCL SPC DEV-CONTROL-BLOCK BAS(.DEV-CONTROL-BLOCK);
DCL DD DCB-MAX-NBR-OF-DEVICES BIN( 2) DIR;
DCL DD DCB-DEVICES-IN-THE-ODP BIN( 2) DIR;
DCL DD DCB-DEVICE-NAME CHAR(10) DIR;
DCL DD DCB-OFFSET-TO-FM-WORK BIN( 4) DIR;
DCL DD DCB-LENGTH-OF-FM-WORK BIN( 4) DIR;
DCL DD DCB-INDEX-FOR-LUD-PTR BIN( 2) DIR;
DCL DD DCB-GET BIN( 2) DIR;
DCL DD DCB-GET-BY-RRN BIN( 2) DIR;
DCL DD DCB-GET-BY-KEY BIN( 2) DIR;
DCL DD * BIN( 2) DIR;
DCL DD DCB-PUT BIN( 2) DIR;
DCL DD DCB-PUT-GET BIN( 2) DIR;
DCL DD DCB-UPDATE BIN( 2) DIR;
DCL DD DCB-DELETE BIN( 2) DIR;
DCL DD DCB-FORCE-EOD BIN( 2) DIR;
DCL DD DCB-FORCE-EOV BIN( 2) DIR;
DCL DD * BIN( 2) DIR;
DCL DD * BIN( 2) DIR;
DCL DD DCB-FREE-REC-LOCK BIN( 2) DIR;
DCL DD * BIN( 2) DIR;
DCL DD * BIN( 2) DIR;
DCL DD * BIN( 2) DIR;
DCL DD DCB-CLOSE BIN( 2) DIR;
DCL DD DCB-OPEN BIN( 2) DIR;
DCL DD DCB-SPTB BIN( 2) DIR;
/************* INPUT FILE HANDLING ****************/
DCL DD FROM-FILE-NAME CHAR(10);
DCL DD FROM-MBR-NAME CHAR(10);
DCL DD FROM-RECORD-LENGTH BIN(2) INIT(92);
DCL SPCPTR .IBUF;
DCL DD FROM-RECORD CHAR(92) BAS(.IBUF);
DCL DD FROM-DATA CHAR(80) DEF(FROM-RECORD) POS(13);
/* INPUT FILE CONTROL BLOCK */
DCL SPCPTR .IFCB INIT(IFCB);
DCL DD IFCB CHAR(214) BDRY(16);
DCL SPCPTR .IFCB-ODP DEF(IFCB) POS( 1);
DCL SPCPTR .IFCB-INBUF DEF(IFCB) POS( 17);
DCL SPCPTR .IFCB-OUTBUF DEF(IFCB) POS( 33);
DCL SPCPTR .IFCB-OPEN-FEEDBACK DEF(IFCB) POS( 49);
DCL SPCPTR .IFCB-IO-FEEDBACK DEF(IFCB) POS( 65);
DCL SPCPTR .IFCB-NEXT-UFCB DEF(IFCB) POS( 81);
DCL DD * CHAR(32) DEF(IFCB) POS( 97);
DCL DD IFCB-FILE CHAR(10) DEF(IFCB) POS(129);
DCL DD IFCB-LIB-ID BIN(2) DEF(IFCB) POS(139);
DCL DD IFCB-LIBRARY CHAR(10) DEF(IFCB) POS(141);
DCL DD IFCB-MBR-ID BIN(2) DEF(IFCB) POS(151);
DCL DD IFCB-MEMBER CHAR(10) DEF(IFCB) POS(153);
DCL DD IFCB-DEVICE-NAME CHAR(10) DEF(IFCB) POS(163);
DCL DD IFCB-DEVICE-INDEX BIN(2) DEF(IFCB) POS(173);
DCL DD IFCB-FLAGS-1 CHAR(1) DEF(IFCB) POS(175) INIT(X'80');
DCL DD IFCB-FLAGS-2 CHAR(1) DEF(IFCB) POS(176) INIT(X'20');
DCL DD IFCB-REL-VERSION CHAR(4) DEF(IFCB) POS(177);
DCL DD IFCB-INV-MK-COUNT BIN (4) DEF(IFCB) POS(181);
DCL DD IFCB-MORE-FLAGS CHAR(1) DEF(IFCB) POS(185);
DCL DD * CHAR(23) DEF(IFCB) POS(186);
DCL DD IFCB-RECORD-ID BIN (2) DEF(IFCB) POS(209) INIT(1);
DCL DD IFCB-RECORD-LENGTH BIN (2) DEF(IFCB) POS(211);
DCL DD IFCB-NO-MORE-PARMS BIN (2) DEF(IFCB) POS(213) INIT(32767);
DCL OL OPEN-I(.IFCB);
DCL OL CLOSE-I(.IFCB);
DCL SPCPTR .GET-PARM INIT(GET-PARM);
DCL DD GET-PARM BIN(4) INIT(H'03000001');
DCL OL GET-I(.IFCB, .GET-PARM, .NULL);
DCL DD GET-ENTRY BIN(2);
DCL EXCM * EXCID(H'5001') BP(END-OF-FILE) CV("CPF") IMD;
DCL INSPTR .OPEN-FROM-MBR;
ENTRY OPEN-FROM-MBR INT;
CPYBWP .NULL, *; /* .NULL CANNOT BE INIT(*) */
CPYNV IFCB-LIB-ID, *LIBL; /* DEFAULT */
CPYBLAP IFCB-LIBRARY,"*LIBL", " ";
CPYNV IFCB-RECORD-LENGTH, FROM-RECORD-LENGTH;
CPYBLA IFCB-FILE, FROM-FILE-NAME;
CPYNV IFCB-MBR-ID, MBR-ID;
CPYBLA IFCB-MEMBER, FROM-MBR-NAME;
CALLX .SEPT(OPEN-ENTRY), OPEN-I, *;
CPYBWP .IBUF, .IFCB-INBUF;
CPYBWP .ODP-ROOT, .IFCB-ODP;
ADDSPP .DEV-CONTROL-BLOCK, .ODP-ROOT, ODP.DEV-NAMELIST;
CPYNV(B) GET-ENTRY, DCB-GET/POS(.OPEN-FROM-MBR);
DCL INSPTR .READ-FROM-RECORD;
ENTRY READ-FROM-RECORD INT;
CALLX .SEPT(GET-ENTRY), GET-I, *;
B .READ-FROM-RECORD;
DCL INSPTR .CLOSE-FROM-MBR;
ENTRY CLOSE-FROM-MBR INT;
CALLX .SEPT(CLOSE-ENTRY), CLOSE-I, *;
B .CLOSE-FROM-MBR;
/************* OUTPUT FILE HANDLING ****************/
DCL DD TO-FILE-NAME CHAR(10);
DCL DD TO-MBR-NAME CHAR(10);
DCL DD TO-RECORD-LENGTH BIN(2) INIT(92);
DCL SPCPTR .OBUF;
DCL DD TO-RECORD CHAR(92) BAS(.OBUF);
DCL DD TO-DATA CHAR(80) DEF(TO-RECORD) POS(13);
/* OUTPUT FILE CONTROL BLOCK */
DCL SPCPTR .OFCB INIT(OFCB);
DCL DD OFCB CHAR(214) BDRY(16);
DCL SPCPTR .OFCB-ODP DEF(OFCB) POS( 1);
DCL SPCPTR .OFCB-INBUF DEF(OFCB) POS( 17);
DCL SPCPTR .OFCB-OUTBUF DEF(OFCB) POS( 33);
DCL SPCPTR .OFCB-OPEN-FEEDBACK DEF(OFCB) POS( 49);
DCL SPCPTR .OFCB-IO-FEEDBACK DEF(OFCB) POS( 65);
DCL SPCPTR .OFCB-NEXT-UFCB DEF(OFCB) POS( 81);
DCL DD * CHAR(32) DEF(OFCB) POS( 97);
DCL DD OFCB-FILE CHAR(10) DEF(OFCB) POS(129);
DCL DD OFCB-LIB-ID BIN(2) DEF(OFCB) POS(139);
DCL DD OFCB-LIBRARY CHAR(10) DEF(OFCB) POS(141);
DCL DD OFCB-MBR-ID BIN(2) DEF(OFCB) POS(151);
DCL DD OFCB-MEMBER CHAR(10) DEF(OFCB) POS(153);
DCL DD OFCB-DEVICE-NAME CHAR(10) DEF(OFCB) POS(163);
DCL DD OFCB-DEVICE-INDEX BIN(2) DEF(OFCB) POS(173);
DCL DD OFCB-FLAGS-1 CHAR(1) DEF(OFCB) POS(175) INIT(X'80');
DCL DD OFCB-FLAGS-2 CHAR(1) DEF(OFCB) POS(176) INIT(X'10');
DCL DD OFCB-REL-VERSION CHAR(4) DEF(OFCB) POS(177);
DCL DD OFCB-INV-MK-COUNT BIN (4) DEF(OFCB) POS(181);
DCL DD OFCB-MORE-FLAGS CHAR(1) DEF(OFCB) POS(185);
DCL DD * CHAR(23) DEF(OFCB) POS(186);
DCL DD OFCB-RECORD-ID BIN (2) DEF(OFCB) POS(209) INIT(1);
DCL DD OFCB-RECORD-LENGTH BIN (2) DEF(OFCB) POS(211);
DCL DD OFCB-NO-MORE-PARMS BIN (2) DEF(OFCB) POS(213) INIT(32767);
DCL OL OPEN-O(.OFCB);
DCL OL CLOSE-O(.OFCB);
DCL SPCPTR .PUT-PARM INIT(PUT-PARM);
DCL DD PUT-PARM BIN(4) INIT(H'10000005');
DCL OL PUT-O(.OFCB, .PUT-PARM, .NULL);
DCL DD PUT-ENTRY BIN(2);
DCL INSPTR .OPEN-TO-MBR;
ENTRY OPEN-TO-MBR INT;
CPYBWP .NULL, *; /* .NULL CANNOT BE INIT(*) */
CPYNV OFCB-LIB-ID, *LIBL; /* DEFAULT */
CPYBLAP OFCB-LIBRARY,"*LIBL", " ";
CPYNV OFCB-RECORD-LENGTH, TO-RECORD-LENGTH;
CPYBLA OFCB-FILE, TO-FILE-NAME;
CPYNV OFCB-MBR-ID, MBR-ID;
CPYBLA OFCB-MEMBER, TO-MBR-NAME;
CALLX .SEPT(OPEN-ENTRY), OPEN-O, *;
CPYBWP .OBUF, .OFCB-OUTBUF;
CPYBWP .ODP-ROOT, .OFCB-ODP;
ADDSPP .DEV-CONTROL-BLOCK, .ODP-ROOT, ODP.DEV-NAMELIST;
CPYNV(B) PUT-ENTRY, DCB-PUT/POS(.OPEN-TO-MBR);
DCL INSPTR .WRITE-TO-RECORD;
ENTRY WRITE-TO-RECORD INT;
CALLX .SEPT(PUT-ENTRY), PUT-O, *;
B .WRITE-TO-RECORD;
DCL INSPTR .CLOSE-TO-MBR;
ENTRY CLOSE-TO-MBR INT;
CALLX .SEPT(CLOSE-ENTRY), CLOSE-O, *;
B .CLOSE-TO-MBR;
PEND;
+---
| This is the MI Programmers Mailing List!
| To submit a new message, send your mail to MI400@midrange.com.
| To subscribe to this list send email to MI400-SUB@midrange.com.
| To unsubscribe from this list send email to MI400-UNSUB@midrange.com.
| Questions should be directed to the list owner/operator: dr2@cssas400.com
+---
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.