AREAD is not recommended for Tony's situation. Instead, follow the standard
assembler conventions and the code will be clean and readable for assembler.
Here is how I would implement Tony's PERFORM_ON macro.
Jon.
PERFORM_ON (R3),BAD_VALUE=ERRNO_20000,BRTABLE=(
INITAPI, 00
ACCEPT, 01
BIND, 02
CLOSE, 03
CONNECT, 04
FCNTL) 05
MACRO
&NAME PERFORM_ON &ADDR,&BAD_VALUE=,BRTABLE=
.* SAME AS PERFORM_ON
&GOBAD SETC 'A&SYSNDX'
AIF ('&BAD_VALUE' EQ '' ).NOBV
&GOBAD SETC '&BAD_VALUE'
.NOBV ANOP
ST R15,R15_LAST Not sure why
MACPARM L,R15,&ADDR
TMLL R15,3 Valid 4 byte offset?
JNZ &GOBAD Invalid, go abend
CL R15,=A(D&SYSNDX-B&SYSNDX) < 0 or > branch table size?
JH &GOBAD Invalid, go abend
L R15,B&SYSNDX.(R15)
BASR R14,R15 call function
J D&SYSNDX
A&SYSNDX DC X'0000' FORCE ABEND
B&SYSNDX DS 0F
&CNT SETA 1
.NEXT ANOP
DC A(&BRTABLE(&CNT)) Branch table entry
&CNT SETA &CNT+1
AIF (&CNT LT K'&BRTABLE).NEXT
D&SYSNDX DS 0H
MEND