*DECK C$SMEX
          IDENT  C$SMEX 
          COMMENT  SORT/MERGE EXIT PROCESSING 
          TITLE  C$SMEX - SORT/MERGE EXIT PROCESSING
          SST 
          B1=1
**        C$SMEX - SORT/MERGE EXIT PROCESSING 
* 
*         CONTAINS PROCESSING FOR SORT/MERGE EXITS AS WELL AS RELEASE 
*         AND RETURN STATEMENT PROCESSING 
*         SEE INDIVIDUAL ROUTINES FOR CALLING SEQUENCES 
*CALL IOMICROS
          TITLE  C.RLSE OR C.RLUF - RELEASE A RECORD TO SORT
          EJECT 
* 
**        C.RLSE - RELEASE RECORD TO SORT (RELEASE VERB)
**        C.RLUF - RELEASE RECORD TO SORT FROM USING FILE 
* 
*         A0 HAS FIT ASSOCIATED 
*         X3 HAS RECORD LENGTH IN CHARACTERS
*         RECORD IS IN SORT/MERGE RECORD AREA 
          ENTRY  C.RLSE,C.RLUF
 C.RLSE   BSS    1
 C.RLUF   EQU    C.RLSE      REQUIRED TO ACCOMMODATE -RELEASE- ON 
*                             -USING- FILE
          SA5    C.SMIPA
          ZR     X5,C.RLSE1  JUMP IF -USING- - NO CHECKS REQUIRED HERE
          SA5    C.SMSDF     FIT SPECIFIED WITH -SORT- STATEMENT
          SX4    A0          FIT ASSOCIATED WITH -RELEASE- STATEMENT
          IX5    X5-X4
          SX1    #SRTM14
          NZ     X5,C.RLSE0  JUMP IF NOT SAME SD
          SA5    =XC.SMIE 
          SX5    X5-1 
          SX1    #SRTM7 
          ZR     X5,C.RLSE1  JUMP IF -RELEASE- PERMISSIBLE HERE 
 C.RLSE0  SA5    C.RLSE      SOURCE LINE NUMBER IN LOWER HALF 
          LX5    30           OF -RJ C.RLSE- INSTRUCTION WORD 
          SX6    X5-1 
          SA6    =XC.LINEA
          RJ     =XC.ABT
 C.RLSE1  SA5    C.SMRRL     INCREMENT NUMBER OF RECORDS -RELEASE-D 
          SX7    B1 
          IX7    X7+X5
          SA7    A5 
          SA4    =SSV.FIT    -USING- FILE FIT, PERHAPS
          ZR     X4,C.RLSE2  JUMP IF -INPUT PROCEDURE IS- 
          FETCH  X4,RT,X3 
          SX3    X3-#ZT#
          ZR     X3,C.RLSEZ  SPECIAL CASE OF Z RECORDS
          FETCH  X4,RL,X3    RECORD LENGTH IN CHARACTERS
          EQ     C.RLSE2
 C.RLSEZ  FETCH  X4,MRL,X3   MRL (FL) IN CHARACTERS FOR Z RECS
 C.RLSE2  SA2    =XC.BINRY
          SX2    X2-4 
          NG     X2,C.RLSE3  JUMP IF BINARY LEVEL BEFORE COBOL 5.3
          SA2    C.SMRIK     RL INCLUDING KEY LENGTHS 
          IX4    X3-X2       RL - RLIKEYS 
          PL     X4,C.RLSE3  JUMP IF RL > RLIKEYS 
          BX3    X2          NEW RL IN CHARS INCLUDES ALL KEYS
 C.RLSE3  BSS    0
          SA5    SORT4FL     SORT 4 FLAG
          BX6    X3 
          SA6    =SRECLEN 
          SA1    C.SMRAA     REC AREA ADDR
          NZ     X5,C.RLST4  JP IF SORT4
          SA5    RTNCODE     RETURN CODE ADDR 
          SA2    PLISTA      PARAM LIST +1 ADDR 
          MX7    0
          SA7    X5          RETURN CODE 0 - SORT REC 
          SA4    X2+B1       GET ADDR OF RL 
          SA3    X2          ADDR OF REC IN SORT BUFFER 
          BX2    X6          REC LEN
          SA6    X4          TO SM
          MX7    0           NO BLANK FILL
          RJ     MOVERC      MOVE RECORD TO SORT BUFFER 
          EQ     C.SMEX1     BACK TO SORT 
 C.RLST4  BSS    0
          SX0    X6+9 
          SX4    52429       1/10 * 2**19 
          IX0    X4*X0
          AX0    19          WORDS
          LX6    30 
          IX0    X6+X0       MAKE INTO SORT PARAM 
          SA2    X1          SET A2 TO REC AREA ADDRESS 
          EQ     C.SMEX1     BACK TO S/M
          TITLE  SORT EXIT 1 - GET NEXT RECORD
          EJECT 
