* GET STRING INDEX                                      HEADER  C:GETSI 0001.000
*                                                                       0002.000
*                  GET STRING INDEX                                     0003.000
*                                                                       0004.000
         M.PGM     C:GETSI,MPX-32,3.6.1,00                              0005.000
         DEF       C:GETSI                                              0006.000
         EXT       C:READWF                                             0007.000
         EXT       C:WRYTWF                                             0008.000
SRTCOM6  COMMON    SRTC6(30)                                            0009.000
         ORG       SRTC6                                                0010.000
LSTSIZ   DATAW     X'0'                                                 0011.000
MXSGIN   DATAW     X'0'                                                 0012.000
WFSIZE   DATAW     X'0'                                                 0013.000
LSTSEC   DATAW     X'0'                                                 0014.000
JJ       DATAW     X'0'                                                 0015.000
KK       DATAW     X'0'                                                 0016.000
LL       DATAW     X'0'                                                 0017.000
SISZ     DATAW     X'0'                                                 0018.000
MAXSSZ   DATAW     X'7FFFFFFF'                                          0019.000
FIB      REZ       1W                                                   0020.000
SONFO    REZ       1W                                                   0021.000
SINFO    REZ       1W                                                   0022.000
TRVCTR   REZ       1W                                                   0023.000
SIINDX   REZ       1W                                                   0024.000
XTMP4    REZ       1W                                                   0025.000
XTMP3    REZ       1W                                                   0026.000
XTMP2    REZ       1W                                                   0027.000
XTMP1    REZ       1W                                                   0028.000
XLV185   REZ       1W                                                   0029.000
XLP1     REZ       1W                                                   0030.000
XLP2     REZ       1W                                                   0031.000
         REL                                                            0032.000
* GET THE NEXT AVAILABLE STRING FOR MERGING                             0033.000
* FIRST FIND THE SMALLEST STRING IN STRINGINFO.                         0034.000
* IF THAT IS LARGER THAN THE LARGEST PREVIOUSLY                         0035.000
* READ (I.E., THE ONLY STRINGS AVAILABLE ARE                            0036.000
* STRINGS WE HAVE JUST CREATED) THEN BEGIN                              0037.000
* SORTING ALL VALID STRING INFORMATION.                                 0038.000
* SINCE STRING INFORMATION IS EXHAUSTED FROM                            0039.000
* STRINGS WE HAVE JUST CREATED) THEN SORTING                            0040.000
* THE SORTING OFSTRING INFORMATION WILL RESULT                          0041.000
* IN STRINGINFO HAVING THE SMALLEST STRINGS                             0042.000
* CURRENTLY AVAILABLE.                                                  0043.000
         M.REQS                                                         0044.000
