COMCSNF 
COMMON
          CTEXT  COMCSNF - SORT NUMBERED FILE.
          SPACE  4,10 
          IF     -DEF,QUAL$,1 
          QUAL   COMCSNF
          BASE   D
*         COMMENT  COPYRIGHT CONTROL DATA SYSTEMS INC.  1992. 
 SNF      SPACE  4,10 
***       SNF - SORT NUMBERED FILE. 
*         R. E. TATE         71/03/01.
*         W. T. SACKETT      71/03/01.
*         L. K. TUTTLE.      79/04/27.
          SPACE  4,40 
***              COMCSNF SORTS A CODED, LINE NUMBERED FILE.  THE FILE 
*         IS READ IN SEGMENTS.  EACH SEGMENT IS SORTED AND THE RESULT 
*         MERGED WITH THE PREVIOUSLY SORTED PORTION OF THE FILE.  THE 
*         SORT IS BASED ON THE FIRST N DIGITS OF THE LINE NUMBER FOR
*         EACH LINE.  THE LINE ENTERED LAST FOR A GIVEN NUMBER IS THE 
*         CORRECTION LINE TO REPLACE ANY LINE HAVING THE SAME NUMBER. 
*         A LINE NUMBER FOLLOWED BY AN EMPTY LINE (CR OR ONE BLANK AND
*         CR) IS CONSIDERED A LINE DELETE.  A LINE NUMBER WITH MORE 
*         THAN N DIGITS IS NOT CHECKED FOR LINE DELETE.  THE CHARACTER
*         SET IS DETERMINED FROM THE FIRST CHARACTER OF THE FILE IF 
*         NOT PASSED IN AS A PARAMETER.  IF AN ERROR CONDITION IS 
*         DETECTED THE FILE IS REWOUND UNALTERED AND THE ERROR CODE 
*         IS RETURNED IN B2.
* 
*                COMCSNF HAS THE ABILITY TO HANDLE THEORETICALLY IN-
*         FINITE LENGTH LINES BY PROCESSING THEM A SECTION AT A TIME. 
*         THERE ARE OF COURSE PRACTICAL LIMITATIONS IMPOSED BY THE
*         LENGTH OF THE CIRCULAR I/O BUFFER.  FOR MORE INFORMATION
*         ON THIS SEE ROUTINE *CEB*.  ALSO PERFORMANCE WILL BE DOWN-
*         GRADED BY MANY LONG LINES.
* 
*                IF SNF$ IS DEFINED BY THE CALLING PROGRAM THEN THE 
*         NUMBER OF LINES IN THE FILE AFTER SORTING WILL BE RETURNED
*         IN (X6).
          SPACE  4,10 
*         DATA AND EQUIVALENCES.
  
 LIMT     CON    0
 WKSTL    EQU    33          WORKING STORAGE BUFFER LENGTH
 PLAD     CON    0           ADDRESS OF PARTIAL LINE IN I/O BUFFER
 PLWC     CON    0           NUMBER OF WORDS IN PARTIAL LINE
 FNT2     CON    0           FNT NAME FROM FET *SCR1* 
 FTYP     CON    0           FILE TYPE (0 = DIRECT ACCESS FILE) 
 INPF     CON    0           INPUT FILE FET ADDRESS 
 LAST     CON    -1          LAST LINE ON SCR 
 NDIG     CON    5           NUMBER OF DIGITS TO SORT ON
 CPAR     CON    -1          CHARACTER SET FLAG 
 DRFG     CON    0           DATA READ FLAG 
 LLFG     CON    0           LONG LINE FLAG 
 ERFG     CON    0           TEMPORARY STORAGE FOR ERROR FLAG 
 SNF$     IF     DEF,SNF$ 
 NLSF     CON    0           NUMBER OF LINES IN FILE AFTER SORT 
 SNF$     ENDIF 
 SNF      SPACE  4,10 
**        TABLE OF CHARACTER SET PARAMETERS.
* 
*T,       6/ SHIFT CNT, 18/ CHAR MASK, 18/ ZERO CHAR, 18/ BLANK CHAR. 
  
  
 TPAR     VFD    6/06,18/0077B,18/33B,18/55B   6/12 DISPLAY CODE
          VFD    6/12,18/7777B,18/60B,18/40B   ASCII8 
 WKST     BSS    WKSTL       WORKING STORAGE FOR SCR TRANSFER TO SCR1 
 SNF      SPACE  4,25 