*  SORT OWNCODE -EXIT 1-.  SORT COMES HERE TO GET THE NEXT RECORD.
* 
*  THE FIRST TIME THROUGH, COBOL CALLS THE INPUT PROCEDURE (EITHER
*  PROGRAMMER SPECIFIED OR GENERATED IF USING SPECIFIED) WHICH IN TURN
*  DOES AN RJ C.RLSE (FOR A RELEASE STATEMENT). 
*  C.RLSE GOES BACK THRU EXIT1 TO SORT. 
*  AFTER THE FINAL RELEASE, THE SORT REQUEST TO GET ANOTHER RECORD GOES 
*  TO C.RLSE WHICH RETURNS TO THE INPUT PROCEDURE.
          ENTRY  C.SMEX1
 C.SMEX1  BSS    1
          SB1    1           RESTORE B1 
          SA5    EXIT1FL     FLAG FOR FIRST TIME
          BX6    X1 
          SX7    A1+B1
          SA6    =SRTNCODE   SAVE PARAMS
          SA7    =SPLISTA 
          NZ     X5,C.RLSE   JP IF NOT FIRST RECORD REQUEST 
          MX7    1
          SA7    A5          SET FLAG TO INDICATE NOT FIRST RECORD
          MX6    0
          SA6    SV.FIT      INITIALIZE TO INDICATE -INPUT PROCEDURE- 
          SA5    C.SMIPA
 EXIT1D   ZR     X5,EXIT1E   JUMP IF -SORT USING- 
* 
*  EXECUTE -SORT...INPUT PROCEDURE IS-
**
* 
          SX6    EXIT1X      RETURN FROM PROC 
          EQ     XFER        GO EXECUTE INPUT PROC AS IF EQ WERE DONE 
* 
**
*  INITIALIZE -SORT...USING-
 EXIT1E   SA5    C.SMUTA     ADDRESS OF WORD IN -USING- FILE TABLE
          SA3    X5 
          ZR     X3,EXIT1X   JUMP IF NO MORE -USING- FILES
          SB5    X3          SAVE ADDR OF USING PROCEDURE 
          AX3    30          -USING- FILE FIT LOCATION
          SX7    X3 
          SA7    SV.FIT      SAVE IT
          SA4    C.SMSDF
          FETCH  X4,MRL,X2
          FETCH  X3,FO,X1    GET FILE ORG 
          SX1    X1-#WA#
*      DO NOT CLOBBER X1 FROM HERE UNTIL EXIT1G 
          NZ     X1,EXIT1NZ  JP IF NOT RELATIVE FILE
*      RELATIVE FILE IS FULL WORDS - ROUND UP 
          SA5    =XC.TNTH    1/10 * 2**24 
          SX2    X2+9 
          IX2    X2*X5
          AX2    24          GIVES NBR OF WORDS 
          SX5    10 
          IX2    X2*X5       BACK TO CHARS - HAS FULL WORDS IN CHARS
 EXIT1NZ  BSS    0
          FETCH  X3,MRL,X5
          IX5    X2-X5
          PL     X5,EXIT1F   JUMP IF SORT FILE MRL GE USING FILE MRL
          NZ     X1,EXIT1EB  JP IF NOT RELATIVE (WA)
