*DECK C$BCDCM 
          IDENT  C$BCDCM
          MACHINE   ANY,I 
  
          SST 
          COMMENT   AN VS AN COMPARISONS
          TITLE  C$BCDCM - AN VS AN COMPARISON ROUTINE
  
 C.BCDCM  SPACE  4
**        C.BCDCM - ALPHANUMERIC VS ALPHANUMERIC COMPARISON ROUTINE 
* 
*         CALLING SEQUENCE: 
*         SX1    OFFSET OF A
*         SX2    OFFSET OF B
*         SB3    BASE ADDR OF A 
*         SB4    BASE ADDR OF B 
*         SB5    LENGTH OF A (BYTES)
*         SB6    LENGTH OF B (BYTES)
*         RJ     =XC.BCDCM
* 
*         RETURNS:  
*         B3     =0          A = B
*                >0          A > B
*                <0          A < B
* 
*                THIS ROUTINE PERFORMS COLLATED COMPARISONS AND RETURNS 
*                A NUMERIC VALUE INDICITAVE OF THE RELATIVE VALUES OF 
*                THE IREMS COMPARED.  THE RELATIVE VALUES ARE DETERMINED
*                BY THE PROGRAM COLLATING SEQUENCE CURRENTLY IN EFFECT. 
* 
*                SINCE THE USER PROGRAM MAY CHANGE THE PROGRAM
*                COLLATING SEQUENCE AT WILL, WE MUST LOCATE IT THRU 
*                USE OF A POINTER *C.PRGCS*.  C.PRGCS CONTAINS, IN THE
*                TOP 30 BITS, THE NUMBER ASSIGNED TO THE SEQUENCE.
*                SINCE THIS NUMBER IS NOT USED HERE, SEE THE CBCVCS 
*                DOCUMENTATION FOR MORE INFO.  THE BOTTOM 30 BITS 
*                CONTAIN THE ADDRESS OF A 64 WORD WEIGHT TABLE.  THIS 
*                TABLE IS INDEXED BY THE CHARACTER TO BE COMPARED AND 
*                CONTAINS SIMPLY THAT CHARACTERS LOCATION IN THE SEQ. 
* 
*                A USER CAN DEFINE A SEQUENCE WHICH WAS TWO OR MORE 
*                CHARACTERS WITH THE SAME VALUE IN THE COLLATING SEQ. 
*                WHEN SUCH A SEQUENCE IS IN EFFECT, THE FLAG *C.EQCHR*
*                IS SET SIGNALING THAT THE COMPARE MUST BE DONE ON A
*                CHARACTER BY CHARACTER BASIS - WHICH IS SLOW...... 
* 
*                IF THE C.EQCHR FLAG IS NOT SET WE CAN DO OUR COMPARES
*                USING THE BOOLEAN AND LONG ADD UNITS TO FIND 
*                INEQUALITIES AND ONLY THEN TO USE THE COLLATING TABLES.
* 
* 
*                METHOD - 
* 
*                IF C.EQCHR IS NOT SET, WE CAN CLASSIFY EACH COMPARE
*                AS ONE OF 4 CASES: 
* 
*         CASE 1    EQUAL BCPS + LENGTHS
*         CASE 2    BOTH ITEMS FIT IN 1 WORD (BCP + LENGTH IGNORED) 
*         CASE 3    EQUAL BCPS + UNEQUAL LENGTHS
*                            NOTE - THE SEVERAL SUBCASES THAT GROW
*                            OUT OF HANDLING THE LONGER ITEM ALSO 
*                            SERVE MANY OTHER CASES.
*         CASE4     UNEQUAL BCPS - LENGTHS DONT MATTER
*                4A - BCPA < BCPB 
*                4B - BCPA > BCPB 
* 
*                WHEN C.EQCHR IS SET -
*         CASE 5    ALL ITEMS, BRUTE FORCE METHOD 
* 
* 
*                CASES 1 THRU 4 ALL BRANCH TO BCDCM36 WHEN AN 
*                INEQUALITY IS DETECTED.  HERE X3 + X4 ARE COMPARED 
*                CHARACTER BY CHARACTER FOR RELATIVE VALUE. 
* 
* 
* 
*         REGISTERS USED- 
* 
*                X  0 1 2 3 4 5 6 - 
*                A  - - 2 3 4 5 - - 
*                B  - - - 3 4 5 6 7 
* 
*         REGISTERS USED IN CMU MODE: 
*                X  0 1 2 3 4 5 6 7 
*                A  0 - - 3 - - 6 - 
*                B  - - - 3 4 5 6 7    EXPECTS B1=1 IN ALL CASES
* 
* 
*         EXTERNAL REFERENCES:  
* 
          EXT    C.BFILL     BLANK FILL TABLE MATCHING C.MASK 
          EXT    C.EQCHR     EQ CHAR IN SEQ FLAG
          EXT    C.MASK      MASK TABLE (LEFT JUST) 
          EXT    C.PRGCS     COLLATING SEQUENCE POINTER 
          EXT    C.BLANK     USED IN CMU MODE ONLY
