*DECK S$GNCMP 
          IDENT  S$GNCMP
          TITLE  S$GNCMP - GENERATE COMPARE CODE
          COMMENT  GENERATE COMPARE CODE. 
  
*CALL LBLPTR
  
  
**        S$GNCMP - GENERATE COMPARE CODE 
* 
*     CALLING SEQUENCE- 
*         S$GNCMP(ORSA,IRRL,LR,LK1,LK2,LO1,L02,BUFREC,SUMOPT);
* 
*     GIVEN-
*         ORSA  = OFFSET TO RECORD STORAGE AREA.
*         IRRL  = INTERNAL RECORD LENGTH. 
*         LR    = N0 OF BITS TO HOLD INDEX TO RECORD STORAGE AREA.
*         LK1   = N0 OF BITS TO HOLD KEY (IN TRN) 
*         LK2   = N0 OF BITS TO HOLD KEY (IN RSA) 
*         LO1   = N0 OF BITS TO HOLD RECORD ORDINAL (IN TRN)
*         LO2   = N0 OF BITS TO HOLD RECORD ORDINAL (IN RSA)
*         BUFREC= TRUE (I.E. NON ZERO) IF REMAINDER OF RECORD 
*                      IS IN CIO BUFFER (RATHER THAN IN RSA)
*         SUMOPT = TRUE (I.E. NON-ZERO) IF SUMMING OPTION FOR EQUAL KEYS
*                  TO BE USED (REQUIRES LO1,LO2 TO BE PASSED IN AS ZERO)
* 
*     DOES- 
*     GENERATE CODE TO EFFECTIVELY SET X7 = (X4) - (X6) 
*     I.E.    X7<0 MEANS (X4) < (X6) ,
*             X7=0 MEANS (X4) = (X6) , AND
*             X7>0 MEANS (X4) > (X6) .
* 
* 
*     GENERATED CODE USES REGISTERS-
*         (SEE GNCMPA, GNCMPB AND GNCMPC) 
  
  
          ENTRY  S$GNCMP
 S$GNCMP  SUBR               ENTRY/EXIT WORD
          SB1    1           CONSTANT 1 
          SA0    A1 
          SA5    A1+6        X5 = ADDR OF *LO2* 
          SA5    X5          X5 = VALUE OF *LO2*
          SA4    A1+4        X4 = ADDR OF *LK2* 
          SA4    X4          X4 = VALUE OF *LK2*
          IX5    X4+X5       X5 = LK2+LO2 
          SA4    A1+7        X4 = ADDR OF *BUFREC*
          SA4    X4          X4 = VALUE OF *BUFREC* 
  
          IFTHEN X5=0        IF KEY ENTIRELY IN DESCRIPTOR
             CALL GNCMPA
          ELSE- 
             IFTHEN X4=0     IF PART OF KEY IN RSA
                CALL GNCMPB 
             ELSE-           IF PART OF KEY IN BUFFER 
                CALL GNCMPC 
                ENDIF.
             ENDIF. 
  
  
  
  
          EXIT
  
          TITLE GNCMPA
**        GNCMPA - GENERATE CODE FOR CASE KEY ENTIRELY IN DESCRIPTOR
* 
*     CALLING SEQUENCE- 
*         CALL GNCMPA 
* 
*     GIVEN-
*         (A1+2) = ADDR OF LR 
*         (A1+3) = ADDR OF LK1
*         (A1+5) = ADDR OF LO1
* 
*     DOES- 
*         GENERATE CODE FOR CASE KEY ENTIRELY IN DESCRIPTOR 
* 
*         GENERATE CODE EXPECTS REGISTERS 
*         X1 = SACRED.
*         X2 = INDEX TO TOURNAMENT FOR CR AND LL
*         X4 = DESCRIPTOR OF LAST LOSER (LL)
*         X6 = DESCRIPTOR OF CURRENT RECORD (CR)
*         A4 = ADDRESS OF LAST LOSER DESCRIPTOR 
*         B1 = 1
*         B2 = ADDRESS OF TOURNAMENT / WSA
  
 GNCMPA   SUBR               ENTRY / EXIT WORD
          SA4    A1+2        ADDRESS OF *LR*
          SA4    X4          X4 = VALUE OF *LR* 
          SA2    A1+3        ADDRESS OF *LK1* 
          SA2    X2          VALUE OF *LK1* 
          SA3    A1+5        ADDRESS OF *LO1* 
          SA3    X3          VALUE OF *LO1* 
          IX5    X2+X3       LK1+LO1
  
          GEN    (MX0 1+1),X4          *MX0 2+LR
          IX2    X4+X5       LR+LK1+LO1 
          GEN    (MX7 1+1),X2          *MX7 1+1+LR+LK1+LO1
          GEN    (BX0 X0-X7)
          GEN    (BX5 X0*X6)           *RIGHT-JUSTIFY KEY 
          GEN    (BX3 X0*X4)           *RIGHT-JUSTIFY KEY 
          GEN    (IX7 X3-X5)           *LL-CR 
  
          EXIT
  
          TITLE GNCMPB
