- INPUT
- Variable-length records from E15
- OUTPUT
- Variable-length output data set
- WORK DATA SETS
- Dynamically allocated (by default)
- USER EXITS
- E15 and E35
- FUNCTIONS/OPTIONS
- 64-bit parameter lists, OUTFIL
The JCL for running program PGM1, and the code used by PGM1 to
invoke DFSORT with the 64-bit invocation parameter list and use the
64-bit E15 and E35 parameter lists, are shown below.
//EXAMP JOB A400,PROGRAMMER 01
//STEP1 EXEC PGM=PGM1 02
//SYSOUT DD SYSOUT=A 03
//SORTOUT DD DSN=PL64.OUTPUT,DISP=(NEW,CATLG,DELETE), 04
// SPACE=(CYL,(8,4)),UNIT=SYSDA 05
-----------------------------------------------------------------------
-----------------------------------------------------------------------
PGM1 CSECT 06
PGM1 AMODE 64
PGM1 RMODE 31
STM 14,12,12(13) SAVE LOW PART REGS
BASR 15,0 SET THE TEMPORARY
USING *,15 BASE REG
M0 DS 0H
STMH 0,15,HIGHREGS SAVE HIGH PART REGS
LLGTR 12,15 SET THE PERMANENT
DROP 15 BASE
USING M0,12 REG
LMH 0,15,HIGHZERO SET HIGH PART OF REGS TO ZERO
ST 13,SAVE+4 SAVE SAVE AREA ADDR
LR 11,13 RELOAD SAVE AREA ADDR
LA 13,SAVE LOAD NEW SAVE AREA ADDR
ST 13,8(11) SAVE NEW SA ADDR INTO OLD SA
* Obtain 64-bit storage (memory object):
* - for 64-bit Invocation Parameter List
* - for 64-bit Control Statements Area
* - for work area passed to E15, E35 exits via USER ADDRESS CONSTANT
STG 12,MOTOKEN SAVE USERTOKEN
LA 2,2 SET NUMBER OF SEGMENTS
STG 2,MOSEGM FOR MEMORY OBJECT (MO) - 2MB
IARV64 REQUEST=GETSTOR, GET MEMORY OBJECT +
ORIGIN=MOADDR, ADDRESS OF MEMORY OBJECT +
USERTKN=MOTOKEN, USERTOKEN +
SEGMENTS=MOSEGM, SIZE OF MEMORY OBJECT +
COND=YES, CONDITIONAL REQUEST +
MF=(E,MOWORK)
LTR 15,15 IF MEMORY OBJECT NOT OBTAINED,
BNZ NOMO EXIT WITH ERROR RETURN CODE
LG 10,MOADDR GET 64-BIT ADDR IN MO FOR
* 64-BIT INVOCATION PARMLIST
USING ICE64INV,10 MAKE ADDRESSABLE
XC 0(ICE64LNG,10),0(10) CLEAR 64-BIT INVOCATION PARM LIST
MVC ICEPLID(8),PL64SORT MOVE 64-BIT PARM LIST IDENTIFIER
LA 2,1024(,10) GET 64-BIT ADDR IN MEMORY OBJECT
* FOR 64-BIT CONTROL STATEMENTS AREA
STG 2,ICECTL AND STORE IN 64-BIT PARM LIST
MVC 0(CTLNG,2),CTLST MOVE CONTROL STATEMENTS INTO MO
*
LA 2,1024(,2) GET 64-BIT ADDR IN MO FOR WORK AREA
STG 2,MOWA USED IN E15, E35 EXITS
MVC ICEUC(8),UADCON MOVE USER EXIT ADDRESS CONSTANT
*
LLGF 2,=A(E15) STORE E15 ADDR
STG 2,ICE15E32 INTO PARM LIST
OI ICEMDEX1,ICE15A64 WITH AMODE 64 AND
OI ICEMDEX2,ICE15PLT WITH 64-BIT EXEC PARAMETER LIST
*
LLGF 2,=A(E35) STORE E35 ADDR
STG 2,ICE35 INTO PARM LIST
OI ICEMDEX1,ICE35A64 WITH AMODE 64 AND
OI ICEMDEX2,ICE35PLT WITH 64-BIT EXEC PARAMETER LIST
* INTO 64-BIT INVOCATION PARM LIST
LGR 1,10 LOAD ADDR OF 64-BIT INVOCATION
* PARAMETER LIST
LINK EP=SORT64 INVOKE SORT WITH 64-BIT NAME
LR 11,15 SAVE RETURN CODE
FREEMO DS 0H
IARV64 REQUEST=DETACH, FREE MEMORY OBJECT +
MATCH=USERTOKEN, +
USERTKN=MOTOKEN, +
COND=YES, +
MF=(E,MOWORK)
LR 15,11 RESTORE RETURN CODE
*
EXITALL DS 0H
LMH 0,14,HIGHREGS RESTORE HIGH PART REGS
L 13,SAVE+4 RESTORE OLD SA ADDR
L 14,12(13) RESTORE CALLER'S
LM 1,12,24(13) REGS
BSM 0,14 RETURN TO CALLER
*
NOMO LA 15,20 ERROR RETURN CODE (NOT MO)
B EXITALL RETURN TO CALLER
*
SAVE DC 18F'0' SAVE AREA
HIGHREGS DC 16F'0'
HIGHZERO DC 16F'0'
*
CTLST DS 0H ADDR OF CONTROL STMTS
DC AL2(CTL2-CTL1) LENGTH OF CONTROL STATEMENT STRING
CTL1 EQU *
DC C' SORT FIELDS=(5,4,BI,A)'
DC C' RECORD LENGTH=(80,80,80),TYPE=V '
DC C' OPTION FILSZ=E1000 '
DC C' OUTFIL FNAMES=SORTOUT '
CTL2 EQU *
CTLNG EQU *-CTLST LENGTH OF CONTROL STATEMENTS AREA
PL64SORT DC C'PL64SORT' IDENTIFIER OF 64-BIT PARM LIST
UADCON DC F'0',A(MOWA) USER ADDRESS CONSTANT
MOWA DC D'0' ADDR OF WORK AREA IN MO
*
MOTOKEN DC D'0' USERTOKEN
MOSEGM DC D'0' SIZE OF MO (IN MB)
MOADDR DC D'0' ADDR OF MO
*
MOWORK DS 0D IARV64 MACRO WORK AREA
IARV64 MF=(L,MOV64L)
*
LTORG
*
ICEPL64 MAPPING OF 64-BIT PARM LISTS
*
DROP 12
PGM1 CSECT
************** E15 **********************************************
*
E15 DS 0H
* THIS E15 EXIT ROUTINE FORMS ALL RECORDS IN MEMORY OBJECT
* AND INSERTS THEM TO DFSORT AS 64-BIT ADRESSED RECORDS.
*
STMG 14,12,8(13) SAVE CALLER's REGISTERS
BASR 11,0 SET
USING *,11 ADDRESSABILITY
LLGTR 11,11 SET CLEAN BASE REG
LARL 14,SAVEE15 GET NEW SAVE AREA ADDRESS
STG 13,128(,14) CHAIN TO PREVIOUS SAVE AREA
STG 14,136(,13) CHAIN TO NEW SAVE AREA
LGR 13,14 SET R13 TO SAVE AREA ADDRESS
LMH 0,15,E15HZERO SET HIGH PART OF REGS TO ZERO
LR 10,1 SAVE EXIT PARAMETER LIST ADDRESS
USING ICE64E15,10 SET ADDRESSABILITY
ICM 15,15,COUNT EXIT IF ALL RECORDS WERE
BZ EOF INSERTED
LLGF 1,ICE15UC+4 GET USER CONSTANT ADDR
LG 1,0(1) GET ADDR OF THE WORK AREA IN MO
MVC 0(80,1),RECE15 MOVE RECORD INTO MEMORY OBJECT
BCTR 15,0 SET NEW
ST 15,COUNT SORT FIELD
*
LA 15,12 RC=12 (INSERT RECORD)
* RETURN TO DFSORT
BACKE15 DS 0H
LG 13,128(,13) RESTORE CALLER's R13
LG 14,8(,13) RESTORE CALLER's R14
LMG 2,12,40(13) RESTORE CALLER's R2-R12
BSM 0,14 RETURN
*
EOF DS 0H
* Create final record in MO for its insert to DFSORT as 64-bit
* addressed record in the E35 exit
LLGF 15,ICE15UC+4 GET USER CONSTANT ADDR
LG 15,0(15) GET ADDR IN MO FOR FINAL RECORD
XC 0(80,15),0(15) CLEAR RECORD's DATA
MVI 1(15),8 SET NEW LENGTH OF FINAL RECORD
MVC 4(4,15),RECNUM SET 'NUMBER OF INSERTED RECORDS'
LA 15,8 SET RETURN CODE
B BACKE15 RETURN CODE
*
E15HZERO DC 18F'0'
SAVEE15 DC 0D'0',F'0',C'F4SA',17FD'0'
HIGHE15 DC 16F'0'
FLAGE15 DC X'00'
E15MOADR DC D'0' ADDR OF MO
E15SEGM DC D'0' SIZE OF MO (IN MB)
E15TOKEN DC D'0' USERTOKEN
RECNUM DC F'1000' NUMBER OF RECORDS
RECE15 DC H'80' LENGTH OF RECORD
DC H'0'
COUNT DC F'1000' SORT FIELD
DC 6C'ABCDEF' DATA
DC 6C'123456' FIELDS
*
LTORG
*
DROP
PGM1 CSECT
************** E35 ********************************************
E35 DS 0H
*
* THIS E35 EXIT ACCEPTS ALL RECORDS FROM DFSORT
* AND AT EOF INSERTS ONE RECORD TO DFSORT AS 64-BIT RECORD.
* THE ADDRESS OF THE FINAL RECORD IN MEMORY OBJECT IS PASSED
* VIA USER ADDRESS CONSTANT FIELD OF 64-BIT PARAMETER LIST.
*
STMG 14,12,8(13) SAVE CALLER's REGISTERS
BASR 11,0 SET
USING *,11 ADDRESSABILITY
LLGTR 11,11 SET CLEAN BASE REG
LARL 14,SAVEE35 GET NEW SAVE AREA ADDRESS
STG 13,128(,14) CHAIN TO PREVIOUS SAVE AREA
STG 14,136(,13) CHAIN TO NEW SAVE AREA
LGR 13,14 SET R13 TO SAVE AREA ADDRESS
LMH 0,15,E35HZERO SET HIGH PART REGS TO ZERO
LR 10,1 SAVE EXIT PARM LIST ADDRESS
USING ICE64E35,10 SET ADDRESSABILITY
ICM 1,15,ICE35RL+4 GET ADDR OF NEW RECORD
* IF ADDR OF NEW RECORD IT IS ZERO, EOF IS INDICATED
BZ RC8E35 BR IF EOF
*
LA 15,0 'ACCEPT' RETURN CODE
* RETURN TO DFSORT
BACKE35 DS 0H
LG 13,128(,13) RESTORE CALLER's R13
LG 14,8(,13) RESTORE CALLER's R14
LMG 2,12,40(13) RESTORE CALLER's R2-R12
BSM 0,14 RETURN
*
RC8E35 DS 0H
TM FLAGE35,X'01' IF FINAL FLAG IS ON
BO RC8E35A EXIT WITH 8 RETURN CODE
MVI FLAGE35,X'01' SET FINAL FLAG
LLGF 1,ICE35UC+4 GET USER CONSTANT ADDR
LG 1,0(1) GET MO ADDR WITH FINAL RECORD
LA 15,12 SET 'INSERT' RETURN CODE
B BACKE35 RETURN TO DFSORT
RC8E35A DS 0H
LA 15,8 SET RETURN CODE
B BACKE35 RETURN TO DFSORT
*
E35HZERO DC 18F'0'
HIGHE35 DC 18F'0'
SAVEE35 DC 0D'0',F'0',C'F4SA',17FD'0'
FLAGE35 DC X'00'
*
LTORG
*
END
- Line
- Explanation
- 01
- JOB statement. Introduces this job to the operating system.
- 02
- EXEC statement. Calls a program named PGM1 that in turn calls
DFSORT.
- 03
- SYSOUT DD statement. Directs DFSORT messages and control statements
to SYSOUT class A.
- 04-05
- SORTOUT DD statement. The OUTFIL data set.
- 06
- Start of the complete source code for PGM1. PGM1 uses the ICEPL64
mapping macro in the DFSORT target library, SICEUSER, to provide separate
Assembler DSECTs for the 64-bit invocation and exit parameter lists.
PGM1 LINKs to DFSORT using the name SORT64 to indicate that it
is using the 64-bit invocation parameter list. PGM1 passes SORT,
RECORD, OPTION and OUTFIL statements in the control statement area.
PGM1's
E15 user exit passes 64-bit addressed records to DFSORT.
PGM1's
E35 user exit accepts all of the sorted records and inserts one additional
record at EOF. DFSORT writes all of the records to the OUTFIL data
set.