**        SNF - SORT NUMBERED FILE. 
* 
*         ENTRY  (X1) = FILE TYPE (0=DIRECT ACCESS).
*                (X2) = ADDRESS OF FET FOR INPUT FILE.
*                (X6) = NUMBER OF DIGITS TO SORT ON.
*                (X7) = CHARACTER SET.
*                     < 0, NOT DETERMINED.
*                     = 0, 6/12 DISPLAY CODE. 
*                     = 1, ASCII8.
* 
*         EXIT   (X1) = 0, SORT COMPLETE, FILE REWRITTEN. 
*                     = NON-ZERO, ERROR ENCOUNTERED.
*                (B2) = ERROR CODE. 
*                       -1, SORT FILE EMPTY.
*                       0, LINE WITHOUT LINE NUMBER ENCOUNTERED.
*                       1, DIRECT ACCESS FILE NOT IN WRITE MODE.
*                       2, NOT ENOUGH BUFFER SPACE AVAILABLE. 
*                (X6) = THE NUMBER OF LINES IN THE FILE AFTER THE SORT
*                       IS COMPLETE (IF SNF$ IS DEFINED). 
* 
*         USES   X - ALL. 
*                A - ALL. 
*                B - 2, 7.
* 
*         CALLS  CEB, GLT, MER. 
* 
*         MACROS READEI, READW, RECALL, RENAME, RETURN, REWIND, WRITE,
*                WRITER, WRITEW.
* 
*         REQUIRES  COMCCIO, COMCLFM, COMCMAC, COMCRDC, COMCRDW,
*                   COMCSST, COMCSYS, COMCWTC, COMCWTW. 
* 
*         NOTES  THE I/O BUFFER OF THE FILE TO BE SORTED IS SPLIT 
*                INTO TWO SECTIONS.  THE TOP SECTION IS HALF THE
*                BUFFER MINUS ONE WORD AND IS USED TO READ IN 
*                LINES FROM THE SORT FILE.  A LINE NUMBER TABLE WILL
*                WILL BE GENERATED IN THE BOTTOM SECTION AND
*                DUE TO OVERHEAD IN *GLT* IT HAS TO BE AT LEAST TWO 
*                WORDS LONGER THAN THE TOP SECTION.  ALSO THE 
*                TOP SECTION MUST STILL BE AT LEAST 101B WORDS
*                TO ALLOW A PRU TO BE READ IN, SO THE MINIMUM 
*                BUFFER SIZE IS 204B WORDS, AND OPTIMUM IS (200B)N +4.
  
  
 SNF      SUBR               ENTRY/EXIT 
  
*         SAVE ENTRY PARAMETERS.
  
          SA7    CPAR        CHARACTER SET
          SA6    NDIG        NUMBER OF DIGITS TO SORT ON
          BX7    X1 
          BX6    X2 
          SA7    FTYP        FILE TYPE
          SA6    INPF        ADDRESS OF FET 
          SA3    SCR
          SA4    SCR1 
          MX1    42          MASK IN FILE NAMES 
          BX6    X1*X3
          BX7    X1*X4
          SX3    B1          SET FILE NOT BUSY
          BX7    X7+X3
          BX6    X6+X3
          SA7    FNT2        STORE FILE NAMES 
          SA6    A4          CHANGE *SCR1* FILE NAME
          BX6    X6-X6       INTIALIZE FLAGS AND COUNTERS 
          SA6    DRFG 
          SX7    -1          START LAST LINE NUMBER AT -1 
 SNF$     IF     DEF,SNF$ 
          SA6    NLSF        CLEAR NUMBER OF SORTED LINES 
 SNF$     ENDIF 
          SA7    LAST 
          SA6    ERFG        CLEAR ERROR FLAG 
          REWIND X2,R        REWIND SORT FILE 
          REWIND SCR1,R      REWIND SCR1
          REWIND SCR,R       REWIND SCR 
          SA2    INPF 
          SA1    X2+1        FIRST
          MX6    -18
          BX1    -X6*X1 
          SA3    X2+4        LIMIT
          BX7    -X6*X3 
          BX6    X6*X3
          IX4    X7-X1       SIZE OF BUFFER 
          SB2    B1+B1
          SX0    X4-204B     CHECK FOR BUFFER .LT. 204B WORDS 
          NG     X0,SNF7     IF BUFFER IS .LT. 204B WORDS 
          SA7    LIMT 
          AX4    1
          IX4    X1+X4       NEW LIMIT
          SX4    X4-1        LEAVE TWO EXTRA WORDS FOR *LNT* OVERHEAD 
          BX6    X6+X4
          SA6    A3 
          EQ     SNF2        BEGIN READING IN FILE
  