**        GNCMPB - GENERATE CODE FOR CASE PART OF KEY IS IN RSA 
* 
*     CALLING SEQUENCE- 
*         CALL GNCMPB 
* 
*     GIVEN-
*         (A1  ) = ADDR OF ORSA 
*         (A1+1) = ADDR OF IRRL 
*         (A1+2) = ADDR OF LR 
*         (A1+3) = ADDR OF LK1
*         (A1+4) = ADDR OF LK2
*         (A1+5) = ADDR OF LO1
*         (A1+6) = ADDR OF LO2
* 
*     DOES- 
*         GENERATE CODE FOR CASE PART OF KEY IS IN RSA
* 
*         GENERATE CODE EXPECTS REGISTERS 
*         X1 = SACRED.
*         X2 = INDEX TO TOURNAMENT FOR CR AND LL
*         X4 = DESCRIPTOR OF LAST LOSER (LL)
*         X6 = DESCRIPTOR OF CURRENT RECORD (CR)
*         A4 = ADDRESS OF LAST LOSER DESCRIPTOR 
*         B1 = 1
*         B2 = ADDRESS OF TOURNAMENT / WSA
  
 GNCMPB   SUBR               ENTRY / EXIT WORD
          SA2    X1          X2 = VALUE OF *ORSA* 
          SB2    X2          SAVE IN B2 
          SA2    A1+B1       X2 = ADDR OF *IRRL*
          SA2    X2          X2 = VALUE OF *IRRL* 
          SB3    X2          SAVE IN B3 
          SA4    A1+2        X4 = ADDR OF *LR*
          SA4    X4          X4 = VALUE OF *LR* 
          SA2    A1+4        X2 = ADDR OF *LK2* 
          SA2    X2          X2 = VALUE OF *LK2*
          SB4    X2          SAVE IN B4 
          SA5    A1+6        X5 = ADDR OF *LO2* 
          SA5    X5          X5 = VALUE OF *LO2*
  
          GEN    (MX0 1+1),X4          * 1+1+LR 
          GEN    (BX5 -X0*X6) 
          GEN    (BX3 -X0*X4) 
          GEN    (IX7 X3-X5)           *LL-CR 
          NEWLBL CMPDONE
          GEN    (NZ X7,"CMPDONE")
  
          GEN    (BX5 X6)              *GET RSA WORDS HERE
          GEN    (LX5 1+1),X4          * 1+1+LR 
          BX3    -X4         X3 = -LR 
          GEN    (MX0 60),X3           * 60-LR
          GEN    (BX5 -X0*X5)          *X5 RECORD NUMBER FOR CR 
          GEN    (SX0 0),B3            *IRRL
          GEN    (IX5 X0*X5)
          SB5    B2-B3       ORSA-IRRL
          IFTHEN B5\0        IF ORSA >= IRRL
            GEN    (SX5 X5+0),B5         *SX5 X5+(ORSA-IRRL)
          ELSE- 
            GEN    (SX5 X5-0),B5         *SX5 X5-(IRRL-ORSA)
            ENDIF.
          GEN    (SA5 B2+X5)           *1ST WORD IN RSA OF CR 
  
          GEN    (BX3 X4) 
          GEN    (LX3 1+1),X4          * 1+1+LR 
          BX3    -X4         X3 = -LR 
          GEN    (MX0 60),X3           * 60-LR
          GEN    (BX3 -X0*X3)          *X3 = RECORD NUMBER FOR LL 
          GEN    (SX0 0),B3            *SX0 REC$IRRL
          GEN    (IX3 X0*X3)
          SB5    B2-B3       ORSA-IRRL
          IFTHEN B5\0        IF ORSA >= IRRL
            GEN    (SX3 X3+0),B5         *SX3 X3+(ORSA-IRRL)
          ELSE- 
            GEN    (SX3 X3-0),B5         *SX3 X3-(IRRL-ORSA)
            ENDIF.
          GEN    (SA3 B2+X3)           *1ST WORD IN RSA OF LL 
  
          SB2    B4+X5       LK2+LO2
          SB3    59 
          SB4    B0          HAVE NOT GENERATED "DIFSIGN" 
 GNCMPB1  LE     B2,B3,GNCMPB2  IF REMAINING KEY LEN LE 59, GO DO LAST
          SB2    B2-60
          GEN    (BX0 X3-X5)
          IFTHEN B4=0 
          NEWLBL DIFSIGN
            ENDIF.
          GEN    (NG X0,"DIFSIGN")     *IF DIFFERENT SIGN 
          GEN    (IX7 X3-X5)
          GEN    (NZ X7,"CMPDONE")
          NEWLBL NEXT 
          GEN    (EQ B0,B0,"NEXT")
  
          IFTHEN B4=0        IF NOT YET GENERATED *DIFSIGN* 
                                       *WE CANNOT JUST PUT X5 IN X7 
                                       *  BECAUSE X5 MIGHT BE 0, AND
                                       *  (X4) <> (X6). 
            GENLBL DIFSIGN             *ENSURE X7"0 
            GEN    (BX7 X5) 
            GEN    (NZ X7,"CMPDONE")
            GEN    (MX7 1)               *SIGN BIT MASK 
            GEN    (BX7 -X7-X5)          *X7 = 0 IFF X5>=0
            GEN    (EQ "CMPDONE") 
  
            SB4    1         NOTE GENERATION OF "DIFSIGN" 
            ENDIF.
  
  
          GENLBL NEXT 
          GEN    (SA5 A5+B1)           *GET NEXT RSA WORD OF LL 
          GEN    (SA3 A3+B1)           *GET NEXT RSA WORD OF LL 
          EQ     GNCMPB1
 GNCMPB2  GEN    (MX0 0),B2            *MASK LOWER BITS OF LAST RSA WORD
          GEN    (BX5 X0*X5)
          GEN    (BX3 X0*X3)
          GEN    (IX7 X3-X5)           *LL-CR 
          GEN    (LX7 0),B2            *SHIFT SIGN BIT UP 
  
          GENLBL CMPDONE
  
  
          EXIT
  
          TITLE GNCMPC
