COMCGMS 
COMMON
          CTEXT  COMCGMS - GENERAL MULTIPLE WORD TABLE SORT.
          SPACE  4,10 
 QUAL$    IF     -DEF,QUAL$ 
          QUAL   COMCGMS
 QUAL$    ENDIF 
          BASE   D
*         COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
 GMS      SPACE  4,10 
***       GMS - GENERAL MULTIPLE WORD TABLE SORT. 
*         T. J. HOFFMANN.    78/02/01.
*         UNIVERSITY OF MINNESOTA.
 GMS      SPACE  4,40 
***       GMS - GENERAL MULTIPLE WORD TABLE SORT. 
* 
*         *GMS* USES A SHELL-METZNER SORT ALGORITHM TO SORT CONSTANT
*         LENGTH TABLE ENTRIES.  THE ENTRIES CAN BE SORTED IN ASCENDING 
*         OR DESCENDING ORDER USING SIGNED (INTEGER) OR UNSIGNED
*         (CHARACTER) ARITHMETIC. 
* 
*         BY DEFAULT, THE SORT KEY IS ASSUMED TO OCCUPY ONE 60 BIT
*         WORD.  IF *GMS$* IS DEFINED, (X0) SPECIFIES A MASK DEFINING 
*         THE KEY FIELD.  THE MASK MUST BE LEFT JUSTIFIED FOR A SIGNED
*         INTEGER SORT TO WORK PROPERLY.  IF *MWK$* IS DEFINED, (X1)
*         SPECIFIES THE NUMBER OF CONSECUTIVE WORDS COMPRISING OR 
*         CONTAINING SEGMENTS OF THE KEY.  IF *GMS$* AND *MWK$* ARE 
*         BOTH DEFINED, THE KEY SEGMENTS IN SUCCEEDING WORDS ARE
*         EFFECTIVELY TREATED AS SECONDARY KEYS IN DECREASING ORDER OF
*         SIGNIFICANCE. 
* 
*         THE SHELL-METZNER ALGORITHM IS DESCRIBED IN - 
*                CREATIVE COMPUTING, NOV-DEC 1976, PP. 76-80. 
* 
*         ENTRY  (B2) = 0 IF CHARACTER SORT (UNSIGNED INTEGERS).
*                     = 1 IF NUMERIC SORT (SIGNED INTEGERS).
*                (B3) = 0 IF ASCENDING SORT.
*                     = 1 IF DESCENDING SORT. 
*                (B4) = FIRST WORD OF SORT KEY IN TABLE ENTRY (FIRST
*                       WORD OF ENTRY = 1). 
*                (B5) = LENGTH OF TABLE ENTRY.
*                (B6) = NUMBER OF ENTRIES IN TABLE. 
*                (B7) = ADDRESS OF TABLE. 
*                IF THE SYMBOL *GMS$* IS DEFINED -
*                (X0) = MASK. 
*                IF THE SYMBOL *MWK$* IS DEFINED -
*                (X1) = NUMBER OF KEY WORDS TO COMPARE. 
* 
*         EXIT   TABLE ENTRIES SORTED.
* 
*         USES   X - 1, 2, 3, 4, 6, 7.
*                A - 0, 1, 2, 3, 4, 6, 7. 
*                B - 2, 3, 4, 5, 6, 7.
  
  
 GMS      SUBR               ENTRY/EXIT 
  
 MWK$     IF     DEF,MWK$ 
          SX6    X1+         SAVE NUMBER OF WORDS IN EACH KEY 
          SA6    GMSE 
 MWK$     ENDIF 
  
          SX3    GMSB 
          ZR     B2,GMS1     IF CHARACTER SORT
          SX3    X3+2        SET NUMERIC SORT 
 GMS1     SA3    X3+B3
          SA1    GMSC+B3     SORT ORDER TEST INSTRUCTION
          BX6    X3 
          SA2    B4-B1       (A2) = OFFSET
          SA6    GMSA 
          SX2    B6          (X2) = LENGTH
          SB4    B4-B1
          BX6    X1 
          SA3    B5          (A3) = ENTRY LENGTH
          SB7    B7-B5
          SA0    B6          (A0) = NUMBER OF ENTRIES 
          SB7    B7+B4       ADD OFFSET 
          SA1    GMSD 
          SA6    A6+B1
          NE     B5,B1,GMS2  IF MULTIPLE WORD ENTRIES 
          SA1    A1+B1       SET SINGLE WORD ENTRIES
 GMS2     BX6    X1 
          SA6    A6+B1
          RJ     *+1         VOID STACK 
          BSS    1
  
