*DECK C$SMIF
          IDENT  C$SMIF 
          TITLE  C$SMIF - INTERFACE TO SORT/MERGE 
          COMMENT  INTERFACE TO SORT/MERGE
          MACHINE  ANY,I
          SST 
**
*         C$SMIF - INTERFACE TO SORT/MERGE VERSION 5
*         CALLED AS FOLLOWS FOR BOTH SORT AND MERGE 
*         A0 = SORT/MERGE SD FIT ADDRESS
*         X0 = ADDR OF KEY AND MERGE FILE DATA
*         X1 = 0 IF NO COLLATING SEQ OPTION IN SOURCE, OTHERWISE
*            = BITS 29-0 COLLATING SEQUENCE NUMBER
*              BITS 59-30 - COLLATING SEQ ADDR IF USED DEF
*         X2 = ACCUMULATED KEY LENGTHS
*         X3 = ADDRESS OF USING AREA OR INPUT PROCEDURE (SORT ONLY) 
*         X4 = ADDRESS OF GIVING OR OUTPUT PROCEDURE
*         X5 = ADDR OF SMMERGE OR SMSORT
*         B3 = 0 IF USING, 1 IF INPUT PROC (SORT ONLY)
*         B4 = 0 IF GIVING, 1 IF OUTPUT PROC
*         B7 = RETURN ADDR
          RJ  C.SORTI OR MERGI