*      MRL FOR RELATIVE FILES IS MINIMUM OF 50 AND IS ROUNDED RL + 10 
          FETCH  X3,RLWD,X5  GET RECORD LENGTH IN WORDS 
          SX5    X5-1 
          SX6    10 
          IX5    X5*X6       IN CHARACTERS
          IX5    X2-X5       TRY AGAIN
          PL     X5,EXIT1F   JP IF OK 
 EXIT1EB  BSS    0
          FETCH  X3,LFN,X7   FILE NAME IS INSERT INTO ERROR MESSAGE 
          SA7    =XC.MSINS
          SX1    #SRTM3 
          SX2    B1          MESSAGE HAS INSERT 
          RJ     =XC.ABT     MESSAGE TO DAYFILE AND ABORT 
 EXIT1F   FETCH  X3,RECA,X7   SAVE -USING- FILE -RECA- FIELD
          SA7    =SSV.RAA 
          FETCH  X4,RECA,X5   SORT FILE -RECA- INTO USING FILE FIT SO 
          STORE  X3,RECA=X5,2       USING FILE READS INTO IT
          MX7    0
          NZ     X1,EXIT1FA  JP IF NOT A RELATIVE FILE
          SA2    X5-1        GET WORD BEFORE SORT AREA
          BX6    X2 
          SA6    =SSV.FWD    SAVE IT SINCE RELATIVE I-O CLOBBERS IT 
          SX7    A2 
 EXIT1FA  BSS    0
          SA7    =SSV.FWAD   SAVE ADDRESS OF THIS WORD
          SX6    EXIT1G      RETURN FROM USING PROC 
          SX5    B5          ADDR OF USING PROC 
**  EXECUTE USING FILE PSEUDO INPUT PROCEDURE 
          EQ     XFER 
 EXIT1G   BSS    0
*  -USING- FILE IS EXHAUSTED. 
          SA3    C.SMUTA
          SA4    X3          RESTORE -RAA- FIELD OF -USING- FILE EXIST- 
          AX4    30           ING PRIOR TO PSEUDO INPUT PROCEDURE 
          SA2    SV.RAA 
          STORE  X4,RECA=X2  RESTORE RECORD ADDRESS 
          SX6    X3+B1       INCREMENT TO NEXT -USING- FILE TABLE ENTRY 
          SA6    A3 
          SA4    SV.FWAD     GET ADDRESS OF SAVED WORD
          ZR     X4,EXIT1E   JP IF SORT RECAREA-1 NOT SAVED (NOT REL FO)
          SA3    SV.FWD      GET SAVED WORD IN FRONT OF SORT REC AREA 
          BX6    X3 
          SA6    X4          RESTORE THIS WORD
          EQ     EXIT1E 
* 
*  THERE ARE NO MORE SORT INPUT RECORDS.
 EXIT1X   BSS    0
          SA5    SORT4FL     SORT 4 FLAG
          NZ     X5,EXIT1S4  JP IF SORT4
          SA1    RTNCODE
          SX6    3
          SA6    X1          RETURN CODE OF 3 - EOF 
          EQ     C.SMEX1     RETURN 
 EXIT1S4  BSS    0
          SA1    C.SMEX1
          LX1    30 
          SB3    X1 
          JP     B3+3 
          TITLE  C.RTRN - RETURN A RECORD FROM SORT/MERGE TO PROG 
          TITLE  SORT/MERGE EXIT 3 - PROVIDES A RECORD
          EJECT 
*  SORT/MERGE OWNCODE -EXIT3-.  SORT/MERGE COMES HERE TO INDICATE IT
*  HAS A RECORD READY FOR OUTPUT
*    SORT 4 - A2 ADDR OF REC, X0 UPPER REC LEN IN CHARS 
*    SORT 5 - X1 = RETURN CODE ADDR, (A1+B1) REC ADD, (A1+2) RL ADD 
* 
          ENTRY  C.SMEX3
 C.SMEX3  BSS    1
          SB1    1           RESTORE B1 
          SA4    SORT4FL     SORT 4 FLAG
          ZR     X4,EXIT3S5 JP IF SORT 5
          SX1    A2          ADDR OF RECORD 
          AX0    30 
          SX2    X0          REC LEN IN CHARACTERS
          EQ     EXIT3A 
 EXIT3S5  BSS    0
          BX7    X1 
          SA3    A1+B1       GET ADDR OF REC AREA 
          SA2    A3+B1       ADDR OF REC LEN
          SA7    RTNCODE     SAVE RETURN CODE ADDR
          BX1    X3          ADDR OF RECORD 
          SA2    X2          GET REC LEN
