*DECK S$GNRI
          IDENT  S$GNRI 
          TITLE  S$GNRI -  GENERATE- REVERT INTEGER 
          COMMENT  GENERATE- REVERT INTEGER 
          SPACE  4
**        S$GNRI -  GENERATE- REVERT INTEGER
* 
*     CALLING SEQUENCE- 
*         S$GNRI(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. 
*         KEYORSUM = 1 FOR SUM, 0 FOR KEY 
*         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$GNRI 
 S$GNRI   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 
          SA2    A1+3        ADDRESS OF KEYORSUM
          SA2    X2          VALUE OF KEYORSUM
          SA0    X2          HIDE KEYORSUM IN A0
  
          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 
******************
* 
* IF THIS IS A SORT-KEY ( AND NOT A SUM-FIELD), WE
* NEED TO FLIP THE SIGN BIT BACK TO WHAT IT WAS 
* ORIGINALLY BEFORE WE DO ANYTHING ELSE.
* 
******************
          SB7    A0          PUT KEYORSUM INTO B7 
          NZ     B7,GNRI0 
          SB5    59          HANDY CONSTANT 
          SB4    X5          B4=OFFSET WITHIN *X4 OF INTERNAL FIELD 
          SB5    B5-B4       NUMBER OF PLACES TO SHIFT TO GET TO
                             THE LEFT-MOST BIT
  
          GEN    (SX3 1)               *X3 IS A ONE-BIT MASK
          GEN    (LX3 0),B5 
          GEN    (BX4 X3-X4)           *FLIP THE BIT IN *X4 
************
* 
* RESTORE B5 FOR S$GNRST
* 
************
          SB5    60 
          IFTHEN B3@B5
            SB5    B3 
            ENDIF.           (ELSE LEAVE 60 IN B5)
  
GNRI0     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   GNRI0
          ELSE- 
            EXIT
            ENDIF.
  
  
          END 