* 
*         RJ IS FOLLOWED BY THE FOLLOWING:  
*                -USING- AREA (SORT ONLY) OR -GIVING- AREA OR -INPUT
*                PROCEDURE- AREA (SORT ONLY), IN THAT ORDER OF
*                PRECEDENCE, NOTE BELOW.
*                -GIVING- AREA OR -INPUT PROCEDURE- AREA (SORT ONLY) OR 
*                -OUTPUT PROCEDURE- AREA, IN THAT ORDER OF PRECEDENCE,
*                NOTE BELOW 
*              + NORMAL RETURN
*                            -USING- AREA CONSISTS OF A TABLE WHICH CON-
*                            TAINS A 1 WORD ENTRY PER -USING- FILE AND
*                            ENDS WITH A ZERO WORD, WHICH IS FOLLOWED 
*                            (SORT ONLY) BY A PSEUDO -INPUT PROCEDURE-
*                            FOR EACH (SORT) -USING- FILE.  THE FORMAT
*                            OF EACH TABLE ENTRY IS - 
*                                 VFD    12/0,18/FITLOC,30/0  - MERGE 
*                                 VFD    12/0,18/FITLOC,12/0,18/PROCLOC 
*                            WHERE -FITLOC- IS THE ADDRESS OF THE FIT OF
*                            THE -USING- FILE, AND -PROCLOC- IS THE 
*                            ADDRESS OF THE PSEUDO -INPUT PROCEDURE-
*                            FOR THAT -USING- FILE.  THE FORMAT OF EACH 
*                            PSEUDO -INPUT PROCEDURE- IS -
*                                 PROCLOC BSS  1
*                                         OPEN FILE.
*                                 LBL1    READ FILE AT END GO TO LBL2.
*                                         RELEASE RECORD. 
*                                         GO TO LBL1. 
*                                 LBL2    CLOSE FILE. 
*                                         EQ   PROCLOC
*                            (NOTE - THERE IS NO MOVE OF THE INPUT
*                            RECORD TO THE SORT FILE RECORD AREA. 
*                            -CBSORT- ARRANGES THINGS SO THAT THE 
*                            -USING- FILE RECORD IS READ DIRECTLY INTO
*                            THE SORT FILE RECORD AREA.)
*                            -GIVING- AREA CONSISTS OF A WORD OF FORMAT 
*                                 VFD    12/0,18/FITLOC,12/0,18/PROCLOC 
*                            FOLLOWED BY A PSEUDO -OUTPUT PROCEDURE-
*                            FOR THE -GIVING- FILE.  -FITLOC- IS THE
*                            ADDRESS OF THE FIT OF THE -GIVING- FILE, 
*                            AND -PROCLOC- IS THE ADDRESS OF THE PSEUDO 
*                            -OUTPUT PROCEDURE-.  THE FORMAT OF THE 
*                            PSEUDO -OUTPUT PROCEDURE- IS - 
*                                 PROCLOC BSS  1
*                                         OPEN FILE.
*                                 LBL1    RETURN RECORD AT END GO TO
*                                          LBL2.
*                                         WRITE RECORD. 
*                                         GO TO LBL1. 
*                                 LBL2    CLOSE FILE. 
*                                         EQ   PROCLOC
*                            (NOTE - THERE IS NO MOVE OF THE SORT/MERGE 
*                            RECORD TO THE OUTPUT FILE AREA, EXCEPT 
*                            WHEN A -USING- FILE HAS Z-TYPE RECORDS.
*                            (IN THIS LATTER CASE, CBSORT PLACES THE
*                            BLANK-FILLED RECORD IN THE OUTPUT FILE 
*                            RECORD AREA.)  CBSORT ARRANGES THAT THE
*                            -GIVING- FILE RECORD IS WRITTEN DIRECTLY 
*                            FROM THE RECORD LOCATION SPECIFIED BY
*                            SORT/MERGE.) 
*                            -INPUT PROCEDURE- AREA IS OF FORMAT -
*                                 LBL1    BSS  1
*                                         -PERFORM- INPUT PROCEDURE.
*                                         EQ   LBL1 
*                            -OUTPUT PROCEDURE- AREA IS OF FORMAT - 
*                                 LBL1    BSS  1
*                                         -PERFORM- OUTPUT PROCEDURE. 
*                                         EQ   LBL1 
* 
*         REGISTERS DESTROYED - ALL EXCEPT B1 
* 
*CALL IOMICROS
          ENTRY  C.MERGI
 C.MERGI  BSS    1           ENTRY FOR MERGE
          MX7    0
          SA2    C.MERGI     GET ENTRY
          SX6    B1+B1       MERGE FLAG 
          EQ     SM1
          ENTRY  C.SORTI
 C.SORTI  BSS    1           ENTRY FOR SORT 
          SX7    X2          LENGTH INCLUDING ALL KEYS
          SA2    C.SORTI     GET ENTRY
          SX6    B1          SORT FLAG
 SM1      BSS    0
          SA7    =XC.SMRIK   SAVE REC LEN INCLUDING KEYS (0 IF MERGE) 
          SB5    X7          SAVE AS FLAG FOR SORT OR MERGE 
          LX2    30 
          SX7    X2-1 
          SA7    =XC.LINEA   SAVE ADDR OF LINE NBR OF CALL
          SA7    MRGLN1 
          SA2    =XC.SMIE    SORT OR MERGE IN EXECUTION FLAG
          ZR     X2,SM2      JP IF NO SORT OR MERGE IN EXECUTION
          SX1    #SRTM9      ERROR - A SORT OR MERGE ALREADY IN EXEC. 
          RJ     =XC.ABT      ABORT THE RUN 
 SM2      BSS    0
          SA6    A2          C.SMIE = 1 IF SORT (ALLOW RELEASE), 2 IF MR
          SX7    B7          RETURN 
          SA7    =SRETURN 
          MX2    1
          LX2    55          MAKE AN RJ INSTRUCTION 
          LX5    30          POSITION SMMERGE OR SMSORT ADDR
          BX6    X5+X2
          SA6    SMCALL      STORE FOR CALL 
          SX7    X0          ADDR OF KEY INFO 
          SA7    =SKEYINFO
          SX6    A0          ADDR OF SD 
          SA6    =XC.SMSDF
          FETCH  A0,RECA,X6  GET RECORD AREA ADDR 
          SA6    =XC.SMRAA
          FETCH  A0,MRL,X6   MAX REC LEN
          SA6    =SMAXRL     SAVE THIS
          SX6    X3          INPUT PROCEDURE OR USING TABLE ADDRESS 
          ZR     B3,USING1   JP IF USING IS SPECIFIED 
          MX6    0
          SB3    X3          B3 NOW HAS INPUT PROC ADDR 
 USING1   BSS    0
          SA6    =XC.SMUTA   USING TABLE ADDR OR 0 IF INPUT PROC
          SA6    =XC.SMRTZ   SET REC TYPE Z FLAG - CHGD BY EXIT3
          SX6    B3 
          SA6    =XC.SMIPA   0 IF USING, OTHERWISE INPUT PROC ADDR
          BX6    X4          OUTPUT PROC OR GIVING ADDR 
          NZ     B4,OUTPROC  JP IF AN OUTPUT PROCEDURE
          SA6    =XC.SMGTA   SAVE GIVING TABLE ADDRESS
          MX6    0
 OUTPROC  BSS    0
          SA6    =XC.SMOPA   SAVE OUTPUT PROCEDURE ADDRESS
          BX6    X1          COLL SET PARAM 
          SA6    =SSVCOLSQ   SAVE IT
          SA1    SMCALLP     PARAM LIST FOR SM5MERG OR SM5SORT
          RJ     *+1         CLEAR STACK
          DATA   0           FOR PREV RJ
 SMCALL   RJ     *           RJ TO SMSORT OR SMMERGE (SET AT ENTRY) 
          SA3    =XC.SMRIK   SORT OR MERGE FLAG 
          ZR     X3,NOMRL    JP IF A MERGE
          SA1    SMMRLP      MRL PARAM
          SA2    =XC.SMSDF
          FETCH  X2,RT,X2 
          SX2    X2-#FT#     SEE IF FIXED LEN RECS
          NZ     X2,VARLEN   JP IF VARIABLE LENGTH
          RJ     =XSM5OFL    CALL TO SET RECORD LENGTH
          EQ     NOMRL
 VARLEN   BSS    0
          RJ     =XSM5OMRL   CALL TO SET MAX REC LENGTH 
 NOMRL    BSS    0
          SB1     1          RESTORE B1 
