*DECK S$GNIL
          IDENT  S$GNIL 
          TITLE  S$GNIL -  GENERATE- INVERT LOGICAL 
          COMMENT  GENERATE- INVERT LOGICAL 
  
*CALL LBLPTR
          SPACE  4
**        S$GNIL -  GENERATE- INVERT LOGICAL
* 
*     CALLING SEQUENCE- 
*         S$GNIL(OFFSET, LENGTH, ASC);
* 
*     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.
*         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 LOGICAL.
* 
*     GENERATES CODE- 
  
  
  
  
          ENTRY  S$GNIL 
 S$GNIL   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 
  
                             B2 = OFFSET OF FIELD WITHIN RECORD 
          CALL   S$GNIWD               *A5 = ADDRESS OF (FIRST) WORD
                                       *X5 = (FIRST) WORD 
  
          SB2    X5          B2 = OFFSET WITHIN WORD
 GNIL0    IFTHEN B2=0        IF OFFSET = 0
            SB6    60 
            GE     B3,B6,GNIL1
            LT     B3,B6,GNIL2
          ELSE-              IF OFFSET " 0
            SB6    60 
            SB7    B2+B3       OFFSET + LENGTH
            GE     B7,B6,GNIL3
            LT     B7,B6,GNIL4
            ENDIF.
          PS
  
  
*     CASE 1: FULL WORD 
                             OFFSET = 0 
                             LENGTH GE 60 
  
 GNIL1    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     GNIL5
  
  
*     CASE 2:  LEFT-JUSTIFIED, NOT FULL WORD
                             OFFSET = 0 
                             LENGTH LT 60 
  
 GNIL2    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     GNIL5
  
  
*     CASE 3:  RIGHT-JUSTIFIED, NOT FULL WORD 
                             OFFSET NE 0
                             OFFSET + LENGTH = 60 
  
 GNIL3    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     GNIL5
  
  
*     CASE 4:  NEITHER RIGHT- NOR LEFT-JUSTIFIED
                             OFFSET NE 0
                             OFFSET + LENGTH LT 60
  
 GNIL4    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     GNIL5
  
  
*     IF MORE WORDS IN KEY FIELD, LOOP
  
 GNIL5    IFTHEN B3"0        IF MORE WORDS
            GEN    (SA5 A5+B1)         *GET NEXT WORD FROM EXTERNAL REC.
            SB2    0           NEW BIT OFFSET = 0 
            EQ     GNIL0
            ENDIF.
  
          EXIT
  
  
  
  
          END 