*         ENTER MAIN LOOP.
  
 SNF1     SA1    X2+B1
          SX6    X1 
          SA6    A1+B1       RESET IN AND OUT ON INPUT FILE 
          SA6    A6+B1
          SA4    PLWC        CHECK FOR PARTIAL LINE 
          ZR     X4,SNF2     IF NO PARTIAL LINE 
          SA3    PLAD 
          WRITEW X2,X3,X4    MOVE PARTIAL LINE TO TOP OF BUFFER 
 SNF2     READEI X2          READ NEXT SEGMENT FROM INPUT FILE
          RECALL SCR
          SA1    X2 
          SA2    SCR1 
          BX1    X1-X2
          AX1    18 
          ZR     X1,SNF3     IF *SCR* ALREADY HAS ITS OWN FNT NAME
          RENAME SCR,SCR1,R 
 SNF3     SA2    INPF        CHECK FOR DATA READ
          SA1    X2+2        IN 
          SA3    A1+B1       OUT
          IX0    X1-X3
          ZR     X0,SNF4     IF NO DATA READ
          RJ     CEB         CHECK END OF BUFFER FOR END OF LINE
          NZ     X1,SNF7     IF ERROR 
          RJ     GLT         GENERATE LINE NUMBER TABLE 
          NZ     X1,SNF7     IF ERROR 
          RJ     MER         MERGE SCR1 AND I TO SCR
          WRITE  SCR
 SNF4     SA2    INPF 
          SA1    X2 
          LX1    59-9 
          PL     X1,SNF1     IF NOT *EOI* ON INPUT FILE 
  
*         PROCESS SORTED FILE.
  
          SA1    DRFG        CHECK IF DATA WAS EVER READ
          SB2    -B1
          ZR     X1,SNF7     IF EMPTY FILE
          SA1    LIMT        RESTORE LIMIT IN FET 
          SA2    INPF 
          SA2    X2+4 
          MX6    -18
          BX6    X6*X2
          BX6    X6+X1
          SA6    A2 
          WRITER SCR,R
          SA1    FTYP 
          ZR     X1,SNF5     IF INPUT WAS DIRECT ACCESS FILE
          SA1    INPF 
          SA1    X1 
          RENAME X2,X1
          EQ     SNF8        RETURN/REWIND FILES
  
 SNF5     REWIND X2,R        COPY SCR TO INPUT
          READEI X2 
          SA5    SCR1+1 
          SA0    X5 
          SA2    INPF 
          REWIND X2,R 
 SNF6     SA5    SCR1+4 
          SX6    A0+B1
          IX5    X5-X6
          READW  SCR,A0,X5
          SB7    A0 
          SB7    B6-B7
          SA2    INPF 
          BX5    X1 
          WRITEW X2,A0,B7 
          PL     X5,SNF6     IF COPY NOT COMPLETE 
          WRITER X2          EMPTY BUFFER 
          EQ     SNF8        RETURN/REWIND FILES
  
 SNF7     SX6    1           SET ERROR FLAG 
          SA6    ERFG 
 SNF8     SA2    SCR1        RESTORE FET NAMES
          BX6    X2 
          SA6    SCR
          SA2    FNT2 
          BX6    X2 
          SA6    SCR1 
          RETURN SCR,R       RETURN SCRATCH FILES 
          RETURN SCR1,R 
          SA2    INPF        REWIND SORT FILE 
          REWIND X2,R 
          SA1    ERFG        RESTORE SAVED VALUE OF ERROR FLAG
 SNF$     IF     DEF,SNF$ 
          SA3    NLSF        NUMBER OF LINES IN SORTED FILE 
          BX6    X3 
 SNF$     ENDIF 
          EQ     SNFX        RETURN 
 GLT      SPACE  4,20 