*         BEGIN SORT. 
  
 GMS3     AX2    1           M = M DIV 2
          SX1    A0          N
          ZR     X2,GMSX     IF SORT COMPLETED
          SB2    B1          J = 1
          IX3    X1-X2       K = N - M
          SB6    X2          M
          SB5    X3          K
 GMS4     SB3    B2+         I = J
 GMS5     SX1    B3 
          SB4    B3+B6       L = I + M
          SX3    A3 
          IX1    X1*X3
          SX4    B4 
          SA1    B7+X1       D(I) 
          IX6    X4*X3
  
 MWK$     IF     DEF,MWK$ 
          SA4    GMSE        GET NUMBER OF WORDS TO COMPARE 
          BX3    X4 
 MWK$     ENDIF 
  
          SA4    B7+X6
  
 MWK$     IF     DEF,MWK$ 
          SX7    A1          SAVE STARTING ADDRESSES OF EACH ENTRY
          LX7    18 
          SX6    A4 
          BX7    X7+X6
 GMS6     SX3    X3-1        DECREMENT NUMBER OF WORDS LEFT TO COMPARE
 MWK$     ENDIF 
  
 GMS$     IF     DEF,GMS$ 
          BX1    X0*X1       APPLY MASK 
          BX4    X0*X4       APPLY MASK 
 GMS$     ENDIF 
  
          BX6    X1-X4       COMPARE KEYS 
  
 MWK$     IF     DEF,MWK$ 
          NZ     X6,GMS7     IF NO MATCH
          NG     X6,GMS7     IF NO MATCH
          ZR     X3,GMS11    IF ALL WORDS COMPARED
          SA1    A1+B1
          SA4    A4+B1
          EQ     GMS6        COMPARE NEXT WORD OF KEYS
 MWK$     ENDIF 
  
 GMS7     SX3    B2+
          PL     X6,GMS8     IF SIGN BITS ARE THE SAME
  
 GMSA     BSS    1
  
*         NG     X4,GMS11    (CHARACTER SORT, ASCENDING ORDER)
*         EQ     GMS9        EXCHANGE ENTRIES 
  
*         NG     X1,GMS11    (CHARACTER SORT, DESCENDING ORDER) 
*         EQ     GMS9        EXCHANGE ENTRIES 
  
*         NG     X1,GMS11    (NUMERIC SORT, ASCENDING ORDER)
*         EQ     GMS9        EXCHANGE ENTRIES 
  
*         NG     X4,GMS11    (NUMERIC SORT, DESCENDING ORDER) 
*         EQ     GMS9        EXCHANGE ENTRIES 
  
 GMS8     BSS    1
          ERRNZ  GMSA-GMS8+1 CODE ASSUMES LOCATIONS CONTIGUOUS
  
*         IX6    X4-X1       (ASCENDING SORT) 
*         NO
*         PL     X6,GMS11    IF D(I) .LE. D(L), NO EXCHANGE 
  
*         IX6    X1-X4       (DESCENDING SORT)
*         NO
*         PL     X6,GMS11    IF D(I) .GE. D(L), NO EXCHANGE 
  
*         INITIALIZE ENTRY EXCHANGE.
  
 GMS9     BSS    1
          ERRNZ  GMS9-GMS8-1 CODE ASSUMES LOCATIONS CONTIGUOUS
  
*         SX1    B3          (MULTIPLE WORD ENTRIES)
*         LX3    18 
*         BX3    X3+X1       SAVE B2 AND B3 
*         SB2    A2 
  