FQHD     EQU       X'0'            FIRST-RECORD QUEUE HEAD              0045.000
LQHD     EQU       X'0'            LAST-RECORD QUEUE HEAD               0046.000
TRUE     EQU       1               TRUTH                                0047.000
FALSE    EQU       X'0'            FALSEHOOD                            0048.000
NSRTOH   EQU       3               OVERHEAD PER TREE ENTRY DURING SORT  0049.000
NMRGOH   EQU       17              OVERHEAD PER MERGE LEVEL DURING MERGE0050.000
FIBSZ    EQU       8                                                    0051.000
IOWSSZ   EQU       X'0'            REQUIRED WORKING SPACE FOR I/O       0052.000
AREAOF   EQU       2               G.A. OFFSET FOR AREA DESCRIPTOR      0053.000
BUFBLK   EQU       1               RECORD OFFSET OF LOW ORDER PART OF BL0054.000
BUFRCT   EQU       2               RECORD OFFSET OF RECORD COUNT        0055.000
BLNKSZ   EQU       3               SIZE OF BLOCK INFO                   0056.000
SISZF    EQU       1               STRINGINFO LOW ORDER OF STRING LENGTH0057.000
SIADRF   EQU       3               STRINGINFO LOW ORDER OF STRING ADDRES0058.000
SIESZ    EQU       4               STRINGINFO ENTRY SIZE                0059.000
MAXSTG   EQU       32767           MAXIMUM NUMBER OF STRINGS            0060.000
FQLSTF   EQU       X'0'            FIRST QUEUE LOCATION LIST POINTER    0061.000
FQRECF   EQU       1               FIRST QUEUE LOCATION OF RECORD POINTE0062.000
FQLNKF   EQU       3               FIRST QUEUE LOCATION OF LINK         0063.000
FQESZ    EQU       4               FIRST QUEUE ENTRY SIZE               0064.000
LQLSTF   EQU       X'0'            LAST QUEUE LOCATION OF LIST POINTER  0065.000
LQRECF   EQU       1               LAST QUEUE LOCATION OF RECORD POINTER0066.000
LQLNKF   EQU       3               LAST QUEUE LOCATION OF LINK          0067.000
LQESZ    EQU       4               LAST QUEUE ENTRY SIZE                0068.000
RCADRF   EQU       X'0'            RECORD POINTER LOCATION OF RECORD ADD0069.000
RCEOSF   EQU       1               RECORD POINTER LOCATION OF END-OF-STR0070.000
RCLNKF   EQU       3               RECORDPOINTER LOCATION OF LINK       0071.000
RCESZ    EQU       4               RECORD POINTER ENTRY SIZE            0072.000
MRGLST   EQU       X'0'            LOCATION OF MERGE-LIST HEAD          0073.000
DUMPOL   EQU       1               LOCATION OF DUMMYPOOL-LIST HEAD      0074.000
MINTSZ   EQU       4               MINIMUM TREE SIZE                    0075.000
MAXTSZ   EQU       X'7FFE'         MAXIMUM TREE SIZE                    0076.000
STARTL   EQU       2               FIRST LIST ENTRY                     0077.000
MINMLV   EQU       2               MINIMUM MERGE LEVEL                  0078.000
MAXMLV   EQU       8               MAXIMUM MERGE LEVEL                  0079.000
NOTNS    EQU       X'0'            NOT NEW STRING                       0080.000
READNS   EQU       -1              READ NEW STRING                      0081.000
ATTCHD   EQU       1               NEW STRING READ AND ATTACHED         0082.000
NOSTRG   EQU       2               NO STRING AVAILABLE                  0083.000
LTV      EQU       X'0'            LESS THAN VALUE                      0084.000
EQV      EQU       1               EQUAL VALUE                          0085.000
GTV      EQU       2               GREATER THAN VALUE                   0086.000
SPERB    EQU       48              STRINGS PER BLOCK OF STRING INFO     0087.000
* SORT CONTROL BLOCK LAYOUT                                             0088.000
SCBWID   EQU       X'0'            WORK FILE ID                         0089.000
SCBIN    EQU       1               INPUT PROCEDURE                      0090.000
SCBOUT   EQU       2               OUTPUT PROCEDURE                     0091.000
SCBRA    EQU       3               RECORD ADDRESS                       0092.000
SCBRL    EQU       4               RECORD LENGTH                        0093.000
SCBKA    EQU       5               KEY ADDRESS                          0094.000
SCBKL    EQU       6               KEY LENGTH                           0095.000
SCBOPT   EQU       7               OPTIONS                              0096.000
* OPTION VALUES                                                         0097.000
MAPPED   EQU       1               USER PROVIDES MEMORY BOUNDS          0098.000
WRTCMP   EQU       2               USER WANTS OUTPUT I/O VERIFIED       0099.000
DIAGNO   EQU       4               USER WANTS SOME INFO MESSAGES        0100.000
SCBSTS   EQU       8               STATUS                               0101.000
* STATUS VALUES                                                         0102.000
EOS      EQU       1               END-OF-SORT                          0103.000
MEMERR   EQU       3               INSUFFICIENT MEMORY                  0104.000
WFSERR   EQU       5               INSUFFICIENT WORKFILE SPACE          0105.000
WFIOER   EQU       9               IRRECOVERABLE I/O ERROR              0106.000
WFRCER   EQU       17              WORKFILE RECORD COUNT ERROR          0107.000
SCBINF   EQU       9               INFO PROCEDURE                       0108.000
SCBBGM   EQU       10              BEGINNING OF MEMORY                  0109.000
SCBEDM   EQU       11              END OF MEMORY                        0110.000
* TRANSFER VECTOR LAYOUT                                                0111.000
TVKSZ    EQU       X'0'            KEYSZ                                0112.000
TVDSZ    EQU       1               DATSZ                                0113.000
TVFIB    EQU       2               FIB                                  0114.000
TVNREC   EQU       3               NRECS                                0115.000
TVSECW   EQU       4               SECTWD                               0116.000
TVTRKS   EQU       5               TRKSEC                               0117.000
TVMRGL   EQU       6               MERGLV                               0118.000
TVPCNT   EQU       7               PCNT                                 0119.000
TVBBAS   EQU       8               BUFBAS                               0120.000
TVSONF   EQU       9               SONFO                                0121.000
TVSINF   EQU       10              SINFO                                0122.000
TVLSSI   EQU       11              LASTSI                               0123.000
TVSGMX   EQU       12              STGMAX                               0124.000
TVRPTS   EQU       13              RECPTS                               0125.000
TVBSZS   EQU       14              BUFSZS                               0126.000
TVRPB    EQU       15              RECSPB                               0127.000
TVRUN    EQU       16              RUN                                  0128.000
TVNXEL   EQU       16              NXELST                               0129.000
TVLOSR   EQU       17              LOSER                                0130.000
TVLKEY   EQU       18              LSTKEY                               0131.000
TVLHDS   EQU       19              LSTHDS                               0132.000
TVLTLS   EQU       20              LSTTLS                               0133.000
TVFQ     EQU       21              FIRSTQ                               0134.000
TVLQ     EQU       22              LASTQ                                0135.000
TVWFSZ   EQU       23              WFSIZE                               0136.000
TVLSEC   EQU       24              LSTSEC                               0137.000
TVMXSG   EQU       25              MXSGIN                               0138.000
TVNBLK   EQU       26              NEXBLK                               0139.000
TVRMDR   EQU       27              RMDR                                 0140.000
TVESTG   EQU       28              ENDSTG                               0141.000
TVNSTG   EQU       29              NUSTRG                               0142.000
TVFULL   EQU       30              FULL                                 0143.000
TVPASZ   EQU       31              PASSSZ                               0144.000
TVPASM   EQU       32              PASMAX                               0145.000
TVSISZ   EQU       33              SISZ                                 0146.000
C:GETSI  EQU       $                                                    0147.000
         STW       R0,XLV185                                            0148.000
         STW       R2,TRVCTR                                            0149.000
         LW        R0,TVFIB*4,X2                                        0150.000
         STW       R0,FIB                                               0151.000
         LW        R0,TVSONF*4,X2                                       0152.000
         STW       R0,SONFO                                             0153.000
         LW        R0,TVSINF*4,X2                                       0154.000
         STW       R0,SINFO                                             0155.000
         LW        R0,TVWFSZ*4,X2                                       0156.000
         STW       R0,WFSIZE                                            0157.000
         LW        R0,TVMXSG*4,X2                                       0158.000
         STW       R0,MXSGIN                                            0159.000
         LW        R0,TVSISZ*4,X2                                       0160.000
         STW       R0,SISZ                                              0161.000
         LW        R0,TVLSEC*4,X2                                       0162.000
         STW       R0,LSTSEC                                            0163.000
