* BEGIN IODMAC2
          SPACE  5
** THESE MACROS MAY USE T1-T8 WITH IN LINE CODE GENERATION OR INDIRECTLY
** THROUGH CALLS TO THE LOAD/STORE SUPPORT ROUTINES
          SPACE  5
** LOAD MACRO
** LOAD A FIELD INTO A AND RIGHT JUSTIFY, ZERO FILL THE REGISTER
** INPUT..RLOC=LOCATION OF BEGINNING OF RECORD
**        RNAME=RECORD NAME
**        FIELD=FIELD NAME (MUST BE LESS THAN 17 BITS LONG)
** OUTPUT..(A)=/RECORD/FIELD RJZF
** USES T1, T2 WHEN FIELDS CROSS PP WORD BOUNDARIES
          SPACE  3
LOAD      MACRO  RLOC,RNAME,FIELD
          LOCAL T
ERCHK     IFGT   /RNAME/N.FIELD,16
M         ERR    FIELD TOO LARGE
ERCHK     ELSE

* TEST WHETHER FIELD CROSSES PP WORD BOUNDARIES AND IF IT DOES NOT,
* GENERATE THE LOAD IN LINE.
L1        IFLE   /RNAME/N.FIELD+/RNAME/L.FIELD,16

* LOAD IT
          LDML   /RNAME/P.FIELD+RLOC

* SHIFT IT
T         SET    16-/RNAME/N.FIELD-/RNAME/L.FIELD
          IFNE   T,0,1
          SHN    -T

* MASK IT
M0        IFNE   /RNAME/L.FIELD,0
M1        IFNE   /RNAME/N.FIELD,16
          MGEN   /RNAME/N.FIELD
M2        IFGT   MASK$,77B
          LPC    MASK$
M2        ELSE
          LPN    MASK$
M2        ENDIF
M1        ENDIF
M0        ENDIF

L1        ELSE

* CROSSES WORD BOUNDARIES
          RJM    LOADF
          VFD    4/0,12/RLOC+/RNAME/P.FIELD
          VFD    4//RNAME/L.FIELD,12//RNAME/N.FIELD

L1        ENDIF

ERCHK     ENDIF

          ENDM
          SPACE  5
** STORE MACRO
** THIS MACRO STORES THE CONTENTS OF A INTO A FIELD IN PP MEMORY.
** THE FIELD MAY CROSS PP WORD BOUNDARIES BUT MUST NOT EXCEED 16
** BITS IN LENGTH.
** INPUT...RLOC=LOCATION OF BEGINNING OF RECORD
**         RNAME=RECORD NAME
**         FIELD=FIELD NAME (MUST BE A FIELD OF 16 OR LESS BITS IN LENGTH)
**         (A)=RJZF VALUE TO STORE.  (IT MUST NOT EXCEED FIELD WIDTH OR
**             UNPREDICTABLE RESULTS WILL OCCUR).
**
** OUTPUT..RECORD UPDATED IN PP MEMORY.
**
** USES T1, T2 PLUS REFERENCE STOREF
          SPACE  3
STORE     MACRO  RLOC,RNAME,FIELD
          LOCAL  X
ERCHK     IFGT   /RNAME/N.FIELD,16
M         ERR    FIELD TOO LARGE
ERCHK     ELSE

* TEST WHETHER FIELD CROSSES PP WORD BOUNDARIES AND IF IT DOES NOT,
* GENERATE IN LINE CODE.
L1        IFLE   /RNAME/N.FIELD+/RNAME/L.FIELD,16
L2        IFEQ   /RNAME/N.FIELD,16

* FULL PP WORD
          STML   /RNAME/P.FIELD+RLOC

L2        ELSE

* ALIGN SOURCE VALUE
X         SET    16-/RNAME/N.FIELD-/RNAME/L.FIELD
          IFNE   X,0,1
          SHN    X

* STORE ALIGNED VALUE
          STDL   T1

* LOAD DEST. FIELD
          LDML   /RNAME/P.FIELD+RLOC

* FORM SHIFTED MASK VALUE
          MGEN   /RNAME/N.FIELD

          DUP    X
MASK$     SET    MASK$+MASK$
          ENDD

* GENERATE MASK INSTRUCTION
          LPC    -MASK$

* INSERT DATA
          ADDL   T1

* REPLACE
          STML   /RNAME/P.FIELD+RLOC

L2        ENDIF

L1        ELSE

* FIELD CROSSES WORD BOUNDARIES
          RJM    STOREF
          VFD    4/0,12/RLOC+/RNAME/P.FIELD
          VFD    4//RNAME/L.FIELD,12//RNAME/N.FIELD

L1        ENDIF
ERCHK     ENDIF
          ENDM
* END IODMAC2