EXIT3A    BSS    0
          SA5    EXIT3FL
          NZ     X5,C.RTRN4  JP IF NOT FIRST CALL 
          MX7    1
          SA7    A5          RESET FLAG TO INDICATE NOT FIRST CALL
          SX7    X1          AVE REC ADDRESS AND SIZE FOR SUB-
          SA7    =SSV.FRA     SEQUENT -RETURN- PROCESSING 
          BX7    X2 
          SA7    =SSRT.RL 
          MX0    42 
          SX7    B1+B1       SET FLAG TO INDICATE -RETURN- IS EXPECTED
          SA7    =XC.SMIE 
          MX7    0
          SA7    =SRTRN1FL   SET FLAG FOR FIRST TIME
          SA5    C.SMOPA
          ZR     X5,EXIT3D   JUMP IF -SORT/MERGE...GIVING-
* 
*  EXECUTE -SORT/MERGE...OUTPUT PROCEDURE IS- 
**
* 
          MX7    0
 EXIT3C   SA7    SV.FIT      INDICATE -OUTPUT PROCEDURE-
          SA5    C.SMOPA     GET OUTPUT PROCEDURE ADDRESS 
          SX6    OPRTN       RETURN ADDRESS 
          EQ     XFER        GO TRANSFER TO PROC AS IF RJ WERE DONE 
 OPRTN    BSS    0
*                            THE OUTPUT PROCEDURE HAS BEEN EXITED 
          SA5    FLG.OP 
          NZ     X5,EXIT4R0  JUMP (LAST RETURN TO SORT/MERGE) IF ALL
*                             RECORDS RETURNED, ELSE
          SX6    B1 
          SA6    A5          SET FLAG TO INDICATE END OF OUTPUT PROC
          SA5    SORT4FL
          NZ     X5,EXIT3S4  JP IF SORT 4 
          SA1    RTNCODE
          SX7    3
          SA7    X1          RETURN CODE OF 3 - END OUTPUT
          EQ     C.SMEX3
 EXIT3S4  BSS    0
          SA1    C.SMEX3
          AX1    30 
          SB3    X1 
          JP     B3+3 
* 
**
* 
*  INITIALIZE -SORT/MERGE GIVING- 
 EXIT3D   SA5    C.SMGTA     SET UP INSTRUCTION TO -RJ- TO PSEUDO OUTPUT
          SA3    X5           PROCEDURE FOR -GIVING- FILE 
          SB5    X3          SAVE GIVING PROC ADDRESS 
          AX3    30          SAVE -GIVING- FILE FIT ADDRESS 
          SX7    X3 
          SA7    SV.FIT 
          SA4    C.SMSDF     SORT FILE FIT ADDRESS
          FETCH  X4,MRL,X2
          FETCH  X3,MRL,X0   GET MAX REC LENGTH 
          FETCH  X3,FO,X5    GET FILE ORG 
          SX5    X5-#WA#
          NZ     X5,EXIT3DA  JP IF USING FILE NOT RELATIVE FILE 
*      MRL FOR RELATIVE IS MIN OF 50 AND INCLUDES RECORD HEADER 
*        COMPUTE REAL LENGTH
          FETCH  X3,RLWD,X5  GET REC LENGTH + HDR LENGTH IN WORDS 
          MX0    59          -1 
          IX5    X0+X5       -1 FOR HEADER
          SX0    10 
          IX0    X0*X5       GIVES REC LENGTH IN CHARACTERS 
 EXIT3DA  BSS    0
          IX5    X0-X2       USING RL - SORT RL 
          PL     X5,EXIT3E   JUMP IF GIVING FILE MRL GE SORT FILE MRL - 
*                             INDICATION THAT SORT/MERGE RECORD WILL
*                             FIT IN GIVING FILE RECORD AREA
          FETCH  X3,LFN,X7   -GIVING- FILE NAME IS MESSAGE INSERT 
          SA7    =XC.MSINS
          SX1    #SRTM4 
          RJ     =XC.ABT     MESSAGE TO DAYFILE AND ABORT 
 EXIT3E   FETCH  X3,RECA,X7   SAVE -GIVING- FILE -RECA- FIELD 
          SA7    SV.RAA 