*  IF A NON-DEFAULT COLLATING SEQUENCE HAS BEEN SPECIFIED, IT MUST BE 
*  TURNED INTO A TABLE AND GIVEN A NAME FOR THE SMSEQ CALL AND IN EACH
*  SMKEY CALL.
*  THE TABLE IS IN ORDER FROM LOWEST DISPLAY CODE TO HIGHEST. 
*  IF THERE ARE ANY EQUAL CHARS, SMEQU MUST BE CALLED 
          SA1    SVCOLSQ     GET COLL SEQ PASSED TO PROG
          SA2    DEFCOLS     GET DEFAULT COLL SEQ 
          SA3    =XC.SMRIK   SORT OR MERGE FLAG 
          SA5    =XC.SRTCS   SORT COLLATING SEQ SET BY SET
          NZ     X3,COLSQ1   JP IF A SORT 
          SA5    =XC.MRGCS   MERGE COLLATING SEQ
 COLSQ1   BSS    0
          NZ     X5,COLSQ2   JP IF A SET SORT OR MERGE COLL SEQ DONE
          NZ     X1,COLSQ3   JP IF A COL SEQ ON STATEMENT 
          SA5    =XC.PCSSV   PROG COL SEQ 
          ZR     X5,STCLSQ   JP IF NO SET PROG COLL SET DONE
 COLSQ2   BSS    0
          LX5    30 
          BX1    X5          SET UP LIKE ONE IN PARAM 
 COLSQ3   BSS    0
          SX0    X1-1 
          ZR     X0,NTASCI   JP IF A USER-DEFINED SEQUENCE
          SX0    X1-CS.NTV
          ZR     X0,STCLSQ   JP IF NATIVE 
          SX0    X1-DEF.CS
          ZR     X0,STCLSQ   JP IF DEFAULT (SAME AS NATIVE) 
          SX0    X1-CS.STND1
          ZR     X0,ASCIICS  JP IF STANDARD-1 (ASCII) 
          SX0    X1-CS.ASCII
          ZR     X0,ASCIICS  JP IF ASCII
          SA2    COBOL6      =10HCOBOL6 
          SX0    X1-CS.CD64 
          ZR     X0,STCLSQ   JP IF CDC64 SEQ
          SX0    X1-CS.UNI
          NZ     X0,NTUNI    JP IF NOT UNIVAC 
          SX1    =XC.UNICS
          LX1    30 
          EQ     NTASCI 
 NTUNI    BSS    0
          SX0    X1-CS.EBCDC
          NZ     X0,ASCIICS  IF NOT EBCDIC ASSUME ASCII (IS ERROR)
          SA2    =10HEBCDIC6
          EQ     STCLSQ 
 ASCIICS  BSS    0
          SA2    ASCII6      =10HASCII6 
          EQ     STCLSQ 
 NTASCI   BSS    0
          LX1    30 
          SX6    X1          ADDR OF COLL SEQ 
          SA6    =SSVCOLSQ
          SB6    65 
          SB5    =SCSARRAD
          SB7    B1 
          RJ     =XC.GETBK   GET A BLOCK FOR TABLE
          SA1    CSARRAD     ADDRESS OF BLOCK 
          MX7    1
          SB2    64 
 MAPCSF   BSS    0           SET UP TABLE 
          SA7    X1+B2
          SB2    B2-B1
          PL     B2,MAPCSF
          MX7    54 
          SB4    X1          ADDRESS OF BLOCK 
          SB3    10 
          SA2    SVCOLSQ     GET ADDR OF COLL SEQ TABLE 
          SA3    X2          FIRST WORD 
          MX6    0
 MAPCS    BSS    0           MAP COLL SEQ TO SMEQ FORMAT
          LX3    6
          BX5    -X7*X3 
          SA4    X5+B4       GET WORD AT THIS COLL POSITION 
          NG     X4,MAPNTD   JP IF NO OTHER CHAR COLLATES SAME YET
          AX4    30 
          SX4    X4 
          NZ     X4,MAPADTT  JP IF PREVIOUS EQUAL FOUND 
          BX7    X3 
          SA7    SAVERS      SAVE NEEDED REGISTERS
          BX7    X6 
          SA7    A7+B1
          SX7    B4 
          SA7    A7+B1
          SA0    A3          SAVE A3
          SB6    66 
          SB5    =XC.BUFF 
          SB7    B1 
          RJ     =XC.GETBK   GET A BLOCK
          SA3    A0          RESTORE A3 
          SA1    =XC.BUFF    ADDRESS OF BLOCK 
          SB2    65 
          MX7    1
 MAPGBC   BSS    0
          SA7    X1+B2
          SB2    B2-B1
          NZ     B2,MAPGBC
          SA2    SAVERS 
          BX3    X2          RESTORE REGS 
          SA2    A2+B1
          BX6    X2 
          SA2    A2+B1
          SB4    X2 
          MX7    54 
          BX5    -X7*X3      GET CHAR AGAIN 
          SA4    X5+B4       GET ONE EQUAL TO IT
          SX1    X1          ADDR OF NEW BLOCK (IS EQUAL TABLE) 
          LX1    30 
          BX7    X1+X4
          LX1    30 
          SA7    A4          STORE CHAR AND POINTER TO EQ TABLE 
          BX7    X4 
          SA7    X1          FIRST EQ TABLE ENTRY (FIRST CHAR)
          SA6    X1+B1       SECOND ENTRY (SECOND OR THIS CHAR) 
          MX7    54 
          EQ     MAPTSTE
 MAPADTT  BSS    0
          SA1    X4+1        POINT INTO TABLE 
 MAPSTB   BSS    0
          SA1    A1+B1
          PL     X1,MAPSTB   JP IF NOT AVAILABLE WORD 
          SA6    A1          PUT CHAR IN ARRAY
          EQ     MAPTSTE
 MAPNTD   BSS    0
          SA6    X5+B4       PUT CHAR IN PROPER COLL SEQ PLACE
 MAPTSTE  BSS    0
          SX6    X6+B1       NEXT CHARACTER 
          SX5    X6-64
          PL     X5,MAPCSDN  JP IF DONE 
          SB3    B3-B1
          NZ     B3,MAPCS    JP IF WORD NOT DONE
          SB3    10 
          SA3    A3+B1       NEXT WORD OF COLL SEQ POSITIONS
          EQ     MAPCS
 MAPCSDN  BSS    0
          MX6    0
          SA6    COLSEQ      KEEP TRACK OF ITEM BEING DONE
          SA6    =XC.BUFF+1  SET UP FOR P LIST
          SA1    SMSEQPL
          RJ     =XSM5SEQN   START SEQUENCE 
 SEQSLP   BSS    0
          SB1    1           RESTORE B1 SINCE SM MAY HAVE CLOBBERED IT
          SA1    COLSEQ      ITEM WE ARE DOING
          SX7    X1-64
          PL     X7,SEQSDN   JP IF DONE 
          SA2    CSARRAD     ADDR OF COLL SEQ ARRAY 
          IX3    X1+X2       POINT TO CURR ITEM 
          SA3    X3 
          SX6    X1+B1       BUMP POS NBR 
          SA6    A1 
          NG     X3,SEQSLP   JUMP IF NO CHARACTER 
          LX3    30 
          SX7    X3          ADDR OF EQUAL TABLE IF ANY 
          ZR     X7,NOEQS    JP IF NO EQUAL CHARACTERS IN THIS SLOT 
          SA7    SAVERS      SAVE ADDR OF EQUAL TABLE 
          SB6    B0 
 EQPR0    BSS    0           FIND NUMBER OF EQUAL CHARS 
          SA5    X7+B6
          NG     X5,EQPR1 
          SB6    B6+B1
          EQ     EQPR0
 EQPR1    BSS    0
          SB7    B1 
          SB5    =XC.BUFF 
          RJ     =XC.GETBK   GET BLOCK FOR PARAMS 
          SA1    =XC.BUFF    ADDR OF BLOCK
          SA2    SAVERS      ADDR OF EQUAL TABLE
          SX1    X1 
          SB2    B0 
 EQPR2    BSS    0           FORM PARAM LIST AND PARAMS 
          SA5    X2+B2
          NG     X5,EQPR3    JP IF DONE WITH EQUAL CHARS
          SX6    X1+B2
          SA6    A5          PARAM POINTER
          LX5    54          CHAR TO TOP
          SA3    =O00555555555555555555 
          BX7    X5+X3
          SA7    X1+B2       PARAM
          SB2    B2+B1
          EQ     EQPR2
 EQPR3    BSS    0
          MX7    0
          SA7    A5          TERMINATE PARAM POINTERS 
          SA1    X2 
 CALLSEQ  BSS    0
          RJ     =XSM5SEQS   SEND SM A CHAR LIST OR CHAR
          SB1    1           RESTORE B1 
          SB7    =XC.BUFF 
          RJ     =XC.FREBK   FREE EQUAL BLOCK 1 
          SB7    SAVERS 
          RJ     =XC.FREBK   FREE BLOCK 2 
          EQ     SEQSLP 
 NOEQS    BSS    0
          LX3    24          CHAR TO TOP
          SA1    =O00555555555555555555 
          BX6    X1+X3
          SA6    A3          MAKE INTO 10H TYPE PARAM 
          SX7    A3 
          SA7    =XC.BUFF    PLIST
          SA1    =XC.BUFF 
          RJ     =XSM5SEQS   SEND SM A CHAR 
          EQ     SEQSLP 
 SEQSDN   BSS    0
          SB7    CSARRAD
          RJ     =XC.FREBK   FREE UP THE BLOCK HOLDING THE TABLE
          SA2    COBOL5S     USER DEFINED NAME
 STCLSQ   BSS    0
          BX6    X2 
          SA6    COLSEQ      PUT COLLATING SEQUENCE IN PARAMETERS 