* 
*         ENTRY POINT(S): 
* 
          ENTRY  C.BCDCM
  
 SAV245   MACRO  AD,REG 
          SX.REG    A2
          SX0    A4 
          LX.REG    18D 
          BX.REG    X.REG+X0
          SX0    A5 
          LX.REG    18D 
          BX.REG    X.REG+X0
          SA.REG    AD
          ENDM
  
 VOID     MACRO              CLEAR THE INSTRUCTION STACK. 
          RJ     *+1         CLEAR THE STACK. 
          EQ     *+1S17      THIS SHOULD NEVER EXECUTE. ABORT.
          ENDM
 C.BCDCM  TITLE  INITIALIZATION 
          ENTRY  C.BCDCN
 C.BCDCN  BSS    0           ENTER HERE IF NO ADDRESS CALC NEEDED 
          BX7    X5 
          SA7    C.BCDCM     SAVE RETURN JUMP IN EXIT 
          VOID               CLEAR THE INSTRUCTION STACK
          SAV245 BCDCMSV,7
          SX0    10          REST NEEDS 10 IN X0
          EQ     BCDCM0      GO TO COMPARE
 BCDCMSV  BSSZ   1
 C.BCDEX  SA2    BCDCMSV
          SA5    X2 
          AX2    18D
          SA4    A2 
          AX2    18D
          SA2    X2 
 C.BCDCM  DATA   0           ENTRY/EXIT 
          SAV245 BCDCMSV,6
          SX0    10 
          SX5    314632B     (1/10)*(2**20) 
          IX6    X1*X5
          AX6    20          DIVIDE BY 10 
 IFA      IFEQ   OP.MODEL,OP.6400 
          LX3    X6,B1       X6*2 
          SB3    B3+X6       UP BASE ADDR 
          LX6    3           X6*8 
          IX6    X6+X3       X6*10
          IX1    X1-X6       BUILD BCP
 IFA      ELSE               6600 
          IX3    X6*X0
          SB3    B3+X6       UP BASE ADDR 
          IX1    X1-X3       CORRECT BCP
 IFA      ENDIF 
  
          IX6    X2*X5
          AX6    20          DIVIDE BY 10 
 IFB      IFEQ   OP.MODEL,OP.6400 
          LX3    X6,B1       X6*2 
          SB4    B4+X6       UP BASE ADDR 
          LX6    3           X6*8 
          IX6    X6+X3       X6*10
          IX2    X2-X6       CORRECT BCP
 IFB      ELSE
          IX3    X6*X0
          SB4    B4+X6
          IX2    X2-X3
 IFB      ENDIF 
 BCDCM0   BSS    0           HERE IF NO ADDRESS CALCULATION NEEDED
  
          SA5    65B
          NG     X5,BCDCM60      CMU MAINFRAME
          SA5    =XC.EQCHR   EQUAL CHAR IN SEQ FLAG 
          NZ     X5,BCDCM40  GO BRUTE FORCE 
 IFB1     IFEQ   OP.MODEL,OP.6400 
          SA3    B3 
          SA4    B4 
          IX6    X1-X2       C.F. EQ BCP
          SB7    X0+0        =10
          SB3    X1+B5       BCP + LNTH 
          NZ     X6,BCDCM1         NEQ BCPS 
          EQ     B5,B6,BCDCM2      EQ LNTHS 
          SB4    X2+B6
          LT     B7,B3,BCDCM8 
          LE     B4,B7,BCDCM7A
          EQ     BCDCM8 
  
 BCDCM1   SB4    X2+B6
          LT     B7,B3,BCDCM22     LONGER THAN 1 WORD 
          GE     B7,B4,BCDCM7A
          EQ     BCDCM22
  
 IFB1     ELSE
          SA3    B3 
          IX6    X1-X2       C.F. EQ BCP
          SA4    B4 
          SB7    X0          =10
          ZR     X6,BCDCM1         EQ BCPS
          SB3    X1+B5             BCP + LNTH 
          SB4    X2+B6
          LT     B7,B3,BCDCM22     LONGER THAN 1 WORD 
          GE     B7,B4,BCDCM7A
          EQ     BCDCM22
  
 BCDCM1   SB3    X1+B5             BCP + LNTH 
          EQ     B5,B6,BCDCM2      EQ LNTHS 
          SB4    X2+B6
          LT     B7,B3,BCDCM8 
          LE     B4,B7,BCDCM7A         ONE WORD ITEM
          EQ     BCDCM8 
 IFB1     ENDIF 
  
 BCDCM2   BSS    0           = LENGTHS, = BCPS
          EQ     B3,B7,BCDCM6A     JP IF ALL IN ONE WORD
          GE     B7,B3,BCDCM7A
          TITLE  CASE 1 -EQ BCPS + EQ LNTHS 
  
*      CASE 1 - EQ BCPS + EQ LNTHS
  
          SB4    X1 
          SB4    B7-B4
          SA5    =XC.MASK+X1
          BX3    -X5*X3      CLEAR FRONT OF FIRST WORD
          BX4    -X5*X4 
          SB5    B5-B4       DECREMENT REMAINING CHARS
          IX6    X3-X4       COMPARE
          NZ     X6,BCDCM36 
          SA3    A3+B1
          SA4    A4+B1
          LT     B5,B7,BCDCM5      LESS THAN 1 WORD LEFT
  
 BCDCM4   BX6    X3-X4       QUICK COMPARE LOOP 
          SB5    B5-B7
          NZ     X6,BCDCM36  FOUND INEQUALITY 
          NG     X6,BCDCM36 
          SA3    A3+B1
          SA4    A4+B1
          GE     B5,B7,BCDCM4      LOOP TILL DONE 
          ZR     B5,BCDCM6   DONE- RETURN *EQUAL* 
  
 BCDCM5   SA5    =XC.MASK+B5
          BX3    X3*X5
          BX4    X4*X5       CLEAN UP WORDS 
          IX6    X3-X4
          SB3    B0 
          ZR     X6,C.BCDEX 
          EQ     BCDCM36
  
 BCDCM6   SB3    0           RETURN *EQUAL* 
          EQ     C.BCDEX
  
  
 BCDCM6A  BSS    0           = LENGTH, = BCP, ALL IN ONE WORD 
          ZR     X1,BCDCM6B  JP IF BCP IS 0 
          SA5    =XC.MASK+X1 MASK FOR FIRST CHARS 
          BX3    -X5*X3 
          BX4    -X5*X4 
 BCDCM6B  BSS    0
          BX6    X3-X4       NOW FILL WORD ITEMS WITH BCP = 0 
          SB3    B0          SET .EQ. 
          NG     X6,BCDCM36  NOT -0 
          ZR     X6,C.BCDEX  .EQ. 
          EQ     BCDCM36
 BCDCM7   TITLE  CASE 2 - BOTH 1 WORD ITEMS 
