* 05/20/76 -- 13:00
* MODULE NAME: EDIT
* NUMBER: 5
* PURPOSE: PROVIDE LINE EDITING SERVICES
* ENTRY POINTS:
*
         DEF      INCTBL            INCREMENT TABLE FOR MOVE
         DEF      SZINCTBL          SIZE OF INCREMENT TABLE
*
         DEF      C05LN,C05PLUS,C05MINUS     EDIT LINE OR RANGE OF LINES
         DEF      C05E                       ERASE LINE(S)
         DEF      C05MOVE                    MOVE LINE(S)
         DEF      C05N                       PRINT NEXT LINE NUMBER
         DEF      C05INSLN          INSERT NEW LINE
         DEF      C05IEND           INSERT END COMMAND
         DEF      S05LOC                     LOCATE PHRASE WITHIN A LINE
         DEF      S05INS                     INSERT PHRASE IN A LINE
         DEF      S05GETLN          GET LINE NUMBER GIVEN OFFSET
         DEF      S05RANGE          GET RANGE OF LINE
         DEF      S05NLMSG          NEXT LINE NUMBER MSG
         DEF      S05RDYCR          READ Y-CR RESPONSES
         DEF      S05DLINE          DELETE TEXT & HEADER FILE LINES
         DEF      S05TABBR,S05BLQM  CHECK FOR TABS, ADD QM TO MSGS
*
         REF      S01SCAN,S01TXTLN
         REF      S27RTXT,S27WTXT
         REF      S07CHHDR,S27DRTXT
         REF      S27RTEL,S27RTNL,S27WTERM,S29STD
         REF      S27PRINT
         REF      S27TXTFL,S27TXTLL,S35LINE
         REF      S02BCHK           BATCH CHECK
         REF      S04FCHK           FILE OUTPUT MODE CHECK
         REF      ZRORTNST          RE-INITIALIZE RETURN STACK
*
         SYSTEM   TEXTDEF
         SYSTEM   ITEMDEF
         INVCMDSTA
         INVWSSTA
         INVHDRSTA
*
         PAGE
*
*
*
         DEF      5P,5D
*
5P       EQU      %
         DATA     X'05'             MODULE NUMBER
         DATA     X'052076'         DATE
         DATA     X'1300'           TIME
*
*
         TITLE    '** EDIT(5) **'
*
*
C05LN    EQU      %
         GET,D1     #RN1            GET FIRST LINE NUMBER
         GET,D2     #RN2            GET SECOND LINE NUMBER (IF PRESENT)
         B        TSTRN             NOW GO TEST 2ND LINE NO.
*
C05PLUS  EQU      %
         LI,AC2   1                 SET MULTIPLIER FOR POSITIVE OFFSET
         B        GETOS             NOW GO CALCULATE OFFSET
*
C05MINUS EQU      %
         LI,AC2   -1                SET MULTIPLIER FOR NEGATIVE OFFSET
*
GETOS    EQU      %                 CALCULATE OFFSET
         GET,D1     #DSHW,:K(1)     GET INTEGER VALUE
         MW,AC2   D1                MULTIPLY BY +/- SIGN
         LW,D1    AC2               MOVE TO D1
         GET,D2     #LN             GET 2ND LINE NUMBER
*
*
         PAGE
*
*
TSTRN    EQU      %                 TEST FOR RANGE OF LINE NUMBERS
         SAVRTN
         BAL,SRTN S02BCHK           IF BATCH MODE EXIT
         BAL,SRTN S04FCHK           CHECK FOR FILE OUTPUT MODE
         STW,D1   RN1               SAVE LN #1
         STW,D2   RN2               SAVE LN #2
*
         MTW,0    RN2               TEST FOR RANGE
         BEZ      EDITLN               NO, GO EDIT LINE
         LW,D1    RN1               GET FIRST LINE IN RANGE
         LW,D2    RN2               GET SECOND LINE IN RANGE
         BAL,SRTN S05RANGE          GO GET KEYS
         CI,AC1   0                 TEST FOR RN1=0
         BE       LNERR                YES, LINE NUMBER ERROR
         B        PRNTRN            NOW PRINT LINES
*
*
         PAGE
*
*
EDITLN   EQU      %                 EDIT LINE IN RN1
         LW,AC1   RN1               GET KEY FOR EDIT LINE
         BAL,SRTN S05GETLN          NOW GET ACTUAL KEY
         CI,AC2   0                 TEST FOR NOT FOUND
         BE       LNERR                ERROR
*
         LI,BUF2  BA(STDX1BUF)      GET BUFFER ADDR
         LI,AC1   #STDBUFSZ         MAX SIZE
         BAL,SRTN S27RTXT           READ ACTUAL TEXT FILE LINE
         STW,AC2  RN1               LINE FOUND, SAVE KEY
         STW,AC1  TXTLNSZ           SAVE LINE SIZE
         LWC,X2     #CS,:K(3)       GET OLD PHRASE COUNT AND ADDR
         BEZ      WRLN              IF ZERO, GO WRITE LINE
*
         LI,X1    BA(STDX1BUF)+1    ADDR OF TEXT LINE
         AI,AC1   -1                DECREMENT SIZE
         BAL,SRTN S05LOC            CHECK LINE FOR OLD PHRASE
         CI,AC2   0                 PHRASE FOUND?
         BE       PHRASERR              NO, PRINT ERROR MESSAGE
*
*
         PAGE
