*DECK S$GNMAC 
          IDENT  S$GNMAC
          TITLE  S$GNMAC -  GENERATE A MACRO CALL 
          COMMENT  GENERATE A MACRO CALL
          SPACE  4
**        S$GNMAC -  GENERATE A MACRO CALL
* 
*     CALLING SEQUENCE- 
*         GENMAC (<MACRO CALL>) 
*       OR
*         SX1    NWORDS*100B+NEWPOS    NWORDS = NO. WORDS TO MOVE 
*         RJ     S$GNMAC               NEWPOS = NEW VALUE FOR S$POS 
* +       <MACRO CALL>
* 
*     GIVEN-
*         S$LOC = ADDRESS WHERE NEXT INSTRUCTION WILL BE STORED AND 
*          LATER EXECUTED.
*         S$POS = POSITION WITHIN WORD AT S$LOC WHERE INSTRUCTION WILL
*          BE STORED.   (VALUE IS 45, 30, 15 OR 0)
* 
*     DOES- 
*         FORCES UPPER. 
*         APPENDS THE INSTRUCTIONS COMPRISING <MACRO CALL>. 
*         UPDATES S$LOC AND S$POS APPROPRIATELY.
* 
*     USES-      B    * - - - - 6 7    *B1=1
*                X  - 1 2 3 - - 6 - 
*                A  - 1 2 3 - - 6 - 
  
  
          ENTRY  S$GNMAC
 S$GNMAC  SUBR
  
*     FORCE UPPER IF NECESSARY
  
          SA2    S$POS       POSITION COUNTER (45, 30, 15 OR 0) 
          IFTHEN X2"0        IF NOT ON WORD BOUNDARY
            SB7    X2-59       MASK FOR NO-OP INSTRUCTIONS
            MX6    1
            SB7    -B7
            AX6    X6,B7
            SA3    =00000460006100046000B 
            BX6    -X6*X3      KEEP ONLY USED INSTRUCTIONS
            SA2    S$LOC       X2 = ADDRESS OF PARTLY FILLED WORD 
            SA3    X2          INSERT NO-OP INSTRUCTIONS
            BX6    X3+X6
            SA6    A3 (S$LOC)  STORE COMPLETE WORD
            SX6    X2+B1       INCREMENT S$LOC
            SA6    A2 S$LOC 
            ENDIF.
  
*     SET NEW POSITION COUNTER
  
          MX6    -6          77777777777777777700B
          BX6    -X6*X1 
          SA6    S$POS
  
*     COPY THE APPROPRIATE NUMBER OF WORDS
  
          AX1    6           X1 = NUMBER OF WORDS TO MOVE 
          IFTHEN X6"0        IF INCR FOR S$LOC IS X1-1
            SX6    -1          REMEMBER THE -1
            ENDIF.             X6 = 0 OR -1 
          IX6    X6+X1       SET THE INCREMENT FOR S$LOC
          SX3    X1          SAVE NO. WORDS FOR EXIT
          SA2    S$GNMAC     12/0400B,18/<RETURN ADDRESS>,30/0
          LX2    30          30/0,12/0400B,18/<RETURN ADDRESS>
          SB6    X2-1        B6 = <SOURCE ADDRESS> - 1
          SA2    S$LOC       ADDRESS FOR NEXT INSTRUCTION 
          SB7    X2-1        B7 = <DESTINATION ADDRESS> - 1 
          IX6    X6+X2       NEW S$LOC
          SA6    S$LOC
 GNMAC1   SA2    B6+X1       GET WORD FOLLOWING (RJ S$GNMAC)
          BX6    X2 
          SA6    B7+X1       STORE WITH GENERATED CODE
          SX1    X1-1        DECREMENT INDEX
          NZ     X1,GNMAC1   IF MORE WORDS TO MOVE, LOOP
  
          SA2    S$GNMAC
          LX2    30          RIGHT-JUSTIFY NORMAL RETURN ADDRESS
          SB7    X2 
          SB7    B7+X3       SKIP THE PARAMETER TO GNMAC
          JP     B7          EXIT TO CALLER 
  
  
 S$LOC    EXTERNAL           ADDRESS WHERE NEXT INSTRUCTION WILL BE 
                             STORED AND LATER EXECUTED
  
 S$POS    EXTERNAL           POSITION WITHIN WORD AT S$LOC WHERE
                             INSTR. WILL BE STORED  (45, 30, 15 OR 0) 
  
  
          END 