*      CASE 2 - BOTH ITEMS FIT IN 1 WORD
  
 BCDCM7A  BSS    0
 IFC      IFEQ   OP.MODEL,OP.6400 
          LX6    X1,B1             X1*2 
          LX1    2                 X1*4 
          IX1    X1+X6             X1*6 
          LX5    X2,B1             X2*2 
          SB3    X1          X3S SHIFT COUNT
          LX2    2                 X2*4 
          IX2    X2+X5             X2+6 
          SB4    X2          X4S SHIFT COUNT
          LX3    X3,B3       LEFT JUST X3 
          SA5    =XC.MASK+B5
          LX4    X4,B4       SAME X4
          BX3    X3*X5       CLEAN OUT X3 
          SA2    =XC.MASK+B6
 IFC      ELSE
          SX5    6
          IX1    X1*X5       X1*6 
          IX2    X2*X5       X2*6 
          SB3    X1 
          SA5    =XC.MASK+B5
          SB4    X2 
          LX3    X3,B3       L. JUST X3 
          SA2    =XC.MASK+B6
          LX4    X4,B4
          BX3    X3*X5       CLEAN UP X3
 IFC      ENDIF 
          BX4    X4*X2       DITTO X4 
          SA5    =XC.BFILL+B5 
          SA2    =XC.BFILL+B6 
          BX3    X3+X5
          BX4    X4+X2
          SB3    B0 
          IX6    X3-X4
          ZR     X6,C.BCDEX 
          EQ     BCDCM36     RETURN NOT EQUAL 
  
 BCDCM8   TITLE  CASE 3 - EQ BCPS + NEQ LENGTHS 
*      CASE 3 - EQ BCPS + NEQ LENGTHS 
  
 BCDCM8   LT     B3,B7,BCDCM21     A FITS IN 1 WORD 
          LT     B4,B7,BCDCM21     OR B DOES
          ZR     X1,BCDCM11  BCP=0
  
          SA5    =XC.MASK+X1
          SB5    B3-10
          BX3    -X5*X3 
          SB6    B4-B7       DECREMENT B6 BY NR CHARS IN THIS WORD
          BX4    -X5*X4 
          IX6    X3-X4
          NZ     X6,BCDCM36 
          LT     B5,B7,BCDCM12     A IS SHORT 
          LT     B6,B7,BCDCM12     OR B IS
  
 BCDCM9   SB5    B5-10       COMPARE LOOP 
          SA3    A3+B1
          SA4    A4+B1
 BCDCM10  SB6    B6-B7
          BX6    X3-X4
          NZ     X6,BCDCM36 
          NG     X6,BCDCM36 
          LT     B5,B7,BCDCM12     A NOW SHORT
          GE     B6,B7,BCDCM9      B LONG - LOOP
          EQ     BCDCM12
  
 BCDCM11  SB5    B5-10
          EQ     BCDCM10
  
 BCDCM12  TITLE  TERMINATION PROCESSOR
**        BCDCM12 - HANDLES GENERAL CASE OF UNEQUAL TERMINATIONS
*                ONE OR BOTH ITEMS IS NOW SHORTER THAN 1 WORD 
*                THIS ROUTINE IS CALLED FROM EVERWHERE - WATCH OUT
* 
  
 BCDCM12  ZR     B5,BCDCM20  A GONE 
          ZR     B6,BCDCM17  B GONE 
          SA3    A3+1 
          SA4    A4+1 
 BCDCM13  GE     B5,B7,BCDCM14     ALT ENTRY IF BOTH ITEMS IN X3+X4 
          SA5    =XC.MASK+B5
          BX3    X3*X5
          SA5    =XC.BFILL+B5 
          BX3    X3+X5
 BCDCM14  GE     B6,B7,BCDCM15
          SA5    =XC.MASK+B6
          BX4    X4*X5
          SA5    =XC.BFILL+B6 
          BX4    X4+X5
 BCDCM15  IX6    X3-X4       WE ASSUME L.JUST, BLANK FILL HERE
          SB5    B5-B7
          SB6    B6-10
          NZ     X6,BCDCM36 
          LT     B0,B5,BCDCM17     A IS NOT EXHAUSTED 
          GE     B0,B6,BCDCM6      BOTH GONE - EXIT, EQUAL
          SA3    =XC.BFILL   =10H 
  
 BCDCM16  GE     B6,B7,BCDCM18     B HAS 1+ WORD LEFT 
          SA4    A4+1 
          EQ     BCDCM14     GO BLANK FILL + COMPARE
  
 BCDCM17  SPACE  4
