I wrote a program to show the error routine I use, and the macros that I use to invoke it. Not fancy, but it works. The 2 macros are ERR and REVB.
ERR does a BAL to the error processing routine that prints the error msg and the location in the program where it occurred. There are 2 versions of the ERR code and macro, one can display registers, and the other cannot. In general, if I'm using err to find my errors, then I use the register version. If I'm only showing user errors, then I do not use the register version. I've done both. W/O registers is shorter code. (1/3 the size.)
REVB does a branch with the reverse condition. In general, it either inserts, or removes, the "N" in the opcode. Here are 4 samples of the REVB macro, which is actually intended to be an internal macro, used inside other macros (like ERR). Following the REVB sample is the TESTERR source program.
* ---------------------
REVB B,Z
NOP Z
* ---------------------
REVB BE,Z
BNE Z
* ---------------------
REVB BNE,Z
BE Z
* ---------------------
REVB BH,Z
BNH Z
* ---------------------
REVB BNH,Z
BH Z
* ---------------------
*
* C:\USERS\LIN\DOCUMENTS\Z390CODE\TEST
*
* ---------------------------------
MACRO
&LBL ERR &BC,&MSG,®S=N
LCLC &L
&L SETC 'SYS&SYSNDX'
LCLA &N
&N SETA K'&MSG-3
AIF ('®S' EQ 'N').NOREGS
&LBL STM 0,15,ERRREGS
REVB &BC,&L.Z
AGO .BAL
.NOREGS ANOP
&LBL REVB &BC,&L.Z
.BAL BAL R14,ERR
DC AL1(&N),C&MSG
&L.Z DS 0H
MEND
* ---------------------------------
AGO .NOMACRG MACRO
&LBL ERR &BC,&MSG
LCLC &L
&L SETC 'SYS&SYSNDX'
LCLA &N
&N SETA K'&MSG-3
&LBL REVB &BC,&L.Z
.BAL BAL R14,ERR
DC AL1(&N),C&MSG
&L.Z DS 0H
MEND
.NOMACRG ANOP
* ---------------------------------
MACRO
&LABEL REVB &COND,&TO
AIF ('&COND' NE 'B').CHANGE
&LABEL NOP &TO
MEXIT
LCLA &K
.CHANGE LCLC &C,&A
AIF ('&COND'(2,1) NE 'N').REMOVE
.*
&K SETA K'&COND.-2
&C SETC '&COND'(3,&K)
&A SETC 'B'
.* MNOTE ,'&A &C'
AGO .GO
.*
.REMOVE ANOP
&K SETA K'&COND.-1
&C SETC '&COND'(2,&K)
&A SETC 'BN'
.* MNOTE ,'&A &C'
.GO ANOP
&LABEL &A&C &TO
MEND
* ---------------------------------
TESTERR START 0
USING *,13
YREGS
B ERRSTART-*(R15)
DS 17F
IDMSG DC C'TESTERR V01.01 ASM &SYSDATE &SYSTIME'
*
ERRSTART STM 14,12,12(13)
ST 13,4(15)
ST 15,8(13)
LR 13,15
L R3,0(R1)
BAL R9,OPEN
SR R10,R10
SR R11,R11
SR R12,R12
ERR B,' FILES OPEN, READ //IN' <== COL-1 BLANK = MSG
**INFORMATIONAL MSG INDICATING START
**
**PROGRAM TO SHOW ERR MACRO AND ERR ROUTINE.
**IN ADDITION, THE REVB MACRO,
**THAT I SEEM TO REWRITE EVERY TINE I USE IT.
*
GET GET IN
GOT LA R10,1(R10) COUNT
LA R3,0(R1)
CLC =C' ERR ',61(R3)
BNE GET
PUT PUT OUT,(3)
LA R11,1(R11) COUNT
GETMORE GET IN
LA R10,1(R10)
LA R3,0(R1)
CLI 52(R3),C'+'
BE GETMORE
CLC =C'**',53(R3)
BNE GOT
MVC LINE+1(66),55(R3)
PUT OUT,LINE
MVC LINE,LINE-1
B GETMORE
* ====================== THIS ERR ROUTINE CAN DISPLAY REGISTERS =======
ERRREGS DC 16F'0'
DC F'0'
MVC LINE+1(0),1(R14)
ERR ST R14,ERR-10
IC R15,0(R14)
EX R15,ERR-6
PUT SYSPRINT,LINE
MVC LINE,LINE-1
L R14,ERR-10
CLI 1(R14),C'#'
BNE ERRRET
MVC LINE(3),=C'0-7'
LA R14,ERRREGS
ERRUNPKL LA R15,LINE+4
LA R0,8
ERRUNPK UNPK 0(9,R15),0(5,R14)
TR 0(8,R15),HEX-240
MVI 8(R15),C' '
LA R14,4(R14)
LA R15,9(R15)
BCT R0,ERRUNPK
PUT SYSPRINT,LINE-1
CLI LINE,C'0'
LA R14,ERRREGS+32
MVC LINE(3),=C'8-F'
BE ERRUNPKL
ABEND 1
ERRQRET CLI 1(R14),C' '
BE ERRRET
ABEND 1
ERRRET LA R14,0(R14)
MVC LINE,LINE-1
SH R14,=H'8'
LA R15,240
EX R15,0(R14)
* ================= THIS IS THE ERR ROUTINE THAT DOESN'T DO REGISTERS
AGO .NOREGS
DC F'0'
MVC LINE+1(0),1(R14)
ERR ST R14,ERR-10
IC R15,0(R14)
EX R15,ERR-6
PUT SYSPRINT,LINE
MVC LINE,LINE-1
BE ERRRET
ABEND 1
ERRRET LA R14,0(R14)
MVC LINE,LINE-1
SH R14,=H'8'
LA R15,240
EX R15,0(R14)
.NOREGS ANOP , ===================================================
*
PUSH PRINT
PRINT NOGEN
OPEN OPEN (SYSPRINT,OUTPUT,IN,INPUT,OUT,OUTPUT)
BR R9
CLOSE CLOSE (SYSPRINT,,IN,,OUT)
BR R9
POP PRINT
* ---------------------------
REVB B,Z
* ---------------------------
REVB BE,Z
* ---------------------------
REVB BNE,Z
* ---------------------------
REVB BH,Z
* ---------------------------
REVB BNH,Z
* -------------------------------
Z LTR R10,R10
ERR BZ,'INPUT FILE IS EMPTY'
LTR R11,R11
ERR BZ,'NO ERR RECORDS FOUND'
ERR B,' COPY GOOD'
ERR B,'#ERROR MSG AND REGISTERS AND ABEND',REGS=Y
BAL R9,CLOSE
L 13,4(13)
LM 14,12,12(13)
SR 15,15
BR 14
LTORG
DC C' '
LINE DC CL133' '
HEX DC C'0123456789ABCDEF'
*
PUSH PRINT
PRINT NOGEN
IN DCB DDNAME=IN,DSORG=PS,MACRF=GL,RECFM=FT,LRECL=266,EODAD=Z
OUT DCB DDNAME=OUT,DSORG=PS,MACRF=PM,RECFM=FT,LRECL=132
*SYSIN DCB DDNAME=SYSIN,DSORG=PS,MACRF=GL,RECFM=FT,LRECL=80,EODAD=ZZ
SYSPRINT DCB DDNAME=SYSPRINT,DSORG=PS,MACRF=PM,RECFM=FT,LRECL=133
POP PRINT
END TESTERR
Oh look, I didn't put any comments in. Again. Get used to it.