*  GENERATE CALLS TO SMKEY TO DEFINE KEY FIELDS 
 CALLKEY  BSS    0
          SA2    KEYINFO
          SA3    X2 
          ZR     X3,DONE     JP IF NO MORE
          NG     X3,DOFILE   JP IF A FILE PARAM NEXT
          LX3    21 
          SA4    A3+B1
          MX5    60-20
          SX7    A4+B1
          SA7    A2          POINT TO NEXT KEY
          BX6    -X5*X3      CHARPOS
          SA6    CHARPOS
          LX3    20 
          BX7    -X5*X3      NCHAR (NBR CHARS)
          SA7    NCHAR
          NZ     X4,NOTAN    JP IF NOT ALPHANUMERIC 
          SA4    COLSEQ      GET NAME OF COLLATING SEQ
 NOTAN    BSS    0
          BX6    X4 
          SA6    CODE        SAVE COLL SEQ NAME OR NUMERIC TYPE 
          MX6    6
          BX7    X6*X3       ORDER (A OR D) 
          SA1    =O00555555555555555555 
          BX7    X7+X1       FILL WITH BLANKS 
          SA7    ORDER       A FOR ASCENDING OR D FOR DESCENDING
          SA1    SMKEYPL     PARAM LIST 
          RJ     =XSM5KEY 
          SB1     1          RESTORE B1 
          EQ     CALLKEY
