* BEGIN IODMAC1
          SPACE  5
** THE FOLLOWING SET OF MACROS PROVIDE A MEANS OF AIDING THE PP COMPASS
** PROGRAMMER IN MAKING REFERENCES TO CYBIL STRUCTURES.  A PARALLEL DEF-
** INITION DECK IS CREATED TO MATCH THE CYBIL DECLARATIONS.  THIS DECK IS
** INPUT TO PP ASSEMBLIES WHICH REFERENCE THE STRUCTURES.
** REFERENCES TO FIELDS OF A RECORD ARE MADE ACCORDING TO THE FOLLOWING
**
**   1.ALL FIELD NAMES ARE QUALIFIED BY THE RECORD NAME.
**      B.RECORD=BYTE LENGTH OF RECORD
**      P.RECORD=LENGTH OF RECORD IN PP WORDS
**      C.RECORD=LENGTH OF RECORD IN CP WORDS
**
**   2.FIELD DEFINITIONS PRODUCE A SET OF SYMBOLS FOR CODE REFERENCE...
**      /RECORD/C.FIELD=CP WORD OFFSET OF FIELD WITHIN RECORD
**      /RECORD/P.FIELD=PP WORD OFFSET OF FIELD WITHIN RECORD
**      /RECORD/L.FIELD=LEFTMOST BIT OF FIELD IN FIRST PP WORD (0=2**15)
**                      IN UNPACKED RECORDS, FIELDS NOT DESCRIBED AS
**                      MULTIPLES OF BYTES ARE ASSUMED TO BE RIGHT ALIGNED
**                      WITHIN AN INTEGRAL NUMBER OF BYTES.  GARBAGE IS
**                      ASSUMED IN THE LEFT (UNUSED) BIT POSITIONS.
**      /RECORD/N.FIELD=NUMBER OF BITS IN THE FIELD (INCLUDING UNUSED BITS
**                      IN JUSTIFIED FIELDS).
**      /RECORD/B.FIELD=BYTE COUNT OF FIELD.
          SPACE  5
** RECORD DEFINITION MACRO
** NAME IS NAME WITH WHICH THE REFERENCES TO THE FIELDS OF THE RECORD
** MUST BE QUALIFIED.  PACKING IS *PACKED* OR OTHER TO INDICATE THE
** ATTRIBUTE OF THE CYBIL RECORD DEFINITION.
          SPACE  3
          MACRO  RECORD,NAME,PACKING
          QUAL   NAME
BITC      SET    0
PACKED    SET    0
          IFC    EQ,*PACKING*PACKED*,1
PACKED    SET    1
          ENDM
          SPACE  5
** RECEND MACRO
** DEFINE THE END OF A RECORD
          SPACE  3
          MACRO  RECEND,NAME
          QUAL
B.NAME    SET    /NAME/BITC+7
B.NAME    SET    B.NAME/8
P.NAME    SET    B.NAME+1
P.NAME    SET    P.NAME/2
C.NAME    SET    P.NAME+3
C.NAME    SET    C.NAME/4
          ENDM
          SPACE  5
** FIELD DEFINITION MACRO
** THIS MACRO DEFINES A FIELD WITHIN A RECORD IN TERMS OF ITS STARTING
** PP WORD NUMBER, LEFTMOST BIT WITHIN THE PP WORD, NUMBER OF BITS IN
** THE FIELD, AND NUMBER OF BYTES IN THE FIELD.
** NAME-NAME OF FIELD FOR QUALIFIED REFERENCES
** LENGTH-NUMBER OF BITS IN FIELD
          SPACE  3
          MACRO  FIELD,NAME,LENGTH
*PP WORD OFFSET
P.NAME    SET    BITC/16

* CP WORD OFFSET
C.NAME    SET    BITC/64

* LEFTMOST BIT IN WORD 0 (0 FROM LEFTMOST, 15=RIGHTMOST)
L.NAME    SET    BITC-P.NAME*16

* BIT LENGTH
N.NAME    SET    LENGTH

* BYTE COUNT
B.NAME    SET    LENGTH+7
B.NAME    SET    B.NAME/8

* INCREMENT BIT COUNTER
BITC      SET    BITC+N.NAME
          ENDM
          SPACE  5
** LOG2 MACRO
** THIS IS A SUPPORT MACRO TO ASSIST IN DETERMINING SUBRANGE STORAGE
** REQUIREMENTS.  THE PARAMETER IS THE VALUE WHICH MUST BE SIZED.
** THE BIT COUNT REQUIRED TO REPRESENT THE PARAMETER VALUE IS RETURNED
** IN ASSEMBLY VARIABLE LOG2$.
          SPACE  3
LOG2      MACRO  N
          LOCAL  J
LOG2$     SET    1
J         SET    N/2
          DUP    32
          IFGT   J,0,2
LOG2$     SET    LOG2$+1
J         SET    J/2
          ENDD
          ENDM
          SPACE  5
** MGEN MACRO
** THIS IS A SUPPORT MACRO FOR THE LOAD/STORE MACROS
** THE LENGTH PARAMETER IS THE LENGTH OF A FIELD OF RJ BITS IN A
** 16 BIT WORD.  THE VALUE OF MASK$ UPON EXIT FROM THE MACRO IS
** A 16 BIT MASK TO ZERO FILL THE RIGHT JUSTIFIED BIT PATTERN.
          SPACE  3
MGEN      MACRO  LENGTH
MASK$     SET    0
          DUP    LENGTH
MASK$     SET    MASK$+MASK$+1
          ENDD
          ENDM
          SPACE  5