* STRINGINDEX:=AREAOFFSET;                                              0164.000
         LI        R3,AREAOF*4                                          0165.000
         STW       R3,SIINDX                                            0166.000
* LASTSIZE:=STRINGINFO(STRINGINDEX).SIZE;                               0167.000
         ADMW      R3,SINFO                                             0168.000
         LW        R0,SISZF*4,X3                                        0169.000
         STW       R0,LSTSIZ                                     0218.000170.000
* FOR I:=STRINGINDEX+STRINGINFOENTRYSIZE STEP                           0171.000
* STRINGINFOENTRYSIZE UNTIL                                             0172.000
* AREAOFFSET+STRINGINFOSIZE-                                            0173.000
* STRINGINFOENTRYSIZE DO 81110000* STRINGINFOENTRYSIZE DO 81110000* STRI0174.000
         LI        R1,SIESZ*4                                           0175.000
         ADMW      R1,SIINDX                                            0176.000
         STW       R1,XTMP1                                             0177.000
         LI        R0,SPERB                                             0178.000
         SUI       R0,1                                                 0179.000
         TRN       R0,R6                                                0180.000
SISCAN   EQU       $                                                    0181.000
         STW       R6,XLP1                                              0182.000
* IF STRINGINFO(I).SIZE<LASTSIZE THEN                                   0183.000
         LW        R3,XTMP1                                             0184.000
         ADMW      R3,SINFO                                             0185.000
         LW        R0,SISZF*4,X3                                        0186.000
         SUMW      R0,LSTSIZ                                            0187.000
