Sample Assembler user exit
The following is a sample Assembler user exit:
AMUEDSNA TITLE 'AMUEDSNA - LOADPLUS USER EXIT USER EXAMPLE - V81'
AMUEDSNA CSECT
AMUEDSNA AMODE 31
AMUEDSNA RMODE 24
*---------------------------------------------------------------------*
* D I S C L A I M E R *
*---------------------------------------------------------------------*
* *
* THIS IS A SAMPLE LOADPLUS USER EXIT. THIS EXIT WOULD BE USED *
* IN ORDER TO DEFINE USER VARIABLES FOR BUILDING DATASET NAMES FOR *
* DYNAMIC WORKFILE ALLOCATION WITH THE DSNPAT KEYWORD. *
* *
* THIS EXIT WILL ONLY BE INVOKED WHEN IT IS SPECIFICALLY NAMED *
* IN THE AMU$OPTS DSNUEXIT PARAMETER OR IN THE DSNUEXIT PARAMETER OF *
* THE LOAD COMMAND. THE SPECIFICATION IN THE LOAD COMMAND WILL *
* OVERRIDE THE SPECIFICATION IN THE AMU$OPTS MACRO. IF THE NAME *
* SPECIFIED IS 'NONE' WITHOUT THE SINGLE QUOTE MARKS, THE EXIT WILL *
* NOT BE INVOKED. *
* *
* NOTE: PLEASE REVIEW THE DOCUMENTATION IN THE REFERENCE MANUAL, *
* AND THE FOLLOWING USAGE NOTES PRIOR TO IMPLEMENTING THIS EXIT. *
* *
* PLEASE CALL BMC SOFTWARE TECHNICAL SUPPORT WITH ANY QUESTIONS YOU *
* MAY HAVE IN THIS AREA. *
* *
* PHONE: 1-800-537-1813 *
* *
*---------------------------------------------------------------------*
SPACE
*---------------------------------------------------------------------*
* N O T E S *
*---------------------------------------------------------------------*
* *
* AMUEDSNA IS CALLED ONCE AT THE BEGINNING OF EITHER THE PRELOAD *
* PHASE OR THE COMBINED PHASE. *
* *
* WHEN INVOKED, R1 CONTAINS THE ADDRESS OF A USER EXIT BLOCK *
* DESCRIBED BY THE AMUDSNXP DSECT. *
* *
* R13 CONTAINS THE ADDRESS OF THE CALLER'S SAVE AREA *
* *
* R14 CONTAINS THE CALLER'S RETURN ADDRESS *
* *
* R15 CONTAINS THE ENTRY POINT ADDRESS OF THIS EXIT *
* *
* UPON EXIT R15 CONTAINS THE RETURN CODE FROM THIS EXIT *
* *
* R15=0 GOOD RETURN *
* *
* R15=OTHER ERROR RETURN, TERMINATE UTILITY *
* *
* AMUDSNXP DSECT THE AREA MAPPED BY THIS DSECT CONTAINS BOTH INPUT *
* AND OUTPUT FIELDS. INPUT FIELDS ARE PROVIDED TO *
* PASS VITAL INFORMATION TO THIS EXIT. ANY MODIFI- *
* CATIONS TO THESE FIELDS WILL BE DISREGARDED UPON *
* RETURN TO THE CALLER. THE OUTPUT FIELDS ARE *
* PROVIDED TO ALLOW THE EXIT TO PASS INFORMATION *
* BACK TO THE CALLER. *
* *
*---------------------------------------------------------------------*
EJECT
*---------------------------------------------------------------------*
* INTERNAL REGISTER USAGE *
*---------------------------------------------------------------------*
* *
* 0 - *
* 1 - ON ENTRY TO MODULE = A(AMUDSNXP BLOCK) COPIED TO R10 *
* 2 - *
* 3 - *
* 4 - *
* 5 - *
* 6 - *
* 7 - *
* 8 - *
* 9 - *
* 10 - *
* 11 - *
* 12 - BASEREG *
* 13 - SAVEAREA *
* 14 - *
* 15 - *
* *
*---------------------------------------------------------------------*
*
R0 EQU 0 R
R1 EQU 1 E
R2 EQU 2 G
R3 EQU 3 I
R4 EQU 4 S
R5 EQU 5 T
R6 EQU 6 E
R7 EQU 7 R
R8 EQU 8
R9 EQU 9 E
R10 EQU 10 Q
R11 EQU 11 U
R12 EQU 12 A
R13 EQU 13 T
R14 EQU 14 E
R15 EQU 15 S
*
*---------------------------------------------------------------------*
* *
* AMUDSNXP DEFINES THE USER VARIABLE USER EXIT PARM BLOCK. *
* *
* NOTE: *
* *
* YOU MAY NOT MODIFY THE FIELDS IN FRONT OF THE USER AREA. *
* *
* YOU MAY NOT MODIFY THE 'STRUCTURE' OF THIS DSECT. *
* *
*---------------------------------------------------------------------*
*
AMUDSNXP DSECT , PARMS PASSED TO EXIT
*
* INPUT AREA
*
XPJOBN DS CL8 JOBNAME
XPSTEP DS CL8 STEPNAME
XPDBNAME DS CL8 DATABASE NAME
XPSPNAME DS CL8 SPACE NAME
XPRESUME DS CL1 RESUME (Y/N)
XPREPLAC DS CL1 REPLACE (Y/N)
DS CL2 RESERVED FOR LOADPLUS
XPUSER DS CL8 USER ID
XPSSID DS CL4 DB2 SUBSYSTEM ID
XPDATE DS CL6 UTILITY EXECUTION DATE MMDDYY
XPTIME DS CL6 UTILITY EXECUTION TIME HHMMSS
XPUTILID DS CL16 UTILITY ID
XPDATE8 DS CL8 UTILITY EXECUTION DATE MMDDYYYY
XPGRPNM DS CL4 DATA SHARING GROUP NAME
XPVCAT DS CL8 VCAT NAME (FROM 1ST PART IF PARTITND)
XPDATEJ DS CL7 UTILITY EXECUTION DATE CCYYDDD
DS CL13 RESERVED FOR LOADPLUS
*
* USER WORK AREA
*
XPUSRWD1 DS F USER WORD 1
XPUSRWD2 DS F USER WORD 2
XPUSRWD3 DS F USER WORD 3
XPUSRWD4 DS F USER WORD 4
XPUSRWD5 DS F USER WORD 5
XPUSRWD6 DS F USER WORD 6
XPUSRWD7 DS F USER WORD 7
XPUSRWD8 DS F USER WORD 8
*
* OUTPUT AREA
*
XPUVAREA DS 100CL17 USER VARIABLE AREA
XPUVENT# EQU 100 NUMBER OF ENTRIES IN OUTPUT AREA
XP$ EQU *-AMUDSNXP
*
*---------------------------------------------------------------------*
* *
* XPUVARS DEFINES THE OUTPUT AREA OF THE AMUDSNXP DSECT AT LABEL *
* XPUVAREA. YOU MAY USE THIS DSECT TO EASILY ADDRESS THE TABLE *
* DEFINED AT XPUVAREA. *
* *
* NOTE: *
* *
* THE NUMBER OF ENTRIES IN THE XPUVAREA TABLE MUST NOT EXCEED 100 *
* OR YOU WILL ADDRESS BEYOND THE END OF THE GETMAINED STORAGE *
* PROVIDED FOR THIS ROUTINE. *
* *
* VARIABLE NAME: *
* *
* 1. MUST BEGIN WITH AN UNDERSCORE CHARACTER C'_' X'6D' *
* 2. MUST BEGIN IN THE LEFTMOST BYTE OF XPUVNAME FIELD *
* 3. IF LESS THAN 9 BYTES, MUST BE PADDED ON THE RIGHT WITH BLANKS *
* 4. MAY NOT CONTAIN EMBEDDED BLANKS *
* 5. NON-BLANK CHARACTERS AFTER THE LEFTMOST BYTE MUST BE NATIONAL *
* CHARACTERS WHICH ARE A THROUGH Z, 0 THROUGH 9, #, @, AND $ *
* *
* VARIABLE DATA: *
* *
* 1. MUST BEGIN IN THE LEFTMOST BYTE OF XPUVDATA FIELD *
* 2. IF LESS THAN 8 BYTES, MUST BE PADDED ON THE RIGHT WITH BLANKS *
* 3. MAY NOT CONTAIN EMBEDDED BLANKS *
* 4. NON-BLANK CHARACTERS MUST BE 'NATIONAL' CHARACTERS WHICH ARE *
* A THROUGH Z, 0 THROUGH 9, #, @, $, -, AND . *
* *
*---------------------------------------------------------------------*
*
XPUVARS DSECT , MAP A VARIABLE ENTRY
XPUVNAME DS CL9 VARIABLE NAME
XPUVDATA DS CL8 VARIABLE DATA
XPUVENT$ EQU *-XPUVNAME LENGTH OF EACH ENTRY
EJECT
*
*---------------------------------------------------------------------*
* *
* LOCAL PROGRAM WORK AREA DSECT POINTED TO BY R11 *
* *
*---------------------------------------------------------------------*
*
WORKAREA DSECT ,
SAVE DS 18F LOCAL SAVE AREA
DWORK DS D DOUBLEWORD WORK AREA
CWORK DS CL8 CHARACTER WORK AREA
WRKAREA$ EQU *-WORKAREA
EJECT
*
*---------------------------------------------------------------------*
* *
* P R O G R A M S T A R T *
* *
*---------------------------------------------------------------------*
*
AMUEDSNA CSECT
*
*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*
* *
* UNCOMMENT THE NEXT TWO INSTRUCTIONS TO DISABLE THIS EXIT. *
* *
*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*
*
* LA R15,0 RC=0, GOOD RETURN
* BSM 0,R14 JUST RETURN TO CALLER
*
*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*
* *
* UNCOMMENT THE PREVIOUS TWO INSTRUCTIONS TO DISABLE THIS EXIT. *
* *
*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*
*
STM R14,R12,12(R13) SAVE CALLERS REGS
LR R12,R15 R12 IS MY BASEREG
USING AMUEDSNA,R12 ESTABLISH ADDRESSABLITY
*
LR R10,R1 GET A(PASSED BLOCK)
USING AMUDSNXP,R10 MAP IT
*
*---------------------------------------------------------------------*
* *
* GET SOME WORKING STORAGE *
* *
*---------------------------------------------------------------------*
*
XR R11,R11 ZERO R11
GETMAIN RC,LV=WRKAREA$,LOC=BELOW GET WORK AREA
LTR R15,R15 OK?
BNZ DSNXRC08 ..NO, ERROR
LR R11,R1 R11 = A(USER WORK AREA)
ST R11,XPUSRWD1 SAVE A(USER WORK AREA)
USING WORKAREA,R11 ADDRESS WORKAREA DSECT
LA R15,SAVE MY SAVE AREA@
ST R15,8(,R13) SAVE IN CALLERS SAVE AREA
ST R13,4(,R15) SAVE CALLERS SAVE AREA@ IN MINE
LR R13,R15 SET OURS CURRENT
EJECT
*
*---------------------------------------------------------------------*
* *
* CREATE USER-DEFINED VARIABLES *
* *
* THE FOLLOWING USER VARIABLES WILL BE CREATED: *
* *
* _JDATE - JULIAN DATE IN THE FORM OF Dyyddd BUILT FROM THE *
* LOADPLUS SUPPLIED VARIABLE &DATE8 *
* *
* _JCDATE - JULIAN DATE IN THE FORM OF Dyyyyddd BUILT FROM THE *
* LOADPLUS SUPPLIED VARIABLE &DATE8 *
* *
* _UTILPFX - UP TO 8 BYTES OF THE FIRST NODE OF THE UTILITY ID *
* *
* _UTILSFX - UP TO 8 BYTES OF THE REMAINING PORTION OF THE *
* UTILITY ID *
* *
*---------------------------------------------------------------------*
*
LA R3,XPUVAREA @(OUTPUT VARIABLE AREA)
USING XPUVARS,R3 ESTABLISH BASE
*
*---------------------------------------------------------------------*
* *
* BUILD _JDATE AND _JCDATE USER VARIABLES *
* *
*---------------------------------------------------------------------*
*
MVC XPUVNAME(XPUVENT$),BLANKS CLEAR ENTRY
*
MVC XPUVNAME,=CL9'_JDATE' SET VAR NAME
*
LA R2,MONTHTAB @(MONTH TABLE - NO LEAP YEAR)
PACK DWORK(8),XPDATE8+4(4) GET YEARS
CVB R4,DWORK INTO R4
LR R7,R4 SAVE A COPY IN R7
SRDL R4,32 PREPARE FOR DIVIDE
D R4,=F'4' DIVIDE BY 4
LTR R4,R4 LEAP YEAR?
BNZ DSNX0110 NO ->
LR R4,R7 GET YEAR AGAIN
SRDL R4,32 PREPARE FOR DIVIDE
D R4,=F'100' DIVIDE BY 100
LTR R4,R4 LEAP YEAR?
BNZ DSNX0100 YES ->
LR R4,R7 GET YEAR AGAIN
SRDL R4,32 PREPARE FOR DIVIDE
D R4,=F'400' DIVIDE BY 400
LTR R4,R4 LEAP YEAR?
BNZ DSNX0110 NO ->
*
DSNX0100 DS 0H
*
LA R2,LEAPTAB @(MONTH TABLE - LEAP YEAR)
*
DSNX0110 DS 0H
*
PACK DWORK(8),XPDATE8(2) GET MONTH
CVB R4,DWORK INTO R4
BCTR R4,0 SUBTRACT 1
SLL R4,1 MULTIPLY BY 2 FOR OFFSET
LH R6,0(R2,R4) GET DAYS FOR PRIOR MONTHS
PACK DWORK(8),XPDATE8+2(2) GET DAYS
CVB R4,DWORK INTO R4
AR R6,R4 TOTAL DAYS IN R6
LR R5,R7 GET YEAR
M R4,=F'1000' SHIFT THE YEAR OVER
AR R5,R6 MAKE IT YYDDD FORMAT
CVD R5,DWORK MAKE IT PACKED
MVC CWORK(L'PL4PAT),PL4PAT GET EDIT PATTERN
ED CWORK(L'PL4PAT),DWORK+4 EDIT YYDDD
*
MVI XPUVDATA,C'D' SET VAR DATA
MVC XPUVDATA+1(5),CWORK+3 SET VAR DATA
*
LA R3,XPUVENT$(,R3) @(NEXT ENTRY)
MVC XPUVNAME(XPUVENT$),BLANKS CLEAR ENTRY
*
MVC XPUVNAME,=CL9'_JCDATE' SET VAR NAME
*
CVD R5,DWORK MAKE IT PACKED
MVC CWORK(L'PL4PAT),PL4PAT GET EDIT PATTERN
ED CWORK(L'PL4PAT),DWORK+4 EDIT YYYYDDD
*
MVI XPUVDATA,C'D' SET VAR DATA
MVC XPUVDATA+1(7),CWORK+1 SET VAR DATA
*
*---------------------------------------------------------------------*
* *
* BUILD _UTILPFX AND _UTILSFX USER VARIABLES *
* *
*---------------------------------------------------------------------*
*
LA R3,XPUVENT$(,R3) @(NEXT ENTRY)
MVC XPUVNAME(XPUVENT$),BLANKS CLEAR ENTRY
*
MVC XPUVNAME,=CL9'_UTILPFX' SET VAR NAME
*
TRT XPUTILID,TRTAB LOOK FOR DELIMETER
BZ DSNX0200 NONE ->
*
LA R2,XPUTILID @(UTIL ID)
LR R4,R1 SAVE @(DELIMETER)
SR R1,R2 LENGTH OF FIRST PART
BZ DSNX0200 NONE ->
*
C R1,=F'8' MORE THAN 8 BYTES LONG
BNH DSNX0130 NO ->
LA R1,8 MAKE IT 8 BYTES
*
DSNX0130 DS 0H
*
BCTR R1,0 SUBTRACT 1 FOR EXECUTED MVC
LA R5,XPUTILID @(UTILID)
EX R1,DSNXMVCU MOVE UTILID PREFIX
*
LA R3,XPUVENT$(,R3) @(NEXT ENTRY)
MVC XPUVNAME(XPUVENT$),BLANKS CLEAR ENTRY
*
MVC XPUVNAME,=CL9'_UTILSFX' SET VAR NAME
LA R5,1(,R4) @(1ST CHAR PAST DELIMETER)
LA R1,XPUTILID+L'XPUTILID @(END OF UTILID)
SR R1,R5 LENGTH OF SECOND PART OF UTILID
BZ DSNXRC00 NONE ->
C R1,=F'8' MORE THAN 8 BYTES LONG
BNH DSNX0140 NO ->
LA R1,8 MAKE IT 8 BYTES
*
DSNX0140 DS 0H
*
BCTR R1,0 SUBTRACT 1 FOR EXECUTED MVC
EX R1,DSNXMVCU MOVE UTILID PREFIX
*
B DSNXRC00 RETURN RC=0
*
DSNX0200 DS 0H
*
MVC XPUVDATA,XPUTILID GET FIRST 8 BYTES
*
LA R3,XPUVENT$(,R3) @(NEXT ENTRY)
MVC XPUVNAME(XPUVENT$),BLANKS CLEAR ENTRY
*
MVC XPUVNAME,=CL9'_UTILSFX' SET VAR NAME
MVC XPUVDATA,XPUTILID+8 GET NEXT 8 BYTES
*
B DSNXRC00 RETURN RC=0
*
DSNXMVCU MVC XPUVDATA(0),0(R5) *** EXECUTED INSTRUCTION ***
*
DROP R3
*
EJECT
*
*---------------------------------------------------------------------*
* *
* SET RETURN CODE AND EXIT *
* *
*---------------------------------------------------------------------*
*
DSNXRC00 DS 0H
*
LA R3,0 SAVE RETURN CODE
B DSNX9000 GOOD RETURN
*
DSNXRC08 DS 0H
*
LA R3,8 SAVE RETURN CODE
* TERMINATE LOADPLUS EXECUTION
DSNX9000 DS 0H
*
LTR R11,R11 DID WE GET STORAGE?
BZ DSNX9900 NO ->
L R13,SAVE+4
FREEMAIN RC,LV=WRKAREA$,A=(R11) FREE LOCAL WORK AREA
*
DSNX9900 DS 0H
*
LR R15,R3 RESTORE RETURN CODE
L R14,12(,R13)
LM R0,R12,20(R13)
BSM 0,R14 RETURN
EJECT
*
*---------------------------------------------------------------------*
* *
* C O N S T A N T S *
* *
*---------------------------------------------------------------------*
*
* 0 1 2 3 4 5 6 7 8 9 A B C D E F
*
TRTAB DC X'00000000000000000000000000000000' 0
DC X'00000000000000000000000000000000' 1
DC X'00000000000000000000000000000000' 2
DC X'00000000000000000000000000000000' 3
DC X'FF00000000000000000000FF0000FFFF' 4 (SP) . + |
DC X'0000000000000000000000000000FF00' 5 ;
DC X'FFFF0000000000000000FFFF00FF0000' 6 - / , _
DC X'00000000000000000000FF000000FF00' 7 : =
DC X'00000000000000000000000000000000' 8
DC X'00000000000000000000000000000000' 9
DC X'00000000000000000000000000000000' A
DC X'00000000000000000000000000000000' B
DC X'00000000000000000000000000000000' C
DC X'00000000000000000000000000000000' D
DC X'FF000000000000000000000000000000' E /
DC X'00000000000000000000000000000000' F
*
* 0 1 2 3 4 5 6 7 8 9 A B C D E F
*
MONTHTAB DC H'0' JANUARY
DC H'31' FEBRUARY
DC H'59' MARCH
DC H'90' APRIL
DC H'120' MAY
DC H'151' JUNE
DC H'181' JULY
DC H'212' AUGUST
DC H'243' SEPTEMBER
DC H'273' OCTOBER
DC H'304' NOVEMBER
DC H'334' DECEMBER
*
LEAPTAB DC H'0' JANUARY
DC H'31' FEBRUARY
DC H'60' MARCH
DC H'91' APRIL
DC H'121' MAY
DC H'152' JUNE
DC H'182' JULY
DC H'213' AUGUST
DC H'244' SEPTEMBER
DC H'274' OCTOBER
DC H'305' NOVEMBER
DC H'335' DECEMBER
*
PL4PAT DC X'4021202020202020' EDIT PATTERN
*
BLANKS DC CL17' ' SOME BLANKS
*
EJECT
LTORG ,
SPACE
END AMUEDSNA
AMUEDSNA CSECT
AMUEDSNA AMODE 31
AMUEDSNA RMODE 24
*---------------------------------------------------------------------*
* D I S C L A I M E R *
*---------------------------------------------------------------------*
* *
* THIS IS A SAMPLE LOADPLUS USER EXIT. THIS EXIT WOULD BE USED *
* IN ORDER TO DEFINE USER VARIABLES FOR BUILDING DATASET NAMES FOR *
* DYNAMIC WORKFILE ALLOCATION WITH THE DSNPAT KEYWORD. *
* *
* THIS EXIT WILL ONLY BE INVOKED WHEN IT IS SPECIFICALLY NAMED *
* IN THE AMU$OPTS DSNUEXIT PARAMETER OR IN THE DSNUEXIT PARAMETER OF *
* THE LOAD COMMAND. THE SPECIFICATION IN THE LOAD COMMAND WILL *
* OVERRIDE THE SPECIFICATION IN THE AMU$OPTS MACRO. IF THE NAME *
* SPECIFIED IS 'NONE' WITHOUT THE SINGLE QUOTE MARKS, THE EXIT WILL *
* NOT BE INVOKED. *
* *
* NOTE: PLEASE REVIEW THE DOCUMENTATION IN THE REFERENCE MANUAL, *
* AND THE FOLLOWING USAGE NOTES PRIOR TO IMPLEMENTING THIS EXIT. *
* *
* PLEASE CALL BMC SOFTWARE TECHNICAL SUPPORT WITH ANY QUESTIONS YOU *
* MAY HAVE IN THIS AREA. *
* *
* PHONE: 1-800-537-1813 *
* *
*---------------------------------------------------------------------*
SPACE
*---------------------------------------------------------------------*
* N O T E S *
*---------------------------------------------------------------------*
* *
* AMUEDSNA IS CALLED ONCE AT THE BEGINNING OF EITHER THE PRELOAD *
* PHASE OR THE COMBINED PHASE. *
* *
* WHEN INVOKED, R1 CONTAINS THE ADDRESS OF A USER EXIT BLOCK *
* DESCRIBED BY THE AMUDSNXP DSECT. *
* *
* R13 CONTAINS THE ADDRESS OF THE CALLER'S SAVE AREA *
* *
* R14 CONTAINS THE CALLER'S RETURN ADDRESS *
* *
* R15 CONTAINS THE ENTRY POINT ADDRESS OF THIS EXIT *
* *
* UPON EXIT R15 CONTAINS THE RETURN CODE FROM THIS EXIT *
* *
* R15=0 GOOD RETURN *
* *
* R15=OTHER ERROR RETURN, TERMINATE UTILITY *
* *
* AMUDSNXP DSECT THE AREA MAPPED BY THIS DSECT CONTAINS BOTH INPUT *
* AND OUTPUT FIELDS. INPUT FIELDS ARE PROVIDED TO *
* PASS VITAL INFORMATION TO THIS EXIT. ANY MODIFI- *
* CATIONS TO THESE FIELDS WILL BE DISREGARDED UPON *
* RETURN TO THE CALLER. THE OUTPUT FIELDS ARE *
* PROVIDED TO ALLOW THE EXIT TO PASS INFORMATION *
* BACK TO THE CALLER. *
* *
*---------------------------------------------------------------------*
EJECT
*---------------------------------------------------------------------*
* INTERNAL REGISTER USAGE *
*---------------------------------------------------------------------*
* *
* 0 - *
* 1 - ON ENTRY TO MODULE = A(AMUDSNXP BLOCK) COPIED TO R10 *
* 2 - *
* 3 - *
* 4 - *
* 5 - *
* 6 - *
* 7 - *
* 8 - *
* 9 - *
* 10 - *
* 11 - *
* 12 - BASEREG *
* 13 - SAVEAREA *
* 14 - *
* 15 - *
* *
*---------------------------------------------------------------------*
*
R0 EQU 0 R
R1 EQU 1 E
R2 EQU 2 G
R3 EQU 3 I
R4 EQU 4 S
R5 EQU 5 T
R6 EQU 6 E
R7 EQU 7 R
R8 EQU 8
R9 EQU 9 E
R10 EQU 10 Q
R11 EQU 11 U
R12 EQU 12 A
R13 EQU 13 T
R14 EQU 14 E
R15 EQU 15 S
*
*---------------------------------------------------------------------*
* *
* AMUDSNXP DEFINES THE USER VARIABLE USER EXIT PARM BLOCK. *
* *
* NOTE: *
* *
* YOU MAY NOT MODIFY THE FIELDS IN FRONT OF THE USER AREA. *
* *
* YOU MAY NOT MODIFY THE 'STRUCTURE' OF THIS DSECT. *
* *
*---------------------------------------------------------------------*
*
AMUDSNXP DSECT , PARMS PASSED TO EXIT
*
* INPUT AREA
*
XPJOBN DS CL8 JOBNAME
XPSTEP DS CL8 STEPNAME
XPDBNAME DS CL8 DATABASE NAME
XPSPNAME DS CL8 SPACE NAME
XPRESUME DS CL1 RESUME (Y/N)
XPREPLAC DS CL1 REPLACE (Y/N)
DS CL2 RESERVED FOR LOADPLUS
XPUSER DS CL8 USER ID
XPSSID DS CL4 DB2 SUBSYSTEM ID
XPDATE DS CL6 UTILITY EXECUTION DATE MMDDYY
XPTIME DS CL6 UTILITY EXECUTION TIME HHMMSS
XPUTILID DS CL16 UTILITY ID
XPDATE8 DS CL8 UTILITY EXECUTION DATE MMDDYYYY
XPGRPNM DS CL4 DATA SHARING GROUP NAME
XPVCAT DS CL8 VCAT NAME (FROM 1ST PART IF PARTITND)
XPDATEJ DS CL7 UTILITY EXECUTION DATE CCYYDDD
DS CL13 RESERVED FOR LOADPLUS
*
* USER WORK AREA
*
XPUSRWD1 DS F USER WORD 1
XPUSRWD2 DS F USER WORD 2
XPUSRWD3 DS F USER WORD 3
XPUSRWD4 DS F USER WORD 4
XPUSRWD5 DS F USER WORD 5
XPUSRWD6 DS F USER WORD 6
XPUSRWD7 DS F USER WORD 7
XPUSRWD8 DS F USER WORD 8
*
* OUTPUT AREA
*
XPUVAREA DS 100CL17 USER VARIABLE AREA
XPUVENT# EQU 100 NUMBER OF ENTRIES IN OUTPUT AREA
XP$ EQU *-AMUDSNXP
*
*---------------------------------------------------------------------*
* *
* XPUVARS DEFINES THE OUTPUT AREA OF THE AMUDSNXP DSECT AT LABEL *
* XPUVAREA. YOU MAY USE THIS DSECT TO EASILY ADDRESS THE TABLE *
* DEFINED AT XPUVAREA. *
* *
* NOTE: *
* *
* THE NUMBER OF ENTRIES IN THE XPUVAREA TABLE MUST NOT EXCEED 100 *
* OR YOU WILL ADDRESS BEYOND THE END OF THE GETMAINED STORAGE *
* PROVIDED FOR THIS ROUTINE. *
* *
* VARIABLE NAME: *
* *
* 1. MUST BEGIN WITH AN UNDERSCORE CHARACTER C'_' X'6D' *
* 2. MUST BEGIN IN THE LEFTMOST BYTE OF XPUVNAME FIELD *
* 3. IF LESS THAN 9 BYTES, MUST BE PADDED ON THE RIGHT WITH BLANKS *
* 4. MAY NOT CONTAIN EMBEDDED BLANKS *
* 5. NON-BLANK CHARACTERS AFTER THE LEFTMOST BYTE MUST BE NATIONAL *
* CHARACTERS WHICH ARE A THROUGH Z, 0 THROUGH 9, #, @, AND $ *
* *
* VARIABLE DATA: *
* *
* 1. MUST BEGIN IN THE LEFTMOST BYTE OF XPUVDATA FIELD *
* 2. IF LESS THAN 8 BYTES, MUST BE PADDED ON THE RIGHT WITH BLANKS *
* 3. MAY NOT CONTAIN EMBEDDED BLANKS *
* 4. NON-BLANK CHARACTERS MUST BE 'NATIONAL' CHARACTERS WHICH ARE *
* A THROUGH Z, 0 THROUGH 9, #, @, $, -, AND . *
* *
*---------------------------------------------------------------------*
*
XPUVARS DSECT , MAP A VARIABLE ENTRY
XPUVNAME DS CL9 VARIABLE NAME
XPUVDATA DS CL8 VARIABLE DATA
XPUVENT$ EQU *-XPUVNAME LENGTH OF EACH ENTRY
EJECT
*
*---------------------------------------------------------------------*
* *
* LOCAL PROGRAM WORK AREA DSECT POINTED TO BY R11 *
* *
*---------------------------------------------------------------------*
*
WORKAREA DSECT ,
SAVE DS 18F LOCAL SAVE AREA
DWORK DS D DOUBLEWORD WORK AREA
CWORK DS CL8 CHARACTER WORK AREA
WRKAREA$ EQU *-WORKAREA
EJECT
*
*---------------------------------------------------------------------*
* *
* P R O G R A M S T A R T *
* *
*---------------------------------------------------------------------*
*
AMUEDSNA CSECT
*
*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*
* *
* UNCOMMENT THE NEXT TWO INSTRUCTIONS TO DISABLE THIS EXIT. *
* *
*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*
*
* LA R15,0 RC=0, GOOD RETURN
* BSM 0,R14 JUST RETURN TO CALLER
*
*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*
* *
* UNCOMMENT THE PREVIOUS TWO INSTRUCTIONS TO DISABLE THIS EXIT. *
* *
*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*
*
STM R14,R12,12(R13) SAVE CALLERS REGS
LR R12,R15 R12 IS MY BASEREG
USING AMUEDSNA,R12 ESTABLISH ADDRESSABLITY
*
LR R10,R1 GET A(PASSED BLOCK)
USING AMUDSNXP,R10 MAP IT
*
*---------------------------------------------------------------------*
* *
* GET SOME WORKING STORAGE *
* *
*---------------------------------------------------------------------*
*
XR R11,R11 ZERO R11
GETMAIN RC,LV=WRKAREA$,LOC=BELOW GET WORK AREA
LTR R15,R15 OK?
BNZ DSNXRC08 ..NO, ERROR
LR R11,R1 R11 = A(USER WORK AREA)
ST R11,XPUSRWD1 SAVE A(USER WORK AREA)
USING WORKAREA,R11 ADDRESS WORKAREA DSECT
LA R15,SAVE MY SAVE AREA@
ST R15,8(,R13) SAVE IN CALLERS SAVE AREA
ST R13,4(,R15) SAVE CALLERS SAVE AREA@ IN MINE
LR R13,R15 SET OURS CURRENT
EJECT
*
*---------------------------------------------------------------------*
* *
* CREATE USER-DEFINED VARIABLES *
* *
* THE FOLLOWING USER VARIABLES WILL BE CREATED: *
* *
* _JDATE - JULIAN DATE IN THE FORM OF Dyyddd BUILT FROM THE *
* LOADPLUS SUPPLIED VARIABLE &DATE8 *
* *
* _JCDATE - JULIAN DATE IN THE FORM OF Dyyyyddd BUILT FROM THE *
* LOADPLUS SUPPLIED VARIABLE &DATE8 *
* *
* _UTILPFX - UP TO 8 BYTES OF THE FIRST NODE OF THE UTILITY ID *
* *
* _UTILSFX - UP TO 8 BYTES OF THE REMAINING PORTION OF THE *
* UTILITY ID *
* *
*---------------------------------------------------------------------*
*
LA R3,XPUVAREA @(OUTPUT VARIABLE AREA)
USING XPUVARS,R3 ESTABLISH BASE
*
*---------------------------------------------------------------------*
* *
* BUILD _JDATE AND _JCDATE USER VARIABLES *
* *
*---------------------------------------------------------------------*
*
MVC XPUVNAME(XPUVENT$),BLANKS CLEAR ENTRY
*
MVC XPUVNAME,=CL9'_JDATE' SET VAR NAME
*
LA R2,MONTHTAB @(MONTH TABLE - NO LEAP YEAR)
PACK DWORK(8),XPDATE8+4(4) GET YEARS
CVB R4,DWORK INTO R4
LR R7,R4 SAVE A COPY IN R7
SRDL R4,32 PREPARE FOR DIVIDE
D R4,=F'4' DIVIDE BY 4
LTR R4,R4 LEAP YEAR?
BNZ DSNX0110 NO ->
LR R4,R7 GET YEAR AGAIN
SRDL R4,32 PREPARE FOR DIVIDE
D R4,=F'100' DIVIDE BY 100
LTR R4,R4 LEAP YEAR?
BNZ DSNX0100 YES ->
LR R4,R7 GET YEAR AGAIN
SRDL R4,32 PREPARE FOR DIVIDE
D R4,=F'400' DIVIDE BY 400
LTR R4,R4 LEAP YEAR?
BNZ DSNX0110 NO ->
*
DSNX0100 DS 0H
*
LA R2,LEAPTAB @(MONTH TABLE - LEAP YEAR)
*
DSNX0110 DS 0H
*
PACK DWORK(8),XPDATE8(2) GET MONTH
CVB R4,DWORK INTO R4
BCTR R4,0 SUBTRACT 1
SLL R4,1 MULTIPLY BY 2 FOR OFFSET
LH R6,0(R2,R4) GET DAYS FOR PRIOR MONTHS
PACK DWORK(8),XPDATE8+2(2) GET DAYS
CVB R4,DWORK INTO R4
AR R6,R4 TOTAL DAYS IN R6
LR R5,R7 GET YEAR
M R4,=F'1000' SHIFT THE YEAR OVER
AR R5,R6 MAKE IT YYDDD FORMAT
CVD R5,DWORK MAKE IT PACKED
MVC CWORK(L'PL4PAT),PL4PAT GET EDIT PATTERN
ED CWORK(L'PL4PAT),DWORK+4 EDIT YYDDD
*
MVI XPUVDATA,C'D' SET VAR DATA
MVC XPUVDATA+1(5),CWORK+3 SET VAR DATA
*
LA R3,XPUVENT$(,R3) @(NEXT ENTRY)
MVC XPUVNAME(XPUVENT$),BLANKS CLEAR ENTRY
*
MVC XPUVNAME,=CL9'_JCDATE' SET VAR NAME
*
CVD R5,DWORK MAKE IT PACKED
MVC CWORK(L'PL4PAT),PL4PAT GET EDIT PATTERN
ED CWORK(L'PL4PAT),DWORK+4 EDIT YYYYDDD
*
MVI XPUVDATA,C'D' SET VAR DATA
MVC XPUVDATA+1(7),CWORK+1 SET VAR DATA
*
*---------------------------------------------------------------------*
* *
* BUILD _UTILPFX AND _UTILSFX USER VARIABLES *
* *
*---------------------------------------------------------------------*
*
LA R3,XPUVENT$(,R3) @(NEXT ENTRY)
MVC XPUVNAME(XPUVENT$),BLANKS CLEAR ENTRY
*
MVC XPUVNAME,=CL9'_UTILPFX' SET VAR NAME
*
TRT XPUTILID,TRTAB LOOK FOR DELIMETER
BZ DSNX0200 NONE ->
*
LA R2,XPUTILID @(UTIL ID)
LR R4,R1 SAVE @(DELIMETER)
SR R1,R2 LENGTH OF FIRST PART
BZ DSNX0200 NONE ->
*
C R1,=F'8' MORE THAN 8 BYTES LONG
BNH DSNX0130 NO ->
LA R1,8 MAKE IT 8 BYTES
*
DSNX0130 DS 0H
*
BCTR R1,0 SUBTRACT 1 FOR EXECUTED MVC
LA R5,XPUTILID @(UTILID)
EX R1,DSNXMVCU MOVE UTILID PREFIX
*
LA R3,XPUVENT$(,R3) @(NEXT ENTRY)
MVC XPUVNAME(XPUVENT$),BLANKS CLEAR ENTRY
*
MVC XPUVNAME,=CL9'_UTILSFX' SET VAR NAME
LA R5,1(,R4) @(1ST CHAR PAST DELIMETER)
LA R1,XPUTILID+L'XPUTILID @(END OF UTILID)
SR R1,R5 LENGTH OF SECOND PART OF UTILID
BZ DSNXRC00 NONE ->
C R1,=F'8' MORE THAN 8 BYTES LONG
BNH DSNX0140 NO ->
LA R1,8 MAKE IT 8 BYTES
*
DSNX0140 DS 0H
*
BCTR R1,0 SUBTRACT 1 FOR EXECUTED MVC
EX R1,DSNXMVCU MOVE UTILID PREFIX
*
B DSNXRC00 RETURN RC=0
*
DSNX0200 DS 0H
*
MVC XPUVDATA,XPUTILID GET FIRST 8 BYTES
*
LA R3,XPUVENT$(,R3) @(NEXT ENTRY)
MVC XPUVNAME(XPUVENT$),BLANKS CLEAR ENTRY
*
MVC XPUVNAME,=CL9'_UTILSFX' SET VAR NAME
MVC XPUVDATA,XPUTILID+8 GET NEXT 8 BYTES
*
B DSNXRC00 RETURN RC=0
*
DSNXMVCU MVC XPUVDATA(0),0(R5) *** EXECUTED INSTRUCTION ***
*
DROP R3
*
EJECT
*
*---------------------------------------------------------------------*
* *
* SET RETURN CODE AND EXIT *
* *
*---------------------------------------------------------------------*
*
DSNXRC00 DS 0H
*
LA R3,0 SAVE RETURN CODE
B DSNX9000 GOOD RETURN
*
DSNXRC08 DS 0H
*
LA R3,8 SAVE RETURN CODE
* TERMINATE LOADPLUS EXECUTION
DSNX9000 DS 0H
*
LTR R11,R11 DID WE GET STORAGE?
BZ DSNX9900 NO ->
L R13,SAVE+4
FREEMAIN RC,LV=WRKAREA$,A=(R11) FREE LOCAL WORK AREA
*
DSNX9900 DS 0H
*
LR R15,R3 RESTORE RETURN CODE
L R14,12(,R13)
LM R0,R12,20(R13)
BSM 0,R14 RETURN
EJECT
*
*---------------------------------------------------------------------*
* *
* C O N S T A N T S *
* *
*---------------------------------------------------------------------*
*
* 0 1 2 3 4 5 6 7 8 9 A B C D E F
*
TRTAB DC X'00000000000000000000000000000000' 0
DC X'00000000000000000000000000000000' 1
DC X'00000000000000000000000000000000' 2
DC X'00000000000000000000000000000000' 3
DC X'FF00000000000000000000FF0000FFFF' 4 (SP) . + |
DC X'0000000000000000000000000000FF00' 5 ;
DC X'FFFF0000000000000000FFFF00FF0000' 6 - / , _
DC X'00000000000000000000FF000000FF00' 7 : =
DC X'00000000000000000000000000000000' 8
DC X'00000000000000000000000000000000' 9
DC X'00000000000000000000000000000000' A
DC X'00000000000000000000000000000000' B
DC X'00000000000000000000000000000000' C
DC X'00000000000000000000000000000000' D
DC X'FF000000000000000000000000000000' E /
DC X'00000000000000000000000000000000' F
*
* 0 1 2 3 4 5 6 7 8 9 A B C D E F
*
MONTHTAB DC H'0' JANUARY
DC H'31' FEBRUARY
DC H'59' MARCH
DC H'90' APRIL
DC H'120' MAY
DC H'151' JUNE
DC H'181' JULY
DC H'212' AUGUST
DC H'243' SEPTEMBER
DC H'273' OCTOBER
DC H'304' NOVEMBER
DC H'334' DECEMBER
*
LEAPTAB DC H'0' JANUARY
DC H'31' FEBRUARY
DC H'60' MARCH
DC H'91' APRIL
DC H'121' MAY
DC H'152' JUNE
DC H'182' JULY
DC H'213' AUGUST
DC H'244' SEPTEMBER
DC H'274' OCTOBER
DC H'305' NOVEMBER
DC H'335' DECEMBER
*
PL4PAT DC X'4021202020202020' EDIT PATTERN
*
BLANKS DC CL17' ' SOME BLANKS
*
EJECT
LTORG ,
SPACE
END AMUEDSNA
Tip: For faster searching, add an asterisk to the end of your partial query. Example: cert*