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

Reply via email to