*DECK S$GNSHT 
          PROC  S$GNSHT(SPEC$, WSAS$, REC$);
  
#**       S$GNSHT -  GENERATE SHORT-CODE                               #
#                                                                      #
#     CALLING SEQUENCE-                                                #
#         S$GNSHT(SPEC$, WSAS$, REC$):                                 #
#                                                                      #
#     GIVEN-                                                           #
#         SPEC$ = USER SPECIFICATION.                                  #
#         WSAS$ = ALLOCATION OF WORKING STORAGE AREA FOR SORT.         #
#         REC$ = FORMAT OF INTERNAL RECORD.                            #
#                                                                      #
#     DOES-                                                            #
#         GENERATES SHORT-CODE INTO CODE$.                             #
  
  
          BEGIN 
  
*CALL A 
  
*CALL REC$
  
*CALL SPEC$ 
  
*CALL WSAS$ 
  
          XREF
              BEGIN 
              PROC  S$ABORT;           # HANDLE INTERNAL ABORT         #
              PROC  S$GNCMP;           # GEN- COMPARE CODE             #
              PROC  S$GNPRU;           # GEN- PUT RECORD TO USER       #
              PROC  S$GNSH1;           # GEN- SHORT-CODE, PART 1       #
              PROC  S$GNSH2;           # GEN- SHORT-CODE, PART 2       #
              PROC  S$GNSH3;           # GEN- SHORT-CODE, PART 3       #
              PROC  S$GNSUM;             #GEN- SUMMING CODE            #
              END 
  
          XREF
              BEGIN                    # USED BY S$GNINV OR S$GNREV    #
              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 
  
  
  
          ITEM  BUFREC       B;        # TRUE IF REMAINDER OF REC. IN  #
                                       #   BUFFER RATHER THAN IN RSA   #
  
          CONTROL DISJOINT ;
  
          CONTROL INERT ; 
  
CONTROL EJECT ; 
  
#     SET GLOBALS USED BY LOW-LEVEL CODE GENERATORS                    #
  
          S$IRRL = REC$IRRL;
          S$LK = 0; 
          S$LR = REC$LR;
          S$OREC = WSAS$OREC; 
          S$ORSA = WSAS$ORSA; 
  
          S$GNSH1(WSAS$LTRN, REC$LR, SPEC$OUTFIT, WSAS$OREC,
                                                     SPEC$FASTOUT); 
  
  
          $BEGIN
          IF REC$LO1+REC$LO2 NQ 0 AND SPEC$1STSUM NQ 0 THEN 
              S$ABORT("S$GNSHT"); 
          $END
  
  
  
          BUFREC = FALSE; 
          S$GNCMP(WSAS$ORSA,REC$IRRL,REC$LR,REC$LK1,REC$LK2,
                  REC$LO1,REC$LO2,BUFREC,SPEC$1STSUM);
  
          IF SPEC$1STSUM NQ 0 THEN
              S$GNSUM(SPEC$,WSAS$ORSA,REC$IRRL,REC$LR,BUFREC);
  
          S$GNSH2;
  
          S$GNPRU(SPEC$, WSAS$OREC, WSAS$ORSA, REC$); 
  
          S$GNSH3(WSAS$LTRN, REC$LR); 
  
          END  # S$GNSHT #
          TERM
