*DECK S$GNRD1 
          IDENT  S$GNRD1
          TITLE  S$GNRD1 -  GENERATE- REVERT DISPLAY CHARACTERS 
          COMMENT  GENERATE- REVERT DISPLAY CHARACTERS
*CALL LBLPTR
          SPACE  4
**        S$GNRD1 -  GENERATE- REVERT DISPLAY CHARACTERS
* 
*     CALLING SEQUENCE- 
*         S$GNRD1(OFFSET,LENGTH,RVT);#(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.
*         RVT = ADDRESS OF REVERSION TABLE
*         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- 
*         (IF 1+1+S$LR+S$LK IS LESS THAN 60), 
*             THE INTERNAL RECORD IS SPECIFIED IN X6. 
*         (ELSE)
*             *A4 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-
  
  
          ENTRY  S$GNRD1
 S$GNRD1  SUBR
          SB1    1           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 RVTABLE 
          SX7    X2          X7=ADDRESS OF RVTABLE
  
******* 
* 
*         SET UP THE REVERSION WEIGHT TABLE FROM RVTABLE
* 
******* 
  
          NEWLBL NEXT 
          GEN    (EQ "NEXT")
*         USES B6,B7,X0,AX1-3,AX6 
  
          NEWLBL WEIGHT 
          GENLBL WEIGHT 
          SB5    0           INDEX TO WEIGHT TABLE
GNRD1     GEN    (PS 0) 
          SA1    X7+B5       GET NEXT ENTRY FROM RVTABLE
          GEN    (PS 0+0),X1
          SB5    B5+1 
          SB7    63 
          LE     B5,B7,GNRD1      GO GET NEXT ENTRY FROM RVTABLE
          GENLBL NEXT 
          GEN    (SB4 "WEIGHT")         *B4 = WEIGHT
********
* 
* NOW SET UP REGISTERS TO REVERT THE CHARACTER FIELD. 
* 
*  B5 = NUMBER OF BITS IN *X4 THAT HAS GOOD DATA
*  *X4  IS INFORMATION FROM THE INTERNAL RECORD 
*  B3 IS THE NUMBER OF REVERTED CHARACTERS IN *X7 
*    ( WE WILL MOVE THE LENGTH TO X7 TO CHECK IT) 
*  B2 IS THE OFFSET IN THE EXTERNAL RECORD FOR THE CHARACTERS 
*                 IN *X7
*  X7 IS NUMBER OF KEY BITS LEFT TO REVERT
* 
********
          SX7    B3          TOTAL LENGTH OF FIELD TO REVERT
          SB5    0           NOTE THAT *X4 HAS NO DATA
          SB3    0           NOTE NO REVERTED CHARS IN *X7
          GEN    (MX7 0)               *X7 IS RESULT REG., CLEAR IT 
GNRD2     IFTHEN B5=0        IF NOTHING IN *X4, 
            SX0   X7-60 
            IFTHEN   X0<0 
              SB5    X7 
            ELSE- 
              SB5    60 
              ENDIF.         B5 = MIN(X7,60)
  
            CALL S$GNRNX               *GET 60 BITS OR LESS INTO *X4
           *USES B4,B6,B7,X0,AX1-3,AX6
                             X5 = OFFSET WITHIN *X4 OF INTERNAL FIELD 
                             S$LK INCREMENTED BY B5 
  
            GEN    (LX4 0),X5          *LEFT-JUST THE FIELD 
            ENDIF.
          GEN    (LX4 6)               *RIGHT-JUST NEXT CHARACTER 
          GEN    (MX0 -6)             *SET UP ONE-CHARACTER MASK
          GEN    (BX1 -X0*X4)            *DROP CHAR INTO X1 
          SB5    B5-6        LESS GOOD DATA IN *X4
  
          GEN    (SA1 B4+X1)           *GET WEIGHT OF CHARACTER 
          SB7    60 
          IFTHEN B3=B7        IF *X7 IS FULL
            SA0    B5        SAVE B5 IN SECRET REGISTER 
            SB5    60        TELL S$GNRST WE HAVE 60 BITS TO STORE
            SX5    0          NO OFFSET IN CONVERTED FIELD(*X7) 
            CALL S$GNRST
            SB5    A0        RESTORE B5 FROM SECRET REGISTER
                             B2 = OFFSET OF EXTERNAL FIELD
                             B3 = LENGTH OF EXTERNAL FIELD
                             X5 = OFFSET WITHIN *X7 OF EXTERNAL FIELD 
                             S$OREC 
            SB2    B2+B3      INCREASE OFFSET BY 60 
            GEN    (SX7 0)             *RE-CLEAR RESULT REGISTER
            SB3  0            NO REVERTED CHARACTERS IN *X7 
            ENDIF.
          GEN    (LX7 6)                  *MAKE ROOM IN RESULT REG. 
          GEN    (BX7 X7+X1)              *STORE REVERTED CHAR IN *X7 
          SX7    X7-6         DECREASE THE LENGTH COUNTER 
          SB3    B3+6         6 MORE BITS HAVE BEEN REVERTED
          IFTHEN X7"0 
            EQ     GNRD2
            ENDIF.
          SB7    60 
          SX5    B7-B3        NOTE OFFSET IN CONVERTED FIELD(*X7) 
          SB5    B3          PUT LENGTH INTO B5 FOR S$GNRST 
          CALL S$GNRST        DO FINAL STORE INTO EXT RECORD
  
          EXIT
  
  
          END 
