Thanks everyone for the input.  Abe, I'm still studying yours.

Jon, thanks for the ideas, I wound up with a variation on yours:

         MACRO
&LABEL   KEYFIELD &NAME,&FIELD,&TYPE=C,&DSECT=NO
         AIF   ('&DSECT' EQ 'YES').KEYFIELD_DSECT
&DC      SETC  'DC'
&UID     SETC  '&SYSNDX'                Unique for each CSECT
&NAMEVAL SETC  '''&NAME'''
&DISPVAL SETC  '(&FIELD.-BASE)'
&LENVAL  SETC  '(L''&FIELD)'
&TYPEVAL SETC  '''&TYPE'''

&LABEL   DS    0F
         AGO   .KEYFIELD_GEN

.KEYFIELD_DSECT ANOP ,
&DC      SETC  'DS'
&UID     SETC  ''
&NAMEVAL SETC  ''
&DISPVAL SETC  ''
&LENVAL  SETC  ''
&TYPEVAL SETC  ''
KEYFIELD DSECT ,

.KEYFIELD_GEN ANOP ,
KEYNAME&UID &DC CL8&NAMEVAL
KEYDISP&UID &DC A&DISPVAL               OFFSET TO FIELD
KEYDLEN&UID &DC A&LENVAL                FIELD LENGTH
KEYTYPE&UID &DC CL1&TYPEVAL             FIELD TYPE
         DS    0F
         AIF   ('&DSECT' EQ 'NO').KEYFIELD_END
KEYLEN   EQU   *-KEYFIELD
.KEYFIELD_END ANOP ,
         MEND

It winds up potentially adding a lot to the symbol table but is much
clearer (in my opinion) than what I originally had.



*Mark*


On Sun, Jun 22, 2025 at 12:36 AM Jon Perryman <jperr...@pacbell.net> wrote:

> On Fri, 20 Jun 2025 10:38:20 -0500, Mark Hammack <mark.hamm...@gmail.com>
> wrote:
>
> >This is how I'm creating "anonymous" fields in the code expansion
>
> There's no upside to having anonymous fields. You don't see anyone
> converting unreferenced labels in DSECTs to anonymous. For CSECT labels,
> why eliminate the label as long as it is unique.
>
> Here's how I would code this but it's not tested. Doubleword alignment to
> future proof for 64 bit addresses.
>
> >         MACRO ,
> >&LABEL   KEYFIELD   &NAME,&FIELD,&TYPE=C,&DSECT=NO
> >
> >         AIF   ('&DSECT' EQ 'YES').KEYFIELD_DSECT
> >UID     SETA    &SYSNDX     CSECT needs unique label
> >&DSECT0 SETC    ''             Use specified value
> >&DSECTB SETC    ''             Use specified value
> >&LABEL   DS    0AD           Doubleword addr align
> >         AGO   .KEYFIELD_GEN
> >
> >.KEYFIELD_DSECT ANOP ,
> >UID     SETC    ''                   DSECT uses the label without of UID
> >&DSECT0 SETC    '0)     '           DSECT does not specify this address
> field, use 0)
> >&DSECTB SETC    ' ''      '           DSECT does not specify this text,
> use blank
> >KEYFIELD DSECT ,
> >.KEYFIELD_GEN ANOP ,
> >
> >KEYNAME&UID   DC    CL8'&dsectb.&NAME'
> >KEYDISP&UID     DC    .A(&dsect0.&FIELD.-BASE)                OFFSET TO
> FIELD
> >KEYDLEN&UID   DC     A(&dsect0.L''&FIELD)                    FIELD LENGTH
> >KEYTYPE&UID DC    CL1'&TYPE'               FIELD TYPE
> >         DS    0AD                    doubleword address  alignment
> >
> >         AIF   ('&DSECT' EQ 'NO').KEYFIELD_END
> >KEYLEN   EQU   *-KEYFIELD
> >.KEYFIELD_END ANOP ,
> >         MEND
>
> >This is more or less what I am trying to do (second paragraph).  Here's a
> >"real world" example of what I am doing:
> >
> >         MACRO
> >&LABEL   KEYFIELD   &NAME,&FIELD,&TYPE=C,&DSECT=NO
> >         AIF   ('&DSECT' EQ 'YES').KEYFIELD_DSECT
> >&N       SETC  '&NAME'
> >&F       SETC  '&FIELD.-BASE'
> >&L       SETC  'L''&FIELD'
> >&KEYNAME SETC '        '
> >&KEYDISP SETC '        '
> >&KEYDLEN SETC '        '
> >&KEYTYPE SETC '        '
> >
> >&LABEL   DS    0F
> >         AGO   .KEYFIELD_GEN
> >
> >.KEYFIELD_DSECT ANOP ,
> >&N       SETC  ' '
> >&F       SETC  '0'
> >&L       SETC  '0'
> >&KEYNAME SETC  'KEYNAME '
> >&KEYDISP SETC  'KEYDISP '
> >&KEYDLEN SETC  'KEYDLEN '
> >&KEYTYPE SETC  'KEYTYPE '
> >KEYFIELD DSECT ,
> >
> >.KEYFIELD_GEN ANOP ,
> >&KEYNAME DC    CL8'&N'
> >&KEYDISP DC    A(&F)                    OFFSET TO FIELD
> >&KEYDLEN DC    A(&L)                    FIELD LENGTH
> >&KEYTYPE DC    CL1'&TYPE'               FIELD TYPE
> >         DS    0F
> >         AIF   ('&DSECT' EQ 'NO').KEYFIELD_END
> >KEYLEN   EQU   *-KEYFIELD
> >.KEYFIELD_END ANOP ,
> >         MEND
>

Reply via email to