Hello Peter,

I'm not sure if it is necessary for your task to store the location of the bits
in macro symbols.

We do it this way:

FLAGA   DS  0BL1
FLAGB   DS  0BL1
FLAGC   DS  0BL1
FLAGD   DS  0BL1
FLAGE   DS  0BL1
FLAGF   DS  0BL1
FLAGG   DS  0BL1
FLAGH   DS  BL1

that is, 8 bits make one byte, every 8 definitions the 0 repeat factor is omitted, so all definitions from FLAGA to FLAGH define the same byte. If you need more
bits, you start this scheme again with the next eight bits, and so on.

and then we define

$FLAGA   EQU  X'80'
$FLAGB   EQU  X'40'
$FLAGC   EQU  X'20'
$FLAGD   EQU  X'10'
$FLAGE   EQU  X'08'
$FLAGF   EQU  X'04'
$FLAGG   EQU  X'02'
$FLAGH   EQU  X'01'

so every bit has its own name and an EQU constant which defines its position. The fact that FLAGA to FLAGH are in the same byte is hidden from (and not relevant to)
the user.

The user uses instructions like

   TM FLAGA,$FLAGA   test bit

   OI  FLAGA,$FLAGA   set bit on

   NI  FLAGA,X'FF'-$FLAGA   set bit off

   XI  FLAGA,$FLAGA    change status of bit

To make the definitions and instructions above easier, we have macros

   DEFBIT list-of-bit-names-of-arbitrary-length
   TESTBIT bit
   SETBIT bit
   RESETBIT bit
   CHGBIT bit

Kind regards

Bernd



Am 04.10.2014 21:13, schrieb Farley, Peter x23353:
John,

Thank you for that example, it helps a lot.  The example I gave was generating 
DC lines for the sake of figuring out the proper syntax.  My real goal is a bit 
different.

I have a static list of 64 flag bit names (each one like Flag_A EQU X'80').  I want 
to create a flag-test macro FTEST to test one or more of those bit flags against a 
set of 8 flag bytes, each named FLAGn, 1 <= n <= 8.  So if Flag_A is defined as 
a bit in Flag1, I will generate a test like:

         FTEST Somewhere,Flag_A
+        TM    Flag1,Flag_A
+        BO    Somewhere

And if a list of multiple flag names are provided to the test macro, the result 
should resemble:

         FTEST Somewhere, (Flag_P,Flag_H,Flag_G,Flag_A)
+        TM    Flag1,Flag_A+Flag_G+Flag_H
+        BO    Somewhere
+        TM    Flag2,Flag_P
+        BO    Somewhere

Obviously the trick is to associate a flag number with each name, and to sort 
the list of flag names provided to the FTEST macro by the flag byte number so 
that all tests against the same flag byte are grouped together.

Also, other than a manually created list of GBLA definitions and SETA initializations 
for the flag names (like GBLA &Flag_A and &Flag_A SETA 1), is it possible to 
create a loop that dynamically computes the flag number for each name (where the flag 
names are stored in the proper order in an initialized GBLC array) and dynamically 
creates the GBLA and SETA lines? I.E., is it legal to loop over GBLA as well as SETA 
statements?

Have you solved a problem like this already, or can you suggest an approach 
that will work for such a macro?

Thank you again for your clear example.

Peter

Reply via email to