*      A HAS SOMETHING LEFT, B IS GONE
  
 BCDCM17  SA4    =XC.BFILL
          GE     B5,B7,BCDCM19     A HAS 1+ WORDS LEFT
          SB6    B0 
          SA3    A3+B1
          EQ     BCDCM13     GO BLANK FILL + COMPARE
  
 BCDCM18  SPACE  4
*      A IS EXHAUSTED, B HAS 1+ WORDS LEFT
  
 BCDCM18  SB6    B6-10
          SA4    A4+B1
          IX6    X3-X4
          NZ     X6,BCDCM36 
          GE     B6,B7,BCDCM18     LOOP TILL B GONE 
          ZR     B6,BCDCM6   IF GONE - EQUAL
          SA4    A4+1 
          EQ     BCDCM14
 BCDCM19  SPACE  4
*      B EXHAUSTED, A WITH 1+ WORDS 
  
 BCDCM19  SB5    B5-10
          SA3    A3+B1
          IX6    X3-X4
          NZ     X6,BCDCM36 
          GE     B5,B7,BCDCM19
          ZR     B5,BCDCM6
          SB6    B0 
          SA3    A3+B1
          EQ     BCDCM13
 BCDCM20  SPACE  4
*      MISC SET UP FOR A EXHAUSTED INITIALY 
  
 BCDCM20  SA3    =XC.BFILL
          SA4    A4+1              GET HIS NEXT WORD
          EQ     BCDCM14
  
 BCDCM21  SPACE  4
*      A OR B SHORT - MASK OFF FIRST WORD 
  
 BCDCM21  ZR     X1,BCDCM13  ALREADY L. JUST
          SA5    =XC.MASK+X1
          SB5    B3 
          BX3    -X5*X3 
          SB6    B4 
          BX4    -X5*X4 
          EQ     BCDCM13
  
 BCDCM22  TITLE  CASE 4 - UNEQUAL BCPS
**        BCDCM22 - CASE 4 -  NEQ BCPS - LENGTHS DONT MATTER
*                HANDLED AS TWO SUBCASES
*             4A - BCPA<BCPB
*             4B - BCPA>BCPB
*                CASE 4B IS HANDLED AT BCDCM29
* 
 BCDCM22  PL     X6,BCDCM29        BCPA>BCPB
          GE     B7,B4,BCDCM28     B FITS IN 1 WORD 
          GE     B3,B7,BCDCM23     A > 1 WORD 
          SA5    =XC.MASK+B3
          BX3    X5*X3
          SA5    =XC.BFILL+B3 
          BX3    X3+X5       BLANK FILL THE END OF THE WORD 
          SB3    B7+0 
  
 BCDCM23  SB5    B3-B7       DECREMENT FOR CHARS IN THIS WORD 
          SB3    X1 
          SA5    =XC.MASK+B3
          SB6    B4-B7
          BX3    -X5*X3 
          SB4    X2+0 
          SX1    B4-B3       BCPA-BCPB
          SB3    X1 
          SA5    =XC.MASK+B4
          BX4    -X5*X4 
 IFD      IFEQ   OP.MODEL,OP.6400 
          LX6    X1,B1       X1*2 
          LX1    2           X1*4 
          IX1    X1+X6       X1*6 
 IFD      ELSE
          SX6    6
          IX1    X1*X6
 IFD      ENDIF 
          SB4    X1 
          SA5    A4+B1
          LX4    X4,B4
          SB6    B6-B3
          SA2    =XC.MASK+B3
          LT     B6,B0,BCDCM28A 
  
 BCDCM24  BX6    X2*X5       OFFSET WORDS COMPARE LOOP
          LX6    X6,B4
          BX4    X4+X6       COMPLETE B WORD
          BX6    X3-X4
          NZ     X6,BCDCM36 
          NG     X6,BCDCM36 
          BX4     -X2*X5     NEXT PART OF B WORD
          SB5    B5-B7
          SA5    A5+B1       BOTTOM PART OF NEXT B WORD 
          SA3    A3+B1
          LT     B5,B0,BCDCM25     A IS DONE
          SB6    B6-B7
          LX4    X4,B4       L. JUST TOP OF NEXT WORD 
          GE     B6,B0,BCDCM24     B NOT DONE - LOOP
          SB5     B5+10 
          SB6     B6+B7 
          BX5    X2*X5
          LX5    X5,B4
          BX4    X4+X5       COMPLETE LAST B WORD 
          NZ     B6,BCDCM13 
          SA4    =XC.BFILL
          EQ     BCDCM15
 BCDCM25  SPACE  4