* 
*  CHECK IF -SORT/MERGE ... USING-, AND IF SO, ASCERTAIN IF ANY -USING- 
*  FILES HAVE RECORD TYPE Z, AND SET FLAG ACCORDINGLY 
          SA3    C.SMRTZ
          ZR     X3,EXIT3E2  JUMP IF NOT -USING-
          SA4    X3          X3=LOC IN TABLE OF -USING- FILE FITS 
 EXIT3E1  AX4    30          X4=-USING- FILE FIT LOC
          FETCH  X4,RT,X5 
          SX5    X5-#ZT#
          ZR     X5,EXIT3E2  JUMP IF RT=Z 
          SX3    X3+B1       INCREMENT TO NEXT TABLE ENTRY
          SA4    X3 
          NZ     X4,EXIT3E1  JUMP IF ANOTHER -USING- FILE 
          SX6    B0 
          SA6    A3          SET FLAG - 0 IF NO -USING- FILE WITH RT=Z
 EXIT3E2  BSS    0
          SX5    B5          ADDRESS OF GIVING PROC 
          SX6    EXIT4R0     RETURN ADDR
**   EXECUTE GIVING FILE PSEUDO OUTPUT PROCEDURE
          EQ     XFER 
          EJECT 
*  -RETURN- A RECORD FROM SORT/MERGE.  THE FIRST TIME THIS ROUTINE IS 
*  ENTERED THERE IS ALREADY A RECORD READY FOR OUTPUT WHICH WAS PRESENT-
*  ED, UNSOLICITED, THE 1ST TIME SORT/MERGE JUMPED TO -EXIT3-.  SUBSE-
*  QUENT ENTRIES TO -C.RTRN- CAUSE A JUMP INTO SORT/MERGE, VIA -EXIT3-, 
*  TO OBTAIN THE NEXT RECORD.  THIS RECORD IS THEN -RETURNED- BEFORE
*  -C.RTRN- IS EXITED.
* 
*  EXIT TO CALLING ROUTINE WITH B3=0 IF A RECORD IS RETURNED
*                               B3"0 IF -AT END- CONDITION
*                                  X3 = RECORD LENGTH IN CHARS
*                               A0=SORT FILE FIT WITH RL=REC LGTH IN
*                                  CHARS IF -OUTPUT PROCEDURE-
          ENTRY  C.RTRN 
 C.RTRN   BSS    1
          SA5    C.SMOPA
          ZR     X5,C.RTRN1  JUMP IF -GIVING- - NO CHECKS REQUIRED HERE 
          SA5    C.SMSDF     FIT SPECIFIED WITH -SORT-/-MERGE- STATEMENT
          SX4    A0          FIT ASSOCIATED WITH -RETURN- STATEMENT 
          IX5    X5-X4
          SX1    #SRTM15
          NZ     X5,C.RTRN1A  JUMP IF NOT SAME SD 
          SA5    =XC.SMIE 
          SX5    X5-2 
          SX1    #SRTM8 
 C.RTRN1  BSS    0
          NZ     X5,C.RTRN1A JP IF RETURN NOT IN OUTPUT PROCEDURE 
          SA5    RTRN1FL     FIRST TIME FLAG
          SA4    FLG.OP      NO RECORDS LEFT FLAG 
          ZR     X5,C.RTRN3  JP IF FIRST TIME 
          ZR     X4,C.RTRN2  JP IF RECORDS LEFT 
*  ERROR - RETURN AFTER AT END DETECTED 
          SX4    X4-20       COUNT OF TIMES THROUGH THIS
          SX1    #SRTM12     MESSAGE
          PL     X4,C.RTRN1A ABORT IF MORE THAN 20 TIMES THROUGH
          SX6    X4+B1
          SA6    A4          BUMP COUNT 
          SA5    C.RTRN      GET LINE NBR 
          LX5    30 
          SX3    X5-1        LINE NUMBER
          MX2    0           NO INSERTS 
          SX6    B0          NO ABORT 
          RJ     =XC.MSG     PUT OUT MESSAGE
          SB3    B1          FLAG AT END
          EQ     C.RTRN      GO TO AT END PROCESS 
 C.RTRN1A SA5    C.RTRN      SOURCE LINE NUMBER IN LOWER HALF 
          LX5    30           OF -RJ C.RTRN- INSTRUCTION WORD 
          SX6    X5-1 
          SA6    =XC.LINEA
          RJ     =XC.ABT
 C.RTRN2  BSS    0
          SA5    SORT4FL     SORT 4 FLAG
          NZ     X5,C.RTNS4  JP IF SORT4
          SA1    RTNCODE
          SX7    B1 
          SA7    X1          RETURN CODE OF 1 - DELETE RECORD 
          EQ     C.SMEX3
 C.RTNS4  BSS    0
          SA1    C.SMEX3
          LX1    30 
          SB3    X1 
          JP     B3+1 