*        CI        R0,X'0'                                              0188.000
         BCF       LT,GSI000                                            0189.000
* BEGIN                                                                 0190.000
* STRINGINDEX:=I;                                                       0191.000
         LW        R0,XTMP1                                             0192.000
         STW       R0,SIINDX                                            0193.000
* LASTSIZE:=STRINGINFO(STRINGINDEX).SIZE;                               0194.000
         LW        R0,SISZF*4,X3                                        0195.000
         STW       R0,LSTSIZ                                            0196.000
* END;                                                                  0197.000
GSI000   EQU       $                                                    0198.000
         LI        R0,SIESZ*4                                           0199.000
         ARMW      R0,XTMP1                                             0200.000
         LW        R6,XLP1                                              0201.000
         BIB       R6,SISCAN                                            0202.000
* IF LASTSIZE>MAXSTRINGSIZEINMEMORY THEN                                0203.000
         LW        R0,LSTSIZ                                            0204.000
         SUMW      R0,MXSGIN                                            0205.000
*        CI        R0,X'0'                                              0206.000
         BCF       GT,GSI001                                            0207.000
* BEGIN SORTING ALL POTENTIAL STRINGS                                   0208.000
* L:=LASTSECTOR;                                                        0209.000
         LW        R0,LSTSEC                                            0210.000
         STW       R0,LL                                                0211.000
* REPEAT WORKFILESIZE-LASTSECTOR TIMES;                                 0212.000
         LW        R0,WFSIZE                                            0213.000
         SUMW      R0,LSTSEC                                            0214.000
* NOTE THAT SINCE MAXIMUM NUMBER OF STRINGS IS                          0215.000
* 32768 THEN WORKFILESIZE-LASTSECTOR IS LESS                            0216.000
* THAN 32768 EVEN IF STRINGS PER BLOCK IS 1.                            0217.000
         TRN       R0,R6                                                0218.000
SORTSI   EQU       $                                                    0219.000
         STW       R6,XLP1                                              0220.000
* BEGIN READ,SORT,WRITE SEQUENCE                                        0221.000
* READ(WORKFILE@L,STRINGOUT);                                           0222.000
         LW        R2,FIB                                               0223.000
         LW        R4,LL                                                0224.000
         LW        R3,SONFO                                             0225.000
         BL        C:READWF                                             0226.000
* FOR J:=AREAOFFSET STEP STRINGINFOENTRYSIZE UNTIL                      0227.000
* AREAOFFSET+STRINGINFOSIZE-                                            0228.000
* STRINGINFOENTRYSIZE DO 81155000* STRINGINFOENTRYSIZE DO 81155000* STRI0229.000
         LI        R0,AREAOF*4                                          0230.000
         STW       R0,XTMP2                                             0231.000
         LI        R0,SPERB                                             0232.000
         TRN       R0,R6                                                0233.000
