*DECK S$GNID
          IDENT  S$GNID 
          TITLE  S$GNID -  GENERATE- INVERT DISPLAY CHARACTERS
          COMMENT  GENERATE- INVERT DISPLAY CHARACTERS
  
*CALL LBLPTR
  
          SPACE  4
**        S$GNID -  GENERATE- INVERT DISPLAY CHARACTERS 
* 
*     CALLING SEQUENCE- 
*         S$GNID(OFFSET, LENGTH, ASC, LOC(WEIGHT)); 
*                                    #(S$IRRL,S$LK,S$LR,S$OREC,S$ORSA)# 
* 
*     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.
*         LOC(WEIGHT) = ADDRESS OF FIRST WORD OF WEIGHT TABLE.
*          CHARACTER  N  HAS A SORT ORDER TAKEN FROM THE RIGHT 6 BITS 
*          OF THE WORD AT LOC(WEIGHT)+N.
*         S$IRRL = WORD LENGTH OF SLOT IN RECORD STORAGE AREA (REC$IRRL). 
*          (USED BY S$GNAPN)
*         S$LK = NUMBER OF BITS OF INFORMATION THAT HAVE BEEN 
*          PREVIOUSLY APPENDED. 
*         S$ORSA = WORD OFFSET WITHIN WSA$ OF RECORD STORAGE AREA.
*          (USED BY S$GNAPN)
* 
*     DOES- 
*         S$OREC = WORD OFFSET WITHIN WSA$ FOR EXTERNAL RECORD AREA.
*         S$LR = NUMBER OF BITS RESERVED FOR RECORD NUMBER  (REC$LR). 
*         GENERATES CODE TO INVERT DISPLAY CHARACTERS ACCORDING TO
*          A COLLATING SEQUENCE.
*         INCREMENTS S$LK BY THE LENGTH IF THE INTERNAL KEY FIELD.
* 
*     GENERATED CODE EXPECTS- 
*         *B1 = 1.
*         *B2 = ADDRESS OF WORKING STORAGE AREA  (WSA$).
*         "RECDESC" = DESCRIPTOR FOR THIS RECORD, CONTAINING THE
*                      RECORD NUMBER. 
*         "WSA" = ADDRESS OF WORKING STORAGE AREA  (WSA$).
*         (IF S$LK " 0,)
*             *X6 = CURRENT VALUE OF KEY, 
*                    WHOSE (1 + 1 S$LR + S$LK MOD 60) BITS ARE USED 
*                    (EXCEPT 0 MEANS 60). 
*         EXTERNAL RECORD AT WSA$+S$OREC
* 
*     GENERATED CODE DOES-
*         INVERTS A DISPLAY CHARACTER FIELD FROM THE EXTERNAL RECORD
*          AT WSA$+S$OREC ACCORDING TO THE SPECIFIED WEIGHT TABLE 
*          AND APPENDS IT TO THE CURRENT INTERNAL RECORD. 
* 
*     GENERATED CODE USES-
*         B    * * 3 - - - -           *B1=1, B2=WSA$ 
*         X  0 1 2 3 4 5 6 -
*         A  - 1 - 3 - 5 6 -
* 
*     S$GNID USES-
*         B    * - - - 5 6 7           *B1=1
*         X  0 1 2 3 4 5 6 7
*         A  - 1 2 3 4 - 6 -
  
  
  
          ENTRY  S$GNID 
 S$GNID   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 LOC(WEIGHT) 
          SA4    X2          ADDRESS OF WEIGHT
          SX7    X4          X7 = ADDRESS OF WEIGHT 
  
*     SET UP THE WEIGHT TABLE 
  
          NEWLBL NEXT 
          GEN    (EQ "NEXT")
         *USES   B6,B7,X0,AX1-3,AX6 
          NEWLBL WEIGHT 
          GENLBL WEIGHT 
          SB5    0           INDEX TO WEIGHT TABLE
 GNID1    GEN    (PS 0) 
          MX0    -6 
          SA1    X7+B5
          BX1    -X0*X1 
          IFTHEN B4"0      (NONZERO IF ASCENDING ORDER) 
            GEN  (PS 0+0),X1
          ELSE- 
            BX1  -X1       (REVERSE WEIGHT TABLE FOR
            SX1  X1+77B    DESCENDING ORDER)
            GEN  (PS 0+0),X1
          ENDIF.
          SB5    B5+1 
          SB7    63 
          LE     B5,B7,GNID1
          GENLBL NEXT 
          GEN    (SB3 "WEIGHT") 
  
*     INVERT CHARACTERS 
  
                             B2 = OFFSET OF FIELD WITHIN RECORD 
          CALL   S$GNIWD               *A5 := ADDRESS OF (FIRST) WORD 
         *USES   B6,B7,X0,AX1-3,X5,AX6 *X5 := (FIRST) WORD
                             X5 := OFFSET WITHIN WORD 
          GEN (MX0 -6)
          GEN    (LX5 0),X5            *LEFT-JUSTIFY FIRST CHARACTER
          SB7    X5 
          SB6    60 
          SX5    B6-B7       X5 := NUMBER OF BITS LEFT IN *X5 
          GEN    (MX4 0)               *CLEAN RESULT REGISTER 
          SX4    0           NOTE NUMBER OF BITS IN *X4 
  
 GNID2    SB7    X4          NUMBER OF BITS IN *X4
          SB6    60 
          IFTHEN B7=B6       IF *X4 IS FULL,
            GNAPN  0,60                  *APPEND 60 BITS FROM *X4 WITH
           *USES   B5,B6,B7,X0,AX1-3,X5,AX6  0 UNUSED BITS ON LEFT
            GEN    (MX4 0)
            SX4    0                    *NOTE NO BITS IN *X4
            ENDIF.
          IFTHEN X5=0        IF NOTHING MORE IN *X5,
            GEN    (SA5 A5+B1)         *X5 := NEW WORD
            SX5    60          NOTE 60 UNUSED BITS IN *X5 
            ENDIF.
          GEN    (LX5 6)               *RIGHT-JUSTIFY NEXT CHARACTER
          GEN    (BX1 -X0*X5)          *EXTRACT NEXT CHARACTER
          SX5    X5-6        NOTE ONE LESS CHARACTER IN *X5 
          GEN    (SA1 B3+X1)           *GET WEIGHT OF CHARACTER 
          GEN    (LX4 6)               *MAKE ROOM FOR WEIGHT
          GEN    (BX4 X4+X1)           *INSERT WEIGHT 
          SX4    X4+6                  *NOTE ONE MORE CHARACTER IN *X4
          SB3    B3-6        NOTE ONE LESS CHARACTER TO DO IN FIELD 
          NZ     B3,GNID2    IF MORE CHARACTERS TO DO,  LOOP
  
          SB7    X4          NUMBER OF BITS SET IN *X4
          SB6    60 
          SB7    B6-B7       NUMBER OF BITS TO LEFT OF USED BITS
          GNAPN  B7,X4                 *APPEND X4 BITS FROM *X4 WITH
                                         B7 UNUSED BITS ON LEFT 
          EXIT
  
          END 
