Coding a program in assembler language

The following sample assembler language program shows how the different parts of a command-level program fit together, and how the EXEC DLI commands are coded in a CICS® online program.

Except for a few commands, this program applies to batch, BMP, and CICS programs. Any differences are highlighted in the notes for the sample assembler code. The numbering on the right of the sample code references these notes.

*ASM XOPTS(CICS,DLI)
*                                                                         1 
R2       EQU   2
R3       EQU   3
R4       EQU   4
R11      EQU   11
R12      EQU   12
R13      EQU   13
DFHEISTG DSECT
SEGKEYA  DS    CL4
SEGKEYB  DS    CL4                                                        2 
SEGKEYC  DS    CL4
SEGKEY1  DS    CL4
SEGKEY2  DS    CL4
CONKEYB  DS    CL8
SEGNAME  DS    CL8
SEGLEN   DS    H
PCBNUM   DS    H
AREAA    DS    CL80
AREAB    DS    CL80                                                       3 
AREAC    DS    CL80
AREAG    DS    CL250
AREASTAT DS    CL360
*        COPY  MAPSET
*
*******************************************************************
*  INITIALIZATION
*  HANDLE ERROR CONDITIONS IN ERROR ROUTINE                               4 
*  HANDLE ABENDS (DLI ERROR STATUS CODES) IN ABEND ROUTINE
*  RECEIVE INPUT MESSAGE
*******************************************************************
*
SAMPLE   DFHEIENT CODEREG=(R2,R3),DATAREG=(R13,R12),EIBREG=R11            5 
*
         EXEC CICS HANDLE CONDITION ERROR(ERRORS)                         6 
*
         EXEC CICS HANDLE ABEND LABEL(ABENDS)                             6 
*
         EXEC CICS RECEIVE MAP ('SAMPMAP') MAPSET('MAPSET')               6 
*        ANALYZE INPUT MESSAGE AND PERFORM NON-DLI PROCESSING
*
*******************************************************************
*  SCHEDULE PSB NAMED 'SAMPLE1'
*******************************************************************
*
         EXEC DLI SCHD PSB(SAMPLE1)                                       7 
         BAL   R4,TESTDIB          CHECK STATUS
*
*******************************************************************
*  RETRIEVE ROOT SEGMENT AND ALL ITS DEPENDENTS
*******************************************************************
*
         MVC   SEGKEYA,=C'A300'                                           8 
         EXEC DLI GU USING PCB(1) SEGMENT(SEGA) INTO(AREAA)            X
               SEGLENGTH(80) WHERE(KEYA=SEGKEYA) FIELDLENGTH(4)
         BAL   R4,TESTDIB          CHECK STATUS
GNPLOOP  EQU   *
         EXEC DLI GNP USING PCB(1) INTO(AREAG) SEGLENGTH(250)
         CLC   DIBSTAT,=C'GE'      LOOK FOR END                           9 
         BE    LOOPDONE            DONE AT 'GE'
         BAL   R4,TESTDIB          CHECK STATUS
         B     GNPLOOP
LOOPDONE EQU   *
*
*******************************************************************
*  INSERT NEW ROOT SEGMENT
*******************************************************************
*
         MVC   AREAA,=CL80'DATA FOR NEW SEGMENT INCLUDING KEY'
         EXEC DLI ISRT USING PCB(1) SEGMENT(SEGA) FROM(AREAA)          X
               SEGLENGTH(80)
         BAL   R4,TESTDIB          CHECK STATUS
*
*******************************************************************
*  RETRIEVE 3 SEGMENTS IN PATH AND REPLACE THEM
*******************************************************************
*
         MVC   SEGKEYA,=C'A200'
         MVC   SEGKEYB,=C'B240'
         MVC   SEGKEYC,=C'C241'
         EXEC DLI GU USING PCB(1)                                      X
               SEGMENT(SEGA) WHERE(KEYA=SEGKEYA)                       X 10     
               FIELDLENGTH(4)                                          X
               INTO(AREAA)                                             X
               SEGLENGTH(80)                                           X
               SEGMENT(SEGB) WHERE(KEYB=SEGKEYB) FIELDLENGTH(4)        X
               INTO(AREAB)                                             X
               SEGLENGTH(80)                                           X
               SEGMENT(SEGC) WHERE(KEYC=SEGKEYC) FIELDLENGTH(4)        X
               INTO(AREAC)                                             X
               SEGLENGTH(80)
         BAL   R4,TESTDIB
*        UPDATE FIELDS IN THE 3 SEGMENTS
         EXEC DLI REPL USING PCB(1)                                    X
               SEGMENT(SEGA) FROM(AREAA) SEGLENGTH(80)                 X
               SEGMENT(SEGB) FROM(AREAB) SEGLENGTH(80)                 X
               SEGMENT(SEGC) FROM(AREAC) SEGLENGTH(80)
         BAL   R4,TESTDIB          CHECK STATUS
*
*******************************************************************
*  INSERT NEW SEGMENT USING CONCATENATED KEY TO QUALIFY PARENT
*******************************************************************
*
         MVC   AREAC,=CL80'DATA FOR NEW SEGMENT INCLUDING KEY'
         MVC   CONKEYB,=C'A200B240'
         EXEC DLI ISRT USING PCB(1)                                    X
               SEGMENT(SEGB) KEYS(CONKEYB) KEYLENGTH(8)                X
               SEGMENT(SEGC) FROM(AREAC) SEGLENGTH(80)
         BAL   R4,TESTDIB          CHECK STATUS