*      A HAS 1 WORD OR LESS LEFT
  
 BCDCM25  SB5    B5+B7
          LX4    X4,B4       L. JUST REST OF B WORD 
          BX7    -X2*X5      SAVE LAST PART OF B
          BX5    X2*X5
          LX5    X5,B4
          BX4    X4+X5       COMPLETE B WORD
          NZ     B5,BCDCM25A JP IF A NOT EXHAUSTED
          ZR     B6,BCDCM6   JP IF B GONE - RETURN AN = 
          GE     B7,B6,BCDCM27     JP IF B ONE WORD OR LESS 
          SA3    =XC.BFILL   USE BLANKS FOR A 
          EQ     BCDCM26
 BCDCM25A BSS    0
          LE     B6,B7,BCDCM13     JP IF B ONE WORD OR LESS 
          SA2    =XC.MASK+B5 BLANK FILL A 
          BX3    X2*X3
          SA2    =XC.BFILL+B5 
          BX3    X2+X3
 BCDCM26  BSS    0
          BX6    X3-X4       COMPARE A AND B
          NZ     X6,BCDCM36 
          NG     X6,BCDCM36 
          SB6    B6-B7       CHARS LEFT IN B
          SA4    A5          SET A4 FOR BCDCM15 
          SB3    B7-B3       CHARS LEFT IN CURR B WORD
          SB5    B3 
          GT     B6,B3,BCDCM26A    JP IF CH IN B > B CHARS IN CURR WORD 
          SB5    B6          USE CHARS LEFT 
 BCDCM26A BSS    0
          SB6    B6-B5       CHARS AFTER THIS COMPARE 
          SB6    B6+B7       PLUS 10 TO FAKE OUT BCDCM15
          SA3    =XC.BFILL   BLANKS FOR A 
          LX7    X7,B4       REST OF B IN CURR WORD TO TOP
          SA2    =XC.MASK+B5
          BX7    X2*X7
          BX5    -X2*X3 
          BX4    X7+X5       GOOD B CHARS PLUS BLANKS 
          EQ     BCDCM15
  
*      B IS SHORTER THAN 1 WORD 
  
 BCDCM27  SA3    =XC.BFILL
          BX4    X4+X5       PUT TOGETHER LAST 10 CHARACTERS
          SA5    =XC.MASK+B6
          BX4    X5*X4
          SA5    =XC.BFILL+B6 
          BX4    X4+X5
          EQ     BCDCM15
 BCDCM28  SPACE  4
*      B FITS IN 1 WORD; BCPA<BCPB
  
 BCDCM28  SB5    B3-B7       LOWER CHAR COUNT 
          IX2    X2-X1
          SB3    X2          BCP B - BCP A
          SB3    B4-B3       (BCP B + LEN B) - (BCP B - BCP A)
*                            B3 NOW HAS BCP A + LEN B ... GOOD PART OF B
 IFE      IFEQ   OP.MODEL,OP.6400 
          LX6    X2,B1       X2*2 
          LX2    2           X2*4 
          IX2    X2+X6       X2*6 
 IFE      ELSE
          SX6    6
          IX2    X2*X6
 IFE      ENDIF 
          SB4    X2 
          LX4    X4,B4       ALIGN B WITH A 
          SA5    =XC.MASK+B3
          BX4    X4*X5
          SA5    =XC.BFILL+B3 
          BX4    X4+X5
          ZR     X1,BCDCM15  BOTH L. JUST 
          SA5    =XC.MASK+X1
          BX3    -X5*X3 
          BX4    -X5*X4 
          EQ     BCDCM15
 BCDCM28A SPACE  4
 BCDCM28A SB6    B6+B7       COMPUTE NR CHARS IN THE WORD 
          BX6    X2*X5
          LX6    X6,B4       R JUST BOTTOM OF ITEM
          BX4    X4+X6       COMPLETE IT
          SB5    B5+B7
          EQ     BCDCM13
  
 BCDCM29  EJECT 
*      CASE 4B - BCPA>BCPB
  
 BCDCM29  GE     B7,B3,BCDCM35     A SHORT
          GE     B4,B7,BCDCM30     B NOT SHORT
          SA5    =XC.MASK+B4
          BX4    X5*X4
          SA5    =XC.BFILL+B4 
          BX4    X4+X5
          SB4    B7 
  
 BCDCM30  SB5    B3-B7
          SB3    X1 
          SA5    =XC.MASK+B3
          SB6    B4-B7
          BX3    -X5*X3 
          SB4    X2          BCP B
          SX1    B3-B4       BCPA-BCPB
          SB3    X1 
          SA5    =XC.MASK+B4
          BX4    -X5*X4 
 IFF      IFEQ   OP.MODEL,OP.6400 
          LX6    X1,B1       X1+2 
          LX1    2           X1*4 
          IX1    X1+X6       X1*6 
 IFF      ELSE
          SX6    6
          IX1    X1*X6       CHARS TO SHIFT * 6 
 IFF      ENDIF 
          SB4    X1          SHIFT COUNT
          SA5    A3+B1       BOTTOM OF A WORD 
          LX3    X3,B4       ALIGN W/B
          SB5    B5-B3
          SA2    =XC.MASK+B3
          LT     B5,B0,BCDCM35A 
  
 BCDCM31  BX6    X2*X5
          LX6    X6,B4       R. JUST BOTTOM OF WORD 
          BX3    X3+X6
          BX6    X3-X4
          NZ     X6,BCDCM36 
          NG     X6,BCDCM36 
          BX3    -X2*X5      TOP PART OF A WORD 
          SB6    B6-B7
          SA5    A5+B1
          SA4    A4+B1
          LT     B6,B0,BCDCM32     B IS DONE
          SB5    B5-B7
          LX3    X3,B4       L. JUST X3 
          GE     B5,B0,BCDCM31     MORE A - LOOP
          SB5    B5+10
          SB6    B6+B7
          BX5    X2*X5
          LX5    X5,B4
          BX3    X3+X5       COMPLETE LAST A WORD 
          NZ     B5,BCDCM13 
          SA3    =XC.BFILL
          EQ     BCDCM15
 BCDCM32  SPACE  4
