Replying to my own post to verify that Bill's note about R0 is accurate, and that COBOL does NOT set R0 = 0 before invoking the module. If called directly BPXWDYN returns RC=20, invalid parameter list. I had to write an assembler subroutine to call BPXWDYN from a COBOL program (tested with Enterprise COBOL V4.1).
I am pasting the COBOL and assembler source here but if it doesn't format correctly write to me privately (NOT on the list please) and I will send you text files.
A better solution might be to code an LE-enabled assembler subroutine and take advantage of the CEE library routines. I leave that as an exercise for the reader.
Note that an extra first parameter (fullword binary) needs to be passed to the assembler module to store the actual BPXWDYN return code. If R15 from BPXWDYN is returned to COBOL directly in R15, COBOL code makes the value positive, which hides the possibly negative return code values that BPXWDYN can produce.
HTH
Peter
COBOL code to invoke the assembler module and call BPXWDYN dynamically:
ID DIVISION.
PROGRAM-ID. TESTWDYN.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-WORK-AREA.
05 WS-SUB PIC S9(4) BINARY.
05 WS-MSG-CNT PIC S9(4) BINARY.
05 WS-RC PIC S9(8) BINARY.
05 WS-RC-D PIC +(7)9.
05 WS-BPXWDYN PIC X(8) VALUE 'CBPXWDYN'.
01 WDYN-PARM.
05 WDYN-LENGTH PIC S9(4) BINARY VALUE 17.
05 WDYN-VALUE PIC X(016) VALUE
'ALLOC NEW DELETE'.
05 WDYN-NULL PIC X(001) VALUE LOW-VALUES.
01 DDNAME.
05 DDNAME-LENGTH PIC S9(4) BINARY VALUE 9.
05 DDNAME-VALUE.
15 FILLER PIC X(005) VALUE 'RTDDN'.
15 FILLER PIC X(003) VALUE LOW-VALUES.
05 DDNAME-NULL PIC X(001) VALUE LOW-VALUES.
01 DSNAME.
05 DSNAME-LENGTH PIC S9(4) BINARY VALUE 45.
05 DSNAME-VALUE.
15 FILLER PIC X(005) VALUE 'RTDSN'.
15 FILLER PIC X(039) VALUE LOW-VALUES.
05 DSNAME-NULL PIC X(001) VALUE LOW-VALUES.
01 MSG-0.
05 MSG-0-LENGTH PIC S9(4) BINARY VALUE 3.
05 MSG-0-VALUE PIC X(003) VALUE 'MSG'.
05 MSG-0-NULL PIC X(001) VALUE LOW-VALUES.
01 MSG-TABLE.
05 MSG OCCURS 9 TIMES.
10 MSG-X-LENGTH PIC S9(4) BINARY VALUE 258.
10 MSG-X-VALUE.
15 FILLER PIC X(004) VALUE 'MSG.'.
15 MSG-X-NO PIC 9(001) VALUE 1.
15 FILLER PIC X(252) VALUE LOW-VALUES.
10 MSG-X-NULL PIC X(001) VALUE LOW-VALUES.
PROCEDURE DIVISION.
PERFORM VARYING WS-SUB FROM 2 BY 1 UNTIL WS-SUB > 9
MOVE WS-SUB TO MSG-X-NO (WS-SUB)
END-PERFORM
CALL WS-BPXWDYN USING WS-RC, WDYN-VALUE, DDNAME, DSNAME,
MSG-0, MSG (1), MSG (2), MSG (3), MSG (4).
MOVE WS-RC TO WS-RC-D
DISPLAY WS-BPXWDYN ' RETURNED RC = ' WS-RC-D
DISPLAY WS-BPXWDYN ' DDNAME LENG = ' DDNAME-LENGTH
', DDNAME = ' DDNAME-VALUE
DISPLAY WS-BPXWDYN ' DSNAME LENG = ' DSNAME-LENGTH
', DSNAME = ' DSNAME-VALUE
DISPLAY WS-BPXWDYN ' MSG-0 LENG = ' MSG-0-LENGTH
', MSG-0 = ' MSG-0-VALUE
IF MSG-0-VALUE IS NUMERIC AND MSG-0-VALUE > '00'
MOVE MSG-0-VALUE TO WS-MSG-CNT
PERFORM VARYING WS-SUB FROM 1 BY 1
UNTIL WS-SUB > WS-MSG-CNT OR WS-SUB > 9
DISPLAY WS-BPXWDYN ' MSG(' WS-SUB ') LENGTH = '
MSG-X-LENGTH (WS-SUB)
', VALUE = '
MSG-X-VALUE (WS-SUB)
END-PERFORM
END-IF
GOBACK.
Assembler stub code:
CBPXWDYN CSECT ,
CCBXWDYN AMODE 31
CCBXWDYN RMODE ANY
YREGS ,
SYSSTATE ARCHLVL=2
STM R14,R2,12(R13) SAVE CALLER'S REGISTERS 14 TO 2
* THIS IS A STUB TO INVOKE THE Z/OS UNIX SERVICES SUBROUTINE BPXWDYN
* FROM COBOL WITH R0 = 0 AS REQUIRED BY BPXWDYN.
* HOWEVER MANY PARAMETERS ARE PASSED TO THIS STUB ARE PASSED TO
* BPXWDYN WITHOUT ALTERATION.
* RETURNS THE RETURN CODE FROM BPXWDYN TO THE CALLING COBOL PROGRAM
* IN THE FIRST PASSED PARAMETER.
* RETURNS RC = -3 IF BPXWDYN CANNOT BE FOUND
LARL R2,ABPXWDYN LOAD A(BPXWDYN) IF WE HAVE IT
L R15,0(,R2)
LTR R15,R15 DO WE HAVE IT?
JNZ CALLWDYN GO CALL IF WE ALREADY HAVE IT
LARL R0,BPXWDYN LOAD A(NAME OF MODULE TO LOAD)
LOAD EPLOC=(0),ERRET=NOTFOUND
LR R15,R0 SET UP FOR CALL TO BPXWDYN
LA R15,0(,R15) CLEAR HIGH-ORDER BIT
ST R15,0(,R2) SAVE A(BPXWDYN) FOR FUTURE CALLS
J CALLWDYN GO CALL NOW THAT WE HAVE IT
NOTFOUND LHI R15,-3 SIGNAL PROGRAM NOT FOUND
L R1,24(,R13) RELOAD ORIGINAL R1
L R2,0(,R1) GET A(RETURN CODE PARAMETER)
J GOBACK AND EXIT TO CALLER
CALLWDYN DS 0H
L R1,24(,R13) RELOAD ORIGINAL R1
L R2,0(,R1) GET A(RETURN CODE PARAMETER)
LA R1,4(,R1) BYPASS RETURN CODE PARAMETER
LARL R14,SAVEAREA SET UP NEW SAVE AREA FOR BPXWDYN
ST R13,4(,R14) LINK NEW SAVE TO OLD SAVE
ST R14,8(,R13) LINK OLD SAVE TO NEW SAVE
LR R13,R14 SET NEW SAVE AREA FOR BPXWDYN
SR R0,R0 SET R0 = 0 AS REQUIRED BY BPXWDYN
BASR R14,R15 CALL BPXWDYN
L R13,4(,R13) RELOAD A(CALLER SAVE AREA)
GOBACK ST R15,0(,R2) GIVE RETURN CODE TO CALLER
LM R0,R2,20(R13) RESTORE CALLER'S REGISTERS 0 TO 2
SR R15,R15 SET COBOL RETURN-CODE TO ZERO
L R14,12(,R13) RESTORE CALLER'S REGISTER 14
BR R14 RETURN TO CALLER
SAVEAREA DC 18F'0' 18-WORD SAVE AREA
BPXWDYN DC CL8'BPXWDYN '
ABPXWDYN DC A(0)
END