**        GLT - GENERATE LINE NUMBER TABLE. 
* 
*         EXIT   (X0) = FWA OF SORTED LINE NUMBER TABLE.
*                (X1) = 0, IF NORMAL RETURN.
*                     = 1, IF ERROR RETURN. 
*                (B2) = ERROR CODE, IF (X1) = 1.
*                (DRFG) = 1.
* 
*         USES   X - 0, 1, 2, 3, 5, 6, 7. 
*                A - 1, 2, 3, 5, 7. 
*                B - 2, 3, 6, 7.
* 
*         CALLS  DCP, GLN, SST=.
  
  
 GLT      SUBR               ENTRY/EXIT 
          SA1    INPF 
          SA1    X1+B1       *FIRST*
          SA2    A1+B1       *IN* 
          SA3    A2+B1       *OUT*
          SA5    A3+B1       *LIMIT*
          SX0    X5          *LNT* WILL START AT *LIMIT*
          MX5    -18
          SX7    B1 
          IX2    X2-X1       *IN* - *FIRST* 
          SA7    DRFG        SET DATA READ FLAG 
          BX5    -X5*X2      NUMBER OF WORDS TO READ
          SA2    X3          READ FIRST WORD
          RJ     DCP         DEFINE CHARACTER SET PARAMETERS
          ZR     X2,GLT9     IF NO LINE NUMBER FOUND
          BX7    X7-X7       ZERO WORD TABLE DELIMITER
          SA7    X0 
 GLT1     BX1    X2 
          NX6,B3 X7          (X6) = 0, (B3) = 48
          RJ     GLN         GET LINE NUMBER
          SB2    47 
          SX7    A2          ADDRESS OF LINE
          LX6    18          POSITION LINE NUMBER 
          EQ     B2,B3,GLT9  IF NO LINE NUMBER
          ZR     X1,GLT4     IF POSSIBLE NULL LINE
 GLT2     BX6    X6+X7
          LX7    X6,B1       LEAVE BIT 0 FOR LINE DELETE FLAG 
          SA7    A7+B1       STORE TABLE ENTRY
          MX1    -12
 GLT3     BX7    -X1*X2 
          SA2    A2+B1       READ NEXT WORD 
          SX5    X5-1        DECREMENT NUMBER OF WORDS TO READ
          NZ     X7,GLT3     IF NOT END OF LINE 
          PL     X5,GLT1     IF MORE WORDS TO READ
          SA7    A7+1        SET TERMINATOR ZERO WORD 
          SX0    X0+1        STARTING ADDRESS OF *LNT* FOR SORT 
          SB7    X0 
          SX1    A7-B7       NUMBER OF ENTRIES IN *LNT* 
          RJ     SST=        SORT TABLE 
          SX1    B0          SET NO ERROR ENCOUNTERED 
          SB2    B0          SET *LNT* GENERATED
          EQ     GLTX        RETURN 
  
*         CHECK POSSIBLE LINE DELETE. 
  
 GLT4     SA1    CPAR 
          SA1    X1+TPAR     GET CHARACTER SET PARAMETERS 
          SB6    -B6         ZERO CHARACTER 
          SB2    X1          BLANK CHARACTER
          SB2    -B2
          SX3    X3+B6       ADD ON CODED ZERO
          SX1    X3+B2       SUBTRACT BLANK 
          SB6    -B6         RESTORE -0 
          ZR     X3,GLT5     IF PROBABLE LINE DELETE
          NZ     X1,GLT2     IF NOT DELETE
 GLT5     SA1    CPAR 
          SA3    A2+1 
          SB3    B3-43
          NZ     X1,GLT7     IF ASCII8 CODE SET 
 GLT6     SB3    B3+5        SET TO CHECK NINE AND TEN DIGITS 
          SX1    X1-2 
 GLT7     GE     B3,B1,GLT8  IF < 9 OR < 4
          ZR     X3,GLT8     IF EOL FOUND 
          ZR     B3,GLT2     IF EXACTLY 9 OR 4
          LX3    X3,B7
          SX3    X3+B2       COMPARE TO BLANK 
          ZR     X3,GLT8     IF LINE DELETE 
          SA3    A3+1 
          PL     X1,GLT6     IF ASCII8
          EQ     GLT2        NOT LINE DELETE
  
 GLT8     MX1    1           SET DELETE FLAG
          BX6    X6+X1
          EQ     GLT2        LOOP TO BUILD ENTRY
  