*         EQ     GMS12       (SINGLE WORD ENTRIES)
*         SB0    B0+
  
*         EXCHANGE MULTIPLE WORD ENTRIES. 
  
 MWK$     IF     DEF,MWK$ 
          SA4    X7          RESTORE ADDRESSES
          LX7    -18
          SA1    X7+
 MWK$     ENDIF 
  
          SA1    A1-B2
          SA4    A4-B2
          SB2    B0 
          SB3    A3          ENTRY LENGTH 
 GMS10    BX7    X1          BEGIN EXCHANGE 
          LX6    X4 
          SA1    A1+B1
          SA4    A4+B1
          SA6    A1-B1
          SB2    B2+1 
          SA7    A4-B1
          LT     B2,B3,GMS10 IF ALL WORDS NOT EXCHANGED YET 
  
*         EXCHANGE COMPLETE.
  
          SB3    X3          RESTORE B3 AND B2
          AX3    18 
          SB3    B3-B6       I = I - M
          SB2    X3 
          GE     B3,B1,GMS5  IF I .GE. 1
 GMS11    SB2    B2+1        J = J + 1
          GT     B2,B5,GMS3  IF J .GT. K
          EQ     GMS4        CHECK NEXT PAIR OF KEYS
  
*         EXCHANGE SINGLE WORD ENTRIES. 
  
 GMS12    SA1    A1+         RELOAD X1/X4 
          SB3    B3-B6       I = I - M
          SA4    A4 
          BX6    X1 
          LX7    X4 
          SA6    A4 
          SA7    A1 
          GE     B3,B1,GMS5  IF I .GE. 1
          EQ     GMS11       ADVANCE POINTERS AND CONTINUE
  
*         DATA FOR INSTRUCTION MODIFICATION.
  
 GMSB     BSS    0           PROCESS DIFFERENT SIGN BITS
  
          LOC    GMSA        (GMS7) 
  
 +        NG     X4,GMS11    IF CORRECT ORDER 
          EQ     GMS9        EXCHANGE ENTRIES 
  
          LOC    GMSA        (GMS7) 
  
 +        NG     X1,GMS11    IF CORRECT ORDER 
          EQ     GMS9        EXCHANGE ENTRIES 
  
          LOC    GMSA        (GMS7) 
  
 +        NG     X1,GMS11    IF CORRECT ORDER 
          EQ     GMS9        EXCHANGE ENTRIES 
  
          LOC    GMSA        (GMS7) 
  
 +        NG     X4,GMS11    IF CORRECT ORDER 
          EQ     GMS9        EXCHANGE ENTRIES 
  
          LOC    *O 
  
 GMSC     BSS    0           PROCESS IDENTICAL SIGN BITS
  
          LOC    GMSA+1      (GMS8) 
  
 +        IX6    X4-X1
          NO
          PL     X6,GMS11    IF D(I) .LE. D(L)
  
          LOC    GMSA+1      (GMS8) 
  
 +        IX6    X1-X4
          NO
          PL     X6,GMS11    IF D(I) .GE. D(L)
  
          LOC    *O 
  
 GMSD     BSS    0           PROCESS EXCHANGE 
  
          LOC    GMSA+2      (GMS9) 
  
 +        SX1    B3          EXCHANGE ENTRIES 
          LX3    18 
          BX3    X3+X1       SAVE B2 AND B3 
          SB2    A2 
  
          LOC    GMSA+2      (GMS9) 
  
 +        EQ     GMS12       EXCHANGE ENTRIES 
 -        SB0    B0+
  
          LOC    *O 
  
 MWK$     IF     DEF,MWK$ 
 GMSE     CON    0           NUMBER OF WORDS TO COMPARE 
 MWK$     ENDIF 
          SPACE  4,10 
          BASE   *
 QUAL$    IF     -DEF,QUAL$ 
          QUAL   *
 GMS      EQU    /COMCGMS/GMS 
 QUAL$    ENDIF 
 GMS      ENDX