** ALIGN MACRO
** MACRO TO ALIGN THE CURRENT BIT COUNTER TO BE *OFFSET* MOD *MODULUS*
** EXAMPLE ALIGN 0,8 FORCES BYTE BOUNDARY.
          SPACE  3
ALIGN     MACRO  OFFSET,MODULUS
          LOCAL M

* VERIFY PARAMETERS
          IFGE   OFFSET,MODULUS,1
M         ERR                      MODULUS MUST EXCEED OFFSET
          IFLE   MODULUS,0,1
M         ERR                      MODULUS MUST EXCEED 0

M         SET    BITC+MODULUS-OFFSET-1
M         SET    M/MODULUS*MODULUS
BITC      SET    M+OFFSET
          ENDM
          SPACE  5
** INTEGER MACRO
** THIS MACRO DEFINES THE NAMED FIELD AS A CYBIL INTEGER
          SPACE  3
          MACRO  INTEGER,NAME
          ALIGN  0,8
NAME      FIELD  64
          ENDM
          SPACE  5
** CHARACTER MACRO
** THIS MACRO DEFINES THE NAMED FIELD AS AN EIGHT BIT CHARACTER
          SPACE  3
          MACRO  CHARC,NAME
          IFEQ   PACKED,0,1
          ALIGN  0,8               BYTE ALIGNED IF UNPACKED
NAME      FIELD  8
          ENDM
          SPACE  5
** ORDINAL MACRO
** THIS MACRO DEFINES THE NAMED FIELD AS AN ORDINAL OF RANGE 0..N
          SPACE  3
          MACRO  ORDINAL,NAME,N
          LOCAL Q
Q         SET    N-1
NAME      SUBRANGE 0,Q
          ENDM
          SPACE  5
** BOOLEAN MACRO
** THIS MACRO DEFINES THE NAMED FIELD AS A BOOLEAN VALUE
          SPACE  3
          MACRO  BOOLEAN,NAME
PK        IFEQ   PACKED,1
* PACKED RECORD
NAME      FIELD  1
PK        ELSE
* NOT PACKED, FORCE BYTE BOUNDARY THEN RIGHT ALIGNMENT
          ALIGN  0,8
          ALIGN  7,8
NAME      FIELD  1
PK        ENDIF
          ENDM
          SPACE  5
** STRING MACRO
** THIS MACRO GENERATES A STRING OF SPECIFIED LENGTH
          SPACE  3
          MACRO  STRING,NAME,LENGTH
          ALIGN  0,8               STRINGS ARE ALWAYS BYTE ALIGNED
NAME      FIELD  LENGTH*8
          ENDM
          SPACE  5
** STRUCT MACRO
** THIS MACRO IS USED WHEN A STRUCTURE (BYTE ALIGNED) AND OF SPECIFIED
** BYTE LENGTH IS EMBEDDED IN A RECORD.
          SPACE  3
          MACRO  STRUCT,NAME,LENGTH
          ALIGN  0,8
NAME      FIELD  LENGTH*8
          ENDM
          SPACE  5
** SUBRANGE MACRO
** THIS MACRO DEFINES THE NAMED FIELD AS A SUBRANGE OF A..B
          SPACE  3
          MACRO  SUBRANGE,NAME,A,B
          LOCAL Q
PK        IFEQ   PACKED,1
* PACKED RECORD
ANEGP     IFLT   A,0
Q         SET    -A
          IFLE   Q,B,1
Q         SET    B+1
          LOG2   Q
Q         SET    LOG2$+1
ANEGP     ELSE
          LOG2   B
Q         SET    LOG2$
ANEGP     ENDIF

NAME      FIELD  Q
PK        ELSE

* UNPACKED RECORD
          ALIGN  0,8
ANEGU     IFLT   A,0
* NEGATIVE LOWER BOUNT REQUIRES 8 BYTES
NAME      FIELD  64
ANEGU     ELSE

* USE UPPER BOUND
          LOG2   B
Q         SET    LOG2$+7
Q         SET    Q/8*8
NAME      FIELD  Q
ANEGU     ENDIF

PK        ENDIF
          ENDM
          SPACE  5
** PPWORD MACRO
** THIS MACRO CAUSES THE NAMED FIELD TO BE DEFINED AS AN ALIGNED PP WORD
** IT IS USED AS A DOCUMENTATION AID TO REMIND THE PROGRAMMER THAT THE
** CYBIL STRUCTURE IS DESIGNED TO ACCOMODATE PP REFERENCE.
          SPACE  3
          MACRO  PPWORD,NAME
          ALIGN  0,16
NAME      FIELD  16
          ENDM
          SPACE  5
** RMA MACRO
** THIS IS A CONVENIENCE MACRO FOR RMA FIELD DEFINITION (BYTE ALIGNMENT
** IS ASSUMED).
          SPACE  3
          MACRO  RMA,NAME
          ALIGN  0,8
NAME      FIELD  32
          ENDM
          SPACE  5
** MLOAD MACRO
** MACRO TO PERFORM A 16 BIT LOAD FROM PP MEMORY USING THE LDDL OR LDML
** INSTRUCTION.  USED TO SUPPORT THE LOAD MACRO.
          SPACE  3
MLOAD     MACRO  W
M         IFLE   W,77B
          LDDL   W
M         ELSE
          LDML   W
M         ENDIF
          ENDM
          SPACE  5
** MSTORE MACRO
** MACRO TO PERFORM A 16 BIT STORE TO PP MEMORY USING THE STDL OR STML
** INSTRUCTION.  USED TO SUPPORT THE STORE MACRO.
          SPACE  3
MSTORE    MACRO  W
M         IFLE   W,77B
          STDL   W
M         ELSE
          STML   W
M         ENDIF
          ENDM
* END IODMAC1
