Sample Assembler user exit


This topic illustrates a sample user exit written in Assembler.

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

 

 

Tip: For faster searching, add an asterisk to the end of your partial query. Example: cert*

LOADPLUS for DB2 13.1