*DECK S$GNRST 
          IDENT  S$GNRST
          TITLE  S$GNRST -  GENERATE- STORE INTO EXTERNAL RECORD
          COMMENT  GENERATE- STORE INTO EXTERNAL RECORD 
          SPACE  4
**        S$GNRST -  GENERATE- STORE INTO EXTERNAL RECORD 
* 
*     CALLING SEQUENCE- 
*         CALL   S$GNRST
* 
*     GIVEN-
*         B2 = BIT OFFSET OF LEFT-MOST BIT IN EXTERNAL FIELD. 
*          THE FIRST BIT OF THE RECORD IS BIT NUMBER 0. 
*         B5 = BIT LENGTH OF EXTERNAL FIELD.
*         X5 = BIT OFFSET OF LEFT-MOST BIT OF FIELD IN *X7
*         S$OREC = WORD OFFSET WITHIN WSA$ FOR EXTERNAL RECORD. 
* 
*     DOES- 
*         GENERATES CODE. 
* 
*     GENERATED CODE EXPECTS- 
*         *B1 = 1.
*         *B2 = ADDRESS OF WORKING STORAGE AREA (WSA$). 
*         *X7 CONTAINS THE FIELD TO BE INSERTED.
*           IT IS B5 BITS LONG AND HAS X5 UNUSED BITS TO THE LEFT.
* 
*     GENERATED CODE DOES-
*         STORES THE FIELD INTO THE EXTERNAL RECORD (OFFSET S$OREC
*          WITHIN WSA$).
* 
*     GENERATED CODE USES-
*         B    * * - - - - -    *B1=1, *B2=WSA$ 
*         X  0 - - 3 - - - 7
*         A  - - - 3 - - - 7
* 
*     S$GNRST USES- 
*         B    - - - - - 6 7
*         X  0 1 2 3 4 - 6 -
*         A  - 1 2 3 - - 6 -
  
  
          ENTRY  S$GNRST
 S$GNRST  SUBR
  
*     ENSURE THAT THE REST OF *X7 IS ZERO 
  
          SB7    X5          OFFSET WITHIN *X7 OF EXTERNAL FIELD
          SB6    60 
          IFTHEN B7=0        IF LEFT-JUSTIFED 
            SB7    X5+B5     OFFSET + LENGTH
            IFTHEN B7=B6       IF RIGHT-JUSTIFED
                                 RETAIN FULL WORD 
            ELSE-              IF NOT RIGHT-JUSTIFIED 
              GEN    (MX0 0),B5        *MX0 LENGTH
              GEN    (BX7 X0*X7)
              ENDIF.
          ELSE-              IF NOT LEFT-JUSTIFIED
            SB7    X5+B5     OFFSET + LENGTH
            IFTHEN B7=B6       IF RIGHT-JUSTIFIED 
              GEN    (MX0 0),X5        *MX0 OFFSET
              GEN    (BX7 -X0*X7) 
            ELSE-              IF NOT RIGHT-JUSTIFIED 
              GEN    (MX0 0),B5        *MX0 LENGTH
              BX1    -X5         -OFFSET
              GEN    (LX0 60),X1       *LX0 -OFFSET 
              GEN    (BX7 X0*X7)
              ENDIF.
            ENDIF.
  
*     SET *X5 = FIRST WORD OF EXTERNAL RECORD 
*     SET X4  = BIT OFFSET OF EXTERNAL FIELD IN *X5 
  
          SX1    B2          OFFSET IN EXTERNAL RECORD FOR FIELD
          SX0    1S22/60+1   1/60 * 2**22 
          IX4    X1*X0       OFFSET/60 * 2**22
          AX4    22          OFFSET/60
          SA1    S$OREC      WORD OFFSET IN WSA$ TO EXTERNAL RECORD 
          IX1    X1+X4       <OFFSET TO RECORD> + <OFFSET WITHIN RECORD>
          GEN    (SA3 B2+0),X1         *B2 = WORD FOR FIELD 
          SX0    60 
          IX4    X4*X0       (OFFSET/60)*60 
          SX1    B2          OFFSET 
          IX4    X1-X4       BIT OFFSET WITHIN *X5
  
*     ALIGN *X7 WITH *X5
                             X5 = OFFSET WITHIN *X7 
                             X4 = OFFSET WITHIN *X5 
          IX1    X5-X4
          IFTHEN X1<0 
            SX1    X1+60
            ENDIF.
          IFTHEN X1"0 
            GEN    (LX7 0),X1 
            ENDIF.
  
*     INSERT *X7 INTO *X5 AND STORE 
  
          IFTHEN X4"0        IF TARGET NOT LEFT-JUSTIFED
*           (SOME OF THE BELOW IS REDUNDANT IF WE ARE STORING 
*            INTO ONLY ONE WORD, BUT IT STILL WORKS.) 
            GEN    (MX0 0),X4 
          GEN    (BX2 X7) 
            GEN    (BX7 -X0*X7) 
          GEN    (BX0 X0*X2)
            GEN    (BX7 -X0*X7) 
            GEN    (BX7 X3+X7)
            GEN    (SA7 A3) 
            GEN    (SA3 A3+B1)
            GEN    (BX7 X0+X3)
            GEN    (SA7 A3) 
          ELSE-              IF LEFT-JUSTIFIED
            GEN    (BX7 X7+X3)
            GEN    (SA7 A3) 
            ENDIF.
  
          EXIT
  
  
 S$OREC   EXTERNAL           WORD OFFSET WITHIN WSA$ FOR EXTERNAL RECORD
  
  
          END 