* 
*  -C.RTRN- JUMPS HERE TO PROCESS THE 1ST RECORD RECEIVED FROM SORT/
*  MERGE. 
 C.RTRN3  BSS    0
          MX7    1
          SA7    A5          SET FLAG TO INDICATE NOT FIRST TIME
         SA1    SV.FRA      X1 HAS ADDR OF REC
         SA2    SRT.RL      X2 HAS REC LENGTH 
          SA5    C.SMRIK
          ZR     X5,C.RTRN3A JP IF MERGE - NO COUNT KEPT
          SA5    C.SMRRL     CHECK IF ANY RECORDS WERE RELEASED.
          SB3    B1 
          ZR     X5,C.RTRN   JUMP IF NO RECORDS RELEASED. 
 C.RTRN3A BSS    0
* 
*  -EXIT3- JUMPS HERE ON RECEIPT OF THE 2ND AND SUBSEQUENT RECORDS FROM 
*  SORT/MERGE - X1 IS REC LOCATION, X2 IS REC LEN IN CHARS
 C.RTRN4  SA5    C.SMRRT     INCREMENT NUMBER OF RECORDS -RETURN-ED 
          SX7    B1 
          IX7    X7+X5
          SA7    A5 
          SA4    SV.FIT      FIT ADDRESS OF -GIVING- FILE, PERHAPS
          ZR     X4,C.RTRN5  JUMP IF -OUTPUT PROCEDURE IS-
* 
*  -SORT/MERGE GIVING- - SET UP FOR SUBSEQUENT WRITE DIRECTLY TO
*  -GIVING- FILE, IF NO -USING- FILE WITH RT=Z, ELSE MOVE RECORD TO 
*  -GIVING- FILE RECORD AREA AND BLANK-FILL.
          SA5    C.SMRTZ
          NZ     X5,C.RTRN4A  JUMP IF -USING- FILE WITH RT=Z
          STORE  X4,RECA=X1  ADDR TO GIVING FILE
          SX3    X2          REC LENGTH 
          SB3    B0          INDICATE A RECORD RETURNED 
          EQ     C.RTRN      EXIT TO COMPILATION FOR WRITE
*                            -USING- FILE WITH RT=Z 
 C.RTRN4A BSS    0
          SA3    SV.RAA      REC AREA ADDR OF GIVING FILE 
          MX7    1           BLANK FILL 
          SA4    SV.FIT      ADDR OF GIVING FIT 
          SA0    X4          FOR MOVERC 
          RJ     MOVERC      MOVE THE RECORD
          FETCH  A0,MRL,X3   RECORD LENGTH IN CHARACTERS
          SB3    B0          INDICATE A RECORD RETURNED 
          EQ     C.RTRN      EXIT TO COMPILATION FOR WRITE
* 
*  -SORT/MERGE OUTPUT PROCEDURE IS- - MOVE RECORD TO SORT/MERGE FILE
*  RECORD AREA
 C.RTRN5  BSS    0
          SA3    C.SMRAA     RECORD AREA ADDR 
          SA5    C.SMSDF     IN CASE -RETURN ... INTO ...-
          SA0    X5           SET A0 TO SORT FILE FIT 
          SA5    C.SMRTZ
          BX7    X5          BLANK FILL FLAG
          RJ     MOVERC      MOVE RECORD TO RECORD AREA 
          STORE  A0,RL=X2    PUT REC LENGTH IN SORT FIT 
          SB3    B0          INDICATE A RECORD RETURNED 
          SX3    X2 
          EQ     C.RTRN      EXIT TO COMPILATION
          TITLE  SORT/MERGE EXIT 4 - NO MORE RECORDS AVAIL
          EJECT 
