I would restructure to open/close the DCB once Here using -ve value to indicate open has failed, or could use flags to track DCB status
* Message is in WORKMSG on arrival here LT R4,MYDCB@ Get DCB address BM WRITTEN Previous open failed, skip BP DOPUT Use STORAGE OBTAIN,LENGTH=XDCBL,LOC=BELOW Get 24-bit DCB buffer LR R4,R1 Move pointer to our 24-bit DCB MVC 0(XDCBL,R4),XDCB Copy the DCB down below the line MVC WORKDWRD(XOPENL),XOPEN Copy the OPEN macro model OPEN ((4),(OUTPUT)),MODE=31,MF=(E,WORKDWRD) Open for write LTR R15,R15 Did that work?? JZ OPENOK Yes save DCB address OPENFAIL EQU * LCR R4,R4 Indicate open has failed OPENOK EQU * ST R4,MYDCB@ DOPUT EQU * PUT (4),WORKMSG Write the message WRITTEN DS 0H In program epilog LT R4,MYDCB@ BZ SKIPFREE Never tried to use BP CLOSEDCB Opened previously LCR R4,R4 Open failed B FREEDCB So skip close CLOSEDCB EQU * MVC WORKDWRD(XCLOSEL),XCLOSE Copy in CLOSE template CLOSE ((4)),MODE=31,MF=(E,WORKDWRD) And do the CLOSE FREEDCB EQU * STORAGE RELEASE,LENGTH=XDCBL,ADDR=(R4) Release DCB buffer SKIPFREE EQU * ***MUCH LATER*** MYDCB@ DC F'0' XDCB DCB DDNAME=SYSPRINT,DSORG=PS,MACRF=PM,RECFM=FBA, * LRECL=133,BLKSIZE=3990 XDCBL EQU *-XDCB Length of our DCB so we can copy it XOPEN OPEN (*-*,(OUTPUT)),MODE=31,MF=L XOPENL EQU *-XOPEN XCLOSE CLOSE (*-*),MODE=31,MF=L XCLOSEL EQU *-XCLOSE