OUTRLP   EQU       $                                                    0234.000
         STW       R6,XLP2                                              0235.000
* BEGIN                                                                 0236.000
* FOR K:=J+STRINGINFOENTRYSIZE                                          0237.000
* STEP STRINGINFOENTRYSIZE                                              0238.000
* UNTIL 2*(AREAOFFSET+STRINGINFOSIZE)                                   0239.000
* -STRINGINFOENTRYSIZE DO                                               0240.000
         LW        R0,SISZ                                              0241.000
         SLL       R0,2                                                 0242.000
         ADI       R0,AREAOF*4                                          0243.000
         ADR       R0,R0                                                0244.000
         STW       R0,XTMP3                                             0245.000
         LI        R0,SIESZ*4                                           0246.000
         ADMW      R0,XTMP2                                             0247.000
         STW       R0,XTMP4                                             0248.000
INNRLP   EQU       $                                                    0249.000
* BEGIN                                                                 0250.000
* IF K=AREAOFFSET+STRINGINFOSIZE THEN                                   0251.000
         LI        R0,AREAOF                                            0252.000
         ADMW      R0,SISZ                                              0253.000
         SLL       R0,2                                                 0254.000
         CAMW      R0,XTMP4                                             0255.000
         BNE       GSI002                                               0256.000
* SKIP FROM STRINGINFO TO STRINGOUT                                     0257.000
* K:=K+AREAOFFSET;                                                      0258.000
         LI        R0,AREAOF*4                                          0259.000
         ARMW      R0,XTMP4                                             0260.000
GSI002   EQU       $                                                    0261.000
* JSZ:=STRINGINFO(J).SIZE;                                              0262.000
         LW        R3,XTMP2                                             0263.000
         ADMW      R3,SINFO                                             0264.000
         LW        R0,SISZF*4,X3                                        0265.000
         STW       R0,JJ                                                0266.000
* KSZ:=STRINGINFO(K).SIZE;                                              0267.000
         LW        R2,XTMP4                                             0268.000
         ADMW      R2,SINFO                                             0269.000
         LW        R0,SISZF*4,X2                                        0270.000
         STW       R0,KK                                                0271.000
* IF KSZ<JSZ THEN                                                       0272.000
         SUMW      R0,JJ                                                0273.000
*        CI        R0,X'0'                                              0274.000
         BCF       LT,GSI003                                            0275.000
* EXCHANGE THESE ENTRIES                                                0276.000
* BEGIN                                                                 0277.000
* STRINGINFO(J).SIZE:=KSZ;                                              0278.000
         LW        R0,KK                                                0279.000
         STW       R0,SISZF*4,X3                                        0280.000
* STRINGINFO(K).SIZE:=JSZ;                                              0281.000
         LW        R0,JJ                                                0282.000
         STW       R0,SISZF*4,X2                                        0283.000
* JAD:=STRINGINFO(J).ADDR;                                              0284.000
         LW        R0,SIADRF*4,X3                                       0285.000
         STW       R0,JJ                                                0286.000
* STRINGINFO(J).ADDR:=STRINGINFO(K).ADDR;                               0287.000
         LW        R7,SIADRF*4,X2                                       0288.000
         STW       R7,SIADRF*4,X3                                       0289.000
* STRINGINFO(K).ADDR:=JAD;                                              0290.000
         STW       R0,SIADRF*4,X2                                       0291.000
* END;                                                                  0292.000
GSI003   EQU       $                                                    0293.000
* END INNER LOOP;                                                       0294.000
         LI        R0,SIESZ*4                                           0295.000
         ARMW      R0,XTMP4                                             0296.000
         LW        R0,XTMP4                                             0297.000
         CAMW      R0,XTMP3                                             0298.000
         BCT       LT,INNRLP                                            0299.000