*  PROCESS FILES IF ANY ARE HERE (WILL BE ON MERGE) 
 DOFILE   BSS    0
          MX7    0
          SA7    SAVERS+2    POINTER FOR CURRENT NAME 
          SB6    B0 
          SB3    A3+B1       POINT TO FIRST FILE PARAM
 COUNTFS  BSS    0           COUNT FILES
          SA2    B3+B1       NEXT FILE NAME (FIRST MUST BE ONE) 
          SB6    B6+B1       BUMP COUNT 
          SB3    B3+B1
          NZ     X2,COUNTFS  JP IF ANOTHER ONE
          SX6    B6 
          SA6    SAVERS      SAVE COUNT OF FILES
          SB6    B6+B6       DOUBLE COUNT FOR ALLOCATE
          SB6    B6+B1       BUMP ONE FOR PARAM LIST TERMINATOR 
          SB5    A6+B1       ADDR OF CMM BLOCK TO HERE
          SA1    KEYINFO
          IX6    X6+X1       POINT TO LAST FILE 
          SA6    A1          FILES LISTED IN REVERSE ORDER OF DECLARATIO
          SB7    B1 
          RJ     =XC.GETBK   GET A CMM BLOCK FOR LIST 
 PRFILE   BSS    0
          SA2    KEYINFO     ADDR OF DATA 
          SA3    X2 
          SX4    X3 
          ZR     X4,DONEMU   JP IF DONE WITH ALL FILES
          SX6    A3-B1       POINT TO NEXT ONE
          SA6    A2 
          SA0    X3          FIT POINTER
          EQ     MRGOPR 
 MRGLN1   DATA   0           LINE NBR 
 MRGOPR   BSS    0
          FETCH  A0,FNEX,X5  OPTIONAL FILE NOT EXISTING FLAG
          MX6    0
          SA6    =SSVCFST 
          NG     X5,PRFILE   JP IF OP FILE NOT HERE - SKIP IT 
          SA2    A0          GET LFN
          MX7    42 
          SA1    SAVERS      COUNT OF FILES 
          BX7    X7*X2
          SA2    A1+B1       ADDR OF BLOCK
          SA3    A2+B1       CURRENT POINTER
          IX2    X2+X3       CURRENT PLACE
          SX6    X3+B1
          SA6    A3          BUMP POINTER 
          SA7    X2          STORE FILE NAME
          IX2    X2+X1       POINTER HALF OF BLOCK
          SX6    A7 
          SA6    X2          POINTER
          MX7    0
          SA7    A6+B1       TERMINATOR (IN CASE LAST)
          EQ     PRFILE      DO NEXT ONE
 DONEMU   BSS    0
          SA1    SAVERS      NBR OF FILES 
          SA2    A1+B1       ADDR OF BLOCK
          IX1    X1+X2       POINT TO LIST OF ADDRESSES 
          SA1    X1          NORMAL PARAM 
          RJ     =XSM5FROM   CALL USING FILE ROUTINE
          SB1    1
          SB7    SAVERS+1 
          RJ     =XC.FREBK   FREE BLOCK 
 DONE     BSS    0
          SA1    =XC.SMRIK   REC LEN - ALSO MERGE OR SORT KEY 
          ZR     X1,MRG1     JP IF IT IS A MERGE
          SX6    =XC.SMEX1
          SA6    =XC.BUFF 
          SA1    =XC.BUFF 
          RJ     =XSM5OWN1   DEFINE EXIT 1
 MRG1     BSS    0
          SX6    =XC.SMEX3
          SA6    =XC.BUFF 
          SA1    =XC.BUFF 
          RJ     =XSM5OWN3   DEFINE EXIT 3
          SX6    =XC.SMEX4
          SA6    =XC.BUFF 
          SA1    =XC.BUFF 
          RJ     =XSM5OWN4   DEFINE EXIT 4
          SA1    =XC.SMRSF   GET RETAIN SEQUENCE FLAG 
          SA2    =10HNO 
          ZR     X1,NORET    JP IF SEQUENCE NOT TO BE RETAINED
          SA2    =10HYES
 NORET    BSS    0
          BX6    X2          YES OR NO OPTION 
          SA6    RETP 
          SA1    RETPAR 
          RJ     =XSM5RETA   GIVE RETAIN SEQUENCE OPTION
          RJ     =XSM5NODA   SUPPRESS DAYFILE MESSAGES
          SB1    1           RESTORE B1 
          SA1    =XC.SRTMS   MESSAGE FLAG 
          ZR     X1,NOMSG1   JP IF NONE WANTED
          SA4    =XC.SMRIK   SORT OR MERGE FLAG 
          SX1    #SRTM11     -START COBOL SORT- MESSAGE NUMBER
          NZ     X4,ISSRT1   JP IF IT IS A SORT 
          SX1    #SRTM10     -START COBOL MERGE- MESSAGE NUMBER 
 ISSRT1   BSS    0
          MX2    0           NO INSERTS 
          SA3    =XC.LINEA   ADDR OF LINE NBR 
          MX6    0           NO ABORT 
          RJ     =XC.MSG     STARTING MESSAGE TO DAYFILE
 NOMSG1   BSS    0
          MX6    0           FLAG AS NOT OLD BINARY 
          RJ     =XC.SMINI   INITIALIZE EXITS 
          RJ     =XSM5END    WRAP UP AND GO TO SORT 
