*INTERNAL SORT ROUTINE(S)                               HEADER  FUPSOR  0001.000
         M.PGM     FUPSOR,MPX-32,3.6.1,00                               0002.000
         SPACE                                                          0003.000
*                                                                       0004.000
************************************************************************0005.000
*                                                                      *0006.000
*                    PROPRIETARY INFORMATION                           *0007.000
*                    -----------------------                           *0008.000
*   THE INFORMATION CONTAINED HEREIN IS PROPRIETARY TO ENCORE          *0009.000
*   COMPUTER CORPORATION AND/OR ITS VENDORS, AND ITS USE, DISCLOSURE,  *0010.000
*   OR DUPLICATION IS SUBJECT TO THE RESTRICTIONS STATED IN THE        *0011.000
*   STANDARD ENCORE COMPUTER CORPORATION LICENSE TERMS AND CONDITIONS  *0012.000
*   OR THE APPROPRIATE THIRD-PARTY SUBLICENSE AGREEMENT.               *0013.000
*                                                                      *0014.000
*                       RESTRICTED RIGHTS                              *0015.000
*                       -----------------                              *0016.000
*   USE, DUPLICATION, OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT       *0017.000
*   TO RESTRICTIONS AS SET FOURTH IN SUBDIVISION (c) (1) (ii) OF       *0018.000
*   THE RIGHTS IN TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT       *0019.000
*   252.227.7013                                                       *0020.000
************************************************************************0021.000
* (C) COPYRIGHT 1989 ENCORE COMPUTER CORPORATION                       *0022.000
*     ALL RIGHTS RESERVED                                              *0023.000
************************************************************************0024.000
*                                                                       0025.000
         SPACE     2                                                    0026.000
         DEF       SORTINT         ENTRY POINT                          0027.000
         SPACE     2                                                    0028.000
*                                                                       0029.000
R0       EQU       0                                                    0030.000
R1       EQU       1                                                    0031.000
R2       EQU       2                                                    0032.000
R3       EQU       3                                                    0033.000
R4       EQU       4                                                    0034.000
R5       EQU       5                                                    0035.000
R6       EQU       6                                                    0036.000
R7       EQU       7                                                    0037.000
X1       EQU       1                                                    0038.000
X2       EQU       2                                                    0039.000
X3       EQU       3                                                    0040.000
SET      EQU       1                                                    0041.000
GT       EQU       2                                                    0042.000
LT       EQU       3                                                    0043.000
EQ       EQU       4                                                    0044.000
GE       EQU       5                                                    0045.000
LE       EQU       6                                                    0046.000
ZR       EQU       4                                                    0047.000
TB       EQU       1                                                    0048.000
ANY      EQU       7                                                    0049.000
         SPACE                                                          0050.000
*        EQU    1F+0W              RETURN ADDRESS                       0051.000
SORTB    EQU    1F+1W              BASE ADDRESS OF TABLE                0052.000
SORTS    EQU    1F+2W              DISTANCE BETWEEN WORDS OF AN ITEM    0053.000
SORTZ    EQU    1F+3W       DISTANCEBTWN WORDS OF ADJACENT ITEMS        0054.000
SORTC    EQU    1F+4W              FLAG FOR DIRECT/INDIRECT,HOR/VERT    0055.000
SORTN    EQU    1F+5W              NUMBER OF ITEMS TO BE SORTED         0056.000
SORTD    EQU    1F+6W              NUMBER OF WORDS TO BE COMPARED       0057.000
SORTX    EQU    1F+7W              POINTER TO THE TYPE OF SORT TO DO    0058.000
         SPACE     2                                                    0059.000
SORTXA   EQU       0W              ADDRESS OF TO GO FOR SORT COMPARISON 0060.000
*        START LOCAL VARIABLES FOR THE SORT PACKAGE                     0061.000
SORTI    EQU       1W                                                   0062.000
SORTM    EQU       2W                                                   0063.000
SORTJ    EQU       3W                                                   0064.000
SORTK    EQU       4W                                                   0065.000
         SPACE     2                                                    0066.000
         BOUND     1W                                                   0067.000
         SPACE                                                          0068.000
