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 <[email protected]> wrote:
> On Fri, 20 Jun 2025 10:38:20 -0500, Mark Hammack <[email protected]>
> 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
>