*
*
TSTNWPH  EQU      %                 NOW TEST FOR NEW PHRASE
         JEZ,D1   (#FLAGS,:K(2)),SETOLDPH  TEST FOR NEW PHRASE
         LWC,X2     #CS,:K(2)       IF SET, GET NUMBER OF CHARS AND ADDR
         LW,AC1   TXTLNSZ           GET LINE SIZE
         AI,AC1   BA(STDX1BUF)      CALC END-OF-LINE
         SW,AC1   X1                CALCULATE START OF OLD PHRASE
         BAL,SRTN S05INS            INSERT NEW PHRASE IN LINE
         AWM,AC2  TXTLNSZ           CALCULATE NEW LINE SIZE
*
WRLN     EQU      %
         LW,AC2   RN1               GET LINE KEY
         BAL,SRTN S05UDLN           DELETE OLD LINE
         LI,BUF2  BA(STDX1BUF)+1    ADDR OF LINE
         LW,AC1   TXTLNSZ           GET LINE SIZE
         AI,AC1   -1                DECREMENT SIZE
RTELN    EQU      %
         BAL,SRTN S27RTEL           PRINT AND EDIT LINE
         CI,AC1   0                 TEST FOR DELETE LINE
         BLE      LNDELMSG             YES, PRINT 'DELETED' MESSAGE
*
SCANLN   EQU      %
         LI,BUF2  BA(STDX1BUF)+1    ADDR OF LINE
         LW,D1    RN1               GET KEY FOR NEW LINE
         PUT,D1   #NXTKEY           STORE IN EDIT KEY
         BAL,SRTN S01SCAN           SCAN LINE FOR COMMANDS
*
*
         PAGE
*
*
         CI,AC1   0                 TEST FOR ZERO SIZE
         BLE      LNDELMSG             YES, RETURN
         CI,SR3   0                 TEST FOR COMMAND ERROR
         BNE      RTELN                YES, RE-EDIT LINE
         LI,BUF3  BA(STDX1BUF)      GET BUFFER ADDR
         STB,AC2  0,BUF3            STORE ATTN COUNT
         AI,AC1   1                 INCREMENT SIZE
         LW,AC2   RN1               GET KEY
         BAL,SRTN S01TXTLN          GO WRITE TEXT FILE LINE
         B        EDITRTN           RETURN
*
SETOLDPH EQU      %
         AW,AC2   X1                ADD SIZE OF PHRASE TO POS.
         AI,AC2   -BA(STDX1BUF)     CALC NEW LINE SIZE
         STW,AC2  TXTLNSZ           SAVE NEW LINE SIZE
         B        WRLN              NOW EDIT LINE
*
LNDELMSG EQU      %
         LW,AC2   RN1               GET LINE KEY
         BAL,SRTN S35LINE           CONVERT TO EBCDIC
         LCI      2                 SAVE LINE NUMBER
         STM,AC1  RN1
         MOVE,X1  BA(RN1),INSDELLN,8  MOVE LN TO MSG
         LI,BUF1  BA(DELMSG)+1      GET ADDR OF MSG
         LB,AC1   DELMSG            SIZE
         BAL,SRTN S27PRINT          PRINT MESSAGE
         B        EDITRTN           NOW RETURN
*
*
         PAGE
*
*
PRNTRN   EQU      %
         BRKCTRL  RNRTN             SET BREAK ADDR
         LI,BUF2  BA(STDX1BUF)      GET BUFFER ADDR
         LW,AC2   RN1               GET KEY OR OFFSET FOR FIRST LINE
*
RDTXT    EQU      %                 READ NEXT TEXT LINE
         LI,AC1   #STDBUFSZ         MAX SIZE
         BAL,SRTN S27RTXT           READ LINE
         CI,AC1   0                 TEST FOR END OF FILE
         BLE      RNRTN                 YES, RETURN
         CW,AC2   RN2               COMPARE KEY TO RN2
         BG       RNRTN                 >RN2, RETURN
*
PRLN     EQU      %
         LI,BUF3  BA(STDX1BUF)+1    ADDR OF LINE
         AI,AC1   -1                DECREMENT SIZE
         BAL,SRTN S27WTERM          PRINT LINE AT TERMINAL
         LI,AC2   0                 SET KEY FOR READ NEXT
         B        RDTXT             READ NEXT LINE
*
RNRTN    EQU      %
         BRKCTRL  0                 RESET BREAK CONTROL
         BAL,SRTN S05NLMSG          PRINT NEXT LINE
         B        ZRORTNST          RE-INITIALIZE RETURN STACK
*
         PAGE
*
* S05DLINE -- DELETE TEXT AND HEADER FILE LINES
*                 AND DECREMENT LINE COUNT
*
S05DLINE EQU      %
         SAVRTN
*
         LI,AC1   0                 SET READ SIZE TO ZERO
         BAL,SRTN S27RTXT           TEST FOR LINE PRESENT
         STW,AC2  SVKEY             SAVE DELETE KEY
         CI,AC2   0                 TEST FOR KEY FOUND
         BE       RTNDLINE             NO, RETURN
*
DTXTLN   EQU      %
         BAL,SRTN S27DRTXT          DELETE TEXT FILE LINE
         SLD,AC1  32                SET ARGS FOR DELETE HEADER
         BAL,SRTN S07CHHDR          DELETE HEADER RECORD
*
         GET,D1   #NLINES           GET CURRENT NUMBER OF LINES
         AI,D1    -1                DECREMENT FOR DELETED LINE
         PUT,D1   #NLINES           STORE NEW LINE COUNT
*
RTNDLINE EQU      %
         LW,AC2   SVKEY             GET DELETE KEY
         RETURN
*
S05UDLN  EQU      %
         SAVRTN
         B        DTXTLN            DELETE LINE UNCONDITIONALLY
*
*
         PAGE
*
* C05INSLN -- INSERT NEW LINE
*
*
C05INSLN EQU      %
         SAVRTN
         BAL,SRTN S02BCHK           IF BATCH MODE EXIT
         BAL,SRTN S04FCHK           FILE OUTPUT MODE CHECK
         JEZ,D1   #RN1,INSLN20      BRANCH IF NO INCREMENT
         CW,D1    L(#ZROKEY)        CHECK FOR KEY
         BL       LNERR             NOT KEY, ERROR
         AND,D1   L(X'FFFFFF')      CLEAN KEY VALUE
INSLN20  RES      0
         STW,D1   INSINC            SAVE INSERT INCREMENT
*
         GET,AC1  #LN               GET NEW LINE NUMBER
         CW,AC1   L(#ZROKEY)        TEST FOR KEY
         BG       STINSKEY             YES, STORE KEY
         BAL,SRTN S05GETLN             NO, GET KEY
         CI,AC2   0                 TEST FOR KEY
         BE       LNERR                NO, ERROR
         LW,AC1   AC2               MOVE KEY TO AC1
*
STINSKEY EQU      %
         CW,AC1   L(#MAXKEY)        IS KEY BEYOND MAXIMUM ALLOWED
         BG       LNERR             YES
         STW,AC1  RN1               STORE INSERT KEY
         LW,AC2   RN1               GET KEY FOR DELETE
         LI,AC1   21                SET TO READ 21 CHARS INTO MSG
         LI,BUF2  BA(REPCHAR)       GET ADDR IN MSG FOR READ
         BAL,SRTN S27RTXT           TEST FOR LINE PRESENT
         AI,AC1   -2                DECR COUNT FOR ATTN AND CR
         STW,AC1  TXTLNSZ           SAVE READ SIZE
         LI,D1    #BLANK            GET A BLANK
         STB,D1   0,BUF2            REPLACE ATTN COUNT WITH BLANK
         MTW,0    INSINC            INSERT WITH INCREMENT
         BEZ      INSLN40           NO
         STW,AC2  KEEPFLG           SAVE INSERT KEY
         LW,AC2   L(#MAXKEY+1)
         STW,AC2  INCEND            INIT END OF INCREMENT RANGE
         LI,AC1   0                 SET READ SIZE TO 0
         LI,AC2   0                 SET TO READ NEXT
         BAL,SRTN S27RTXT           READ NEXT RECORD
         CI,SR3   3                 EOF
         BE       INSLN35           YES
         STW,AC2  INCEND            SAVE END OF RANGE KEY
INSLN35  RES      0
         LW,AC2   KEEPFLG           GET STARTING INSERT KEY
INSLN40  RES      0
         CI,AC2   0                 WAS KEY FOUND
         BE       INSLN50           NO
         LW,AC1   TXTLNSZ           GET LINE SIZE
         AI,AC1   REPMSGSZ          ADD SIZE OF REPLACE MSG
         LI,BUF3  BA(REPMSG)        GET BA OF MSG
         BAL,SRTN S05TABBR          REPLACE TABS WITH SPACES
         BAL,SRTN S05BLQM           ADD BLANKS AND QUESTION MARK
         LI,BUF1  BA(REPMSG)        GET BYTE ADDR OF MSG
         BAL,SRTN S27PRINT          GO PRINT REPLACE MSG
         BAL,SRTN S05RDYCR          GET RESPONSE
         CI,SR3   0                 TEST RESPONSE
         BE       CNCLERS           GO TO ACTION CANCELLED
         LW,AC2   RN1               GET DELETE KEY
         BAL,SRTN S05DLINE          GO DELETE LINE
INSLN50  RES      0
         MTW,0    INSINC            INSERT WITH INCREMENT
         BNEZ     INSLN100          YES, PROCESS INCREMENT
         LI,BUF1  BA(STDX1BUF)+1    GET ADDR OF EDIT BUFFER
         BAL,SRTN S27RTNL           READ NEW LINE
         B        SCANLN            NOW SCAN NEW LINE
INSLN100 RES      0
         LW,AC2   RN1               GET INSERT KEY
         CW,AC2   INCEND            TEST FOR END OF INCREMENT RANGE
         BGE      EDITRTN           END OF RANGE, EXIT
         BAL,SRTN S35LINE           CONVERT KEY TO LINE NUMBER
         LCI      2
         STM,AC1  LNPRMSG           MOVE LINE NUMBER TO LINE PROMPT MSG
         LI,BUF1  BA(LNPRMSG)       GET BYTE ADDR OF MESSAGE
         LI,AC1   LNPRSZ            GET SIZE OF LINE PROMPT MSG
         BAL,SRTN S27PRINT          GO PRINT MESSAGE
         LI,BUF1  BA(STDX1BUF)+1    GET ADDR OF EDIT BUFFER
         LW,AC2   RN1               GET NEXT KEY
         BAL,SRTN S27RTNL           READ NEXT INSERT LINE
         CI,AC1   0                 WAS LINE SIZE = 0
         BLE      INSLN100          YES, READ LINE AGAIN
         LI,BUF2  BA(STDX1BUF)+1    GET BYTE ADDR OF LINE
         LW,D1    RN1               GET KEY OF LINE
         PUT,D1   #NXTKEY           STORE IN EDIT KEY
         BAL,SRTN S01SCAN           SCAN LINE FOR COMMANDS
         CI,AC1   0                 TEST FOR SYSTEM COMMAND
         BLE      EDITRTN           YES, END OF INSERT MODE
         CI,SR3   0                 TEST FOR COMMAND ERROR
         BE       INSLN150          NO ERROR
         BAL,SRTN S27RTEL           PRINT AND EDIT LINE
INSLN150 RES      0
         LI,BUF3  BA(STDX1BUF)      GET BYTE ADDR OF LINE
         STB,AC2  0,BUF3            STORE ATTN COUNT
         AI,AC1   1                 INCR SIZE FOR ATTN
         LW,AC2   RN1               GET KEY
         BAL,SRTN S01TXTLN          GO WRITE TEXT FILE LINE
         LW,AC2   INSINC            GET INSERT INCREMENT
         AWM,AC2  RN1               ADD TO LAST INSERT KEY
         B        INSLN100
*
*
         PAGE
*
*
* C05IEND -- INSERT END COMMAND
*
C05IEND  RES      0
         SAVRTN
         BAL,SRTN S02BCHK           IF BATCH MODE EXIT
         BAL,SRTN S04FCHK           FILE OUTPUT MODE CHECK
         RETURN
*
*
         PAGE
*
* LOCATE PHRASE WITHIN A LINE
*
* ENTRY: X1 =BYTE ADDR OF FIRST CHAR IN LINE
*        X2 =NUMBER OF CHARS IN PHRASE, BYTE ADDR OF FIRST CHAR
*        AC1=LENGTH OF LINE
*
* EXIT:  X1 =BYTE ADDR OF FIRST CHAR OF PHRASE IN LINE
*        AC2=NUMBER OF CHARS IN PHRASE (0 IF NOT FOUND)
*
S05LOC   EQU      %
         SAVRTN
*
         CI,AC1   0                 TEST FOR NO CHARS IN LINE
         BLE      LOCERR               NONE, RETURN WITH AC2=0
         STW,X2   PHRASE            SAVE PHRASE COUNT/FIRST CHAR
         AW,AC1   X1                CALCULATE END OF INPUT LINE
         LB,AC2   PHRASE            GET NUMBER OF CHARS IN PHRASE
         SW,AC1   AC2               CALCULATE LAST CHAR TO CHECK
         STW,AC1  LSTCHAR           SAVE LAST CHAR TO CHECK
*
FCLP     EQU      %
         LB,AC1   0,X2              GET FIRST CHAR IN PHRASE
         CB,AC1   0,X1              COMPARE TO NEXT CHAR IN LINE
         BE       TSTCOMP           FIRST CHARS EQUAL,TEST PHRASE
*
INCRFC   EQU      %
         AI,X1    1                 INCREMENT LINE POINTER
         CW,X1    LSTCHAR           TEST FOR LAST COMPARE CHAR
         BLE      FCLP                  NO,TEST NEXT CHAR
*
*
         PAGE
*
*
LOCERR   EQU      %                 ERROR,PHRASE NOT FOUND
         LI,AC2   0                 SET SIZE TO ZERO
         B        LOCRTN            RETURN
*
TSTCOMP  EQU      %
         STW,X1   FCHAR             SAVE FIRST CHAR
         CBS,X1   0                 COMPARE PHRASE
         BE       PFND              EQUAL,PHRASE FOUND
         LCI      2
         LM,X1    XREGS             RESTORE LINE AND PHRASE POINTERS
         B        INCRFC            INCREMENT LINE POINTER AND CONTINUE
*
PFND     EQU      %
         LW,X1    FCHAR             RESTORE FIRST CHAR OF PHRASE IN LINE
         LB,AC2   PHRASE            GET NUMBER OF CHARS IN PHRASE
*
LOCRTN   EQU      %                 RETURN
         RETURN
*
*
         PAGE
*
* INSERT CHAR STRING IN LINE
*
* ENTRY: X1 = FIRST CHAR OF NEW PHRASE IN LINE
*        X2 = COUNT,BYTE ADDR OF NEW PHRASE
*        AC1= NUMBER OF CHARS REMAINING IN LINE (FROM X1)
*        AC2= NUMBER OF CHARS AVAILABLE IN LINE
*
* EXIT:  AC2= DIFFERENCE IN NUMBER OF CHARS FOR NEW LINE
*
S05INS   EQU      %
         SAVRTN
*
         LCI      2
         STM,X1   XREGS             SAVE FIRST CHAR, PHRASE
         STM,AC1  NLINE             SAVE NUMBER OF LINE CHARS,EMPTY CHAR
*
         LB,AC2   PHRASE            GET NUMBER OF CHARS IN PHRASE
         SW,AC2   NCHARS            SUBTRACT NUMBER OF AVAILABLE CHARS
         BEZ      INSCHARS              IF ZERO,LINE SHIFT NOT REQD
         BGZ      ENDMOVE
         AW,X1    NCHARS            CALC FIRST CHAR TO MOVE
         LI,AC3   1                 INCR. FOR MOVE
         B        SHFTREM           GO SHIFT LINE
*
ENDMOVE  EQU      %
         AW,X1    NLINE             CALC END OF LINE
         AI,X1    -1                FIRST CHAR TO MOVE
         LI,AC3   -1                INCR FOR SOURCE CHAR
*
*
         PAGE
*
*
SHFTREM  EQU      %
         SW,AC1   NCHARS            CALC # TO MOVE
         SW,AC3   AC2               CALC ADD WORD
SHFTLNLP EQU      %
         LB,D1    0,X1              GET SOURCE CHAR
         AW,X1    AC2               GET DEST. ADDR
         STB,D1   0,X1              MOVE CHAR
         AW,X1    AC3               INCR/DECR POINTER
         BDR,AC1  SHFTLNLP          GET NEXT MOVE CHAR
*
INSCHARS EQU      %
         LW,X2    FCHAR             GET DESTINATION ADDR OF PHRASE
         LW,X1    PHRASE            GET NEW PHRASE INFO
         BEZ      INSRTN            NO NEW PHRASE, RETURN
         SCS,X1   8                 MOVE COUNT TO X2
         SLS,X2   8
         SLD,X1   -8
         MBS,X1   0                 MOVE PHRASE INTO LINE
*
INSRTN   EQU      %                 RETURN
         RETURN
*
*
         PAGE
*
* S05GETLN -- GET LINE NUMBER GIVEN OFFSET
*
* ENTRY PARAMETERS:
*        AC1 = KEY OR OFFSET
*
* EXIT PARAMETERS:
*        AC2 = NEW KEY (0 IF KEY NOT FOUND)
*
S05GETLN EQU      %
         SAVRTN
*
         CW,AC1   L(#ZROKEY)        TEST FOR KEY
         BGE      GETKEY               YES, GET KEY
         STH,AC1  SAVLN                OFFSET, SAVE VALUE
         GET,AC1  #CLP              GET CLP FOR OFFSET
         SLD,AC1  -32               SHIFT FOR ZERO READ
         BAL,SRTN S27RTXT           POSITION FILE AT CLP
         LH,AC1   SAVLN             NOW GET OFFSET
         BEZ      RTNGETLN             ZERO, RETURN
         AI,AC1   -1                SET OFFSET FOR READ PREVIOUS
*
GETKEY   EQU      %
         SLD,AC1  -32               SHIFT FOR ZER READ
         BAL,SRTN S27RTXT           READ TO FIND KEY
*
RTNGETLN EQU      %
         RETURN
*
*
         PAGE
*
* S05RANGE -- GET RANGE OF KEYS GIVEN OFFSETS OR KEYS
*
* ENTRY PARAMETERS:
*        D1 = LINE NUMBER OR OFFSET 1
*        D2 = LINE NUMBER OR OFFSET 2
*
* EXIT PARAMETERS:
*        AC1 = RN1
*        AC2 = RN2
*
S05RANGE EQU      %
         SAVRTN
         STW,D1   RN1               SAVE LINE 1
         STW,D2   RN2               SAVE LINE 2
*
         LW,AC1   RN1               GET FIRST KEY IN RANGE
         BAL,SRTN S05GETLN          GET ACTUAL KEY
         CI,AC2   0                 TEST FOR ZERO
         BNE      STRN1                KEY FOUND, GO STORE
         BAL,SRTN S27RTXT              NOT FOUND, READ NEXT
*
STRN1    EQU      %
         STW,AC2  RN1               SAVE FIRST KEY
         LW,AC1   RN2               NOW GET LAST KEY
         BNEZ     TSTRN2            GO TEST IF NON-ZERO
*
LNSEQUAL EQU      %
         LW,AC1   RN1               LINES EQUAL, GET RN1
         STW,AC1  RN2               STORE IN RN2
         B        RTNRANGE          RETURN
*
*
         PAGE
*
*
LNSZERO  EQU      %
         LI,AC1   0                 SET RETURN TO ZERO
         LI,AC2   0
         B        RTNRN             RETURN
*
TSTRN2   EQU      %
         BAL,SRTN S05GETLN          GET ACTUAL KEY
         CI,AC2   0                 TEST FOR KEY FOUND
         BNE      STRN2                FOUND , GO STORE
         LI,AC2   -1                SET FOR READ PREVIOUS
         BAL,SRTN S27RTXT           GO READ
*
STRN2    EQU      %
         CW,AC2   RN1               TEST FOR RN2 < RN1
         BL       LNSZERO              YES, SET TO ZERO
         STW,AC2  RN2                  NO, STORE RN2
*
*
RTNRANGE EQU      %
         LCI      2
         LM,AC1   RN1               GET LINE NUMBERS
*
RTNRN    EQU      %
         RETURN
*
*
         PAGE
*
* C05E -- ERASE A LINE OR RANGE OF LINES
*
*
C05E     EQU      %
         SAVRTN
         BAL,SRTN S02BCHK           IF BATCH MODE EXIT
         BAL,SRTN S04FCHK           FILE OUTPUT MODE CHECK
*
         BRKCTRL  CNCLERS           SET BREAK ADDR
         GET,D1   #RN1              GET FIRST LINE IN RANGE
         JNEZ,D2  #RN2,GETERNGE     GET RN2
         LW,AC1   D1                NO RANGE, GET LN
         BAL,SRTN S05GETLN          GET KEY
         STW,AC2  RN1               SAVE KEY
         STW,AC2  RN2
         B        TSTLNERR          GO TEST FOR ERROR
*
GETERNGE EQU      %
         BAL,SRTN S05RANGE          GET RANGE OF KEYS
TSTLNERR EQU      %
         LW,AC2   RN1               GET KEY OF FIRST LINE IN RANGE
         BEZ      ERMVERR               ZERO, LINE NUMBER ERROR
*
         LI,BUF2  BA(STDINBUF)+SZERMSG-1     ADDR FOR FIRST PART OF LINE
         LI,AC1   21                READ A MAXIMUM OF 21 CHARS IN LINE
         BAL,SRTN S27RTXT           READ INTO BUFFER
         AI,AC1   SZERMSG-2         CALCULATE SIZE INCLUDING ERASE MSG
         STW,AC1  TXTLNSZ           SAVE SIZE
*
         MOVE,X1  BA(ERASEMSG),BA(STDINBUF),SZERMSG    MOVE TO BUFFER
         PAGE
*
*
         LW,AC2   RN2               GET LAST KEY IN RANGE
         CW,AC2   RN1               TEST FOR RN2=RN1
         BLE      GETRSP               YES, GET 'Y' - CR
         LI,BUF2  BA(STDINBUF)+SZTHMSG-1
         AW,BUF2  TXTLNSZ           ADDR FOR FIRST PART OF LAST LINE
         LI,AC1   21                MAXIMUM OF 21 CHARS FOR MESSAGE
         BAL,SRTN S27RTXT           READ LINE
*
         AI,AC1   SZTHMSG-2         CALCULATE NEW SIZE FOR MESSAGE
         AWM,AC1  TXTLNSZ           ADD TO OLD SIZE
         AI,BUF2  1-SZTHMSG         CALC ADDR FOR 'THRU' MESSAGE
         MOVE,X1  BA(THRUMSG),*BUF2,SZTHMSG  MOVE TO BUFFER
*
*
         PAGE
*
*
GETRSP   EQU      %
         LI,BUF3  BA(STDINBUF)      ADDR OF ERASE MESSAGE
         LW,AC1   TXTLNSZ           SIZE OF MESSAGE
         BAL,SRTN S05TABBR          TEST FOR TABS
         BAL,SRTN S05BLQM           ADD BLANKS AND QM
         BAL,SRTN S27WTERM          WRITE MESSAGE
*
         BAL,SRTN S05RDYCR          GET 'Y-CR' RESPONSE
         CI,SR3   0                 TEST FOR 'YES' RESPONSE
         BE       CNCLERS               NO, CANCEL ACTION
*
         BRKCTRL  0                 INITIALIZE BREAK COUNT
         LW,AC2   RN1               GET KEY FOR FIRST LINE TO ERASE
GETNERS  EQU      %
         LI,AC1   0                 SET READ SIZE TO ZERO
         BAL,SRTN S27RTXT           GET NEXT KEY VALUE
         CI,AC2   0                 TEST FOR NO KEY FOUND (EOF)
         BE       ENDMSG                YES, END-OF-ERASE
         STW,AC2  RN1               SAVE CURRENT KEY
*
         BAL,SRTN S05UDLN           DELETE TEXT&HEADER RECORDS
         MTW,0    BRKFLAG           TEST BREAK FLAG
         BNEZ     ERASEBRK             SET, STOP ERASE
         LI,AC2   0                 SET UP FOR READ NEXT LINE
         LW,AC1   RN1               GET LAST DELETE KEY
         CW,AC1   RN2               COMPARE TO END OF RANGE
         BL       GETNERS               LESS, CONTINUE DELETE
*
         PAGE
*
*
ENDMSG   EQU      %
         BAL,SRTN S05NLMSG          GO PRINT NEXT AVAILABLE KEY
*                                    ...AND SET #LKEY AND #FKEY
RTNERASE EQU      %                 RETURN
         B        ZRORTNST          RE-INITIALIZE RETURN STACK
*
*
ERMVERR  EQU      %
         LI,AC1   11                'ILLEGAL LINE NUMBER' MESSAGE
         BAL,SRTN S29STD            PRINT MESSAGE
*
CNCLERS  EQU      %
         BRKCTRL  0                 RESET BREAK CONTROL
         LI,AC1   6                 'ACTION CANCELLED' MESSAGE
         BAL,SRTN S29STD            PRINT MESSAGE
         B        ZRORTNST          RETURN
*
         PAGE
*
* C05MOVE -- MOVE COMMAND
*
*
C05MOVE  EQU      %
         SAVRTN
         BAL,SRTN S02BCHK           IF BATCH MODE EXIT
         BAL,SRTN S04FCHK           FILE OUTPUT MODE CHECK
*
         BRKCTRL  CNCLERS           SET BREAK ADDR
         GET,D1   #FLAGS,:K(1)      GET 'KEEP' FLAG
         STW,D1   KEEPFLG           SAVE 'KEEP' FLAG
         GET,AC1  #LN               GET LINE TO MOVE AFTER
         CW,AC1   L(#ZROKEY)        TEST FOR KEY
         BGE      TSTMVKEY              YES, NOW CHECK FOR VALID KEY
         BAL,SRTN S05GETLN          GET ACTUAL KEY
*
         CI,AC2   0                 TEST FOR KEY FOUND
         BE       ERMVERR              NO, MOVE ERROR
         STW,AC2  MVKEY             SAVE KEY
         B        GMVGAP            NOW CALCULATE GAP
*
TSTMVKEY EQU      %
         STW,AC1  MVKEY             SAVE KEY
         BAL,SRTN S05GETLN          GO TEST FOR VALID KEY
         CI,AC2   0                 CHECK FOR KEY
         BNE      GMVGAP                OK, GO CALCULATE GAP
*
         LI,AC2   -1                SET UP FOR READ PREVIOUS
         BAL,SRTN S27RTXT           TEST FOR RECORD
*
*
         PAGE
*
GMVGAP   EQU      %
         STW,AC2  MVLNKEY           SAVE KEY OF ACTUAL LINE (FOR MSG)
         LI,AC1   0                 SET READ SIZE TO ZERO
         LI,AC2   0                 SET KEY FOR READ NEXT
         STW,AC2  MVGAP             INITIALIZE THE RECORD GAP
         STW,AC2  MVTYPE            INITIALIZE MOVE TYPE
         BAL,SRTN S27RTXT           GO READ NEXT KEY
         CI,AC2   0                 TEST FOR EOF
         BNE      CALCGAP               NO, GO CALCULATE GAP
*
         LI,AC2   #KEYINCR          MOVE AFTER END, INCREMENT = 1.0
         STW,AC2  MVINCR            SAVE INCREMENT
         B        CNTMVLNS          GO COUNT NUMBER OF LINES TO MOVE
*
CALCGAP  EQU      %
         SW,AC2   MVKEY             CALCULATE GAP FOR MOVE
         STW,AC2  MVGAP             SAVE GAP
CNTMVLNS EQU      %                 NOW CALCULATE NUMBER OF MOVE LINES
         JEZ,AC1  #RN1,LSTLNMV      GET FIRST MOVE LINE
         CW,AC1   L(#ZROKEY)        TEST FOR KEY OR OFFSET
         BG       TSTFKEY               KEY, GO TEST
         STH,AC1  RN1               SAVE OFFSET VALUE
         GET,AC1  #LKEY             GET LAST KEY FOR MOVE OFFSET
         SLD,AC1  -32               SHIFT FOR ZERO READ
         BAL,SRTN S27RTXT           POSITION FILE AT LAST KEY
*
         LH,AC2   RN1               GET OFFSET VALUE
         BGZ      ERMVERR           >0, ERROR
         AI,AC2   -1                SET FOR READ PREVIOUS
         BAL,SRTN S27RTXT           GO FIND KEY
         CI,AC2   0                 TEST FOR KEY FOUND
         BE       ERMVERR              NOT FOUND, ERROR
         B        STFKEY               FOUND, STORE FIRST KEY
*
         PAGE
*
*
TSTFKEY  EQU      %
         SLD,AC1  -32               SET UP FOR READ KEY WITH SIZE ZERO
         BAL,SRTN S27RTXT           GO TEST KEY
         CI,AC2   0                 TEST FOR KEY FOUND
         BNE      STFKEY                YES, STORE KEY
*
         BAL,SRTN S27RTXT           KEY NOT FOUND, READ NEXT SEO. KEY
         CI,AC2   0                 TEST FOR EOF
         BE       ERMVERR               YES, ERROR
*
STFKEY   EQU      %
         STW,AC2  RN1               STORE KEY OF FIRST LINE TO MOVE
         STW,AC2  RN2               INITIALIZE RN2
         JEZ,AC1  #RN2,MVTOEND      TEST FOR RN2 IN COMMAND
*
         CW,AC1   L(#ZROKEY)        TEST FOR KEY
         BG       TSTLKEY              YES, GO CHECK
         STH,AC1  RN2                  NO, SAVE OFFSET VALUE
         GET,AC1  #LKEY             GET LAST KEY FOR OFFSET
         SLD,AC1  -32               SHIFT FOR ZERO READ
         BAL,SRTN S27RTXT           GO POSITION FILE
*
         LH,AC2   RN2               NOW GET OFFSET VALUE
         BGZ      ERMVERR           >0, ERROR
         AI,AC2   -1                SET FOR READ PREVIOUS
         BAL,SRTN S27RTXT           GO GET ACTUAL KEY
         CI,AC2   0                 TEST FOR FOUND
         BE       ERMVERR              NO, ERROR
*
*
         PAGE
*
*
STLKEY   EQU      %
         STW,AC2  RN2               STORE LAST KEY
         B        TSTMVRN           GO TEST MOVE LINES
*
TSTLKEY  EQU      %
         SLD,AC1  -32               SHIFT FOR READ ZERO
         BAL,SRTN S27RTXT           GO READ KEY
         CI,AC2   0                 TEST FOR  KEY FOUND
         BNE      STLKEY               YES, GO STORE
*
         LI,AC2   -1                SET FOR READ LAST
         BAL,SRTN S27RTXT           GO READ
         B        STLKEY            NOW STORE KEY
*
LSTLNMV  EQU      %                 MOVE LAST LINE ONLY
         MTW,-1   MVTYPE            SET MOVE TYPE
         GET,D1   #LKEY             GET VALUE OF LAST KEY
         STW,D1   RN1               SET RN1
         STW,D1   RN2               SET RN2
         B        TSTMVRN           NOW TEST MOVE KEYS
*
MVTOEND  EQU      %                 MOVE THRU END
         GET,D1   #LKEY             GET LAST KEY
         CW,D1    RN1               TEST FOR EQUAL
         BE       TSTMVRN              YES, ONE LINE ONLY
         MTW,1    MVTYPE            SET MOVE TYPE
         STW,D1   RN2               SET RN2
*
*
         PAGE
*
*
TSTMVRN  EQU      %
         LW,AC1   RN1               GET FIRST KEY
         CW,AC1   RN2               COMPARE TO LAST KEY
         BG       ERMVERR              LARGER, ERROR
         CW,AC1   MVKEY             COMPARE TO MOVE AFTER KEY
         BG       CNTLNS               LARGER, KEYS OK
*
         LW,AC1   RN2               GET LAST KEY
         CW,AC1   MVKEY             COMPARE TO MOVE AFTER KEY
         BG       ERMVERR              LARGER, ERROR
*
CNTLNS   EQU      %
         LI,AC1   0
         STW,AC1  NLINES            INITIALIZE NUMBER OF LINES TO MOVE
         LW,AC2   RN1               GET KEY FOR FIRST LINE
*
CNTLNSLP EQU      %
         MTW,1    NLINES            INCREMENT LINE COUNT
         BAL,SRTN S27RTXT           READ NEXT LINE TO MOVE
         CW,AC2   RN2               TEST FOR LAST KEY
         BGE      CALCINCR              YES, CALCULATE INCREMENT
         LI,AC2   0                 SET KEY FOR READ NEXT LINE
         B        CNTLNSLP          CONTINUE READ
*
*
         PAGE
*
*
CALCINCR EQU      %
         LW,AC2   MVGAP             GET GAP FOR MOVE
         BEZ      PRMVMSG               ZERO, GO PRINT MESSAGE
         DW,AC2   NLINES            DIVIDE GAP BY NUMBER OF LINES
         LI,X1    SZINCTBL          NOW SEARCH INCREMENT TABLE
*
INCRLP   EQU      %
         CH,AC2   INCTBL,X1         COMPARE REAL INCREMENT TO TABLE
         BG       INCRFND               LARGER, INCREMENT FOUND
         BDR,X1   INCRLP            TEST NEXT INCREMENT
         B        MAXLNSER          TOO MANY LINES FOR GAP, ERROR
*
INCRFND  EQU      %
         LH,AC2   INCTBL,X1         GET LINE INCREMENT
         STW,AC2  MVINCR            SAVE
*
*
         PAGE
*
*
PRMVMSG  EQU      %
         LI,BUF2  BA(STDINBUF)+SZAFMSG-1  GET ADDR FOR READ
         LW,AC2   MVLNKEY           GET MOVE-AFTER KEY
         BEZ      AFLNZRO              ZERO, AFTER LINE 0
         LI,AC1   21                READ 21 CHARS MAX
         BAL,SRTN S27RTXT           READ TEXT LINE
         B        STAFMSG           NOW STORE AFTER MSG
*
AFLNZRO  EQU      %
         MOVE,X1  BA(LNZROMSG),*BUF2,SZLNZRO  LINE 0.0 MSG
         LI,AC1   SZLNZRO           GET SIZE OF MESSAGE
*
STAFMSG  EQU      %
         AI,AC1   SZAFMSG-2         ADD SIZE OF AFTER MSG
         STW,AC1  TXTLNSZ           SAVE SIZE
         MOVE,X1  BA(AFMSG),BA(STDINBUF),SZAFMSG  MOVE MSG
*
*
         PAGE
*
STMVMSG  EQU      %
         LI,BUF2  BA(STDINBUF)+SZMVMSG-1  ADDR FOR READ
         AW,BUF2  TXTLNSZ           ADD PREVIOUS SIZE
         LI,AC1   21                21 CHARS MAX
         LW,AC2   RN1               KEY FOR READ
         BAL,SRTN S27RTXT           READ LINE
         AI,AC1   SZMVMSG-2         ADD SIZE OF MSG
         AWM,AC1  TXTLNSZ           ADD TO EXISTING LINE
         AI,BUF2  1-SZMVMSG         CALC ADDR FOR 'MOVE'
         MOVE,X1  BA(MVMSG),*BUF2,SZMVMSG  MOVE MSG TO LINE
         MTW,0    MVTYPE            TEST MOVE TYPE
         BLZ      INSBLNKS             ONE LINE, DONE
         BGZ      THRUEND              THRU END
         LW,AC2   RN2               GET LAST KEY OF MOVE
         CW,AC2   RN1               TEST FOR ONE LINE ONLY
         BE       INSBLNKS             YES, DONE
         LI,BUF2  BA(STDINBUF)+SZTHMSG-1  ADDR FOR READ
         AW,BUF2  TXTLNSZ           ADD EXISTING SIZE
         LI,AC1   21                21 CHARS MAX
         BAL,SRTN S27RTXT           READ LINE
*
         AI,AC1   SZTHMSG-2         ADD SIZE OF MSG
         AWM,AC1  TXTLNSZ           ADD TO EXISTING SIZE
         AI,BUF2  1-SZTHMSG         ADDR FOR MSG
         MOVE,X1  BA(THRUMSG),*BUF2,SZTHMSG  MOVE MSG
         B        INSBLNKS          DONE
         PAGE
*
*
THRUEND  EQU      %
         LI,BUF2  BA(STDINBUF)      GET ADDR OF BUFFER
         AW,BUF2  TXTLNSZ           ADD CURRENT SIZE
         MOVE,X1  BA(THENDMSG),*BUF2,SZENDMSG MOVE MSG
         LI,AC1   SZENDMSG          GET SIZE OF MSG
         AWM,AC1  TXTLNSZ           ADD TO EXISTING SIZE
*
*
INSBLNKS EQU      %
         LI,BUF3  BA(STDINBUF)      GET ADDR FOR WRITE
         LW,AC1   TXTLNSZ           SIZE FOR WRITE
         BAL,SRTN S05TABBR          TEST FOR TABS
         BAL,SRTN S05BLQM           ADD BLANKS AND QM
         BAL,SRTN S27WTERM          GO PRINT MESSAGE
         BAL,SRTN S05RDYCR          GET 'Y' -CR RESPONSE
         CI,SR3   0                 TEST FOR NO RESPONSE
         BE       CNCLERS               NO, CANCEL ACTION
*
*
         PAGE
*
* NOW MOVE TEXT FILE LINES
*
         BRKCTRL  0                 INITIALIZE BREAK COUNT
         LW,AC2   RN1               KEY FOR FIRST LINE TO MOVE
MVLNLP   EQU      %
         LI,BUF2  BA(STDINBUF)      GET ADDR OF BUFFER
         LI,AC1   #STDBUFSZ         MAX SIZE OF BUFFER
         BAL,SRTN S27RTXT           READ TEXT FILE LINE
*
         STW,AC1  TXTLNSZ           SAVE READ SIZE
         STW,AC2  RN1               SAVE KEY
         MTW,0    KEEPFLG           TEST 'KEEP' FLAG
         BNEZ     GLSTMKEY             SET, SKIP OVER DELETE
         BAL,SRTN S27DRTXT          DELETE TEXT FILE LINE
*
GLSTMKEY EQU      %
         LW,AC2   MVKEY             GET LAST MOVE KEY
         AW,AC2   MVINCR            ADD MOVE INCREMENT
         STW,AC2  MVKEY             SAVE NEW KEY
         LI,BUF3  BA(STDINBUF)      ADDR OF LINE
         LW,AC1   TXTLNSZ           SIZE OF LINE
         BAL,SRTN S27WTXT           WRITE NEW LINE
*
*
         PAGE
*
*
         LW,AC1   RN1               GET OLD KEY
         LW,AC2   MVKEY             GET NEW KEY
         BAL,SRTN S07CHHDR          GO MOVE HEADER RECORD
         MTW,0    BRKFLAG           TEST BREAK FLAG
         BNEZ     MOVEBRK              SET, END-OF-MOVE
*
         LI,AC1   0                 SET SIZE TO ZERO
         LW,AC2   RN1               GET OLD KEY
         CW,AC2   RN2               TEST FOR LAST LINE
         BGE      RTNMOVE              YES, RETURN
         BAL,SRTN S27RTXT           POSITION FILE AT OLD KEY
         LI,AC2   0                 SET KEY FOR READ SEQUENTIAL
         B        MVLNLP            GO READ NEXT LINE
*
RTNMOVE  EQU      %
         BAL,SRTN S05NLMSG          SET FIRST AND LAST KEYS
         B        ZRORTNST          RE-INITIALIZE RETURN STACK
*
MAXLNSER EQU      %
         LI,AC1   28                'TOO MANY LINES TO MOVE' MESSAGE
         BAL,SRTN S29STD            PRINT MESSAGE
         B        CNCLERS           NOW CANCEL MOVE ACTION
*
*
         PAGE
*
*
MOVEBRK  EQU      %
         LI,X1    BA(MVDMSG)        GET ADDR OF 'MOVED' MSG
         B        STLSTMSG          GOT SET-UP MESSAGE
ERASEBRK EQU      %
         LI,X1    BA(ERSDMSG)       GET ADDR OF 'ERASED' MSG
STLSTMSG EQU      %
         LI,X2    INSEMMSG          GET ADDR FOR INSERT
         LI,AC1   SZEMMSG           GET SIZE
         STB,AC1  X2                COUNT FOR MBS
         MBS,X1   0                 SET-UP MSG
*
         LW,AC2   RN1               GET LAST LINE
         BAL,SRTN S35LINE           CONVERT TO EBCDIC
         LCI      2                 SAVE LINE
         STM,AC1  RN1
         MOVE,X1  BA(RN1),INSLSTEM,8  MOVE TO MSG
         LI,BUF1  BA(LSTEMMSG)+1    GET ADDR OF MSG
         LB,AC1   LSTEMMSG          GET SIZE
         BAL,SRTN S27PRINT          PRINT MSG
         BAL,SRTN S05NLMSG          PRINT NEXT-LINE MSG
         B        ZRORTNST          RE-INITIALIZE RETURN STACK
*
*
MVDMSG   TEXT     'MOVED '
ERSDMSG  TEXT     'ERASED'
SZEMMSG  EQU      6
*
*
         PAGE
*
* S05RDYCR -- READ 'Y' CR RESPONSE FOR ERASE AND MOVE COMMANDS
*
* EXIT PARAMETER:
*        SR3 = 0  IF RESPONSE IS DIFFERENT THAN 'Y' CR
*            = 1  IF RESPONSE IS 'Y' CR
*
S05RDYCR EQU      %
         SAVRTN
*
         LI,BUF1  BA(MSGBUF)        GET BUFFER ADDR
         BAL,SRTN S27RTNL
         LI,SR3   0                 INITIALIZE EXIT PARAM
*
         LB,AC3   MSGBUF            GET FIRST CHAR
         CI,AC3   LC('Y')           TEST FOR L.C. 'Y'
         BE       TSTCR                YES, TEST FOR CR
         CI,AC3   'Y'                  NO, TEST FOR U.C. 'Y'
         BNE      RTNRDYCR          RETURN WITH 'NOT FOUND'
*
TSTCR    EQU      %
         LI,X4    1                 SET INDEX FOR NEXT CHAR
         LB,AC3   MSGBUF,X4         GET 2ND CHAR
         CI,AC3   #CR               TEST FOR CR
         BNE      RTNRDYCR          NOT EQUAL, RETURN
         LI,SR3   1                     EQUAL, SET EXIT PARAM
*
RTNRDYCR EQU      %                 RETURN
         RETURN
*
*
         PAGE
*
* S05NLMSG -- SET NEN FIRST AND LAST LINE AND PRINT NEXT LINE NUMBER
*
S05NLMSG EQU      %
         SAVRTN
*
         BAL,SRTN S27TXTFL          GET FIRST LINE IN TEXT FILE
         CI,AC2   0                 TEST FOR NO LINES
         BE       SETFSTLN             NO LINES, SET FIRST
         STW,AC2  RN1               SAVE FIRST KEY
         BAL,SRTN S27TXTLL          GET LAST KEY IN TEXT FILE
         LW,D1    RN1               GET NEW FIRST KEY
         LW,D2    AC2               GET NEW LAST KEY
         B        STFLKEY           GO STORE 1ST & LAST KEYS
SETFSTLN EQU      %
         LW,D1    L(#FSTKEY)        GET DEFAULT 1ST KEY
         LW,D2    L(#ZROKEY)        GET DEFAULT LAST KEY
*
STFLKEY  EQU      %
         PUT,D1   #FKEY             STORE NEW FIRST KEY
         PUT,D2   #LKEY             STORE NEW LAST KEY
         BAL,SRTN C05N              PRINT NEXT LINE NUMBER
*
         GET,AC1  #CLP              NOW TEST CLP
         SLD,AC1  -32               SET FOR 0 SIZE READ
         BAL,SRTN S27RTXT           READ TEXT FILE LINE
         CI,AC2   0                 TEST FOR DELETED
         BNE      RTNNL                OK, RETURN
         GET,D1   #LKEY                NOT THERE, SET CLP AT END
         PUT,D1   #CLP              STORE NEW CLP
*
RTNNL    EQU      %
         RETURN
         PAGE
*
* C05N -- PRINT NEXT LINE NUMBER
*
C05N     EQU      %
         SAVRTN
         BAL,SRTN S04FCHK           FILE OUTPUT MODE CHECK
*
         GET,AC1  #LKEYVAL          NOW GET VALUE OF KEY
         SLD,AC1  -32               SET UP FOR DIVIDE
         DW,AC1   L(#KEYINCR)       DIVIDE BY WHOLE LINE INCR
         MI,AC2   #KEYINCR
         AI,AC2   #KEYINCR          ADD ONE LINE
         CW,AC2   L(#MAXKEY-#ZROKEY)  CHECK FOR MAXIMUM LINE NUMBER
         BG       MAXLN             MAX REACHED
         BAL,SRTN S35LINE           NOW GET EBCDIC FOR PRINTOUT
*
         LCI      2                 SAVE EBCDIC OF KEY
         STM,AC1  RN1
         MOVE,X1  BA(RN1),INSLNUM,8 MOVE KEY TO MESSAGE
         LI,BUF1  BA(NLNMSG)+1      GET ADDR OF MESSAGE
         LB,AC1   NLNMSG            SIZE OF MESSAGE IN FIRST BYTE
         BAL,SRTN S27PRINT          NOW PRINT MESSAGE
         B        RTNNLMSG
MAXLN    RES      0
         LI,AC1   79                SET UP 'MAX LINE NUM' MSG
         BAL,SRTN S29STD            GO PRINT MESSAGE
*
RTNNLMSG EQU      %                 RETURN
         RETURN
*
*
         PAGE
*
* S05TABBR -- REPLACE TABS WITH BLANKS FOR MESSAGES
*
* ENTRY PARAMETERS: BUF3=ADDR OF MESSAGE
*                   AC1 =SIZE OF MESSAGE
*
S05TABBR EQU      %
         SAVRTN
*
         LW,X4    BUF3              GET MESSAGE START ADDR
         LW,D1    AC1               GET SIZE OF MESSAGE
         LI,AC2   #TAB              TAB CHAR FOR COMPARE
         LI,AC3   #BLANK            BLANK FOR REPLACE
*
TSTRTAB  EQU      %
         CB,AC2   0,X4              TEST FOR TAB
         BNE      DECRTST              NO, DECR. PTR
         STB,AC3  0,X4                 YES, REPLACE WITH BLANK
*
DECRTST  EQU      %
         AI,X4    1                 INCR. POINTER
         BDR,D1   TSTRTAB           DECR. SIZE AND TEST
         RETURN
*
*
         PAGE
*
* S05BLQM -- ADD BLANKS AND QM AT END OF MESSAGES
*
* ENTRY PARAMETERS: BUF3=ADDR OF MESSAGE
*                   AC1 =SIZE OF MESSAGE
*
S05BLQM  EQU      %
         SAVRTN
*
         LW,X4    BUF3              GET MESSAGE START ADDR
         AW,X4    AC1               ADD SIZE SO FAR
         INSCHAR  #BLANK,*X4,3      ADD BLANKS AT END
         LI,AC2   #QM               NOW ADD QUESTION MARK
         STB,AC2  0,BUF1
         AI,AC1   4                 UPDATE SIZE
         RETURN
*
*
         PAGE
*
* MESSAGES AND INCREMENT TABLE
*
*
ERASEMSG TEXT     'ERASE-- '        ERASE MESSAGE
SZERMSG  EQU      8                 NUMBER OF CHARS IN MESSAGE
*
THRUMSG  TEXT     '  --THRU-- '     THRU MESSAGE
SZTHMSG  EQU      11                NUMBER OF CHARS IN MESSAGE
*
*
MVMSG    TEXT     '   --MOVE-- '
SZMVMSG  EQU      12
*
AFMSG    TEXT     'AFTER-- '
SZAFMSG  EQU      8
*
*
LNZROMSG TEXT     '  (LINE 0.0) '
SZLNZRO  EQU      13
*
*
         PAGE
*
*
THENDMSG TEXT     '  --THRU END OF DOCUMENT'
SZENDMSG EQU      24
*
*
*
*
INCTBL   DATA,2   1,1,2,5,10,20,50,100,200,500,1000
SZINCTBL EQU      HA(%)-HA(INCTBL)-1
         BOUND    4
*
*
         PAGE
*
*
PHRASERR EQU      %
         LI,AC1   14
         BAL,SRTN S29STD
*
ERRTN    EQU      %
         LI,AC1   6
         BAL,SRTN S29STD
*
EDITRTN  EQU      %
         BAL,SRTN S05NLMSG          PRINT NEXT-LINE MESSAGE
         RETURN
*
LNERR    EQU      %
         LI,AC1   11
         BAL,SRTN S29STD
         B        ERRTN
*
*
         PAGE
*
* LOCAL VARIABLES
*
5D       CSECT    0                 START OF LOCALS
XREGS    EQU      %                 SAVE X-REGISTERS
FCHAR    RES      1                     ADDR OF FIRST CHAR
PHRASE   RES      1                     COUNT/ADDR OF PHRASE
*
NLINE    RES      1                 NUMBER OF CHARS IN LINE
NCHARS   RES      1                 NUMBER OF CHARS IN PHRASE
LSTCHAR  RES      1                 ADDR OF LAST CHAR
SAVLN    RES      1                 SAVE OFFSET TO FIND KEY
*
TXTLNSZ  RES      1                 SIZE OF TEXT LINE
*
RN1      RES      1                 FIRST LINE IN RANGE
RN2      RES      1                 LAST LINE IN RANGE
*
MVKEY    RES      1                 MOVE LINES KEY
MVLNKEY  RES      1
MVGAP    RES      1                 GAP BETWEEN MOVE LINES
MVINCR   RES      1                 INCREMENT FOR MOVE LINES
NLINES   RES      1                 NUMBER OF MOVE LINES
MVTYPE   RES      1                 MOVE TYPE
*
KEEPFLG  RES      1                 'KEEP' FLAG FOR MOVE'S
SVKEY    RES      1                 SAVE KEY
INSINC   RES      1                 INSERT INCREMENT
INCEND   RES      1                 END OF INSERT INCREMENT RANGE
*
         PAGE
*
*
NLNMSG   MESSAGE  'NEXT LINE NUMBER ',(INSLNUM,8),#CR
DELMSG   MESSAGE  'LINE ',(INSDELLN,8),' DELETED'
LSTEMMSG MESSAGE  #CR,'LAST LINE ',(INSEMMSG,SZEMMSG),;
                      ':',(INSLSTEM,8)
REPMSG   TEXT     'REPLACE--   '
         RES      5
REPMSGSZ EQU      10
REPCHAR  EQU      BA(REPMSG)+9
*
*
LNPRMSG  RES      2
         DATA,2   X'7A0D'
LNPRSZ   EQU      BA(%)-BA(LNPRMSG)
         BOUND    4
*
*
         USECT    #PLOC
         END
