*DECK S$GNIMG 
          PROC  S$GNIMG(IMTBL$, REC$, SPEC$, CODE$);
  
#**       S$GNIMG -  GENERATE INTERMEDIATE-MERGE-CODE                  #
#                                                                      #
#     CALLING SEQUENCE-                                                #
#         S$GNIMG(IMTBL$, REC$, SPEC$, CODE$):                         #
#                                                                      #
#     GIVEN-                                                           #
#         IMTBL$ = FORMAT OF INTERMEDIATE MERGE TABLE                  #
#         REC$ = FORMAT OF INTERNAL RECORD.                            #
#         SPEC$ = USER SPECIFICATION.                                  #
#         CODE$ = LOCATION FOR GENERATED CODE.                         #
#                                                                      #
#     DOES-                                                            #
#         GENERATES INTERMEDIATE-MERGE-CODE INTO CODE$.                #
  
  
          BEGIN 
  
*CALL A 
  
*CALL IMTBL$
  
*CALL REC$
  
*CALL SPEC$ 
  
*CALL CODE$ 
  
          XREF
              BEGIN 
              PROC  S$CMSLF;           # SHRINK MEMORY BLOCK AT LWA    #
              PROC  S$ABORT;           # HANDLE INTERNAL ABORT         #
              PROC  S$GNCMP;           # GEN- COMPARE CODE             #
              PROC  S$GNGIB;           # GEN- GET RECORD FROM FILE     #
              PROC  S$GNIM1;           # GEN- INTMRG-CODE , PART 1     #
              PROC  S$GNIM2;           # GEN- INTMRG-CODE , PART 2     #
              PROC  S$GNIM3;           # GEN- INTMRG-CODE , PART 3     #
              PROC  S$GNIM4;           # GEN- INTMRG-CODE , PART 4     #
              PROC  S$GNPIB;           # GEN- PUT RECORD TO FILE       #
              PROC  S$GNSUM;           # GEN- SUMMING CODE             #
              PROC  S$INITL;           # INITIALIZE  LABELS            #
              END 
  
  
          XREF
              BEGIN                    # USED BY S$GNINV               #
              ITEM  S$IRRL   I;        # REC$IRRL                      #
              ITEM  S$LK     I;        # NUMBER OF USED KEY BITS       #
              ITEM  S$LR     I;        # NUMBER OF BITS FOR REC. NUM.  #
              ITEM  S$OREC   I;        # WSA$ OFFSET TO EXTERNAL REC   #
              ITEM  S$ORSA   I;        # WSA$ OFFSET TO REC STOR AREA  #
              END 
  
           XREF 
              BEGIN 
              ITEM  S$LOC    I;        # ABSOLUTE ADDRESS FOR NEXT INST#
              ITEM  S$POS    I;        # NEXT FREE BIT FOR INST, 0=LEFT#
              ITEM  S$ACODE  I;        # ABS. ADDRESS OF FIRST CODE WD #
              ITEM  S$LCODE  I;        # LENGTH OF CODE$               #
              END 
  
          ITEM  BUFREC       B;        # TRUE IF REMAINDER OF REC. IN  #
                                       #   BUFFER RATHER THAN IN RSA   #
          ITEM  LF           I;        # L. OF NON-KEY, NON-SUM FIXED  #
                                       # (I.E. REC$LF1 + REC$LF2)      #
          ITEM  LL           I;        # LENGTH OF LENGTH FIELD        #
                                       # (I.E. REC$LL1 + REC$LL2)      #
          ITEM  LONGKEY      I;        # LENGTH IN WORDS OF REMAINDER  #
                                       #  OF KEY IN BUFFER             #
          ITEM  OFFSET       I;        # BIT OFFSET TO LENGTH FIELD    #
                                       # (I.E. 1+1+LR+LK+LO+LS)        #
          ITEM  UNUSED       I;        # PARAMETER TO S$CMSLF          #
  
          CONTROL DISJOINT ;
  
          CONTROL INERT ; 
  
CONTROL EJECT ; 
  
          S$INITL;                               # INITIALIZE LABELS   #
          S$ACODE = LOC(CODE$WORD[1]);           # FOR S$GEN, S$GNLBL  #
          S$LCODE = CODE$LENGTH;                 # FOR S$GEN           #
          S$LOC = S$ACODE;                       # FOR S$GEN, S$GNLBL  #
          S$POS = 0;                             # FOR S$GEN, S$GNLBL  #
  
  
#     SET GLOBALS USED BY LOW-LEVEL CODE GENERATORS                    #
  
          S$IRRL = REC$IRRL;
          S$LK = 0; 
          S$LR = REC$LR;
          S$OREC = 0; 
          S$ORSA = 0; 
  
          LONGKEY = ( ( REC$LK2 + REC$LO2 + REC$LS2 ) / 60 ) + 1; 
  
          S$GNIM1(REC$LR, LONGKEY, REC$IRRL); 
  
          S$GNGIB(REC$LR, LONGKEY, REC$IRRL); 
  
          S$GNIM2;
  
          BUFREC = TRUE;
  
  
          $BEGIN
          IF REC$LO1+REC$LO2 NQ 0 AND SPEC$1STSUM NQ 0 THEN 
              S$ABORT("S$GNIMG"); 
          $END
  
          S$GNCMP(0, REC$IRRL, REC$LR, REC$LK1, REC$LK2,
                  REC$LO1, REC$LO2, BUFREC, SPEC$1STSUM); 
  
          IF SPEC$1STSUM NQ 0 THEN
              S$GNSUM(SPEC$, 0, REC$IRRL, REC$LR, BUFREC);
  
          S$GNIM3;
  
          LL = REC$LL1 + REC$LL2; 
          LF = REC$LF1 + REC$LF2; 
          OFFSET = 1 + 1 + REC$LR + REC$LK1 + REC$LK2 
                   + REC$LO1 + REC$LO2 + REC$LS1 + REC$LS2; 
          S$GNPIB(SPEC$FIXED, REC$IRRL, REC$LR, OFFSET, LL, LF);
  
          S$GNIM4;
  
          CODE$USED = S$LOC - S$ACODE + 1;       # (+1 FOR PART WORD)  #
  
          UNUSED = CODE$LENGTH - CODE$USED; 
          S$CMSLF(CODE$, UNUSED); 
  
          END  # S$GNIMG #
          TERM
