*COMDECK  COMADEF - STRUCTURED FIELD DECLARATION MACROS.
 COMADEF  CTEXT  COMADEF - STRUCTURED FIELD DECLARATION MACROS. 
***       COMADEF - STRUCTURED FIELD DECLARATION MACROS.
* 
*         J. A. WHITE III AND S. I. JASIK - DATES UNKNOWN 
*         P. H. MCQUESTEN    76-10-06.
* 
*         MACROS TO FACILITATE FIELD DESCRIPTION, WHERE FIELDS ARE
*         SUB-WORD ENTITIES.  THE 'DESCRIBE' MACRO IS USED TO PROVIDE 
*         A PREFIX FOR NAMES SUPPLIED IN SUBSEQUENT 'DEFINE' REFERENCES.
*         FOR EACH NAME SPECIFIED, THE FOLLOWING SYMBOLS WILL BE
*         DEFINED 
* 
*                PFX_NAME_P -- THE BIT POSITION OF THE RIGHT MOST BIT 
*                              WHICH COMPRISES THE NAMED FIELD (WITHIN
*                              A WORD BITS ARE NUMBERED ACCORDING TO
*                              THE POWER OF TWO WHICH THEY REPRESENT) 
*                PFX_NAME_L -- THE LENGTH IN BITS OF THE FIELD
* 
*         FIELDS ARE NOT PERMITTED TO SPAN WORD BOUNDARIES (A FATAL-TO- 
*         ASSEMBLY ERROR WILL RESULT) OR TO GO BEYOND THE TOTAL NUMBER
*         OF BITS WHICH THE ENTIRE SET OF FIELDS IS SUPPOSED TO OCCUPY. 
* 
*         EACH 'DEFINE' REFERENCES A FIELD BEGINNING TO THE IMMEDIATE 
*         RIGHT OF THE PRECEEDING FIELD.
 DESCRIBE SPACE  3
***       DESCRIBE - DECLARE BEGINNING OF STRUCTURE.
* 
*         DESCRIBE PFX,BITSLONG,TOPBIT,WORDNR 
* 
*         ENTRY  PFX = THE PREFIX FOR THE STRUCTURE, AS MENTIONED ABOVE.
*                BITSLONG = THE TOTAL LENGTH IN BITS OF THE STRUCTURE,
*                     IF NOT PRESENT A VALUE OF 60 IS ASSUMED.
*                TOPBIT = THE BEGINNING (LEFTMOST) BIT OF THE STRUCTURE,
*                     IF ABSENT "BITSLONG-1" IS THE DEFAULT VALUE.
*                WORDNR = WORD NUMBER OF THE STRUCTURE BEING DESCRIBE-D.
*                     ZERO IF OMITTED.  SHOULD BE OMITTED FOR 
*                     SINGLE-WORD STRUCTURES. 
  
  
 DESCRIBE MACRO  PREFIX,BITSLONG,TOPBIT,WORDNR
          NOREF  /"QUAL"/.C,/"QUAL"/.D,/"QUAL"/.W 
          NOREF  /"QUAL"/.B,/"QUAL"/.L,/"QUAL"/.1 
          NOREF  /"QUAL"/.2,/"QUAL"/.3,/"QUAL"/.4 
          NOREF  /"QUAL"/.5 
 .P       MICRO  1,,/PREFIX/
 .D       SET    BITSLONG   60
 .C       SET    TOPBIT     .D-1
 .W       SET    WORDNR     0 
*                            INITIALIZE COUNTERS. 
 .L       SET    .D 
 .B       SET    .C 
          IFC    NE, WORDNR  ,1 
 ".P"W    EQU    .W 
 DESCRIBE ENDM
 DEFINE   SPACE  4,20 
***       DEFINE - DECLARE A FIELD WITHIN THE STRUCTURE.
* 
*  NAME   DEFINE LENGTH,R 
* 
*         ENTRY  NAME = THE NAME OF THE FIELD MENTIONED ABOVE.  IF NOT
*                    PRESENT THEN THE REFERENCE WILL ACT AS FILLER. 
*                LENGTH = THE BIT LENGTH OF THIS FIELD (OR FILLER). 
*                    IF OMITTED, LENGTH = ONE IS ASSUMED. 
*                R = IF PRESENT, WILL CAUSE THE NAMED FIELD TO BE 
*                    DEFINED RELATIVE TO BIT POSITION 'R' AS THE
*                    TOPMOST (LEFTMOST) BIT.  THE 'REDEF' MACRO WILL
  
  
          MACRO  DEFINE,N,LONG,RESET
 .1       SET    LONG 1 
          IFC    NE,//RESET/,2
 .L       SET    1000    ** KLUDGE **      .L-.B+RESET
 .B       SET    RESET
* 
          IFC    NE,  N ,1
 N        DEQU   *,.1,.B-.1+1 
*                            ADVANCE COUNTERS, CHECK OVERFLOW.
 .L       SET    .L-.1
 .B       SET    .B-.1
          ERRMI  .L          TOTAL LENGTH OF ".P" LONGER THAN SPECIFIED.
          IFLT   .B,0,3 
          IFNE   .B,-1,1
           ERR    FIELD SPANS A WORD BOUNDARY    ("SEQUENCE") 
 .B       SET    59 
 DEFINE   ENDM
 DEQU     SPACE  4,20 
