*DECK S$GNII
          IDENT  S$GNII 
          TITLE  S$GNII -  GENERATE- INVERT INTEGER 
          COMMENT  GENERATE- INVERT INTEGER 
  
*CALL LBLPTR
          SPACE  4
**        S$GNII -  GENERATE- INVERT INTEGER
* 
*     CALLING SEQUENCE- 
*         S$GNII(OFFSET,LENGTH,ASC,KEYORSUM); 
* 
*     GIVEN-
*         OFFSET = NUMBER OF BIT STARTING THE KEY FIELD IN THE
*          EXTERNAL RECORD.  THE FIRST BIT IS NUMBER 0. 
*         LENGTH = NUMBER OF BITS IN THE KEY FIELD OF THE EXTERNAL
*          RECORD.
*         ASC = NON-ZERO IF KEY IS ASCENDING. 
*             = ZERO IF KEY IS DESCENDING.
*         KEYORSUM = 1 FOR SUM, 0 FOR KEY 
*         S$LK = NUMBER OF BITS OF INFORMATION THAT HAVE BEEN 
*          APPENDED.  (USED BY S$GNAPN) 
*         S$OREC = WORD OFFSET WITHIN WSA$ OF EXTERNAL RECORD.
*          (USED BY S$GNIWD)
*         S$ORSA = WORD OFFSET WITHIN WSA$ OF RECORD STORAGE AREA.
*          (USED BY S$GNAPN)
* 
*     DOES- 
*         INCREMENTS LK BY NUMBER OF BITS OF INVERTED INTEGER.
* 
*     GENERATES CODE- 
  
  
  
  
          ENTRY  S$GNII 
 S$GNII   SUBR
          SB1    1           B1 = CONSTANT 1
          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 
          SB4    X2          B4 = ASC 
  
          SA2    A1+3        ADDRESS OF KEYORSUM
          SA2    X2          VALUE OF KEYORSUM
          SB5    X2          B5= KEYORSUM 
                             B2 = OFFSET OF FIELD WITHIN RECORD 
          CALL   S$GNIWD               *A5 = ADDRESS OF (FIRST) WORD
                                       *X5 = (FIRST) WORD 
  
          SB2    X5          B2 = OFFSET WITHIN WORD
*************************** 
* 
*  THE FIRST THING TO DO IS TO SWITCH THE LEFT-MOST 
*  BIT OF THE SIGN IN *X5 - IF THIS IS A SORT KEY 
*  AND NOT A SUM FIELD. 
* 
*************************** 
  
          NZ     B5,GNII0 
          SB5    59          HANDY CONSTANT 
          SB5    B5-B2       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    (BX5 X3-X5)           *FLIP THE BIT IN *X5 
 GNII0    IFTHEN B2=0        IF OFFSET = 0
            SB6    60 
            GE     B3,B6,GNII1
            LT     B3,B6,GNII2
          ELSE-              IF OFFSET " 0
            SB6    60 
            SB7    B2+B3       OFFSET + LENGTH
            GE     B7,B6,GNII3
            LT     B7,B6,GNII4
            ENDIF.
          PS
  
  
*     CASE 1: FULL WORD 
                             OFFSET = 0 
                             LENGTH GE 60 
  
 GNII1    IFTHEN B4"0        IF ASCENDING 
            GEN    (BX4 X5) 
           *USES   B6,B7,X0,AX1-3,AX6 
          ELSE-              IF DESCENDING
            GEN    (BX4 -X5)
            ENDIF.
          GNAPN  0,60                  *APPEND 60 BITS FROM *X4 WITH
         *USES   B5,...                  0 UNUSED BITS ON LEFT
          SB3    B3-60       LENGTH = LENGTH - 60 
          EQ     GNII5
  
  
*     CASE 2:  LEFT-JUSTIFIED, NOT FULL WORD
                             OFFSET = 0 
                             LENGTH LT 60 
  
 GNII2    GEN    (MX0 0),B3            *MX0 LENGTH
          IFTHEN B4"0        IF ASCENDING 
            GEN    (BX4 X5*X0)
          ELSE-              IF DESCENDING
            GEN    (BX4 -X5*X0) 
            ENDIF.
          GNAPN  0,B3                  *APPEND B3 BITS FROM *X4 WITH
                                         0 UNUSED BITS ON LEFT
          SB3    0           NO BITS LEFT IN KEY
          EQ     GNII5
  
  
*     CASE 3:  RIGHT-JUSTIFIED, NOT FULL WORD 
                             OFFSET NE 0
                             OFFSET + LENGTH = 60 
  
 GNII3    IFTHEN B4"0        IF ASCENDING 
            GEN    (MX0 0),B2          *MX0 OFFSET
            GEN    (BX4 -X0*X5) 
          ELSE-              IF DESCENDING
            SB7    -B2         -OFFSET
            GEN    (MX0 60),B7         *MX0 <LENGTH WITHIN WORD>
            SB7    -B2         -OFFSET
            GEN    (LX0 60),B7         *LX0 -OFFSET 
            GEN    (BX4 -X5*X0) 
            ENDIF.
          SB6    60 
          SB7    B6-B2       NUMBER OF BITS INVERTED
          SB3    B3-B7       DECREMENT NUMBER OF BITS LEFT IN KEY FIELD 
          GNAPN  B2,B7                 *APPEND B7 BITS FROM *X4 WITH
                                        B3 UNUSED BITS ON THE LEFT
          EQ     GNII5
  
  
*     CASE 4:  NEITHER RIGHT- NOR LEFT-JUSTIFIED
                             OFFSET NE 0
                             OFFSET + LENGTH LT 60
  
 GNII4    GEN    (MX0 0),B3            *MX0 LENGTH
          SB7    -B2         -OFFSET
          GEN    (LX0 60),B7           *LX0 -OFFSET 
          IFTHEN B4"0        IF ASCENDING 
            GEN    (BX4 X5*X0)
          ELSE-              IF DESCENDING
            GEN    (BX4 -X5*X0) 
            ENDIF.
          GNAPN  B2,B3                 *APPEND B3 BITS FROM *X4 WITH
                                         B2 UNUSED BITS ON THE LEFT 
          SB3    0           NO BITS LEFT IN KEY
          EQ     GNII5
  
  
*     IF MORE WORDS IN KEY FIELD, LOOP
  
 GNII5    IFTHEN B3"0        IF MORE WORDS
            GEN    (SA5 A5+B1)         *GET NEXT WORD FROM EXTERNAL REC.
            SB2    0           NEW BIT OFFSET = 0 
            EQ     GNII0
            ENDIF.
  
          EXIT
  
  
  
  
          END 