*         ERROR EXITS.
  
 GLT9     SX1    B1          SET UP ERROR RETURN
          SB2    B0          NO LINE NUMBER ERROR CODE
          EQ     GLT         RETURN 
          EQ     GLTX        RETURN 
          SPACE  4,10 
**        CEB - CHECK END OF BUFFER FOR END OF LINE.
* 
*         *CEB* STORES THE ADDRESS OF A PARTIAL LINE ( IF ONE WAS 
*         LEFT IN THE I/O BUFFER WHEN THE LAST SEGMENT WAS READ)
*         IN *PLAD* AND RESETS *IN* TO KEEP THE PARTIAL LINE
*         FROM BEING SEEN BY *GLT* AND *MER*. *SNF* WILL MOVE THE 
*         PARTIAL LINE TO THE TOP OF THE BUFFER BEFORE THE NEXT 
*         READ AND RESET THE FET POINTERS.  IN ADDITION *CEB* MAKES 
*         SURE THAT THERE WILL BE AT LEAST 101B WORDS OF ROOM LEFT IN 
*         THE BUFFER ONCE THE PARTIAL LINE IS MOVED TO THE TOP OF 
*         THE BUFFER TO ALLOW AT LEAST ONE PRU TO BE READ IN. 
* 
*         EXIT   (PLAD) = ADDRESS OF PARTIAL LINE.
*                (PLWC) = NUMBER OF WORDS IN PARTIAL LINE.
*                (X1) = 0 IF NO ERROR.
*                (X1) = 1 IF NOT ENOUGH BUFFER SPACE AVAILABLE. 
*                (B2) = 2 IF NOT ENOUGH BUFFER SPACE AVAILABLE. 
* 
*         USES   X - ALL. 
*                A - 2, 3, 4, 5, 7. 
*                B - 2, 3 ,4, 5 
* 
*         MACROS RECALL.
  
 CEB2     SX7    B3+B1
          SA7    A4          RESET *IN* TO EXCLUDE PARTIAL LINE 
          SA7    PLAD        STORE ADDRESS OF PARTIAL LINE
 CEB3     SX7    B5 
          SA7    PLWC        STORE NUMBER OF WORDS
          BX1    X1-X1       CLEAR ERROR FLAG 
  
 CEB      SUBR               ENTRY/EXIT 
          SA2    INPF 
          RECALL X2 
          SB5    B0          START NUMBER OF WORDS AT ZERO
          SA2    X2 
          LX2    59-9 
          SA3    A2+B1       *FIRST*
          NG     X2,CEB3     IF EOI ENCOUNTERED 
          SA4    A3+1        *IN* 
          SA5    A2+4        *LIMIT*
          IX0    X5-X3       *LIMIT*-*FIRST*
          MX2    -12
          SB4    X0-101B     NUMBER OF WORDS THAT CAN BE READ 
          SB3    X4-1 
 CEB1     SA3    B3          GET WORD FROM END OF DATA
          BX6    -X2*X3 
          ZR     X6,CEB2     IF *EOL* FOUND 
          SB3    B3-B1
          SB5    B5+B1       INCREMENT NUMBER OF WORDS READ 
          LE     B5,B4,CEB1  IF MORE WORDS CAN BE READ
          SB2    B1+B1       SET ERROR CODE FOR NOT ENOUGH BUFFER SPACE 
          SX1    B1          SET ERROR FLAG 
          EQ     CEBX        RETURN 
 DCP      SPACE  4,20 
