COMCMSF 
COMMON
          CTEXT  COMCMSF - MERGE SORTED FILES.
          SPACE  4
          IF     -DEF,QUAL$,1 
          QUAL   COMCMSF
          BASE   D
*         COMMENT COPYRIGHT CONTROL DATA SYSTEMS INC.  1996.
          SPACE  4,15 
***       MSF - MERGE SORTED FILES. 
*         G. S. YODER.    96/04/24. 
* 
*         ENTRY  (X0) = LENGTH OF TABLE ENTRY.
*                (X1) = NUMBER OF ENTRIES IN FULL BLOCK.
*                (X2) = SORT KEY MASK.
*                (B4) = WORD OFFSET OF KEY IN TABLE ENTRY.
*                (B5) = LENGTH OF KEY IN WORDS. 
*                (A0) = WORKING BUFFER 1 ADDRESS. 
*                (A5) = WORKING BUFFER 2 ADDRESS. 
*                ENTRIES TO SORT ON INPUT FILES 1 AND 2.
* 
*         EXIT   SORTED ENTRIES ON FILE 3.
  
  
 MSF      SUBR               ENTRY/EXIT 
  
*         PRESET SORT PARAMETERS. 
  
          BX6    X1 
          BX7    X2 
          SA6    MSFA        SAVE BLOCK SIZE
          SA7    MSFD        SAVE SORT KEY MASK 
          SX1    B5+
          LX1    24 
          BX0    X0+X1       SET KEY LENGTH AND ENTRY LENGTH
          PX0    X0,B4       SET KEY OFFSET 
  
*         INITIALIZE NEXT PASS. 
  
 MSF1     REWIND S1          REWIND INPUT FILE 1
          REWIND S2          REWIND INPUT FILE 2
          REWIND S3          REWIND OUTPUT FILE 1 
          REWIND S4          REWIND OUTPUT FILE 2 
          READ   S1          INITIATE READ
          READ   S2          INITIATE READ
          WRITE  S3,*        SET WRITE FUNCTION 
          WRITE  S4,*        SET WRITE FUNCTION 
          SX6    B0+
          SX5    S3          INITIALIZE OUTPUT FILE FET ADDRESS 
          SA6    MSFC        CLEAR BLOCKS WRITTEN 
  
*         INITIALIZE BLOCK MERGE. 
  
 MSF2     SA1    MSFA 
          BX6    X1 
          SA6    MSFB        INITIALIZE BLOCK 1 SIZE
          SA6    A6+1        INITIALIZE BLOCK 2 SIZE
          READW  S1,A0,X0    READ BLOCK 1 ENTRY 
          ZR     X1,MSF9     IF NOT EOR 
          EQ     MSF13       CHECK MERGE COMPLETE 
  
*         COMPARE SORT KEYS.
  
 MSF3     UX3,B4 X0          SET KEY OFFSET 
          SA1    A0+B4       READ FIRST WORD OF FIRST ENTRY KEY 
          SA2    A5+B4       READ FIRST WORD OF SECOND ENTRY KEY
          SA4    MSFD        SET SORT KEY MASK
          AX3    24          SET KEY LENGTH 
 MSF4     BX1    X4*X1
          BX2    X4*X2
          BX6    X1-X2
          IX7    X2-X1
          NG     X6,MSF5     IF KEYS ARE OPPOSITE SIGN
          NZ     X6,MSF6     IF KEYS NOT IDENTICAL
          SA1    A1+B1
          SA2    A2+B1
          SX3    X3-1        DECREMENT WORDS TO COMPARE 
          ZR     X3,MSF7     IF ALL WORDS OF KEY COMPARED 
          EQ     MSF4        COMPARE NEXT WORD OF KEYS
  
 MSF5     NG     X1,MSF8     IF FIRST KEY GREATER 
          EQ     MSF7        WRITE FIRST ENTRY
  
 MSF6     NG     X7,MSF8     IF FIRST KEY GREATER 
  
*         WRITE ENTRY 1 AND READ NEXT ENTRY.
  
 MSF7     WRITEW X5,A0,X0    WRITE ENTRY
          SA1    MSFB 
          SX6    B1 
          IX6    X1-X6       COUNT ENTRY
          SA6    A1+
          ZR     X6,MSF11    IF END OF BLOCK 1
          READW  S1,A0,X0    READ ENTRY 
          ZR     X1,MSF3     IF NOT EOR 
          EQ     MSF11       COPY BLOCK 2 
  