SORTADDS EQU       $               TABLE OF SORT COMPARISON POINTS      0069.000
         DATAW     SORTCASU         ASCENDING UNSIGNED                  0070.000
         DATAW     SORTCDEU        DESCENDING UNSIGNED                  0071.000
         DATAW     SORTCASG        ASCENDING ALGEBRAIC                  0072.000
         DATAW     SORTCDEG        ESCENDING ALGEBRAIC                  0073.000
         DATAW     SORTCASA        ASCENDING ABSOLUTE                   0074.000
         DATAW     SORTCDEA        DESCENDING ABSOLUTE                  0075.000
         SPACE     2                                                    0076.000
         TITLE INTERNAL SORT ROUTINE                                    0077.000
         SPACE                                                          0078.000
         CSECT                                                          0079.000
         SPACE                                                          0080.000
*++                                                                     0081.000
*                                                                       0082.000
*  SORTINT  --  INTERNAL SORT ROUTINE                                   0083.000
*                                                                       0084.000
*  INPUT:                                                               0085.000
*        R2 = BUFFER ADDRESS (CONTAINS THE ENTRY(S) TO BE SORTED)       0086.000
*        R3 = ADDRESS OF 1W LOCATION CONTAINING: # OF RECORDS TO SORT   0087.000
*        R4 = LENGTH (IN BYTES) OF COMBINED KEYS                        0088.000
*                                                                       0089.000
*  OUTPUT:                                                              0090.000
*        THE SORTED BUFFER OF ENTRY(S)                                  0091.000
*                                                                       0092.000
*--                                                                     0093.000
         SPACE                                                          0094.000
SORTINT  EQU       $                                                    0095.000
         SPACE                                                          0096.000
         PUSH                      SAVE REGS                            0097.000
         PUSHT                     ALLOCATE A STACK FRAME FOR TEMP. STOR0098.000
         PUSHT                     ALLOCATE A STACK FRAME FOR TEMP. STOR0099.000
         STW       R2,SORTB,X1     BUFFER ADDRESS                       0100.000
         LI        R0,1W           DISTANCE BETWEEN FIELDS IN KEY       0101.000
         STW       R0,SORTS,X1                                          0102.000
         LW        R0,0W,X3        # RECORDS TO SORT                    0103.000
         SLL       R0,2            ADJUST TO WORDS                      0104.000
         STW       R0,SORTN,X1                                          0105.000
         TRR       R0,R5           DITTO                                0106.000
         ZMW       SORTC,X1        DIRECT SORT                          0107.000
         LA        R0,SORTPROT     CUSTOM COMPARSION ROUTINE            0108.000
         STW       R0,SORTX,X1                                          0109.000
         TRR       R0,R7           DITTO                                0110.000
         STW       R4,SORTD,X1     # WORDS TO BE COMPARED               0111.000
         LI        R0,PROSZ.O      RECORD LENGTH                        0112.000
         STW       R0,SORTZ,X1                                          0113.000
         BU        SORT            DO IT                                0114.000
         SPACE     2                                                    0115.000
SORTI.10 EQU       $                                                    0116.000
         POPT                      DEALLOCATE STACK FRAME               0117.000
         POPT                      DEALLOCATE STACK FRAME               0118.000
         POP                       RESTORE REGS                         0119.000
         TRSW      R0              RETURN                               0120.000
         SPACE     4                                                    0121.000
SORTPROT EQU       $                                                    0122.000
         SPACE                                                          0123.000
         PUSH                      SAVE REGS                            0124.000
         ADI       R3,PRONM.O*2    POSITION TO VOLUME NAME FIELD        0125.000
         ADI       R2,PRONM.O*2    POSITION TO VOLUME NAME FIELD        0126.000
         LI        R0,-PRONM.O     NEG. LENGTH OF EACH KEY              0127.000
         LW        R7,SORTD+1F,X1  LENGTH OF COMBINED KEYS              0128.000
         ZR        R6              INITIALIZE FOR DIVIDE                0129.000
         DVI       R6,PRONM.O      GIVES # OF KEYS                      0130.000
         TRN       R7,R6           NEG. # KEYS                          0131.000