**        DCP - DEFINE CHARACTER PARAMETERS.
*         DETERMINE CHARACTER SET OF INPUT FILE AND SET 
*         UP PARAMETERS ACCORDINGLY.
* 
*         ENTRY  (X2) = FIRST WORD OF INPUT BUFFER. 
*                (CPAR) = -1, CHARACTER SET TO BE DETERMINED. 
*                       = 0, CHARACTER SET = 6/12 DISPLAY CODE. 
*                       = 1, CHARACTER SET = ASCII8.
* 
*         EXIT   (X2) = NON ZERO IF NORMAL RETURN.
*                       0, IF ERROR RETURN. 
*                (X4) = CHARACTER MASK. 
*                (B4) = 48 - NDIG - 1.
*                (B5) = -(FIRST NON-NUMERIC CHARACTER). 
*                (B6) = -(FIRST NUMERIC CHARACTER). 
*                (B7) = SHIFT COUNT.
* 
*         USES   X - 1, 2, 4, 7.
*                A - 1, 7.
*                B - 3, 4, 5, 6, 7. 
  
  
 DCP4     SA1    X1+TPAR     GET PARAMETER WORD 
          AX1    18          GET ZERO CHARACTER 
          SB6    X1 
          SB6    -B6
          AX1    18 
          SB5    B6-10       GET FIRST NON-NUMERIC
          SX4    X1          GET CHARACTER MASK 
          AX1    18 
          SB7    X1          GET SHIFT COUNT
          SA1    NDIG        SET UP CHARACTER COUNT CONSTANT
          SB4    X1+B1
          SB3    48 
          SX1    B0 
          SB4    B3-B4
  
 DCP      SUBR               ENTRY/EXIT 
          SA1    CPAR        CHECK CHARACTER SET
          PL     X1,DCP4     IF ALREADY DETERMINED
  
*         CHECK IF 6/12 DISPLAY CODE. 
  
          LX2    6
          MX4    -6 
          BX4    -X4*X2      FIRST CHARACTER
          LX2    6
          SX4    X4-33B 
          NG     X4,DCP1     IF ALPHABETIC
          SX4    X4-10
          PL     X4,DCP1     IF NON-NUMERIC 
          LX2    -12
          SX1    B0          SET 6/12 DISPLAY CODE FLAG VALUE 
          EQ     DCP2        COMPLETE PARAMETER SETUP 
  
*         CHECK IF ASCII8.
  
 DCP1     MX4    -12
          BX4    -X4*X2      FIRST CHARACTER
          SX1    B1          SET ASCII8 FLAG VALUE
          LX2    -12
          SX4    X4-60B 
          NG     X4,DCP3     IF NOT NUMERIC 
          SX4    X4-10
          PL     X4,DCP3     IF NOT NUMERIC 
 DCP2     BX7    X1 
          SA7    A1          CHARACTER SET FLAG 
          EQ     DCP4        SET UP PARAMETERS
  
 DCP3     SX2    B0+         SET ERROR EXIT 
          EQ     DCPX        RETURN 
 GLN      SPACE  4,20 
**        GLN - GET LINE NUMBER.
* 
*         ENTRY  (X1) = (X2) = FIRST WORD OF LINE.
*                (X4) = CHARACTER MASK. 
*                (X6) = ZERO. 
*                (A2) = ADDRESS FIRST WORD OF LINE. 
*                (B3) = 48. 
*                (B4) = 48 - NDIG - 1.
*                (B5) = -(FIRST NON-NUMERIC). 
*                (B6) = -(ZERO CHARACTER).
*                (B7) = SHIFT COUNT.
* 
*         EXIT   (X1) = DATA FOLLOWING LINE NUMBER. 
*                (X6) = PSEUDO-HEX LINE NUMBER. 
* 
*         USES   X - 1, 3, 6, 7.
*                A - 1, 3.
*                B - 2, 3.
  
  
 GLN      SUBR               ENTRY/EXIT 
 GLN1     LX1    B7 
          BX3    X4*X1       GET NEXT CHARACTER 
          SX7    X3+B5       SUBTRACT FIRST NON-DIGIT 
          BX1    -X4*X1      CLEAR CHARACTER BEING PROCESSED
          SX3    X3+B6       SUBTRACT ZERO CHARACTER
          BX7    -X7+X3 
          SB3    B3-1 
          NG     X7,GLNX     IF NOT NUMERIC 
          EQ     B3,B4,GLNX  IF MAXIMUM NUMBER OF DIGITS PROCESSED
          LX6    4
          IX6    X6+X3       ACCUMULATE DIGIT 
          NZ     X1,GLN1     IF WORD NOT USED NOT UP
          SA3    CPAR 
          ZR     X3,GLN1     IF NOT ASCII8
          SB2    B3-43
          NZ     B2,GLN1     IF NOT EXACTLY FIVE DIGITS PROCESSED 
          SA1    A2+1 
          EQ     GLN1        CONTINUE PROCESSING
 MER      SPACE  4,15 