*  SORT/MERGE OWNCODE -EXIT 4-.  SORT/MERGE COMES HERE TO INDICATE THERE
*  ARE NO MORE RECORDS TO BE OUTPUT.  JUMP TO -AT END- EXIT ON
*  -RJ C.RTRN- INSTRUCTION IN COMPILATION.
* 
          ENTRY  C.SMEX4
 C.SMEX4  BSS    1
          SB1    1           RESTORE B1 
          SA4    SV.FIT 
          BX7    X1 
          SA7    RTNCODE
          ZR     X4,EXIT4A   JUMP IF -OUTPUT PROCEDURE IS-
          SA5    SV.RAA      RESTORE -GIVING- FILE -RAA- FIELD
          STORE  X4,RECA=X5 
 EXIT4A   SA5    FLG.OP 
          NZ     X5,EXIT4R0  JUMP IF OUTPUT PROCEDURE ALREADY EXITED
*                             (BEFORE ALL RECORDS RETURNED) 
          SX6    B1 
          SA6    A5          SET FLAG TO INDICATE ALL RECORDS RETURNED
          SB3    B1          INDICATE -AT END- CONDITION
          SA5    C.SMRRT
          NZ     X5,C.RTRN   JUMP TO CALLING ROUTINE IF NON-NULL INPUT
          EQ     EXIT3A      GO TO EXIT 3A IF NULL INPUT. 
 EXIT4R0  BSS    0           EXIT 4 RETURN TO +0
          SA5    SORT4FL
          NZ     X5,C.SMEX4  JP IF OLD BINARY 
          SA1    RTNCODE
          MX7    0
          SA7    X1 
          EQ     C.SMEX4
          TITLE  MISCELLANEOUS ROUTINES AND ITEMS 
          EJECT 
 C.SMINI  SPACE  1
* 
**        C.SMINI - INITIALIZE SORT/MERGE EXIT PROCESSING 
* 
          ENTRY  C.SMINI
 C.SMINI  BSS    1
          SA6    =SSORT4FL   SET SORT 4 FLAG
          MX6    0
          MX7    0
          SA6    C.SMRRL     RECS RELEASED
          SA7    C.SMRRT     RECS RETURNED
          SA6    =SEXIT1FL   EXIT 1 FIRST TIME FLAG 
          SA7    =SEXIT3FL   EXIT 3 FIRST TIME FLAG 
          SA6    =SFLG.OP    OUTPUT A REC FLAG
          EQ     C.SMINI
 MOVERC   SPACE  3
 MOVERC   DATA   0           MOVE REC - X1=FROM, X2=LEN, X3=TO
*                            X7=0 IF NO BLANK FILL, NZ IF BLANK FILL
*                            IF BLANK FILL, A0 HAS FIT ADDR OF RECEIVER 
          SA7    =SBLFILL 
          SA5    65B         GET RA + 65
          PL     X5,MOVERC6C NON-CMU MAINFRAME
