*COMDECK  COMADEF - STRUCTURED FIELD DECLARATION MACROS.
          CTEXT  COMADEF - STRUCTURED FIELD DECLARATION MACROS. 
 COMADEF  SPACE  4,10 
***       COMADEF - STRUCTURED FIELD DECLARATION MACROS.
* 
*         S. I. JASIK        73-01-00.
*         P. H. MCQUESTEN    76-12-29.
* 
*         COPYRIGHT CONTROL DATA CORPORATION. 1976, 1977. 
 COMADEF  SPACE  4,10 
***              THE STRUCTURED FIELD DECLARATION MACROS PROVIDE A
*         FACILITY TO DEFINE SYMBOLS DESCRIBING THE POSITION AND SIZE 
*         OF FIELDS WITHIN A WORD.
* 
*         USERS SHOULD AVOID NAMES OF THE FORM *'?DEF#XX* WHERE *XX* IS 
*         ANY TWO CHARACTERS.  NAMES OF THIS FORM ARE USED INTERNALLY.
* 
*         ALL NUMERIC CONSTANTS GREATER THAN 7 IN THESE MACROS HAVE 
*         AN EXPLICIT RADIX, SO THE *BASE* MODE IS IMMATERIAL.
* 
*         THIS COMMON DECK CONTAINS NO UNLABELED *ELSE* OR *ENDIF*
*         STATEMENTS, SO IT CAN BE ASSEMBLED CONDITIONALLY. 
 COMADEF  SPACE  4,10 
***              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. 
* 
*         UNLESS THE 'RESET' PARAMETER OCCURS, EACH 'DEFINE' IS 
*         CONSIDERED TO REFERENCE A FIELD BEGINNING TO THE IMMEDIATE
*         RIGHT OF THE PRECEDING FIELD.  A 'REDEF' MACRO IS ALSO
*         PROVIDED TO DECLARE OVERLAPPING STRUCTURES, AND IS USUALLY
*         MORE APPROPRIATE THAN THE 'RESET' PARAMETER OF 'DEFINE'.
 DESCRIBE SPACE  4,20 
***       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
 '?DEF#PX    MICRO 1,,/PREFIX/
 '?DEF#BL   SET   BITSLONG   60 
 '?DEF#TB   SET   TOPBIT     '?DEF#BL-1 
 '?DEF#WN   SET   WORDNR     0
*                            INITIALIZE COUNTERS. 
 '?DEF#LI   SET   '?DEF#BL
 '?DEF#BI   SET   '?DEF#TB
          IFC    NE, WORDNR  ,1 
 "'?DEF#PX"W  EQU  '?DEF#WN 
 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
*                    USUALLY BE MORE APPROPRIATE, ESPECIALLY WHEN THE 
*                    OVERLAP IS TO BEGIN AT A SYMBOLICALLY DEFINED
*                    POSITION.
  
  
          MACRO  DEFINE,N,LONG,RESET
 '?DEF#LL SET   LONG  1 
          IFC   NE,//RESET/,2 
 '?DEF#LI SET   1000    ** KLUDGE **     '?DEF#LI-'?DEF#BI+RESET
 '?DEF#BI SET   RESET 
* 
          IFC   NE,  N ,1 
 N        DEQU  *,'?DEF#LL,'?DEF#BI-'?DEF#LL+1
*                            ADVANCE COUNTERS, CHECK OVERFLOW.
 '?DEF#LI SET   '?DEF#LI-'?DEF#LL 
 '?DEF#BI SET   '?DEF#BI-'?DEF#LL 
     ERRMI '?DEF#LI    TOTAL LENGTH OF "'?DEF#PX" LONGER THAN SPECIFIED 
          IFLT  '?DEF#BI,,3 
          IFNE  '?DEF#BI,-1,1 
          ERR    FIELD SPANS A WORD BOUNDARY    ["SEQUENCE"]___________ 
 '?DEF#BI 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 
 '?DEF#LL SET    LEN  "'?DEF#PX"B_L 
 '?DEF#PP SET    V    "'?DEF#PX"B_P 
 "'?DEF#PX"N_P EQU  '?DEF#PP
 "'?DEF#PX"N_L EQU  '?DEF#LL
*                            LIST FIELD MASK PRETTILY.
          LOC    '?DEF#WN*100B+'?DEF#PP 
          POS    1+'?DEF#TB 
 '?DEF#BB SET    *P-'?DEF#LL-'?DEF#PP 
 '?DEF#DD SET    '?DEF#BL-'?DEF#LL-'?DEF#BB 
          VFD    '?DEF#BB/,'?DEF#LL/-0,'?DEF#DD/
          ORG    *O-*P/60D