**        MER - MERGE LAST SORTED SEGMENT WITH NEW INPUT USING DATA 
*                FROM LINE NUMBER TABLE TO WRITE TO SCR.
* 
*         ENTRY  (X0) = FWA LINE NUMBER TABLE.
*                (LAST) = LAST LINE NUMBER FROM PREVIOUS SEGMENT. 
* 
*         EXIT   SEGMENTS MERGED ONTO SCR.
* 
*         USES   X - ALL. 
*                A - ALL. 
*                B - 2, 3, 7. 
* 
*         CALLS  DCP, GLN.
* 
*         MACROS READ, READC, REWIND, WRITEC, WRITER, WRITEW. 
  
  
 MER      SUBR               ENTRY/EXIT 
          SA5    X0          FIRST ENTRY IN LINE NUMBER TABLE 
          LX5    59-0 
          SA1    LAST        GET LAST LINE NUMBER OF PREVIOUS SEGMENT 
          SA0    X5          (A0) = BUFFER ADDRESS OF LINE M
          MX7    1
          PL     X5,MER1     IF NOT NULL LINE 
          SA0    -1          LINE DELETE FLAG 
          BX5    X7-X5       CLEAR LINE DELETE FLAG 
 MER1     AX5    18          (X5) = M, LINE NUMBER ON MERGE SEGMENT 
          IX0    X1-X5
          NG     X0,MER18    IF NO OVERLAP OF FILES 
          WRITER SCR         EMPTY SCR BUFFER 
          REWIND X2,R 
          SA3    FNT2 
          BX6    X3 
          SA6    X2          SCR FNT NAME SCR1
          SA3    SCR1+B1     SET IN=OUT=FIRST FOR SCR1
          SX6    X3 
          SA6    A3+B1
          SA6    A6+B1
          READ   A3-B1       READ SCR1, OLD FILE SEGMENT
  
*         GET LINE NUMBER S FROM SCR1 AND WRITE LINE TO WKST. 
  
 MER2     SX7    B0+         CLEAR LONG LINE FLAG 
          SA7    LLFG 
          READC  SCR1,WKST,WKSTL
          NZ     X1,MER17    IF EOR ON SCR1 
          MX7    -12
          BX7    -X7*X4 
          ZR     X7,MER3     IF LINE FIT INTO *WKST*
          SA7    LLFG        SET LONG LINE FLAG TO TRUE 
          BX7    X4          REPLACE FORCED *EOL* WORD
          SA7    WKST+WKSTL-1 
 MER3     RJ     DCP         DEFINE CHARACTER PARAMETERS
          SA2    WKST        GET LINE NUMBER S
          NX6,B3 X1          (X6) = 0, (B3) = 48
          BX1    X2 
          RJ     GLN
 MER4     IX0    X5-X6       M - S
          NG     X0,MER9     IF M .LT. S
          NZ     X0,MER6     IF M .NE. S
 SNF$     IF     DEF,SNF$ 
          SA1    NLSF        DECREMENT NUMBER OF SORTED LINES 
          SX7    X1-1 
          SA7    A1+
 SNF$     ENDIF 
          SA1    LLFG 
          ZR     X1,MER2     IF (M=S) .AND. *LLFG* IS FALSE 
 MER5     READC  SCR1,WKST,WKSTL  CLEAR OUT REST OF LINE
          MX7    -12
          BX6    -X7*X4 
          NZ     X6,MER5     IF *EOL* NOT YET REACHED 
          EQ     MER2        PROCESS NEXT LINE
  
 MER6     SA3    LAST        LAST LINE NUMBER 
          IX0    X3-X5
          NG     X0,MER12    IF M .GT. *LAST* S 
          SA1    LLFG 
          ZR     X1,MER8     IF LINE WAS NOT TOO LONG 
 MER7     WRITEW SCR,WKST,WKSTL  TRANSFER LINE SO FAR 
          READC  SCR1,WKST,WKSTL
          MX7    -12
          BX6    -X7*X4 
          BX7    X4          REPLACE POSSIBLE FORCED *EOL* WORD 
          SA7    WKST+WKSTL-1 
          NZ     X6,MER7     IF NOT END OF LINE 
 MER8     WRITEC SCR,WKST    TRANSFER LINE
          EQ     MER2        PROCESS NEXT LINE
  