*      B IS DONE - CHECK A
  
 BCDCM32  SB6    B6+B7
          BX6    X4          SAVE REST OF B 
          SA4    =XC.MASK+B6
          BX6    X4*X6       LAST OF B
          BX7    X4          SAVE MASK
          SA4    =XC.BFILL   SPACES 
          BX7    -X7*X4 
          BX6    X6+X7       B PADDED WITH SPACES 
          BX7    X4          SAVE WORD OF SPACES
          BX4    X6          B TO X4
 BCDCM32A BSS    0
          SB5    B5-B7       CHARS LEFT IN A AFTER THIS COMPARE 
          LX3    X3,B4       TOP OF A 
          BX6    X2*X5       BOTTOM OF A
          LX6    X6,B4
          BX3    X3+X6       COMPLETED A
          PL     B5,BCDCM32B JP IF MORE THAN 1 WORD OF A LEFT 
          SB5    B5+B7       CHARS LEFT IN A
          SA5    =XC.MASK+B5
          BX3    X5*X3       GOOD A CHARS 
          BX5    -X5*X7      SOME SPACES
          BX3    X3+X5       A SPACE FILLED 
          SB5    B0          NO CHARS IN A LEFT 
 BCDCM32B BSS    0
          BX6    X3-X4       COMPARE A AND B
          NZ     X6,BCDCM36 
          NG     X6,BCDCM36 
          ZR     B5,BCDCM6   JP IF DONE - FIELDS EQUAL
          BX4    X7          SPACES SINCE B IS NOW ALL DONE 
          BX3    -X2*X5      TOP OF NEXT A
          SA5    A5+B1       NEXT A WORD
          EQ     BCDCM32A    COMPARE AGAIN
 BCDCM35  SPACE  4
*      BCPA>BCPB;  A IS 1 WORD OR LESS
  
 BCDCM35  SB6    B4-B7
          IX1    X1-X2       BCPA-BCPB
 IFG      IFEQ   OP.MODEL,OP.6400 
          LX6    X1,B1       X1*2 
          LX1    2           X1*4 
          IX1    X1+X6
 IFG      ELSE
          SX6    6
          IX1    X1*X6
 IFG      ENDIF 
          SB4    X1 
          SB3    X2+B5
          LX3    X3,B4       ALIGN A W/B
          SA5    =XC.MASK+B3
          BX3    X3*X5       CLEAR RIGHT END OF A 
          SA5    =XC.BFILL+B3 
          BX3    X3+X5       BLANK FILL IT
          ZR     X2,BCDCM15  ALREADY L. JUST
          SA5    =XC.MASK+X2
          BX3    -X5*X3 
          BX4    -X5*X4 
          EQ     BCDCM15
  
 BCDCM35A SPACE  4
 BCDCM35A SB5    B5+B7
          BX6    X2*X5
          LX6    X6,B4
          BX3    X3+X6       COMPLETE A WORD
          SB6    B6+B7
          EQ     BCDCM13
  
 BCDCM36  TITLE  PROCESS INEQUALITIES 
**        BCDCM36 - COMPARES THE CONTENTS OF X3 AND X4 CHARACTER BY 
*                CHARACTER - RETURNS RELATIVE VALVE IN B3 
* 
*                X3 + X4 ARE FULL WORD ITEMS. COMPARISON STARTS WITH
*                CHARACTER POSN. 0 AND CONTINUES UNTIL A MIS-MATCH IS 
*                FOUND. FAILURE TO FIND A MIS-MATCH CAUSES MODE 1.
* 
* 
 BCDCM36  SX1    77B         1 CHAR MASK
          SA5    =XC.PRGCS   COLLATING SEQ ADDR 
          SB6    X5+0 
  
 BCDCM37  LX3    6           LOOP 
          LX4    6
          BX2    X3*X1
          BX5    X4*X1
          SB7    B7-1 
          SA2    B6+X2       PICK UP WEIGHTS
          SA5    B6+X5
          BX2    X2*X1
          BX5    X5*X1
          IX6    X2-X5
          NZ     X6,BCDCM38 
          LT     B0,B7,BCDCM37     LOOP TILL DONE 
          EQ     *+400000B         ERROR EXIT - PROGRAM FAILURE 
  
 BCDCM38  PL     X6,BCDCM39 
          SB3    -1          A<B
          EQ     C.BCDEX     EXIT 
  
 BCDCM39  SB3    B1          A>B
          EQ     C.BCDEX
  
  
 BCDCM40  TITLE  CHARACTER BY CHARACTER COMPARE 