***       DEQU - DECLARE EQUIVALENCED FIELD.
* 
*  NAM    DEQU   FLD,LEN
* 
*         ENTRY  NAM = A NEW FIELD NAME TO BE DECLARED. 
*                FLD = A PREVIOUSLY DEFINED FIELD IN THIS STRUCTURE.
*                LEN = (OPTIONAL) EXPLICIT BIT LENGTH OF NEW FIELD. 
*                      IF 'LEN' IS OMITTED, LENGTH OF THE NEW FIELD 
*                      WILL BE SAME AS LENGTH OF OLD FIELD. 
  
  
          MACRO  DEQU,N,B,LEN,V 
 .2       SET    LEN  ".P"B_L 
 .3       SET    V    ".P"B_P 
 ".P"N_P  EQU    .3 
 ".P"N_L  EQU    .2 
*                            LIST FIELD MASK PRETTILY.
          LOC    .W*100B+.3 
          POS    1+.C 
 .4       SET    *P-.2-.3 
 .5       SET    .D-.2-.4 
          VFD    .4/,.2/-0,.5/
          ORG    *O-*P/60D
*                            DEFINE MASK VALUE FOR SINGLE BIT FIELDS. 
          IFEQ   .2,1,4 
          NOREF  /"QUAL"/".P"N_L
          IFLE   .3,17,2
 .A       DECMIC .3 
 ".P"N_M  EQU    1S".A" 
          ENDM
 REDEF    SPACE  4,10 
***       REDEF - DECLARE OVERLAPPING SUB-STRUCTURES. 
* 
*         REDEF  NAME 
* 
*         ENTRY  NAME = THE NAME OF A PREVIOUSLY DECLARED FIELD.
* 
*         CAUSES SUBSEQUENT FIELD TO BE DEFINED BEGINNING AT THE TOP
*         (LEFTMOST) BIT OF FIELD 'NAME'.  IF 'NAME' IS OMITTED,
*         REDEFINITION BEGINS AT THE TOP OF THE ENTIRE STRUCTURE. 
  
  
 REDEF    MACRO  N
          IFC    EQ, N  ,3
 .1       SET    .C 
 .L       SET    .D 
          SKIP   2
 .1       SET    ".P"N_P+".P"N_L-1
 .L       SET    1000  ** KLUDGE **  .L+.1-.B+1 
* 
 .B       SET    .1 
          ENDM
 EXAMPLE  SPACE  4,30 
***       CONSIDER THE FOLLOWING EXAMPLE -- 
* 
*         TABLE X      .------.-------.------.
*                      . TYPE   VALUE . SUBV .  (SAY FOR TYPE @ 100)
*                      .------.-------.------.
*                       '      '       '     '
*                      59     47      17     0
* 
*                 OR   .------.--------------.
*                      . TYPE . MESSAGE      .  (FOR TYPE > 100)
*                      .------.--------------.
*                       '      '             '
*                      59     47             0
* 
*                DESCRIBE X.,60    TABLE X, THE PREFIX TO BE USED IS THE
*                                  TWO CHARACTERS 'X.'
*         TYPE   DEFINE  12 
*         MSG    DEFINE  48 
*                REDEF   MSG
*         VALUE  DEFINE  30 
*         SUBV   DEFINE  18 
* 
*       THE SYMBOLS DEFINED WOULD BE
* 
*                X.TYPEP   EQU  48
*                X.TYPEL   EQU  12
*                X.MSGP    EQU   0
*                X.MSGL    EQU  48
*                X.VALUEP  EQU  18
*                X.VALUEL  EQU  30
*                X.SUBVP   EQU   0
*                X.SUBVL   EQU  18
 BMFW     SPACE  4,20 
***       BFMW - CREATE A BIT FIELD MASK WORD.
* 
* LAB     BFMW   PREFIX,(BITLIST),SHFT
* 
*         ENTRY  PREFIX = BIT FIELD PREFIX CHARACTERS WITH NO PERIOD. 
*                BITLIST = LIST OF BIT FIELDS TO APPEAR IN MASK.
*                SHFT = AMOUNT BY WHICH WORD IN REGISTERS HAS ALREADY 
*                       BEEN SHIFTED. 
  
  
          MACRO  BFMW,LAB,PR,BIT,SHFT 
          IFC    NE,/"QUAL"//,1 
          NOREF  /"QUAL"/.P,/"QUAL"/.Z
* 
 LAB      BSS    0
 .Z       SET    0
  
          IRP    BIT
 .P       SET    PR.BIT_P+PR.BIT_L+SHFT 
          IFGT   .P,60,1
 .P       SET    .P-60
          IFNE   .P,PR.BIT_L,3
          POS    .P 
          VFD    PR.BIT_L/-0
          ELSE   1
 .Z       SET    .P 
          IRP 
* 
          IFNE   .Z,0,3 
          POS    .Z 
          VFD    .Z/-0
          SKIP   1
          VFD    *P/0 
* 
          ENDM
  
 COMADEF  ENDX
