At the moment I've broken things up into a handful user data types, and with that and some pre-aggregating of the scattered elements into nice contiguous integer data blocks I'm able to MEMCOPY in and out of the working user structures used by the subroutines. A little additional code and time penalty but it doesn't look too bad.
That works - no need to get into union stuff - it's an advanced C programming concept where different structure members overlay on top of each other.
One example that exists in Designer already is the PeerLink heap structure, PL (not the block). There are bits for all 16 of the blocks for their Active state, e.g. PL.B0Act, PL.B1Act, PL.B2Act, ? PL.B15.Act. But then there is also member called PL.Active that is a WORD (16 bits) that represents those 16 bits in a single WORD. It occupies the SAME MEMORY locations as the bits. Hence. the LSBit of PL.Active is the same as PL.B0Act bit, and the MSBit of PL.Active is the same as PL.B15Act.
The PL.Error, PL.Updated, and PL.Inhibit are similar WORD struct members that sit on top of the 16 individual blocks' bit members. Almost everything there is read-only, but the PL.Inhibit and the corresponding individual PL.BxInh bits are read/write. Hence, you could easily WRITE to the 16 inhibit bits from an MHR or DLV via the MOVE instruction:
MOVE DLV2000 PL.Inhibit