*         MERGE LINE M. 
  
 MER9     SB2    A0          BUFFER ADDRESS FOR MERGE FILE
          BX0    X5 
          SA5    A5+B1       GET NEXT M 
          LX5    59-0        CHECK LINE DELETE FLAG (BIT 0) 
          ZR     X5,MER11    IF END OF LINE NUMBER TABLE
          SA0    X5          BUFFER ADDRESS OF LINE M 
          MX7    1
          PL     X5,MER10    IF NOT LINE DELETE 
          SA0    -B1
          BX5    X7-X5
 MER10    AX5    18          NEXT M TO X5 
          BX2    X5-X0
          ZR     X2,MER9     IF SAME, DELETE EARLIER M
          NG     B2,MER4     IF DELETE LINE FLAG SET
          BX0    X6 
          WRITEC SCR,B2      TRANSFER LINE M TO SCR 
 SNF$     IF     DEF,SNF$ 
          SA4    NLSF        INCREMENT NUMBER OF SORTED LINES 
          SX6    X4+B1
          SA6    A4 
 SNF$     ENDIF 
          BX6    X0 
          EQ     MER4        LOOP TO PROCESS NEXT M 
  
*         DUMP REST OF SCR1 TO SCR. 
  
 MER11    NG     B2,MER12    IF NULL LINE 
          WRITEC SCR,B2      WRITE LAST LINE OF LINE NUMBER TABLE 
 MER12    SA1    LLFG        CHECK LONG LINE FLAG 
          MX0    -12
          ZR     X1,MER15    IF LONG LINE FLAG FALSE
          EQ     MER14       TRANSFER THE FIRST SECTION OF LONG LINE
  
 MER13    BX7    -X0*X4 
          ZR     X7,MER15    IF LINE FIT INTO *WKST*
          BX7    X4          REPLACE FORCED *EOL* WORD
          SA7    WKST+WKSTL-1 
 MER14    WRITEW SCR,WKST,WKSTL  TRANSFER THIS SECTION
          EQ     MER16       READ NEXT SECTION OF LONG LINE 
  
 MER15    WRITEC SCR,WKST    TRANSFER LINE OR LAST PART 
 MER16    READC  SCR1,WKST,WKSTL
          ZR     X1,MER13    IF NOT *EOR* 
  
*         DUMP REST OF LINE NUMBER TABLE TO SCR AND EXIT
  
 MER17    ZR     X5,MER20    IF END OF *LNT*
 MER18    SB7    A0 
          BX0    X5          CHECK MERGE
          SA5    A5+B1       NEXT LINE FROM LINE NUMBER TABLE 
          LX5    59-0        CHECK LINE DELETE FLAG (BIT 0) 
          SA0    X5+
          PL     X5,MER19    IF NO LINE DELETE
          SA0    -1 
          MX7    1           REMOVE SIGN EXTENSION
          BX5    X7-X5
 MER19    AX5    18          NEXT M TO X5 
          BX3    X5-X0
          ZR     X3,MER17    IF SAME LINE NUMBERS 
          NG     B7,MER17    IF LINE DELETE 
          WRITEC SCR,B7      TRANSFER LINE M TO SCR 
 SNF$     IF     DEF,SNF$ 
          SA4    NLSF        INCREMENT NUMBER OF SORTED LINES 
          SX6    X4+B1
          SA6    A4 
 SNF$     ENDIF 
          EQ     MER17       DUMP NEXT LINE OF LINE NUMBER TABLE
  
*         EXIT
  
 MER20    BX6    X0 
          SA3    LAST        LAST LINE NUMBER FROM PREVIOUS SEGMENT 
          IX4    X6-X3
          NG     X4,MER      IF LAST LINE MERGED < *LAST* 
          SA6    A3+
          EQ     MERX        RETURN 
 ELK      SPACE  4,10 
          SPACE  4,10 
          BASE   *
 QUAL$    IF     -DEF,QUAL$ 
          QUAL   *
 SNF      EQU    /COMCSNF/SNF 
 QUAL$    ENDIF 
          ENDX