*                            DEFINE MASK VALUE FOR SINGLE BIT FIELDS. 
          IFEQ   '?DEF#LL,1,4 
          NOREF  /"QUAL"/"'?DEF#PX"N_L
          IFLE   '?DEF#PP,17,2
 '?DEF#PP DECMIC '?DEF#PP 
 "'?DEF#PX"N_M EQU  1S"'?DEF#PP"
          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
 '?DEF#LL SET    '?DEF#TB 
 '?DEF#LI SET    '?DEF#BL 
          SKIP   2
 '?DEF#LL SET    "'?DEF#PX"N_P+"'?DEF#PX"N_L-1
 '?DEF#LI SET    1000  ** KLUDGE **  '?DEF#LI+'?DEF#LL-'?DEF#BI+1 
* 
 '?DEF#BI SET    '?DEF#LL 
          ENDM
 EXAMPLE  SPACE  4,30 
***       CONSIDER THE FOLLOWING EXAMPLE -- 
* 
*         TABLE X      .------.-------.------.
*                      . TYPE   VALUE . SUBV .  (SAY FOR TYPE .LE. 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
 BFLIT    SPACE  4,10 
***       BFLIT - CREATE BIT FIELD MASK LITERAL.
* 
* LOC     BFLIT  PFX,(FIELD1,FIELD2,...,FIELDN) 
* 
*         SEE *BFMIC* FOR PARAMETERS. 
  
  
          MACRO  BFLIT,LOC,PFX,BITS 
 '?DEF#TT BFMIC  PFX,(BITS) 
 LOC      LIT    "'?DEF#TT" 
          ENDM
 BFMIC    SPACE  4,20 
***       BFMIC - CREATE BIT FIELD MASK MICRO.
* 
* LOC     BFMIC  PFX,(FIELD1,FIELD2,...,FIELDN) 
* 
*         ENTRY  LOC = NAME OF THE MICRO TO BE CREATED. 
*                PFX = BIT FIELD PREFIX CHARACTERS WITH NO PERIOD.
*                FIELD(I) = SYMBOLIC NAMES OF FIELDS TO BE SET. 
*         EXIT   LOC = MICRO CONTAINING THE 20-OCTAL DIGIT VALUE
*                            (WITH *B* SUFFIX PRESENT). 
* 
*         GENERATES A MICRO WITH 1-BITS IN SPECIFIED FIELDS, AND 0-BITS 
*         ELSEWHERE.  THE DESIGNATED FIELDS MUST HAVE BEEN DECLARED VIA 
*         DESCRIBE/DEFINE.
  
  
          MACRO  BFMIC,LOC,PFX,FLD
 '?DEF#CC MICRO  1,60, 0000000000_0000000000_0000000000_0000000000_00000
,00000_0000000000 
* 
          IRP    FLD
*                            NUMBER OF BITS IN THIS FIELD 
 '?DEF#LL SET    PFX.FLD_L
 '?DEF#11 MICRO  1,'?DEF#LL, 1111111111_1111111111_1111111111_1111111111
,_1111111111_1111111111 
*                            EXTRACT TRAILING BITS
 '?DEF#BB MICRO  61-PFX.FLD_P,,/"'?DEF#CC" /
*                            EXTRACT LEADING BITS 
 '?DEF#DD MICRO 
          IFNE   60-PFX.FLD_P-'?DEF#LL,,1 
 '?DEF#DD MICRO  1,60-PFX.FLD_P-'?DEF#LL, "'?DEF#CC"
* 
*                            MERGE NEW PIECES 
 '?DEF#CC MICRO  1,60, "'?DEF#DD""'?DEF#11""'?DEF#BB" 
          IRP 
*                            CONVERT BINARY TO OCTAL
 LOC       MICRO
 '?DEF#EE  SET
 '?DEF#.1  DUP   60D/3
 '?DEF#EE SET    1+'?DEF#EE 
 '?DEF#FF MICRO  3*'?DEF#EE-2,1, "'?DEF#CC" 
 '?DEF#GG MICRO  3*'?DEF#EE-1,1, "'?DEF#CC" 
 '?DEF#HH MICRO  3*'?DEF#EE-0,1, "'?DEF#CC" 
 '?DEF#HH OCTMIC "'?DEF#FF"*4+"'?DEF#GG"*2+"'?DEF#HH",1 
 LOC      MICRO  1,, "LOC""'?DEF#HH"
 '?DEF#.1 ENDD
* 
 LOC      MICRO  1,, "LOC"B 
 BFMIC    ENDM
 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 
 LAB      BSS 
 '?DEF#ZZ  SET
          IRP    BIT
 '?DEF#PP  SET   PR.BIT_P+PR.BIT_L+SHFT 
          IFGT  '?DEF#PP,60,1 
 '?DEF#PP  SET   '?DEF#PP-60
          IFNE  '?DEF#PP,PR.BIT_L,3 
          POS   '?DEF#PP
          VFD    PR.BIT_L/-0
          SKIP  1 
 '?DEF#ZZ   SET   '?DEF#PP
          IRP 
* 
          IFNE  '?DEF#ZZ,0,3
          POS   '?DEF#ZZ
          VFD   '?DEF#ZZ/-0 
          SKIP   1
          VFD    *P/0 
* 
          ENDM
  
  
 COMADEF  ENDX