SORTP.10 EQU       $                                                    0132.000
         LW        R7,0W,X3        A(I)                                 0133.000
         EOMW      R7,0W,X2        A(L)                                 0134.000
         BGE       SORTP.20        SIGNS ARE THE SAME                   0135.000
         TBM       0,0W,X3         CHECK SIGN OF A(I)                   0136.000
         BS        SORTP.HI        A(I) .GT. A(L)                       0137.000
         BU        SORTP.LO        A(I) .LT. A(L)                       0138.000
SORTP.20 LW        R7,0W,X3        A(I)                                 0139.000
         CAMW      R7,0W,X2        A(L)                                 0140.000
         BLT       SORTP.LO        A(I) .LT. A(L)                       0141.000
         BGT       SORTP.HI        A(I) .GT. A(L)                       0142.000
         ADR       R4,R3           ADVANCE ADDRESS BY DISTANCE BETWEEN  0143.000
         ADR       R4,R2           WORDS OF THE SAME ITEM               0144.000
         BIW       R0,SORTP.10     COMPARE EACH WORD OF KEY             0145.000
         SUI       R3,PRONM.O*2    POSITION TO NEXT KEY                 0146.000
         SUI       R2,PRONM.O*2    POSITION TO NEXT KEY                 0147.000
         LI        R0,-PRONM.O     NEG. LENGTH OF EACH KEY              0148.000
         BIB       R6,SORTP.10     LOOP TILL ALL KEYS ARE PROCESSED     0149.000
         BU        SORTP.EQ                                             0150.000
         SPACE     2                                                    0151.000
SORTP.HI ABM       29,0W,X1        BUMP RETURN ADDRESS BY ONE WORD      0152.000
SORTP.EQ ABM       29,0W,X1        BUMP RETURN ADDRESS BY ONE WORD      0153.000
SORTP.LO EQU       $                                                    0154.000
         POP                       RESTORE REGS                         0155.000
         TRSW      R0              RETURN                               0156.000
         TITLE     THE SHELL'S SORT PACKAGE                             0157.000