*
*******************************************************************
*  RETRIEVE SEGMENT DIRECTLY USING CONCATENATED KEY
*  AND THEN DELETE IT AND ITS DEPENDENTS
*******************************************************************
*
         MVC   CONKEYB,=C'A200B230'
         EXEC DLI GU USING PCB(1)                                      X
               SEGMENT(SEGB)                                           X
               KEYS(CONKEYB) KEYLENGTH(8)                              X
               INTO(AREAB) SEGLENGTH(80)
         BAL   R4,TESTDIB          CHECK STATUS
         EXEC DLI DLET USING PCB(1)                                    X
               SEGMENT(SEGB) SEGLENGTH(80) FROM(AREAB)
         BAL   R4,TESTDIB          CHECK STATUS
*
*******************************************************************
*  RETRIEVE SEGMENT BY QUALIFYING PARENT WITH CONCATENATED KEY,
*  OBJECT SEGMENT WITH WHERE OPTION USING A LITERAL,
*  AND THEN SET PARENTAGE
*
*  USE VARIABLES FOR PCB INDEX, SEGMENT NAME, AND SEGMENT LENGTH
*******************************************************************
*
         MVC   CONKEYB,=C'A200B230'
         MVC   SEGNAME,=CL8'SEGA'
         MVC   SEGLEN,=H'80'
         MVC   PCBNUM,=H'1'
         EXEC DLI GU USING PCB(PCBNUM)                                 X
               SEGMENT((SEGNAME))                                      X
               KEYS(CONKEYB) KEYLENGTH(8) SETPARENT                    X
               SEGMENT(SEGC) INTO(AREAC) SEGLENGTH(SEGLEN)             X
               WHERE(KEYC='C520')
         BAL   R4,TESTDIB          CHECK STATUS
*
*******************************************************************
*  RETRIEVE DATABASE STATISTICS
*******************************************************************
*
         EXEC DLI STAT USING PCB(1) INTO(AREASTAT)                     X
               VSAM FORMATTED LENGTH(360)
         BAL   R4,TESTDIB          CHECK STATUS
*
*******************************************************************
*  RETRIEVE ROOT SEGMENT USING BOOLEAN OPERATORS
*******************************************************************
*
         MVC   SEGKEY1,=C'A050'
         MVC   SEGKEY2,=C'A150'
         EXEC DLI GU USING PCB(1) SEGMENT(SEGA) INTO(AREAA)            X
               SEGLENGTH(80) FIELDLENGTH(4,4,4,4)                      X
               WHERE(KEYA > SEGKEY1 AND KEYA < SEGKEY2
               KEYA > 'A275' AND  KEYA < 'A350')
         BAL   R4,TESTDIB          CHECK STATUS
*
*******************************************************************
*  TERMINATE PSB WHEN DLI PROCESSING IS COMPLETED
*******************************************************************
*
         EXEC DLI TERM                                                   11 
*
*******************************************************************
*  SEND OUTPUT MESSAGE
*******************************************************************
*
         EXEC CICS SEND MAP('SAMPMAP') MAPSET('MAPSET')                   6 
         EXEC CICS WAIT TERMINAL
*
*******************************************************************
*  COMPLETE TRANSACTION AND RETURN TO CICS
*******************************************************************
*
         EXEC CICS RETURN                                                12 
*
*******************************************************************
*  CHECK STATUS IN DIB
*******************************************************************
*
TESTDIB  EQU   *
         CLC   DIBSTAT,=C'  '      IS STATUS BLANK                       13 
         BER   R4                  YES - RETURN
*        HANDLE DLI STATUS CODES REPRESENTING EXCEPTIONAL CONDITIONS
*
         BR    R4                  RETURN
ERRORS   EQU   *
*        HANDLE ERROR CONDITIONS
*
ABENDS   EQU   *
*        HANDLE ABENDS INCLUDING DLI ERROR STATUS CODES
*
         END

Notes for the sample assembler code:

  •  1 For a CICS online program containing EXEC DLI commands, you must specify the DLI and CICS options. For a batch or BMP program containing EXEC DLI, you must specify only the DLI option.
  •  2 For reentry, define each of the areas the program uses—I/O areas, key feedback areas, and segment name areas in DFHEISTG.
  •  3 Define an I/O area for each segment you retrieve, add, or replace (in a single command).
  •  4 For a batch or BMP program containing EXEC DLI, you must save registers on entry and restore registers on exit according to z/OS® register-saving conventions.
  •  5 In a batch or BMP program, aDFHEIRET with an optional DFHEIENT saves the registers on entry. Do not specify the EIBREG parameter in a batch program.
  •  6 Do not code EXEC CICS commands in a batch or BMP program.
  •  7 In a CICS online program, use the SCHD PSB command to obtain a PSB for the use of your program. Do not schedule a PSB in a batch or BMP program.
  •  8 This GU command retrieves the first occurrence of SEGA with a key of A300. You do not have to provide the KEYLENGTH or SEGLENGTH options in an assembler language program.
  •  9 This GNP command retrieves all dependents under segment SEGA. The GE status code indicates that no more dependents exist.
  •  10 This GU command is an example of a path command. Use a separate I/O area for each segment you retrieve.
  •  11 In a CICS online program, the TERM command terminates the PSB scheduled earlier. You do not terminate the PSB in a batch or BMP program.
  •  12 For a batch or BMP program, code RCREG parameter instead of EXEC CICS RETURN. The RCREG parameter identifies a register containing the return code.
  •  13 After issuing each command, you should check the status code in the DIB.