*DECK C$LITCM 
          IDENT  C$LITCM
 C.LITCM  TITLE  C.LITCM - AN VS AN WITH -ALL- LITERAL COMPARE
          MACHINE  ANY,I
  
          COMMENT  AN VS AN -ALL- LITERAL COMPARE 
          SST 
  
 C.LITCM  SPACE  4
**        C.LITCM - AN VS AN WITH AN -ALL- LITERAL COMPARE
* 
*                THIS ROUTINE HANDLES COMPARISONS IN WHICH ONE ITEM 
*                            IS AN -ALL- LITERAL (I.E. -ALL "ABCD"-). 
*                            IT USES C.BCDCM TO DO THE ACTUAL COMPARES, 
*                            AND SIMPLY LOOPS UNITL THE NON-LITERAL 
*                            IS EXHAUSTED.
* 
*                NOTE:       WE KEEP THE NON-LITERAL ITEM-S ADDRESS AND 
*                            BCP TOGETHER AS A CHARACTER ADDRESS TO 
*                            MAKE COMPUTATION EASIER.  WE GIVE C.BCDCM
*                            THE UPDATED CHARACTER AND BASE OF THE NON
*                            LITERAL SO IT DOES NOT HAVE TO DO THE WORK 
*                            OF COMPARING THEM
* 
*         CALLING SEQUENCE: 
* 
*         SX1    BYTE OFFSET OF A 
*         SX2    BYTE OFFSET OF B 
*         SB3    BASE ADDR OF A 
*         SB4    BASE ADDR OF B 
*         SB5    LENGTH OF A (BYTES)
*         SB6    LENGTH OF B (BYTES)
*         SB7    0 - IF A IS THE LITERAL
*                1 - IF B IS THE LITERAL
*         RJ     =XC.LITCM
* 
*         RETURNS:  
* 
*         B3     =0          A = B
*                >0          A > B
*                <0          A < B
* 
*         REGISTERS USED: 
*                X  0 1 2 3 4 5 6 7 
*                A  - - 2 3 4 5 6 7 
*                B  - - - 3 4 5 6 7 
* 
*         ENTRY POINT(S): 
  
          ENTRY  C.LITCM
  
*         EXTERNAL REF(S):  
  
          EXT    C.BCDCM
 C.LITCM  EJECT 
  
  
  
 C.LITCM  DATA   0           ENTRY/EXIT 
          NZ     B7,LITCM10  JP IF B IS THE LITERAL 
* 
*         A IS THE LITERAL
* 
          SX6    X1          BCP LIT (A)
          LX6    18 
          SX5    B3          BASE ADDR LIT
          BX6    X6+X5
          SX5    B5          LENGTH LIT 
          LX6    18 
          IX6    X6+X5
          SA6    =SLITINFO   SAVE LITERAL INFORMATION 
 LITCM1   BSS    0           MAIN COMPARE LOOP
          SX0    314632B     (1/10)*(2**20) 
          IX5    X0*X2
          AX5    20          OFFSET / 10
 T641     IFEQ   OP.MODEL,OP.6400 
          LX6    B1,X5       *2 
          BX7    X6 
          LX7    2           *8 
          IX6    X7+X6       *10
 T641     ELSE
          SX6    10 
          IX6    X6*X5       *10
 T641     ENDIF 
          SB4    B4+X5       NEW OFFSET 
          IX2    X2-X6       NEW BCP
          SX6    B6-B5       SIZE OF NEXT COMPARE 
          PL     X6,LITCM2   JP IF LIT LONGER THAN B
          SB5    B6          COMPARE ONLY TO SIZE OF B
          MX6    0
 LITCM2   BSS    0
          SX5    B5 
          IX7    X5+X2       BUMP OFFSET BY SIZE OF LITERAL 
          LX7    18 
          SX5    B4          BASE ADDR B
          IX7    X7+X5
          LX7    18 
          IX7    X7+X6       REMAINING LENGTH OF B
          SA7    =SITMINFO   SAVE ITEM INFORMATION
          SB6    B5          CHARACTERS TO COMPARE
          SA5    COMPRTN     RETURN FROM COMPARE
          EQ     =XC.BCDCN   GO COMPARE FIELDS
 LITCM3   BSS    0
          NZ     B3,C.LITCM  NOT EQUAL - RETURN 
          SA2    ITMINFO     SAVED ITEM INFORMATION 
          SB6    X2          LENGTH REMAINING 
          ZR     B6,C.LITCM  EXIT IF DONE 
          SA1    LITINFO     SAVED LITERAL INFORMATION
          AX2    18 
          SB4    X2          BASE ADDR ITEM 
          AX2    18          BCP ITEM 
          SB5    X1          LENGTH LITERAL 
          AX1    18 
          SB3    X1          BASE ADDRESS LITERAL 
          AX1    18          BCP LITERAL
          EQ     LITCM1      GO COMPARE ANOTHER CHUNK 
 COMPRTN  EQ     LITCM3 
 LITCM10  EJECT 
*         LITCM10 - B IS THE LITERAL
* 
  
 LITCM10  BSS    0
* 
*         B IS THE LITERAL
* 
          SX6    X2          BCP LIT (B)
          LX6    18 
          SX5    B4          BASE ADDR LIT
          BX6    X6+X5
          SX5    B6          LENGTH LIT 
          LX6    18 
          IX6    X6+X5
          SA6    =SLITINFO   SAVE LITERAL INFORMATION 
 LITCM1B  BSS    0           MAIN COMPARE LOOP
          SX0    314632B     (1/10)*(2**20) 
          IX5    X0*X1
          AX5    20          OFFSET / 10
 T642     IFEQ   OP.MODEL,OP.6400 
          LX6    B1,X5       *2 
          BX7    X6 
          LX7    2           *8 
          IX6    X7+X6       *10
 T642     ELSE
          SX6    10 
          IX6    X6*X5       *10
 T642     ENDIF 
          SB3    B3+X5       NEW OFFSET 
          IX1    X1-X6       NEW BCP
          SX6    B5-B6       SIZE OF NEXT COMPARE 
          PL     X6,LITCM2B  JP IF LIT LONGER THAN A
          SB6    B5          COMPARE ONLY TO SIZE OF A
          MX6    0
 LITCM2B  BSS    0
          SX5    B6 
          IX7    X5+X1       BUMP OFFSET BY SIZE OF LITERAL 
          LX7    18 
          SX5    B3          BASE ADDR A
          IX7    X7+X5
          LX7    18 
          IX7    X7+X6       REMAINING LENGTH OF A
          SA7    =SITMINFO   SAVE ITEM INFORMATION
          SB5    B6          CHARACTERS TO COMPARE
          SA5    COMPRTB     RETURN FROM COMPARE
          EQ     =XC.BCDCN   GO COMPARE FIELDS
 COMPRTB  EQ   LITCM3B       JUMP FOR RETURN
 LITCM3B  BSS    0
          NZ     B3,C.LITCM  NOT EQUAL - RETURN 
          SA1    ITMINFO     SAVED ITEM INFORMATION 
          SB5    X1          LENGTH REMAINING 
          ZR     B5,C.LITCM  EXIT IF DONE 
          SA2    LITINFO     SAVED LITERAL INFORMATION
          AX1    18 
          SB3    X1          BASE ADDR ITEM 
          AX1    18          BCP ITEM 
          SB6    X2          LENGTH LITERAL 
          AX2    18 
          SB4    X2          BASE ADDRESS LITERAL 
          AX2    18          BCP LITERAL
          EQ     LITCM1B     GO COMPARE ANOTHER CHUNK 
  
          END 
