*DECK  BCDEQ
          IDENT  BCDEQ
          MACHINE   ANY,I 
  
          SST 
          COMMENT   "SUBSYS"
          COMMENT   AN VS AN COMPARISONS
          TITLE  BCDEQ (C.BCDCM)  AN VS AN COMPARISON ROUTINE 
  
 C.BCDCM  SPACE  4
**        C.BCDCM - ALPHANUMERIC VS ALPHANUMERIC COMPARISON ROUTINE 
*                CHECKS FOR EQUALITY OF EQUAL LENGTH OPERANDS 
* 
*         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
* 
*         EXTERNAL REFERENCES:  
* 
          EXT    C.MASK      MASK TABLE (LEFT JUST) 
* 
*         ENTRY POINT(S): 
* 
          ENTRY  C.BCDCM
 C.BCDCM  TITLE  INITIALIZATION 
 C.BCDCM  DATA   0           ENTRY/EXIT 
          SX0    10 
          IX6    X1-X0
          IX4    X2-X0
          NG     X6,BCDCM1   NO INDEXING ON A 
          SX5    52429       =2**19/10
          IX6    X1*X5
          AX6    19          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 
  
 BCDCM1   NG     X4,BCDCM2   NO INDEXING ON B 
          SX5    52429       =2**19/10
          IX6    X2*X5
          AX6    19          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 
  
 CMU      IFEQ   OP.BDP,OP.NO      NO CMU 
 BCDCM2   BSS    0
          SB7    X0          =10
          SA3    B3          PICK UP FIRST WORD 
          SB3    X1+B5       BCP+LNTH 
          SA4    B4 
          LT     B7,B3,BCDCM3      ITEM A WONT FIT IN 1 WORD
          SB4    B6+X2
          GE     B7,B4,BCDCM7      BOTH 1 WORD ITEMS - CASE 2 
  
 BCDCM3   IX6    X1-X2
          SB4    B6+X2
          NZ     X6,BCDCM22  UNEQUAL BCPS - CASE 4
          ZR     X1,BCDCM4   BCP=0
          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 
          NZ     X6,BCDCM36  FOUND INEQUALITY 
          NG     X6,BCDCM36 
          SB5    B5-B7
          ZR     B5,BCDCM6   DONE- RETURN *EQUAL* 
          SA3    A3+B1
          SA4    A4+B1
          GE     B5,B7,BCDCM4      LOOP TILL DONE 
  
 BCDCM5   SA5    =XC.MASK+B5
          BX3    X3*X5
          BX4    X4*X5       CLEAN UP WORDS 
          IX6    X3-X4
          NZ     X6,BCDCM36 
  
 BCDCM6   SB3    0           RETURN *EQUAL* 
          EQ     C.BCDCM
 BCDCM7   TITLE  CASE 2 - BOTH 1 WORD ITEMS 
*      CASE 2 - BOTH ITEMS FIT IN 1 WORD
  
 BCDCM7   EQ     B5,B7,BCDCM4      EXACTLY 1 WORD 
 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+0        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+0 
          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 
          BX3    X3+X5
          SA2    =XC.BFILL+B6 
          BX4    X4+X2
          IX6    X3-X4
          NZ     X6,BCDCM36 
          EQ     BCDCM6      RETURN - EQUAL 
  
 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    0
          SA3    A3+1 
          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+0 
          SA5    A4+1 
          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 
          BX5    X2*X5
          LX5    X5,B4
          SB4    A5+0        SAVE A5
          ZR     B5,BCDCM26  A IS EXHAUSTED 
          LT     B6,B7,BCDCM27A    B IS ALSO GONE 
          SB6    B6+B3
          SB3    B7-B3
          SA5    =XC.BFILL+B3 
          BX5    X4+X5
          SA4    B4 
          BX4    X5          RESTORE X4 
          SB6    B6-B7
          EQ     BCDCM15
  
*      A IS EXHAUSTED 
  
 BCDCM26  ZR     B6,BCDCM6   DONE - RETURN AN = 
          GE     B7,B6,BCDCM27
          SB6    B6+B3
          SB3    B7-B3
          SA5    =XC.BFILL+B3 
          BX5    X4+X5
          SA4    B4 
          SA3    =XC.BFILL
          BX4    X5 
          SB6    B6-B7
          EQ     BCDCM15
  
*      B IS SHORTER THAN 1 WORD 
  
 BCDCM27  SA3    =XC.BFILL
          SA5    =XC.BFILL+B6 
          BX4    X4+X5
          EQ     BCDCM15
 BCDCM27A SPACE  4
 BCDCM27A BX4    X4+X5             COMPLETE B WORD
          EQ     BCDCM13
 BCDCM28  SPACE  4
*      B FITS IN 1 WORD; BCPA<BCPB
  
 BCDCM28  SB5    B3-B7       LOWER CHAR COUNT 
          IX2    X2-X1
          SB6    B4+0 
 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 
          SB3    X1+B6
          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+0 
          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+0        SHIFT COUNT
          SA5    A3+1        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
          LX3    X3,B4       L. JUST REST OF WORD 
          BX5    X2*X5
          LX5    X5,B4
          SB4    A5+0        SAVE A5
          ZR     B6,BCDCM33  B IS DONE
          LT     B5,B7,BCDCM34A    A IS GONE
          SB5    B5+B3
          SB3    B7+B3
          SA5    =XC.BFILL+B3 
          BX5    X3+X5
          SA3    B4          RESET A3 
          BX3    X5          RESET X3 
          SB5    B5-B7
          EQ     BCDCM15
  