**        GNCMPC - GENERATE CODE FOR CASE PART OF KEY IS IN BUFFER
* 
*     CALLING SEQUENCE- 
*         CALL GNCMPC 
* 
*     GIVEN-
*         (A1+2) = ADDR OF LR 
*         (A1+4) = ADDR OF LK2
*         (A1+6) = ADDR OF LO2
* 
*     DOES- 
*         GENERATE CODE FOR CASE PART OF KEY IS IN BUFFER 
* 
*         GENERATE CODE EXPECTS REGISTERS 
*         X1 = SACRED.
*         X2 = INDEX TO TOURNAMENT FOR CR AND LL
*         X4 = DESCRIPTOR OF LAST LOSER (LL)
*         X6 = DESCRIPTOR OF CURRENT RECORD (CR)
*         A4 = ADDRESS OF LAST LOSER DESCRIPTOR 
*         B1 = 1
*         B2 = ADDRESS OF TOURNAMENT / WSA
  
 GNCMPC   SUBR               ENTRY / EXIT WORD
          SA4    A1+2        X4 = ADDR OF *LR*
          SA4    X4          X4 = VALUE OF *LR* 
          SA2    A1+4        X2 = ADDR OF *LK2* 
          SA2    X2          X2 = VALUE OF *LK2*
          SB2    X2          SAVE IN B2 
          SA5    A1+6        X5 = ADDR OF *LO2* 
          SA5    X5          X5 = VALUE OF *LO2*
          SB2    X5+B2       B2 = LK2 + LO2 