*                            SET UP INDIRECT MOVE DESCRIPTOR WORD 
          BX6    X2          SAVE RL
          SB7    X3          SAVE ADDR OF OUTPUT AREA 
 MOVERC5A BSS    0
          SX7    8001 
          IX5    X2-X7
          MI     X5,MOVERC5B  JUMP IF MOVE OF LE 8000 CHARACTERS
          SX2    8000        MOVE 8000 CHARS
 MOVERC5B MX7    56 
          BX4    -X7*X2 
          BX7    X7*X2
          SX0    X1          ADDR OF REC
          LX7    18-4 
          IX7    X7+X0
          LX7    4-0
          IX7    X7+X4
          LX7    26-0 
          IX7    X7+X3
          SA7    =SSRT.IM    INDIRECT MOVE DESCRIPTOR WORD
          BX2     X6         RESTORE X2 (REC LEN) 
          IM     SRT.IM      MOVE RECORD TO SORT/MERGE FILE RECORD AREA 
          MI     X5,MOVERC6A  JUMP IF MOVE COMPLETE 
          SX7    B1          SET UP FOR NEXT MOVE OF LE 8000 CHARACTERS 
          IX2    X5+X7       NBR CHARS LEFT TO MOVE 
          SX1    X1+800      NEW SORTCE ADDR
          SX3    X3+800      NEW DESTINATION ADDRESS
          EQ     MOVERC5A 
 MOVERC6A BSS    0
          SA1    BLFILL 
          ZR     X1,MOVERC   EXIT IF NO BLANK FILL
          SA1    =XC.TNTH 
          IX1    X2*X1
          AX1    24          WHOLE WORDS MOVED
          SX7    10 
          IX7    X1*X7
          IX7    X2-X7       NBR CHARS IN LAST WORD 
          SB5    B7+X1       ADDR OF LAST WORD
          SB7    X7 
          SA4    B5          LAST WORD
          SB6    X1          WORDS MOVED
          ZR     X7,MOVERC6B JP IF LAST WORD WHOLE WORD 
          SB6    B6+B1
 MOVERC6B BSS    0
          EQ     MOVERC6D 
 MOVERC6C BSS    0
          SB7    X2         REC LEN IN CHARS
          SB6    B0 
 MOVERC6  SA4    X1+B6       MOVE REC TO SORT/MERGE FILE RECORD AREA
          BX7    X4 
          SA7    X3+B6
          SB6    B6+B1
          SB7    B7-10
          GT     B7,B0,MOVERC6
          SB5    A7          ADDR OF LAST WORD
          SB7    B7+10       CHARS IN LAST WORD 
 MOVERC6D BSS    0
          SA5    =XC.BLANK
          ZR     B7,MOVERCX  JP IF LAST WORD COMPLETE 
          SA1    =XC.MASK+B7
          BX7    -X1*X5 
          BX4    X1*X4
          BX7    X4+X7
          SA7    B5          FILL LAST WORD 
          SB5    B5+B1
 MOVERCX  BSS    0
          BX7    X5          SPACES 
          FETCH  A0,RLWD,X5,,6     REC LENGTH IN WORDS
          SB7    X5 
          SB7    B6-B7       WORDS LEFT 
          PL     B7,MOVERC   EXIT IF ALL WORDS PROCESSED
 MOVERCY  BSS    0
          SA7    B5          BLANK OUT REMAINING WORDS
          SB5    B5+B1
          SB7    B7+B1
          NG     B7,MOVERCY 
          EQ     MOVERC      EXIT 
 XFER     SPACE  3
 XFER     BSS    0           TRANSFER TO ROUTINE AS IF RJ WERE DONE 
          MX7    1
          LX7    57          MAKE AN EQ 
          LX6    30          X6 HAS RETURN ADDR 
          BX6    X6+X7
          SA6    X5          X5 HAS ADDR TO RJ TO 
          SB6    X5 
          RJ     *+1         FLUSH STACK
          DATA   0
          JP     B6+1        GO TO CALLED ROUTINE 
 ITEMS    SPACE  3
          ENTRY  C.SMIPA
 C.SMIPA  DATA   0           ADDRESS OF INPUT PROCEDURE 
          ENTRY  C.SMGTA
 C.SMGTA  DATA   0           ADDRESS OF GIVING TABLE (0 IF OUTPUT PROC) 
          ENTRY  C.SMOPA
 C.SMOPA  DATA   0           ADDRESS OF OUTPUT PROCEDURE (0 IF GIVING)
          ENTRY  C.SMRIK
 C.SMRIK  DATA   0           0 IF MERGE, RL INCLUDING KEYS IF SORT
          ENTRY  C.SMRRL
 C.SMRRL  DATA   0           NBR OF RECORDS RELEASED
          ENTRY  C.SMRRT
 C.SMRRT  DATA   0           NBR OF RECORDS RETURNED
          ENTRY  C.SMRTZ
 C.SMRTZ  DATA   0           SET IF USING FILE HAS REC TYPE Z 
          ENTRY  C.SMSDF
 C.SMSDF  DATA   0           ADDR OF SD FIT 
          ENTRY  C.SMUTA
 C.SMUTA  DATA   0           ADDRESS OF USING TABLE 
          ENTRY  C.SMRAA
 C.SMRAA  DATA   0           SD RECORD AREA ADDRESS 
          END 
