Here is an example of a message user routine, the members (member
1 and member 2) of a group have established a protocol for the use
of the message control information (MSGCNTL parameter on DIDXCMDSGOX):
- If member 1 sends a message to member 2 and places zeros in the
first byte of the message control field, member 1 is indicating that
the data in the message buffer area (MSGBUF parameter on IXCMSGOX)
is an initial message. Member 2's message user routine then reads
in the data contained in the message buffer.
- If member 1 sends a message with anything other than zeros in
the first byte of the message control field, member 1 is confirming
that it received a prior message. Member 2's message user routine
then does not have to read in any information from the message buffer.
***************************************************************
* *
* MESSAGE USER ROUTINE *
* *
***************************************************************
MEXIT CSECT
MEXIT AMODE 31
MEXIT RMODE ANY
@MAINENT DS 0H
USING *,R15
B @PROLOG
DC AL1(16)
DC C'ME 89360 MEXIT'
DROP R15
***************************************************************
* *
* ENTRY LINKAGE *
* *
***************************************************************
@PROLOG STM R14,R12,12(R13)
LR R12,R15
@PSTART EQU MEXIT
*
* SET UP BASE REGISTER TO 12
*
USING @PSTART,R12
SLR R15,R15
IC R15,@SIZDATD
SLR R0,R0
ICM R0,7,@SIZDATD+1
STORAGE OBTAIN,LENGTH=(0),SP=(15)
LR R10,R1
USING @DATD,R10
ST R13,4(,R10)
ST R10,8(,R13)
LM R15,R1,16(R13)
LR R13,R10
***************************************************************
* *
* MESSAGE USER ROUTINE CODE *
* *
* IF THE FIRST BYTE OF MSGCNTL CONTAINS ZEROS, THEN READ *
* IN THE MESSAGE; OTHERWISE, DO NOT READ IN THE MESSAGE. *
* *
***************************************************************
LR R6,R1 SAVE THE PARAMETER LIST
USING MEPL,R6 GET ADDRESSABILITY TO MEPL
L R4,MEPLMLEN PLACE THE LENGTH OF MSG IN REG 4
LA R5,MEPLCNTL LOAD ADDRESS OF MSGCNTL TO REG 5
USING CHKTYPE,R5 GET ADDRESSABILITY TO MSGCNTL
CLI MSGTYPE,X'00' SEE IF MESSAGE SHOULD BE READ IN
BNE @DONREAD IF NO, BRANCH
STORAGE OBTAIN,LENGTH=(R4),SP=0 IF YES, GET STORAGE FOR MSG
LR R3,R1 SAVE THE ADDRESS IN REG 3
*
* SET UP DYNAMIC AREA AND ISSUE IXCMSGIX TO RECEIVE MESSAGE
*
L R7,MSGILNTH
BCTR R7,0
EX R7,@SETPARM
IXCMSGIX MSGTOKEN=MEPLMTOK,MSGBUF=(R3), X
RETCODE=RETURN,RSNCODE=REASON,MF=(E,MSGILSTD)
***************************************************************
* *
* NOTE: THIS IS A SIMPLIFIED EXAMPLE OF A MESSAGE USER *
* ROUTINE. NORMALLY, AT THIS POINT, THE MESSAGE WOULD *
* BE PLACED ON A WORK QUEUE OR OTHER APPROPRIATE ACTION *
* TAKEN WITHIN THE MESSAGE USER ROUTINE, AND *
* THE STORAGE WOULD NOT BE RELEASED. *
* *
***************************************************************
*
* RELEASE THE STORAGE AND WRITE TO OPERATOR
*
STORAGE RELEASE,LENGTH=(R4),ADDR=(R3),SP=0
WTO 'READ IN THE MESSAGE',ROUTCDE=11,LINKAGE=BRANCH
B @FINI
*
* BRANCH HERE WHEN MSGTYPE DOES NOT CONTAIN ZEROS (NO MESSAGE
* TO RECEIVE)
*
@DONREAD WTO 'MESSAGE CONFIRMATION',ROUTCDE=11,LINKAGE=BRANCH
*
* RELEASE DYNAMIC AREA
*
@FINI LR R1,R10
L R13,4(,R13)
SLR R15,R15
IC R15,@SIZDATD
SLR R0,R0
ICM R0,7,@SIZDATD+1
STORAGE RELEASE,LENGTH=(0),ADDR=(1),SP=(15)
LM R14,R12,12(R13)
BR R14 RETURN TO XCF
DS 0F
@SETPARM MVC MSGILSTD(0),MSGILSTS
@PSIZE EQU ((*-MEXIT+99)/100)*5
DC C'PATCH AREA - MEXIT 89.360'
PUSH PRINT
PRINT ON,GEN,DATA
@PSPACE DC 25S(*)
ORG @PSPACE
DC ((@PSIZE+1)/2)S(*)
ORG ,
POP PRINT
MEXIT CSECT ,
LTORG
DS 0D
@SIZDATD DS 0A
DC AL1(0)
DC AL3(@DYNSIZE)
R0 EQU 0
R1 EQU 1
R2 EQU 2
R3 EQU 3
R4 EQU 4
R5 EQU 5
R6 EQU 6
R7 EQU 7
R8 EQU 8
R9 EQU 9
R10 EQU 10
R11 EQU 11
R12 EQU 12
R13 EQU 13
R14 EQU 14
R15 EQU 15
MSGILST1 IXCMSGIX MF=(L,MSGILSTS) LIST FORM OF IXCMSGIX MACRO
MSGILNTH DC A(*-MSGILST1)
@ENDDATA EQU *
@DATA DS 0H
@DATD DSECT
DS 0F
SAVEAREA DS 18F
RETURN DS 1F RETURN CODE
REASON DS 1F REASON CODE
TOKENMSG DS CL4 MESSAGE TOKEN
MSGILST2 IXCMSGIX MF=(L,MSGILSTD) LIST FORM OF IXCMSGIX MACRO
@ENDDATD DS 0X
@DYNSIZE EQU ((@ENDDATD-@DATD+7)/8)*8
CHKTYPE DSECT
MSGTYPE DS X
RESTCNTL DS XL31
***************************************************************
* *
* MAPPING MACROS *
* *
***************************************************************
IXCYMEPL
END MEXIT