*         WRITE ENTRY 2 AND READ NEXT ENTRY.
  
 MSF8     WRITEW X5,A5,X0    WRITE ENTRY
          SA1    MSFB+1 
          SX6    B1 
          IX6    X1-X6       COUNT ENTRY
          SA6    A1+
          ZR     X6,MSF10    IF END OF BLOCK 2
 MSF9     READW  S2,A5,X0    READ ENTRY 
          ZR     X1,MSF3     IF NOT EOR 
  
*         COPY REMAINDER OF BLOCK 1.
  
 MSF10    WRITEW X5,A0,X0    WRITE ENTRY
          SA1    MSFB 
          SX6    B1 
          IX6    X1-X6       COUNT ENTRY
          SA6    A1+
          ZR     X6,MSF12    IF END OF BLOCK 1
          READW  S1,A0,X0    READ ENTRY 
          ZR     X1,MSF10    IF NOT EOR 
          EQ     MSF12       RESET OUTPUT FILE
  
*         COPY REMAINDER OF BLOCK 2.
  
 MSF11    WRITEW X5,A5,X0    WRITE ENTRY
          SA1    MSFB+1 
          SX6    B1 
          IX6    X1-X6       COUNT ENTRY
          SA6    A1+
          ZR     X6,MSF12    IF END OF BLOCK 2
          READW  S2,A5,X0    READ ENTRY 
          ZR     X1,MSF11    IF NOT EOR 
  
*         RESET OUTPUT FILE.
  
 MSF12    SA1    MSFC 
          SX7    S3&S4
          SX6    B1 
          BX5    X5-X7       SET NEW OUTPUT FILE
          IX6    X1+X6       COUNT BLOCK WRITTEN
          SA6    A1 
          EQ     MSF2        INITIALIZE BLOCK MERGE 
  
*         FLUSH OUTPUT FILES AND CHECK MERGE COMPLETE.
  
 MSF13    SX7    S3&S4
          BX5    X5-X7       RESET LAST FILE WRITTEN
          WRITER X5          FLUSH LAST FILE WRITTEN
          SA1    MSFC 
          SX7    1
          BX6    X2 
          IX1    X1-X7
          ZR     X1,MSFX     IF ONE BLOCK WRITTEN 
          SA1    MSFA 
          LX1    1
          BX6    X1 
          SA6    A1          SET FULL BLOCK SIZE FOR NEXT PASS
          SX7    S3&S4
          BX5    X5-X7
          WRITER X5          FLUSH OTHER OUTPUT FILE
  
*         SWAP INPUT AND OUTPUT FILE NAMES. 
  
          RECALL S1 
          RECALL S2 
          RECALL S3 
          RECALL S4 
          SA1    S1 
          SA2    S3 
          BX6    X1 
          BX7    X2 
          SA6    A2 
          SA7    A1 
          SA1    S2 
          SA2    S4 
          BX6    X1 
          BX7    X2 
          SA6    A2 
          SA7    A1 
          EQ     MSF1        INITIALIZE NEXT PASS 
  
  
 MSFA     CON    0           FULL BLOCK ENTRY COUNT 
 MSFB     CON    0           BLOCK 1 ENTRY COUNT
          CON    0           BLOCK 2 ENTRY COUNT
 MSFC     CON    0           RECORDS WRITTEN COUNT
 MSFD     CON    0           SORT KEY MASK
 FETS     SPACE  4,10 
**        FETS. 
  
  
 S1       BSS    0           INPUT FILE 1 
 ZZZZZGW  FILEB  MS1B,MSFBL,FET=10
  
 S2       BSS    0           INPUT FILE 2 
 ZZZZZGX  FILEB  MS2B,MSFBL,FET=10
  
 S3       BSS    0           OUTPUT FILE 1
 ZZZZZGY  FILEB  MS3B,MSFBL,FET=10
  
 S4       BSS    0           OUTPUT FILE 4
 ZZZZZGZ  FILEB  MS4B,MSFBL,FET=10
  
  
          BASE   *
 QUAL$    IF     -DEF,QUAL$ 
          QUAL   *
 MSF      EQU    /COMCMSF/MSF 
 S1       EQU    /COMCMSF/S1
 S2       EQU    /COMCMSF/S2
 S3       EQU    /COMCMSF/S3
 S4       EQU    /COMCMSF/S4
 QUAL$    ENDIF 
          ENDX