*   RETURN FROM SORT - WRAP IT UP 
          SB1     1          RESTORE B1 
          MX6    0
          SA6    =XC.SMIE    CLEAR SORT/MERGE IN EXECUTION FLAG 
          SA5    =XC.SRTMS   SEE IF MESSAGES WANTED 
          ZR     X5,NOMSG2   JP IF NONE 
          MX7    1
          SA7    =XC.HLDMS   KEEP MESSAGE CAPSULE IN CORE 
          SA5    =XC.SMRIK   SORT OR MERGE FLAG 
          ZR     X5,MRG2     JP IF A MERGE RUN
          SA1    =XC.SMRRL   NUMBER OF RECORDS RELEASED 
          RJ     =XC.MSCV    CONVERT TO DISPLAY 
          SA7    =XC.MSINS   MESSAGE INSERT PLACE 
          MX7    0
          SA7    A7+B1
          SX2    B1          FLAG INSERT
          MX3    1           SUPPRESS SOURCE LINE 
          MX6    0           NO ABORT 
          SX1    #SRTM5      - RECORDS RELEASED MESSAGE 
          RJ     =XC.MSG     OUTPUT MESSAGE 
 MRG2     BSS    0
          SA1    =XC.SMRRT   NBR RECS RETURNED
          RJ     =XC.MSCV    CONVERT TO DISPLAY 
          SA7    =XC.MSINS   INSERT 
          MX6    0
          SA6    A7+B1
          SX2    B1          HAS INSERT 
          MX3    1           SUPPRESS SOURCE LINE 
          MX6    0           NO ABORT 
          SX1    #SRTM6      - RECORDS RETURNED MESSAGE 
          RJ     =XC.MSG     OUTPUT MESSAGE 
          SX1    #SRTM2      -END COBOL SORT- MESSAGE 
          SA5    =XC.SMRIK
          NZ     X5,ISSRT2   JP IF IT IS A SORT 
          SX1    #SRTM1      -END COBOL MERGE- MESSAGE
 ISSRT2   BSS    0
          MX2    0           NO INSERTS 
          MX3    1           NO SOURCE LINE 
          MX6    0           NO ABORT 
          SX7    B0 
          SA7    =XC.HLDMS   DONT HOLD MESSAGE CAPSULE ANY MORE 
          RJ     =XC.MSG     LAST MESSAGE OUT 
 NOMSG2   BSS    0
          SA1    RETURN      GET RETURN ADDRESS 
          SB2    X1 
          JP     B2          RETURN TO JOB
          TITLE  PARAMETERS AND ITEMS 
          EJECT 
 RETAINP  VFD    42/0,18/RETAINO
          DATA   0           TERMINATOR 
 RETAINO  BSS    1
 SMCALLP  VFD    42/0,18/CONS0
 SMMRLP   VFD    42/0,18/MAXRL
 SMSEQPL  VFD    42/0,18/COBOL5S
 RETPAR   VFD    42/0,18/RETP 
 RETP     DATA   0
          EXT    C.BUFF 
 DIS      EQU    C.BUFF 
  
 SMKEYPL  BSS    0           PARAMETER FOR SMKEY CALLS
          VFD    42/0,18/CHARPOS
          VFD    42/0,18/NCHAR
          VFD    42/0,18/CODE 
          VFD    42/0,18/ORDER
 CONS0    DATA   0           TERMINATOR 
 CHARPOS  EQU    C.BUFF 
 NCHAR    EQU    C.BUFF+1 
 CODE     EQU    C.BUFF+2 
 COLSEQ   EQU    C.BUFF+4 
 ORDER    EQU    C.BUFF+5 
  
 COBOL5S  DATA   7LCOBOL5S   NAME OF USER-DEF COLL SEQ FOR S/M
 SAVERS   BSS    4
 ASCII6   DATA   10HASCII6         ASCII COLL SEQ NAME FOR S/M
 COBOL6   DATA   10HCOBOL6         CDC COLL SEQ NAME FOR S/M
 CS1      IFEQ   OP.COLSQ,OP.ASCII
 DEFCOLS  EQU    ASCII6 
 CS1      ELSE
 DEFCOLS  EQU    COBOL6 
 CS1      ENDIF 
          END 