* END OUTER LOOP;                                                       0300.000
         LI        R0,SIESZ*4                                           0301.000
         ARMW      R0,XTMP2                                             0302.000
         LW        R6,XLP2                                              0303.000
         BIB       R6,OUTRLP                                            0304.000
* NOW WE HAVE THE SMALLEST STRINGS IN SINFO & THE 81220000* NOW WE HAVE 0305.000
* LARGEST IN SONFO. NOW CHECK TO SEE IF WE NEED                         0306.000
* TO SAVE WHAT'S IN SONFO                                               0307.000
* IF STRINGINFO(AREAOFFSET+STRINGSIZE-                                  0308.000
* STRINGINFOENTRYSIZE).SIZE=                                            0309.000
* MAXSTRINGSIZE THEN                                                    0310.000
         LW        R1,SISZ                                              0311.000
         SLL       R1,2                                                 0312.000
         ADI       R1,AREAOF*4                                          0313.000
         SUI       R1,4*SIESZ                                           0314.000
         ADMW      R1,SINFO                                             0315.000
         LW        R0,SISZF*4,X1                                        0316.000
         CAMW      R0,MAXSSZ                                            0317.000
         BNE       GSI004                                               0318.000
* LASTSECTOR:=LASTSECTOR+1;                                             0319.000
         LW        R0,LSTSEC                                            0320.000
         ADI       R0,1                                                 0321.000
         STW       R0,LSTSEC                                            0322.000
         LW        R3,TRVCTR                                            0323.000
         STW       R0,TVLSEC*4,X3                                       0324.000
         BU        GSI005                                               0325.000
* ELSE                                                                  0326.000
GSI004   EQU       $                                                    0327.000
* WRITE(WORKFILE@L,STRINGOUT);                                          0328.000
         LW        R2,FIB                                               0329.000
         LW        R4,LL                                                0330.000
         LW        R3,SONFO                                             0331.000
         BL        C:WRYTWF                                             0332.000
GSI005   EQU       $                                                    0333.000
* END;                                                                  0334.000
         LI        R4,1                                                 0335.000
         ARMW      R4,LL                                                0336.000
         LW        R6,XLP1                                              0337.000
         BIB       R6,SORTSI                                            0338.000
* RESET STRING INDEX                                                    0339.000
* STRINGINDEX:=AREAOFFSET;                                              0340.000
         LI        R0,AREAOF*4                                          0341.000
         STW       R0,SIINDX                                            0342.000
* REMEMBER THE LARGEST AVAILABLE                                        0343.000
* MAXSTRINGSIZEINMEMORY:=STRINGINFO(AREAOFFSET+                         0344.000
* STRINGSIZE-STRINGINFOENTRYSIZE).SIZE; 81252000* STRINGSIZE-STRINGINFOE0345.000
         LW        R1,SISZ                                              0346.000
         SLL       R1,2                                                 0347.000
         ADI       R1,AREAOF*4                                          0348.000
         SUI       R1,4*SIESZ                                           0349.000
         ADMW      R1,SINFO                                             0350.000
         LW        R3,TRVCTR                                            0351.000
         LW        R0,SISZF*4,X1                                        0352.000
         STW       R0,TVMXSG*4,X3                                       0353.000
* END;                                                                  0354.000
GSI001   EQU       $                                                    0355.000
* REMEMBER THE CURRENT SETTING SO NEW STRINGS                           0356.000
* WILL HAVE A SLOT                                                      0357.000
* LASTSTRINGINDEX:=STRINGINDEX;                                         0358.000
         LW        R2,SIINDX                                            0359.000
         LW        R3,TRVCTR                                            0360.000
         STW       R2,TVLSSI*4,X3                                       0361.000
* RETURN (STRINGINDEX);                                                 0362.000
*                                  R2 = SIINDX                          0363.000
         LW        R0,XLV185                                            0364.000
         TRSW      R0                                                   0365.000
* END;                                                                  0366.000
         END                                                            0367.000