**        BCDCM40 - BRUTE FORCE CHARACTER BY CHARACTER COMPARE
* 
*                ** SPEED IS NO OBJECT.....** 
* 
* 
  
 BCDCM40  SA3    B3 
          SA4    B4 
          SX6    6
          IX5    X1*X6       SHIFT COUNT FOR A
          SB3    X5 
          IX5    X2*X6       SHIFT COUNT FOR B
          SB4    X5 
          LX3    X3,B3
          SB7    10 
          LX4    X4,B4
          SB3    X1 
          SB4    X2+0 
          SB3    B7-B3       NR CHARS IN THIS WORD
          SX0    77B         MASK 
          SA1    =XC.PRGCS
          SB4    B7-B4
          SB5    B5-B3
          SB6    B6-B4
          SB7    X1 
          GE     B5,B0,BCDCM40A    NOT A SHORT ITEM 
          SB3    B5+B3       SET NR CHARS IN WORD 
          SB5    B0 
 BCDCM40A GE     B6,B0,BCDCM41     B NOT SHORT EITHER 
          SB4    B6+B4
          SB6    B0 
  
 BCDCM41  LX3    6           MAIN LOOP
          LX4    6
          BX2    X3*X0       STRIP OFF CHAR 
          BX5    X4*X0
          SB3    B3-1 
          SA2    X2+B7       WEIGHT 
          SA5    X5+B7
          SX6    77B
          BX2    X2*X6
          BX5    X5*X6
          IX6    X2-X5
          NZ     X6,BCDCM38  FOUND INEQUALITY 
          SB4    B4-B1
          ZR     B3,BCDCM45  GET NEXT A WORD
          NZ     B4,BCDCM41  SOME B LEFT
          SB7    10 
 BCDCM42  LT     B6,B7,BCDCM43     LAST B WORD
          SA4    A4+1        GET NEXT WORD
          SB4    B7 
          SB6    B6-B7
          SB7    X1+0 
          EQ     BCDCM41
  
 BCDCM43  ZR     B6,BCDCM44  HANDLE B EXHAUSTED 
          SA4    A4+B1
          SB4    B6          NR CHARS LEFT
          SB6    B0 
          SB7    X1 
          EQ     BCDCM41
  
 BCDCM44  ZR     B5,BCDCM50 
          SA4    =XC.BFILL   COMPARE A VS SPACES
          SB4    B7 
          SB7    X1          RESTORE ADDRESS
          EQ     BCDCM41
 BCDCM45  SPACE  4
*      GET NEXT A WORD
  
 BCDCM45  ZR     B5,BCDCM48  A EXHAUSTED
          SB7    10 
          LT     B5,B7,BCDCM47
          SB3    B7 
          SB5    B5-B7
          SA3    A3+1 
  
 BCDCM46  ZR     B4,BCDCM42  GET ANOTHER B WORD 
          SB7    X1+0        RESET ADDR 
          EQ     BCDCM41
  
 BCDCM47  SB3    B5          NR CHARS LEFT
          SB5    B0 
          SB7    X1 
          SA3    A3+B1
          EQ     BCDCM46
  
 BCDCM48  ZR     B6,BCDCM49  CHECK FOR COMPLETE 
          SA3    =XC.BFILL
          SB3    10 
          SB7    10 
          EQ     BCDCM46
  
 BCDCM49  ZR     B4,BCDCM6   DONE -SET EQUAL
          SA3    =XC.BFILL
          SB3    B4          JUST ENOUGH TO FINISH
          SB7    X1 
          EQ     BCDCM41
  
 BCDCM50  SB4    B3          MATCH A-S COUNT
          SB7    X1 
          SA4    =XC.BFILL
          EQ     BCDCM41
* 
 CMU      EJECT 
 BCDCM60   TITLE  CMU COMPARE CODE
 BCDCM60   SB7    127 
          SA3    =XC.PRGCS   COLLATING SEQ POINTER
          SA0    X3          SET FOR CMU
          SX6    466B        CMU COMPARE OP CODE
          SX0    B3          ADDRESS OF A 
          SX3    B4          ADDRESS OF B 
          LX0    30 
          LX6    51 
          BX6    X6+X0
          BX6    X6+X3
          LX1    22          POSITION BCP OF A
          LX2    18          BCP OF B 
          BX0    X1+X2
          BX6    X0+X6       COMPLETE CMU INSTRUCTION 
          LX1    60-22       REPOSITION BCPS
          LX2    60-18
          SA6    CMUINST     STORE CMU INSTRUCTION (NO LENGTH)
          VOID               CLEAR THE INSTRUCTION STACK
 BCDCM61   BSS    0 
          GE     B7,B5,BCDCM68     JP IF A SHORTER THAN MAX 
          GE     B7,B6,BCDCM68     JP IF B SHORTER THAN MAX 
  
 BCDCM62   ZR     B5,BCDCM66  A IS EXHAUSTED
          ZR     B6,BCDCM67  B IS EXHAUSTED 
          SB2    B5          USE A LENGTH 
          LT     B5,B6,BCDCM63     GET MIN LNTH 
          SB2    B6          USE B LENGTH 
 BCDCM63  LT     B2,B7,BCDCM64     JP IF < 127 CHARS
          SB2    B7+0        USE 127
 BCDCM64  SB5    B5-B2       DECREMENT REMAINING CHARS
          SB6    B6-B2
  
          RJ     BLDCMU      GO DO COMPARE
  
 BCDCM65  RJ     MODADDR
          EQ     BCDCM61      GO TRY NEXT CHUNK 
  
  
*      A IS NOW EXHAUSTED, BUT B IS HUGE
  
 BCDCM66  BSS    0
          MX0    60-18
          LX0    30          MASK OF ADDRESS OF A 
          MX3    60-4 
          LX3    22          MASK OF BCP OF A 
          BX0    X3*X0
          SA4    CMUINST
          BX6    X0*X4       MASK OF A ADDR AND BCP 
          SX7    =XC.BLANK   POINTER TO SPACES
          LX7    30 
          BX6    X6+X7       PUT ADDR OF BLANKS AND BCP 0 FOR A 
          SA6    A4 
 BCDCM66A BSS    0
          SB2    B6          SIZE OF B
          LT     B6,B7,BCDCM66B    JP IF LESS THAN MAX
          SB2    B7          USE 127
 BCDCM66B BSS    0
          SB6    B6-B2       ADJUST REMAINING CHARS 
          RJ     BLDCMU      GO TO COMPARE
          ZR     B6,C.BCDEX  EXIT IF B NOW EXAUSTED 
          RJ     MODADDR     ADJUST B ADDRESS 
          EQ     BCDCM66A    GO TRY NEXT  PIECE 
  
  
