*DECK S$GNRL
          IDENT  S$GNRL 
          TITLE  S$GNRL -  GENERATE- REVERT LOGICAL 
          COMMENT  GENERATE- REVERT LOGICAL 
          SPACE  4
**        S$GNRL -  GENERATE- REVERT LOGICAL
* 
*     CALLING SEQUENCE- 
*         S$GNRL(OFFSET,LENGTH,ASC);#(S$IRRL,S$LK,S$LR,S$OREC,S$ORSA)#
* 
*     GIVEN-
*         OFFSET = BIT OFFSET OF LEFT-MOST BIT IN EXTERNAL FIELD. 
*          THE FIRST BIT OF THE RECORD IS BIT NUMBER 0. 
*         LENGTH = NUMBER OF BITS IN THE EXTERNAL FIELD.
*         ASC = NON-ZERO IFF SORT ORDER IS ASCENDING. 
*         S$IRRL = NUMBER OF WORDS PER SLOT IN THE RECORD STORAGE AREA. 
*          (USED BY S$GNRNX)
*         S$LK = NUMBER OF BITS OF INFORMATION THAT HAVE BEEN PREVIOUSLY
*          REVERTED.
*         S$LR = NUMBER OF BITS RESERVED FOR RECORD NUMBER. 
*         S$OREC = WORD OFFSET WITHIN WSA$ FOR EXTERNAL RECORD. 
*         S$ORSA = WORD OFFSET WITHIN WSA$ OF RECORD STORAGE AREA.
*          (USED BY S$GNRNX)
* 
*     DOES- 
*         GENERATES CODE. 
*         INCREMENTS S$LK BY THE LENGTH OF THIS INTERNAL FIELD. 
* 
*     GENERATED CODE EXPECTS- 
*         *B1 = 1.
*         *B2 = ADDRESS OF WORKING STORAGE AREA  (WSA$).
*         (IF 1+1+S$LR+S$LK IS LESS THAN 60,) 
*             THE INTERNAL RECORD IS SPECIFIED IN X6. 
*         (ELSE)
*             *A0 IS THE ADDRESS OF THE WORD CONTAINING BIT 1+S$LR+S$LK.
* 
*     GENERATED CODE DOES-
*         (BASED ON *LENGTH* AND THIS TYPE,)
*             REVERTS THE FIELD STARTING AT BIT 1+S$LR+S$LK AND 
*              PUTS IT IN THE EXTERNAL RECORD AREA (DETERMINED BY 
*              S$OREC) ACCORDING TO *OFFSET* AND *LENGTH*.
* 
*     GENERATED CODE USES-
*         B    * * - - - - -    *B1=1, *B2=WSA$ 
*         X  0 - - 3 4 - * 7    *X6=DESCRIPTOR
*         A  0 - - 3 4 - - 7
  
  
          ENTRY  S$GNRL 
 S$GNRL   SUBR
          SB1    1           SET B1=1 FOR *GEN* 
          SA2    X1          VALUE OF OFFSET
          SB2    X2          B2 = OFFSET
          SA2    A1+1        ADDRESS OF LENGTH
          SA2    X2          VALUE OF LENGTH
          SB3    X2          B3 = LENGTH
          SA2    A1+2        ADDRESS OF ASC 
          SA2    X2          VALUE OF ASC 
          SX7    X2          X7 = ASC 
  
          SB5    60 
          IFTHEN B3@B5       IF LENGTH LQ 60
            SB5    B3        ASK S$GNRNX FOR THAT MANY BITS 
            ENDIF.           (ELSE ASK S$GNRNX FOR 60 BITS) 
                             S$IRRL, S$LR,S$LK,S$ORSA 
          CALL   S$GNRNX               *X4 CONTAINS INTERNAL FIELD
         *USES   B4,B6,B7,X0,AX1-3,AX6
                             X5 = OFFSET WITHIN *X4 OF INTERNAL FIELD 
                             S$LK INCREMENTED BY B5 
  
GNRL0     IFTHEN X7"0        IF ASCENDING 
            GEN    (BX7 X4) 
          ELSE-              IF DESCENDING
            GEN    (MX3 60) 
            GEN    (BX7 X3-X4)
            ENDIF.
  
                             B2 = OFFSET OF EXTERNAL FIELD
                             B3 = LENGTH OF EXTERNAL FIELD
                             X5 = OFFSET WITHIN *X7 OF EXTERNAL FIELD 
                             S$OREC 
          CALL   S$GNRST               *STORE *X7 IN EXTERNAL RECORD
         *USES   (SAME AS GEN),X4 
  
***************** 
* 
*  SEE IF WE ARE DONE 
* 
***************** 
  
          SB5    60 
          SB3    B3-B5
          IFTHEN B3>0        WE ARENT DONE
            SB2    B2+B5     INCREASE THE OFFSET FOR S$GNRST
            IFTHEN  B3@B5    IF LENGTH LQ 60
              SB5   B3       ASK S$GNRNX FOR THAT MANY BITS 
              ENDIF.         (ELSE ASK S$GNRNX FOR 60 BITS) 
            CALL S$GNRNX
            EQ   GNRL0
          ELSE- 
            EXIT
            ENDIF.
          END 