* 
  
          GEN    (BX5 X6)              *COPY OF CR
          GEN    (MX0 1+1),X4          * 1+1+LR 
          GEN    (BX5 -X0*X6) 
          GEN    (BX3 -X0*X4) 
          GEN    (IX7 X3-X5)
          NEWLBL CMPDONE
          GEN    (NZ X7,"CMPDONE")
  
          GEN    (SA1 "NFILES")        *X1=LTRN 
  
          GEN    (BX5 X6)              *GET BUFFER WORDS HERE 
          GEN    (LX5 1+1),X4          * 1+1+LR 
          BX3    -X4         X3 = -LR 
          GEN    (MX0 60),X3           * 60-LR
          GEN    (BX5 -X0*X5)          *X5 = RECORD NUMBER FOR CR 
          GEN    (SX0 7)               * LEN OF IM FET
          GEN    (IX5 X5*X0)           * RN*(LEN OF FET ) 
          GEN    (IX5 X5+X1)           *TAKE CARE OF OFFSET FROM WSA
          GEN    (SA0 X5+B2)           *A0=ADDR OF FET
          GEN    (SA5 A0+3)            *OUT POINTER 
          GEN    (SA5 X5)              *1ST WORD OF CR IN BUFFER
  
          GEN    (BX3 X4) 
          GEN    (LX3 1+1),X4          * 1+1+LR 
          BX3    -X4         X3 = -LR 
          GEN    (MX0 60),X3           * 60-LR
          GEN    (BX3 -X0*X3)          *X3 = RECORD NUMBER FOR LL 
          GEN    (SX0 7)               * LEN OF IM FET
          GEN    (IX3 X3*X0)           * RN*(LEN OF FET)
          GEN    (IX3 X3+X1)           *TAKE CARE OF OFFSET FROM WSA
          GEN    (SA0 X3+B2)           *A0=ADDR OF FET
          GEN    (SA3 A0+3)            *OUT POINTER 
          GEN    (SA3 X3)              *1ST WORD OF LL IN BUFFER
  
          SB3    59 
          SB4    B0          HAVE NOT GENERATED "DIFSIGN" 
 GNCMPC1  LE     B2,B3,GNCMPC2  IF REMAINING KEY LEN LE 59, GO DO LAST
          SB2    B2-60
          GEN    (BX0 X3-X5)
          IFTHEN B4=0 
          NEWLBL DIFSIGN
            ENDIF.
          GEN    (NG X0,"DIFSIGN")     *IF DIFFERENT SIGN 
  
          GEN    (IX7 X3-X5)
          GEN    (NZ X7,"CMPDONE")
          NEWLBL NEXT 
          GEN    (EQ B0,B0,"NEXT")
          IFTHEN B4=0        IF NOT YET GENERATED *DIFSIGN* 
                                       *WE CANNOT JUST PUT X5 IN X7 
                                       *  BECAUSE X5 MIGHT BE 0, AND
                                       *  (X4) <> (X6). 
            GENLBL DIFSIGN             *ENSURE X7"0 
            GEN    (BX7 X5) 
            GEN    (NZ X7,"CMPDONE")
            GEN    (MX7 1)               *SIGN BIT MASK 
            GEN    (BX7 -X7-X5)          *X7 = 0 IFF X5>=0
            GEN    (EQ "CMPDONE") 
  
            SB4    1         NOTE GENERATION OF "DIFSIGN" 
            ENDIF.
  
  
          GENLBL NEXT 
          GEN    (SA5 A5+B1)           *GET NEXT BUFFER WORD OF CR
          GEN    (SA3 A3+B1)           *GET NEXT BUFFER WORD OF LL
          EQ     GNCMPC1
 GNCMPC2  GEN    (MX0 0),B2            *MASK LOWER BITS OF LAST BUF WORD
          GEN    (BX5 X0*X5)
          GEN    (BX3 X0*X3)
          GEN    (IX7 X3-X5)           *LL-CR 
          GEN    (LX7 0),B2            *SHIFT SIGN BIT UP 
  
          GENLBL CMPDONE
  
  
          EXIT
  
GNCMPSA   EJECT 
          END 