*      B IS EXHAUSTED AND A IS HUGE...
  
 BCDCM67  BSS    0
          MX0    60-22       MASK FOR BCP AND ADDR B
          SA4    CMUINST
          BX6    X0*X4       MASK OFFB BCP AND ADDR 
          SX7    =XC.BLANK
          BX6    X6+X7
          SA6    A4          CMU INST WITH SPACES FOR B 
          VOID               CLEAR THE INSTRUCTION STACK
 BCDCM67A BSS    0
          SB2    B5          SIZE OF A
          LT     B5,B7,BCDCM67B    JP IF LESS THAN MAX
          SB2    B7          USE MAX
 BCDCM67B BSS    0
          SB5    B5-B2       DECREMENT REMAINING CHARS
          RJ     BLDCMU      EXECUTE CMU COMPARE
          ZR     B5,C.BCDEX  JP IF DONE 
          RJ     MODADDR     UPDATE A ADDRESS 
          EQ     BCDCM67A    GO TRY ANOTHER PIECE 
  
  
* 
*         BCDCM68 - ONE OR BOTH ITEMS ARE < 128 CHARS LONG
* 
 BCDCM68  NE     B5,B6,BCDCM62      JP IF NOT EQUAL LENGTHS 
          SB2    B5 
          RJ     BLDCMU 
  
          EQ     C.BCDEX     RETURN WITH B3 = 0 
  
  
 BLDCMU   EJECT 
**        BLDCMU - SETS UP AND EXECUTES A COMPARE COLLATED
*                INSTRUCTION. 
* 
*                RETURNS IF EQUAL COMPARE, ELSE SETS B3 AND SPLITS. 
* 
*         EXPECTS:  
*         A0     COLLATING SEQ ADDR 
*         B2     LENGTH OF COMPARE (127 OR LESS)
* 
*         SAVES X4 AND X5 
* 
* 
  
 BLDCMU   DATA   0
          SX7    B2          LENGTH TO COMPARE
          SX0    17B
          BX3    X0*X7       LOW 4 BITS OF LENGTH 
          BX4    -X0*X7      HIGH 3 BITS
          SA5    CMUINST     CMU INSTRUCTION
          LX3    26 
          LX4    44 
          BX3    X3+X4
          MX0    3
          LX0    48+3 
          MX7    4
          LX7    4+26 
          BX0    X7+X0
          BX5    -X0*X5      MASK OFF CURRENT LENGTH
          BX7    X3+X5       PUT LENGTH IN INSTRUCTION
          SA7    A5          STORE CMU INST 
          VOID               CLEAR THE INSTRUCTION STACK
          SB3    B0          FOR EQUAL RETURN AND FOR RNI 
          SB0    0           NO-OP WORD FOR RNI 
 CMUINST  DATA   0
          ZR     X0,BLDCMU   EQUAL -EXIT
          NG     X0,BLDCMU1 
          SB3    B1 
          EQ     C.BCDEX
  
 BLDCMU1  SB3    B0-B1
          EQ     C.BCDEX
  
 MODADDR  EJECT 
*                USED IN CMU MODE ONLY
* 
*         EXPECTS BCP A IN X1, BCP B IN X2, LENGTH IN B2
* 
*         RETURNS 
*                CMUINST UPDATED FOR A AND B BCP AND ADDR 
*                X1 AND X2 HAVE UPDATED BCP FOR A AND B 
* 
* 
  
 MODADDR  DATA   0
          SX6    314632B     (1/10)*(2**20) 
          SX5    B2          LENGTH OF LAST COMPARE 
          IX0    X5*X6       LEN * 1//10**20
          AX0    20          NBR OF WORDS 
          SX6    10 
          IX6    X0*X6       WHOLE CHARS
          IX5    X5-X6       EXTRA CHARS
          SA4    CMUINST     CMU INSTRUCTION
          ZR     B5,MODA2    JP IF A EXHASTED - DONT UPDATE A 
          BX6    X0          WORDS
          MX7    60-4 
          LX7    22 
          IX1    X1+X5       BUMP BCP 
          SX3    X1-10
          NG     X3,MODA1    JP IF BCP NOT OVERFLOWED 
          SX6    X6+B1       BUMP WORD COUNT BY 1 
          BX1    X3 
 MODA1    BSS    0
          BX4    X7*X4       MASK OFF OLD BCP 
          BX7    X1 
          LX7    22 
          LX6    30 
          BX6    X6+X7
          IX4    X4+X6       PUT NEW BCP IN AND BUMP ADDRESS OF A 
 MODA2    BSS    0
          ZR     B6,MODA4    JP IF B EXHAUSTED
          IX2    X2+X5       BUMP BCP B 
          SX6    X2-10
          NG     X6,MODA3    JP IF BCP NOT OVERFLOWED 
          SX0    X0+B1       BUMP WORD COUNT BY 1 
          BX2    X6          NEW BCP
 MODA3    BSS    0
          MX7    60-4 
          LX7    18 
          BX4    X7*X4       MASK OFF OLD BCP 
          BX6    X2 
          LX6    18 
          BX6    X6+X0       BCP AND ADDR ADJUST
          IX4    X4+X6       BUMP ADDR OF B AND INSERT BCP
 MODA4    BSS    0
          BX6    X4 
          SA6    A4          STORE ADJUSTED CMU INSTRUCTION 
          VOID               CLEAR THE INSTRUCTION STACK
          EQ     MODADDR     SCRAM- COMPLETE
  
  
          END 