*                                                                       0158.000
***>     D.L. SHELL'S SORT FOR THE SYSTEMS 86                           0159.000
*        VERTICAL OR HORIZONTAL TABLE,DIRECT OR INDIRECT                0160.000
*        R3        BASE ADDRESS OF THE TABLE TO BE SORTED               0161.000
*                  B                                                    0162.000
*        R2        NUMBER OF ITEMS IN THE TABLE                         0163.000
*                  S                                                    0164.000
*        R3        DISTANCE BTWN WORDS OF ADJACENT ITEMS                0165.000
*        R4        FLAGS (DIRECT/INDIRECT, HORIZONTAL/VERTICAL         O0166.000
*        R5        NUMBER OF ITEMS TO BE SORTED                        W0167.000
*                  N                                                    0168.000
*        R6        NUMBER OF WORDS TO BE COMPARED IN EACH ITEM         W0169.000
*                  D                                                    0170.000
*        R7        DESIGNATES THE TYPE OF SORT TO BE PERFORMED:         0171.000
*                  X                                                    0172.000
*        0W        UNSIGNED ASCENDING                                   0173.000
*        1W        UNSIGNED DESCENDING                                  0174.000
*        2W        ALGEBRAIC       ASCENDING                            0175.000
*        3W        ALGEBRAIC      DESCENDING                            0176.000
*        4W        ABSOLUTE        ASCENDING                            0177.000
*        5W        ABSOLUTE       DESCENDING                            0178.000
*        OR ANYTHING ELSE IS TO BE LOCATION OF THE USERS OWN            0179.000
*        SORT COMAPRISON ROUTINE                                        0180.000
*                                                                       0181.000
         SPACE     2                                                    0182.000
SORT     EQU       $                                                    0183.000
*        PUSH                      SAVE REGS                            0184.000
*        PUSHT                     ALLOCATE A STACK FRAME FOR TEMPORARY 0185.000
*                                  STORAGE                              0186.000
         CI        R5,1W                                                0187.000
         BLE       SORT40          NO ENTRIES IN THE TABLE-ABORT THE SOR0188.000
         STW       R5,SORTM,X1                                          0189.000
         STW       R7,SORTXA,X1    SAVE THE POSSIBLE COMPARISON ADDRESS 0190.000
         CI        R7,5W           LIMIT OF FLAG RANGE                  0191.000
         BGT       SORT20          USE THE USERS COMPARISON ADDRESS     0192.000
         TRR       R7,R3           FOR USE AS INDEX                     0193.000
         LW        R7,SORTADDS,X3  GET THE ADDRESS OF OUR OWN COMPARISON0194.000
         STW       R7,SORTXA,X1    SAVE THE POSSIBLE COMPARISON ADDRESS 0195.000
SORT20   LW        R5,SORTM,X1                                         W0196.000
         SRL       R5,1                                                W0197.000
         ZBR       R5,31           KNOCK OUT ANY EXTRANEOUS BITS        0198.000
         ZBR       R5,30           KNOCK OUT ANY EXTRANEOUS BITS        0199.000
         TRN       R5,R6           -M FOR LATER USE AND ALSO SET THE CC 0200.000
         STW       R5,SORTM,X1     M=M/2                               W0201.000
         BEQ       SORT40          IF(M=0)GOTO40                        0202.000
         ADMW      R6,SORTN,X1     N-M                                  0203.000
         STW       R6,SORTK,X1     K=N-M                               W0204.000
         LI        R5,1W                                                0205.000
         STW       R5,SORTJ,X1     J=1  (WORD)                          0206.000
SORT41   EQU       $                                                    0207.000
         STW       R5,SORTI,X1     I=J                                  0208.000
SORT49   LW        R5,SORTM,X1                                          0209.000
         ADMW      R5,SORTI,X1                                          0210.000
         SUI       R5,1W           FORTRAN INDICES                      0211.000
         MPMW      R4,SORTZ,X1     1 FOR HOR., SIZE FOR VERTICAL        0212.000
         SRL       R5,2                                                W0213.000
         TRR       R5,R2                                             DAW0214.000
         ADMW      R2,SORTB,X1     ADD IN THE BASE ADDRESS              0215.000
         LW        R5,SORTI,X1                                         W0216.000
         SUI       R5,1W           FORTRAN INDICES                     W0217.000
         MPMW      R4,SORTZ,X1     1 FOR HOR., SIZE FOR VERTICAL        0218.000
         SRL       R5,2                                                W0219.000
         TRR       R5,R3                                             DAW0220.000
         ADMW      R3,SORTB,X1     ADD IN THE BASE ADDRESS              0221.000
         TRR       R3,R5           ADDRESS OF A(I)                    AW0222.000
         TRR       R2,R6           ADDRESS OF A(L) OR A(I+M)          AW0223.000
         TBM       0,SORTC,X1      CHECK STORED FLAG FOR DIRECT(IND.    0224.000
         BNS       SORT49C         DIRECT                               0225.000
         LW        R3,0W,X3        FOR INDIRECT SORT                    0226.000
         LW        R2,0W,X2        FOR INDIRECT SORT                    0227.000
SORT49C  EQU       $                                                    0228.000
         LNW       R7,SORTD,X1     NUMBER OF WORDS TO BE COMPARED       0229.000
         LW        R4,SORTS,X1     DISTANCE BETWEEN WORDS OF AN ITEM    0230.000
         BL        *SORTXA,X1      TO THE COMPARISON                    0231.000
         BU        SORT60          A(I) .LT. A(I+M)                     0232.000
         BU        SORT60          A(I) .EQ. A(I+M)                     0233.000
         BU        SORT50          A(I) .GT. A(I+M)                     0234.000
SORT50   EQU       $                                                    0235.000
*        TBM       0,SORTC,X1      CHECK DIRECT/INDIRECT FLAG           0236.000
*        BNS       SORT50E         GO FOR DIRECT                        0237.000
         LNW       R0,SORTZ,X1    GET NO OF WORDS TO MOVE               0238.000
         TRR       R5,R3           INDIRECT-RESTORE POINTERS TO TABLE   0239.000
         TRR       R6,R2                                                0240.000
SORT50E  LW        R4,0W,X3                                             0241.000
         LW        R7,0W,X2                                             0242.000
         STW       R4,0W,X2                                             0243.000
         STW       R7,0W,X3        INTERCHANGE OF ONE WORD COMPLETE     0244.000
         TBM       0,SORTC,X1      IS THIS AN INDIRECT SORT             0245.000
         BS        SORT50X         YES-WE MOVE ONLY THE POINTER WORD    0246.000
         ADMW      R3,SORTS,X1     GET ADDRESS FOR NEXT WORD OF THIS ITM0247.000
         ADMW      R2,SORTS,X1     GET ADDRESS FOR NEXT WORD OF THIS ITM0248.000
         BIW       R0,SORT50E      MORE WORDS TO EXCHANGE               0249.000
SORT50X  LW        R7,SORTI,X1                                          0250.000
         SUMW      R7,SORTM,X1                                          0251.000
         STW       R7,SORTI,X1     I=I-M                                0252.000
         SUI       R7,1W                                                0253.000
         BGE       SORT49          IF(I-1)60,49,49                      0254.000
SORT60   ABM       29,SORTJ,X1     J=J+1                                0255.000
         LW        R5,SORTJ,X1                                          0256.000
         CAMW      R5,SORTK,X1                                          0257.000
         BLE       SORT41          IF(J-K)41,41,20                      0258.000
         BU        SORT20                                               0259.000
SORT40   EQU       $                                                    0260.000
*        POPT                      DEALLOCATE STACK FRAME USED FOR      0261.000
*                                  TEMPORARY STORAGE                    0262.000
*        POP                       RESTORE REGS                         0263.000
*        TRSW      0               RETURN TO THE CALLER                 0264.000
         BU        SORTI.10                                             0265.000
         SPACE     5                                                    0266.000
         BOUND     1W                                                   0267.000
         SPACE                                                          0268.000
SORTCASU EQU       $                ASCENDING UNSIGNED                  0269.000
SORTCDEU EQU       $               DESCENDING UNSIGNED                  0270.000
SORTCASG EQU       $               ASCENDING ALGEBRAIC                  0271.000
SORTCDEG EQU       $              DESCENDING ALGEBRAIC                  0272.000
SORTCASA EQU       $               ASCENDING ABSOLUTE                   0273.000
SORTCDEA EQU       $               DESCENDING ABSOLUTE                  0274.000
         SPACE     2                                                    0275.000
COMPQ    EQU       $                                                    0276.000
         SPACE                                                          0277.000
         PUSH                      SAVE REGS                            0278.000
         TRR       R7,R0           DITTO                                0279.000
         LW        R7,0W,X3        A(I)                                 0280.000
         EOMW      R7,0W,X2        A(L)                                 0281.000
         BGE       COMPR           SIGNS ARE THE SAME                   0282.000
         TBM       0,0W,X3         CHECK SIGN OF A(I)                   0283.000
         BS        SHI             A(I) .GT. A(L)                       0284.000
         BU        SLO             A(I) .LT. A(L)                       0285.000
COMPR    LW        R7,0W,X3        A(I)                                 0286.000
         CAMW      R7,0W,X2        A(L)                                 0287.000
         BLT       SLO             A(I) .LT. A(L)                       0288.000
         BGT       SHI             A(I) .GT. A(L)                       0289.000
         ADR       R4,R3           ADVANCE ADDRESS BY DISTANCE BETWEEN  0290.000
         ADR       R4,R2           WORDS OF THE SAME ITEM               0291.000
         BIW       R0,COMPQ        COMPARE EACH WORD                    0292.000
         BU        SEQ             ALL WORDS ARE EQUAL                  0293.000
SHI      ABM       29,0W,X1        BUMP RETURN ADDRESS BY ONE WORD      0294.000
SEQ      ABM       29,0W,X1        BUMP RETURN ADDRESS BY ONE WORD      0295.000
SLO      EQU       $                                                    0296.000
         POP                       RESTORE REGS                         0297.000
         TRSW      R0              RETURN                               0298.000
         SPACE     4                                                    0299.000
         END                                                            0300.000