*      B IS GONE - A MAY OR MAY NOT BE ALSO 
  
 BCDCM33  ZR     B5,BCDCM6         EXIT 
          GE     B7,B5,BCDCM34
          SB5    B5+B3
          SB3    B7-B3
          SA5    =XC.BFILL+B3 
          BX5    X3+X5
          SA3    B4          RESET A3 
          SA4    =XC.BFILL
          BX3    X5 
          SB5    B5-B7
          EQ     BCDCM15
  
*      BOTH A AND B ARE SHORT 
  
 BCDCM34  SA4    =XC.BFILL
          SA5    =XC.BFILL+B5 
          BX3    X3+X5
          EQ     BCDCM15
 BCDCM34A SPACE  4
 BCDCM34A BX3    X3+X5             COMPLETE A WORD
          EQ     BCDCM13
 BCDCM35  SPACE  4
*      BCPA>BCPB;  A IS 1 WORD OR LESS
  
 BCDCM35  SB6    B4-B7
          IX1    X1-X2       BCPA-BCPB
          SB5    B3+0 
 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  SB3    B1 
          EQ     C.BCDCM
 C.BFILL  DATA   10H
          VFD    6/0,54/9H
          VFD    12/0,48/8H 
          VFD    18/0,42/7H 
          VFD    24/0,36/6H 
          VFD    30/0,30/5H 
          VFD    36/0,24/4H 
          VFD    42/0,18/3H 
          VFD    48/0,12/2H 
          VFD    54/0,6/1H
          DATA   0
 CMU      EJECT 
 CMU      ELSE
 BCDCM2   TITLE  CMU COMPARE CODE 
 BCDCM2   SB7    127
          SX3    B3 
          LX6    X3,B1       X3*2 
          LX3    3           X3*8 
          IX4    X3+X6       X3*10 = ADDRA * 10 
          IX4    X4+X1       ADD IN BCP TO GET A-S CHAR ADDR
  
          SX3    B4+0        NOW B
          LX6    X3,B1
          LX3    3
          IX5    X3+X6
          IX5    X5+X2       B-S CHAR ADDR
          SX0    B3+0 
          SX3    B4+0 
  
          LT     B7,B5,BCDCM4      A LONG 
          EQ     BCDCM16           BOTH SHORT 
  
 BCDCM4   BSS    0
          SB4    B5 
          LT     B5,B6,BCDCM6      GET MIN LNTH 
          SB4    B6 
 BCDCM6   LT     B4,B7,BCDCM8 
          SB4    B7+0 
 BCDCM8   SX7    B4          LENGTH OF NEXT OPN 
          IX4    X4+X7
          IX5    X5+X7       UP CHAR ADDRESSES
          SB5    B5-B4       REMAIN CHARS 
          SB6    B6-B4
  
          RJ     BLDCMU      GO DO COMPARE
  
 BCDCM10  RJ     MODADDR
          LT     B7,B5,BCDCM4      A STILL BIG
          EQ     BCDCM16           BOTH SHORT 
  
  
  
 BCDCM16  EJECT 
* 
*         BCDCM16 - BOTH ITEMS ARE NOW 127 OR LESS IN LENGTH
* 
 BCDCM16  BSS    0
          SX7    B5 
          RJ     BLDCMU 
  
 BCDCM18  SB3    B0          SET EQUAL
          EQ     C.BCDCM     AND SPLIT
  
  
  
  
 BLDCMU   EJECT 
*         BLDCMU - BUILDS AND EXECUTES A COMPARE UNCOLLATED 
*                INSTRUCTION. 
* 
*                RETURNS IF EQUAL COMPARE, ELSE SETS B3 AND SPLITS. 
* 
*         EXPECTS:  
*         X0     ADDRA
*         X1     BCPA 
*         X2     BCPB 
*         X3     ADDRB
*         X7     LENGTH OF COMPARE ( 127 OR LESS) 
* 
*         SAVES X4 AND X5 
* 
* 
  
 BLDCMU   DATA   0
          SX6    467B        COMPARE UNCOLLATED OPCODE
          LX0    30 
          LX6    51 
          BX3    X0+X3       ADDRA/ADDRB
          LX1    22 
          BX6    X3+X6       OP/ADDRA/ADDRB 
          LX2    18 
          BX6    X1+X6       OR IN BCPA 
          SX0    17B         MASK 
          BX1    X0*X7       LL 
          BX3    -X0*X7      LU 
          LX1    26 
          BX6    X2+X6       OR IN BCPB 
          LX3    44 
          BX6    X1+X6       OR IN LL 
          BX6    X3+X6       OR IN LU 
          SA6    CMUINST     OP/LU/ADDRA/LL/BCPA/BCPB/ADDRB 
          SB0    0           NO-OP WORD FOR RNI 
 CMUINST  DATA   0
          ZR     X0,BLDCMU   EQUAL -EXIT
          SB3    B1 
          EQ     C.BCDCM
  
 MODADDR  EJECT 
*                USED IN CMU MODE ONLY
* 
*         EXPECTS X4= CHAR ADDR OF A
*                 X5 = CHAR ADDR B
* 
*         RETURNS 
*                X0 = ADDRA 
*                X1 = BCPA
*                X2 = BCPB
*                X3 = ADDRB 
* 
* 
  
 MODADDR  DATA   0
          SX6    52429       2**19/10 
          IX0    X4*X6
          IX3    X5*X6
          AX0    19          =X4/10 = ADDRA 
          AX3    19          =X5/10 = ADDRB 
          SX6    X0 
          LX7    X6,B1
          LX6    3
          IX6    X6+X7       X0*10
          IX1    X4-X6       =BCPA
          SX6    X3 
          LX7    X6,B1
          LX6    3
          IX6    X6+X7
          IX2    X5-X6       BCPB 
          EQ     MODADDR     SCRAM- COMPLETE
  
  
 CMU      ENDIF 
          END 
