* 12/19/75 -- 13:00
* MODULE NAME: DISPLAY
* NUMBER: 11
* PURPOSE: PROVIDE DISPLAY TERMINAL EDITING SERVICES
* ENTRY POINTS:
*
         DEF      C11CRT            ASSOCIATE CRT PROFILE TABLE
         DEF      C11DISP           CRT EDIT FACILITY
         DEF      C11TERM           TERMINAL DEFINITION COMMAND
*
         DEF      DISPERR           DISPLAY ERROR FLAG
         DEF      DISPFLG           DISPLAY MODE FLAG
         DEF      3010FLG           3010 TERMINAL FLAG
         DEF      3010FWD           3010 FORWARD ONLY PRINT FLAG
         DEF      1200FLG           1200 OUTPUT FLAG
*
         REF      BUFSZ             BUFFER SIZE FOR SOME I/O
         REF      INCTBL            INCREMENT TABLE FOR MOVE
         REF      M:UC              M:UC DCB
         REF      STDWKBUF          STANDARD WORK BUFFER
         REF      SZINCTBL          SIZE OF INCREMENT TABLE
         REF      S01SCAN           SCAN LINE FOR COMMANDS
         REF      S01TXTLN          WRITE LINE TO TEXT FILES
         REF      S05DLINE          DELETE TXT AND HDR RECORD
         REF      S05NLMSG          SET NEW 1ST AND LAST LINES
         REF      S05RANGE          GET RANGE OF LINES
         REF      S05RDYCR          READ 'Y' CR RESPONSE
         REF      S27PRINT          WRITE CHARS TO TERMINAL
         REF      S27READ           READ FROM TERMINAL-NO EDITING
         REF      S27RTNL           READ LINE FROM TERMINAL
         REF      S27RTXT           READ LINE FROM TXT FILE
         REF      S27WTERM          WRITE LINE TO TERMINAL
         REF      S29STD            WRITE STANDARD MESSAGE
         REF      S35CNVRT          CONVERT BINARY TO EBCDIC
         REF      S36CKTYP          CHECK FOR TYPE AHEAD
         REF      S36ECON           TURN ECHOPLEX ON
         REF      S36ECOFF          TURN ECHOPLEX OFF
         REF      S36INPUT          READ THRU SPECIFIED DCB
         REF      S36M:FP           FREE DYNAMIC PAGE
         REF      S36M:GP           GET DYNAMIC PAGE
         REF      S36M:WAIT         WAIT A SPECIFIED TIME
         REF      S36STRNS          SET TRANSPARENT MODE
         REF      S36RTRNS          RESET TRANSPARENT MODE
*
         SYSTEM   TEXTDEF
         SYSTEM   ITEMDEF
         INVCMDSTA
         INVWSSTA
         INVHDRSTA
*
         INVDCBTBL
         PAGE
*
*
*
         DEF      11P,11D
*
11P      EQU      %
         DATA     X'11'             MODULE NUMBER
         DATA     X'121975'         DATE
         DATA     X'1300'           TIME
*
*
         TITLE    '** DISPLAY(11) **'
*
*
* C05DISP -- CRT EDIT FACILITY
*
C11DISP  RES      0
         SAVRTN
         MTW,1    DISPFLG           SET DISPLAY MODE FLAG
         LI,AC1   0                 INITIALIZE TO 0
         STW,AC1  DSPGCNT             DYNAMIC STORAGE PAGE COUNT
         STW,AC1  CRTRN2              LAST CRT LINE KEY
         STW,AC1  ENDRNG              END OF RANGE FLAG
         STW,AC1  BLINKFLG            BLINKING MODE FLAG
         GET,D1   #FLAGS,:K(1)      GET 'ADD' OPTION FLAG
         STW,D1   ADDFLG            SAVE 'ADD' OPTION FLAG
         BNEZ     DISP40            IF 'ADD' OPTION, DONT CHECK RANGE
         GET,D1   #FKEY             INITIALIZE DISP RANGE TO ALL
         GET,D2   #LKEY
         JEZ,AC1  #RN1,DISP30       WAS BEGIN RANGE SPECIFIED
         LW,D1    AC1               YES, USE AS START OF RANGE
         JEZ,AC1  #RN2,DISP30       WAS END RANGE SPECIFIED
         LW,D2    AC1               YES, USE AS END OF RANGE
DISP30   RES      0
         BAL,SRTN S05RANGE          GET FIRST AND LAST KEY OF RANGE
         STW,AC1  RN1               SAVE RANGE START KEY
         STW,AC2  RN2               SAVE RANGE END KEY
         CI,AC1   0                 DOES FIRST LINE EXIST
         BE       DISP800           NO, ERROR
DISP40   RES      0
         LI,AC1   1                 SET TO GET 1 PAGE
         BAL,SRTN S11GP             GET DYNAMIC PAGE
         CI,SR3   0                 CHECK FOR ERROR
         BNE      DISP810           ERROR
         STW,BUF1 DSADDR            SAVE ADDR OF START
DISP50   RES      0
         MTW,0    ENDRNG            END OF RANGE
         BGZ      DISP750
DISP60   RES      0
         LW,BUF1  DSADDR
         STW,BUF1 KEYTBL            SAVE ADDR OF KEY TABLE
         LI,AC1   0
         STW,AC1  *KEYTBL           INIT NUMBER OF KEYS TO 0
         BAL,SRTN S11CHOME          HOME CURSOR
         BAL,SRTN S11PGCLR          CLEAR THE SCREEN
         LI,X1    3                 SET COUNT TO 3
         BAL,SRTN S11CDN            MOVE CURSOR DOWN
         LI,AC1   0
         STW,AC1  SCRNLN#           INIT SCREEN LINE NUMBER TO 0
         MTW,0    ADDFLG            TEST 'ADD' FLAG
         BNEZ     DISP90            'ADD' SPECIFIED
         LW,AC2   RN1               GET KEY OF FIRST LINE
         STW,AC2  CRTRN1            SAVE 1ST CRT LINE KEY
         BAL,SRTN S11WRCRT          WRITE LINES TO CRT
         LW,X1    *DSADDR           KEY LINE COUNT
         LW,AC1   *DSADDR,X1        GET LAST CRT LINE KEY
         AND,AC1  L(X'7FFFFFFF')    STRIP OFF DELETE BIT
         STW,AC1  CRTRN2            SAVE LAST CRT LINE KEY
         MTW,1    KEYTBL            INCR POINTER
DISP90   RES      0
         LW,AC1   KEYTBL            GET ADDR OF NEXT WORD
         STW,AC1  INFOTBL%          SET UP POINTER TO INFO TABLE
DISP100  RES      0
         LW,AC1   INFOTBL%
         STW,AC1  INFOTBL           SET UP POINTER TO INFO TABLE
         LD,AC1   RTNSTACK          SAVE CURRENT RETURN STACK
         STD,AC1  SVSTACK
         BRKCTRL  DISPBRK           SET BREAK ADDRESS
         LI,AC1   M:UC              GET DCB ADDR
         STW,AC1  DCBADDR           SAVE
         LI,AC1   #RDLNSZ           SET UP READ SIZE
         STW,AC1  BUFSZ             SAVE
         LI,D1    BA(STDINBUF)      GET BUFFER ADDR
         SLD,D1   -2                SET UP WORD ADDR IN D1
         SLS,DX1  -30               SET UP BYTE DISPLACEMENT IN DX1
DISP300  RES      0
         BAL,SRTN S36INPUT          START DUMMY READ
         B        DISP300
*
DISP750  RES      0
         GET,D1   #LKEY             GET LAST WS KEY
         CW,D1    RN1               COMPARE TO START OF NEXT RANGE
         BL       DISP900           NO MORE LINES TO EDIT
         STW,D1   RN2               SAVE AS NEW END OF RANGE
         LW,AC1   CHAR2             GET 2ND 'NEXT ACTION' CHAR
         CI,AC1   1                 IS IT AN 'N'
         BE       DISP60            YES
         LI,AC1   62                SET FOR 'END RANGE' MSG
         BAL,SRTN S11MSG            GO WRITE MESSAGE
         BAL,SRTN S05RDYCR          GET RESPONSE
         CI,SR3   0
         BE       DISP900           RESPONSE = NO
         B        DISP60
DISP800  RES      0
         LI,AC1   63                SET FOR NOTHING TO DISPLAY MSG
         BAL,SRTN S29STD            GO WRITE MESSAGE
         B        DISP890
DISP810  RES      0
         LI,AC1   13                SET FOR NO STORAGE MSG
         BAL,SRTN S29STD            GO WRITE MESSAGE
         B        DISP890
DISP890  RES      0
         LI,AC1   6                 SET FOR ACTION CANCELLED MSG
         BAL,SRTN S29STD            GO WRITE MESSAGE
         B        DISP950
DISP900  RES      0
         BAL,SRTN S11CHOME          HOME CURSOR
         BAL,SRTN S11PGCLR          CLEAR PAGE
         LI,AC1   61                SET FOR 'END DISPLAY MODE' MSG
         BAL,SRTN S11MSG            GO WRITE MESSAGE
DISP950  RES      0
         LW,AC1   DSPGCNT           GET NUMBER OF PAGES TO FREE
         BAL,SRTN S11FP             FREE ALL DYNAMIC PAGES
         LI,AC1   0
         STW,AC1  DISPFLG           RESET DISPLAY MODE FLAG
         RETURN
         PAGE
*
* BREAK PROCESSOR FOR DISPLAY COMMAND
DISPBRK  RES      0
         BRKCTRL  0                 RESET BREAK ADDRESS
         LD,AC1   SVSTACK           RESTORE RETURN STACK
         STD,AC1  RTNSTACK
DSPBRK50 RES      0
         MTW,0    ADDFLG            TEST 'ADD' FLAG
         BNEZ DSPBRK70              'ADD' SPECIFIED
         LI,AC1   58                SET FOR 'NEXT ACTION' MSG
         BAL,SRTN S11MSG            GO WRITE MESSAGE
         BAL,SRTN S11NXTAC          GET NEXT ACTION RESPONSE
         CI,SR3   0                 IS RESPONSE VALID
         BE       DSPBRK50          NO
         STW,X2   CHAR2             SAVE 2ND INPUT CHAR
         B        %,X1
         B        R%RSPN            REPLACE ORIGINAL LINES
         B        A%RSPN            ADD LINES TO END OF DOCUMENT
         B        E%RSPN            FURTHER EDITING REQUIRED
         B        C%RSPN            CLEAR SCREEN
*
* HERE FOR 'ADD' OPTION
DSPBRK70 RES      0
         LI,AC1   65                SET FOR 'ANY MORE' MSG
         BAL,SRTN S11MSG            GO WRITE MESSAGE
         BAL,SRTN S05RDYCR          GET RESPONSE
         LI,AC1   1                 INITIALIZE TO 'MORE' RESPONSE
         CI,SR3   0                 CHECK RESPONSE
         BNE      DSPBRK75          RESPONSE = 'MORE'
         LI,AC1   2                 SET RESPONSE TO 'NO MORE'
DSPBRK75 RES      0
         STW,AC1  CHAR2             SAVE RESPONSE
         B        A%RSPN            GO TO 'ADD' ROUTINE
         PAGE
*
*
* NEXT ACTION = 'R'
*
R%RSPN   RES      0
         BAL,SRTN S11MSGW           WRITE 'WORKING' MESSAGE
         BAL,SRTN S11RDCRT          READ LINES FROM CRT
         CI,SR3   0                 ERROR
         BNE      DISP810           YES
         LW,AC1   CRTRN1            GET 1ST KEY OF DELETE RANGE
         LW,AC2   CRTRN2            GET LAST KEY OF DELETE TRANGE
         BAL,SRTN S11DRNG           DELETE DISPLAYED RANGE
         BAL,SRTN S11GET%I          INIT S11GET ROUTINE
         LI,D1    0
         PUT,D1   #PRNTFLG          SET TO SUPPRESS PRINTOUT
         STW,D1   INSCNT            INIT INSERT COUNT TO 0
         STW,D1   CMDERR            RESET COMMAND ERROR FLAG
         STW,D1   INSERR            RESET INSERT ERROR FLAG
         LW,D1    RNGM1
         STW,D1   SVKEY             INIT LAST WRITE KEY TO RANGE - 1
RRSPN50  RES      0
         LI,AC1   0                 INITIALIZE TO 0
         STW,AC1  DISPERR             DISPLAY ERROR FLAG
         BAL,SRTN S11GET            GET NEXT RECORD
         CI,SR3   0                 FINISHED
         BNE      RRSPN900          YES
         CI,AC3   0                 IS THIS AN INSERT
         BE       RRSPN200          NO
         MTW,0    INSCNT            IS THIS THE FIRST INS OF A SERIES
         BGZ      RRSPN180          NO
         LI,DX1   0
         STB,DX1  INSERR            RESET CURRENT INSERT ERROR FLAG
         STW,AC3  INSCNT            SAVE NUMBER OF INSERTS IN GROUP
         LW,DX1   NEXTKEY           GET NEXT ORIGINAL RECORD WRITE KEY
         SW,DX1   SVKEY             FIND INSERT RANGE
         AI,DX1   -1
         DW,DX1   INSCNT            CALCULATE INSERT INCREMENT
         BGZ      RRSPN90           BRANCH IF ENOUGH ROOM
         MTW,1    INSERR            SET INSERT ERROR FLAG
         MTB,1    INSERR            SET CURRENT INSERT FLAG
RRSPN90  RES      0
         LI,X1    SZINCTBL          GET SIZE OF INCREMENT TABLE
RRSPN100 RES      0
         CH,DX1   INCTBL,X1         FIND CLOSEST INCREMENT IN TABLE
         BG       RRSPN150          OK
         BDR,X1   RRSPN100          CONTINUE
RRSPN150 RES      0
         LH,D1    INCTBL,X1         GET ACTUAL INCREMENT
         STW,D1   INSINCR           SAVE INCREMENT
RRSPN180 RES      0
         MTW,-1   INSCNT            DECREMENT INSERT COUNT
         MTB,0    INSERR            TEST FOR CURRENT INSERT ERROR
         BNEZ     RRSPN50           YES, DO NOT WRITE RECORD
         LW,AC2   SVKEY             GET LAST WRITE KEY
         AW,AC2   INSINCR           ADD INSERT INCREMENT
RRSPN200 RES      0
         STW,AC2  SVKEY             SAVE WRITE KEY
         MOVE,X1  *BUF1,BA(STDINBUF)+1,*AC1  MOVE RECORD TO BUFFER
         LW,D1    AC2               GET WRITE KEY
         PUT,D1   #NXTKEY           SET UP NEXT WRITE KEY
         LI,AC2   1                 SET ATTN COUNT = 1 TO FORCE SCAN
         LI,BUF2  BA(STDINBUF)+1    SET UP BUFFER ADDR
         BAL,SRTN S01SCAN           GO SCAN LINE FOR COMMANDS
         STB,AC2  STDINBUF          STORE ATTN COUNT
         AI,AC1   1                 INCR SIZE FOR ATTN COUNT
         LI,BUF3  BA(STDINBUF)      SET UP BUFFER ADDR
         LW,AC2   SVKEY             GET WRITE KEY
         BAL,SRTN S01TXTLN          GO WRITE TXT AND HDR LINES
         LW,AC1   DISPERR           GET COMMAND ERROR FLAG
         AWM,AC1  CMDERR            ACCUMULATE ERROR COUNT
         B        RRSPN50
RRSPN900 RES      0
         BAL,SRTN S05NLMSG          SET NEW 1ST AND LAST LINES
         MTW,0    CMDERR            ANY COMMAND ERRORS
         BEZ      RRSPN910          NO
         LI,AC1   59                SET FOR 'COMMAND ERROR' MSG
         PUT,AC1  #PRNTFLG          ALLOW PRINTING
         BAL,SRTN S11MSG            GO WRITE MESSAGE
         BAL,SRTN S05RDYCR          READ RESPONSE
         CI,SR3   0
         BNE      DISP100           RESPONSE = YES
RRSPN910 RES      0
         MTW,0    INSERR            ANY INSERT ERRORS
         BEZ      ENDACTN           NO, GO TO END ACTION ROUTINE
         LI,AC1   64                SET FOR 'INSERT ERROR' MSG
         PUT,AC1  #PRNTFLG          ALLOW PRINTING
         BAL,SRTN S11MSG            GO WRITE MESSAGE
         BAL,SRTN S05RDYCR          READ RESPONSE
         CI,SR3   0
         BE       ENDACTN           RESPONSE = NO
         B        DISP100           RESPONSE = YES
         PAGE
*
*
* NEXT ACTION = 'A'
*
A%RSPN   RES      0
         BAL,SRTN S11MSGW           WRITE 'WORKING' MESSAGE
         BAL,SRTN S11RDCRT          READ LINES FROM CRT
         CI,SR3   0                 ERROR
         BNE      DISP810           YES
         BAL,SRTN S11GET%I          INIT S11GET ROUTINE
         LI,D1    0
         PUT,D1   #PRNTFLG          SET TO SUPPRESS PRINTOUT
         STW,D1   DLTRN1            SET 1ST DELETE KEY TO 0
         STW,D1   CMDERR            RESET COMMAND ERROR FLAG
ARSPN50  RES      0
         LI,AC1   0                 INITIALIZE TO 0
         STW,AC1  DISPERR             DISPLAY ERROR FLAG
         BAL,SRTN S11GET            GET NEXT RECORD
         CI,SR3   0                 FINISHED
         BNE      ARSPN900          YES
         MOVE,X1  *BUF1,BA(STDINBUF)+1,*AC1  MOVE RECORD TO BUFFER
         GET,D1   #LKEYVAL          GET LAST KEY VALUE
         SLD,D1   -32               SET FOR DIVIDE
         DW,D1    L(#KEYINCR)       DIVIDE BY WHOLE INCR
         MI,DX1   #KEYINCR          MULT BY INCR
         AI,DX1   #KEYINCR          ADD NEXT INCR
         SLD,D1   32                SET UP FOR STORE
         OR,D1    L(#ZROKEY)        OR IN KEY SIZE
         PUT,D1   #NXTKEY           SET UP NEXT WRITE KEY
         LI,AC2   1                 SET ATTN CNT = 1 TO FORCE SCAN
         LI,BUF2  BA(STDINBUF)+1    SET UP POINTER TO RECORD
         BAL,SRTN S01SCAN           GO SCAN LINE FOR COMMANDS
         STB,AC2  STDINBUF          STORE ATTN COUNT
         AI,AC1   1                 INCR SIZE FOR ATTN COUNT
         LI,BUF3  BA(STDINBUF)      SET UP BUFFER POINTER
         GET,D1   #NXTKEY           GET NEXT WRITE KEY
         PUT,D1   #LKEY             SAVE IN LAST KEY
         PUT,D1   #CLP              PUT IN CLP
         MTW,0    DLTRN1            DID WE SAVE 1ST KEY
         BNEZ     ARSPN80           YES
         STW,D1   DLTRN1            SAVE 1ST KEY IN RANGE
ARSPN80  RES      0
         STW,D1   DLTRN2            SAVE POSSIBLE LAST KEY
         LW,AC2   D1                SET UP WRITE KEY
         BAL,SRTN S01TXTLN          GO WRITE TXT FILE LINE
         LW,AC1   DISPERR           GET COMMAND ERROR FLAG
         AWM,AC1  CMDERR            ACCUMULATE ERROR COUNT
         B        ARSPN50
ARSPN900 RES      0
         MTW,0    CMDERR            ANY COMMAND ERRORS
         BEZ      ENDACTN           NO, GO TO END ACTION ROUTINE
         LI,AC1   59                SET FOR 'COMMAND ERROR' MSG
         PUT,AC1  #PRNTFLG          ALLOW PRINTING
         BAL,SRTN S11MSG            GO WRITE MESSAGE
         BAL,SRTN S05RDYCR          READ RESPONSE
         CI,SR3   0                 CHECK RESPONSE
         BE       ENDACTN           RESPONSE = NO
         LW,AC1   DLTRN1            GET 1ST ADD KEY
         LW,AC2   DLTRN2            GET LAST KEY OF ADD RANGE
         BAL,SRTN S11DRNG           DELETE ADDED RANGE
         LI,D1    0
         PUT,D1   #PRNTFLG          INHIBIT PRINTING
         BAL,SRTN S05NLMSG          SET NEW 1ST AND LAST LINES
         LI,D1    1
         PUT,D1   #PRNTFLG          ALLOW PRINTING
         B        DISP100           GO REEDIT
         PAGE
*
*
* NEXT ACTION = 'E'
*
E%RSPN   RES      0
         B        DISP100
*
*
* NEXT ACTION = 'C'
*
C%RSPN   RES      0
         BAL,SRTN S11CHOME          HOME CURSOR
         BAL,SRTN S11PGCLR          CLEAR THE SCREEN
         B        ENDACTN           GO TO END ACTION ROUTINE
*
*
ENDACTN  RES      0
         LI,D1    1
         PUT,D1   #PRNTFLG          SET TO ALLOW PRINTOUT
         LI,AC1   0                 SET TO CLEAR MESSAGE LINES
         BAL,SRTN S11MSG            GO WRITE MESSAGE
         LW,X1    CHAR2             GET 2ND NEXT ACTION CHAR
         B        %+1,X1
         B        DISP50            2ND CHAR = CR
         B        DISP50            2ND CHAR = N
         B        DISP900           2ND CHAR = S
         PAGE
*
*
* C05CRT -- ASSOCIATE CRT PROFILE TABLE
*
C11CRT   RES      0
         SAVRTN
         RETURN
         PAGE
*
*
* C11TERM -- TERMINAL DEFINITION COMMAND
*
C11TERM  RES      0
         SAVRTN
         LI,X1    4
TERM20   RES      0
         JNEZ,D1  (#FLAGS,X1),TERM50  CHECK FOR TERM FLAGS
         BDR,X1   TERM20
         B        TERM500
TERM50   RES      0
         B        %,X1
         B        T%3010            3010 TERMINAL
         B        T%TTY             TTY TERMINAL
         B        T%2741            2741 TERMINAL
         B        T%1200            1200 OUTPUT
T%3010   RES      0
         MTW,1    3010FLG
         B        TERM500
T%TTY    RES      0
T%2741   RES      0
         LI,AC1   0
         STW,AC1  3010FLG
         STW,AC1  1200FLG
         B        TERM500
T%1200   RES      0                 1200 OUTPUT
         MTW,1    1200FLG           SET 1200 FLAG
TERM500  RES      0
         RETURN
         PAGE
*
*
* S11CHOME -- MOVE CURSOR TO HOME POSITION
*
S11CHOME RES      0
         SAVRTN
         LB,AC1   CRTHOME           GET BYTE COUNT
         LI,BUF1  BA(CRTHOME)+1     GET ADDRESS OF CNTRL CHARS
         BAL,SRTN S27PRINT          WRITE TO CRT
         RETURN
*
*
* S11LNCLR -- CLEAR A LINE ON SCREEN
*
S11LNCLR RES      0
         SAVRTN
         LB,AC1   CRTLNCLR          GET BYTE COUNT
         LI,BUF1  BA(CRTLNCLR)+1    GET ADDRESS OF CNTRL CHARS
         BAL,SRTN S27PRINT          WRITE TO CRT
         RETURN
*
*
* S11PGCLR -- CLEAR ENTIRE PAGE
*
S11PGCLR RES      0
         SAVRTN
         LB,AC1   CRTPGCLR          GET BYTE COUNT
         LI,BUF1  BA(CRTPGCLR)+1    GET ADDR OF CNTRL CHARS
         BAL,SRTN S27PRINT          WRITE TO CRT
         LI,AC1   2                 SET TO WAIT 2 UNITS (2.4 SEC)
         BAL,SRTN S36M:WAIT         WAIT
         RETURN
*
*
* S11CDN -- MOVE CURSOR DOWN
*
* ENTRY PARAMETERS:
*         X1 = COUNT OF LINES DOWN
*
*
S11CDN   RES      0
         SAVRTN
         LB,AC1   CRTCDN            GET BYTE COUNT
         LI,BUF1  BA(CRTCDN)+1      GET ADDR OF CNTRL CHARS
CDN50    RES      0
         BAL,SRTN S27PRINT          WRITE TO CRT
         BDR,X1   CDN50
         RETURN
*
*
* S11TRANS -- INITIATE TRANSMIT FROM CRT
*
S11TRANS RES      0
         SAVRTN
         BAL,SRTN S11CHOME          HOME CURSOR
         LI,X1    2                 SET COUNT TO 2
         BAL,SRTN S11CDN            MOVE CURSOR DOWN
         BAL,SRTN S11STEXT          WRITE 'START TEXT' CHAR
         LB,AC1   CRTTRANS          GET BYTE COUNT
         LI,BUF1  BA(CRTTRANS)+1    GET ADDR OF CONTROL CHARS
         BAL,SRTN S27PRINT
         RETURN
*
*
* S11SBLNK -- START BLINKING FIELD
*
S11SBLNK RES      0
         SAVRTN
         LB,AC1   CRTSBLNK          GET BYTE COUNT
         LI,BUF1  BA(CRTSBLNK)+1    GET ADDR OF CONTROL CHARS
         BAL,SRTN S27PRINT          WRITE TO CRT
         RETURN
*
*
* S11EBLNK -- STOP BLINKING FIELD
*
S11EBLNK RES      0
         SAVRTN
         LB,AC1   CRTEBLNK          GET BYTE COUNT
         LI,BUF1  BA(CRTEBLNK)+1    GET ADDR OF CONTROL CHARS
         BAL,SRTN S27PRINT          WRITE TO CRT
         RETURN
*
*
* S11STEXT -- WRITE 'START TEXT' CHAR
*
S11STEXT RES      0
         SAVRTN
         LB,AC1   CRTSTEXT          GET BYTE COUNT
         LI,BUF1  BA(CRTSTEXT)+1    GET ADDR OF CONTROL CHAR
         BAL,SRTN S27PRINT          WRITE TO CRT
         RETURN
         PAGE
*
*
* S11CHKDS -- CHECK FOR ENOUGH DYNAMIC STORAGE ROOM TO STORE
*             NEXT LINE READ FROM CRT SCREEN.  IF NOT ENOUGH
*             GET ANOTHER PAGE.
*
* ENTRY PARAMETERS:
*         AC1 = NUMBER OF CHARACTERS TO BE MOVED TO DS
*
* EXIT PARAMETERS:
*         SR3 = 0 IF ENOUGH ROOM
*         SR3 = 1 IF NOT ENOUGH ROOM
*
S11CHKDS RES      0
         SAVRTN
         LI,SR3   0                 INIT TO NO ERROR
         AI,AC1   3                 CALCULATE NO. OF WORDS REQ'D
         SLS,AC1  -2
         AI,AC1   1
         AW,AC1   INFOTBL           CALCULATE LAST DS WORD REQ'D
         CW,AC1   DSEND             DO WE HAVE ENOUGH ROOM
         BL       CHKDS90           YES
         LW,D1    BUF1              SAVE INPUT BUFFER ADDR
         LI,AC1   1                 SET TO GET ANOTHER PAGE
         BAL,SRTN S11GP             GET PAGE
         LW,BUF1  D1                RESTORE INPUT BUFFER ADDR
CHKDS90  RES      0
         RETURN
         PAGE
*
*
* S11CHKSP -- CHECK FOR ENOUGH SCREEN SPACE TO WRITE NEXT LINE
* ENTRY PARAMETERS:
*         AC1 = LINE SIZE (INCLUDING CR)
*
S11CHKSP RES      0
         SAVRTN
         LI,SR3   0                 INIT TO ENOUGH SPACE
         SW,AC1   CRTCRDSP          ADJUST SIZE FOR DISPLAYING CR
         AI,AC1   4                 ADD 4 TO SIZE FOR LINE NUMBER
CHKSP50  RES      0
         SW,AC1   CRTCHARS          SUBTRACT CHARS/LINE FROM SIZE
         BLZ      CHKSP80           FINISHED
         MTW,-1   SCRNLNS           REQUIRES EXTRA SCREEN LINE
         B        CHKSP50
CHKSP80  RES      0
         MTW,-1   SCRNLNS           SUBTRACT FOR 1ST SCREEN LINE USED
         BGEZ     CHKSP900          BRANCH IF ENOUGH SCREEN LINES
         LI,SR3   1                 SET TO NO SPACE LEFT
CHKSP900 RES      0
         RETURN
         PAGE
*
*
* S11CKBLN -- CHECK FOR BLANK LINE
*
* ENTRY PARAMETERS:
*         BUF1 = BYTE ADDR OF LINE
*         AC1  = SIZE OF LINE
*
* EXIT PARAMETERS:
*         SR3  = 0 IF LINE NOT BLANK
*         SR3  = 1 IF BLANK LINE
*
S11CKBLN RES      0
         SAVRTN
         LI,SR3   0                 INIT TO NOT BLANK LINE
         CI,AC1   1                 IS SIZE = 1
         BNE      CKBLN50           NO, NOT BLANK LINE
         LB,X1    0,BUF1            GET CHARACTER
         CI,X1    #CR               DOES CHAR = CR
         BNE      CKBLN50           NO, NOT BLANK LINE
         AI,SR3   1                 SET TO BLANK LINE
CKBLN50  RES      0
         RETURN
         PAGE
*
*
* S11CKSEQ -- CHECK FOR VAILD SEQUENCE NUMBER
*
* ENTRY PARAMETERS:
*         AC1 = SOURCE STRING
*
* EXIT PARAMETERS:
*         AC2 = BINARY SEQUENCE NUMBER IF VALID
*         SR3 = 1 IF VALID SEQUENCE NUMBER
*               0 IF NOT VALID SEQUENCE NUMBER
*
S11CKSEQ RES      0
         SAVRTN
         LI,SR3   0                 INITIALIZE TO NOT VALID
         SLD,AC1  -16               GET 1ST TWO CHARS
         SLS,AC2  -16               RIGHT JUSTIFY
         CI,AC2   '# '              DO CHARS = '# '
         BE       CKSEQ30           YES, OK - CONTINUE CHECK
         CI,AC2   X'7B0D'           DO CHARS = # CR
         BNE      CKSEQ50           NO, CHECK FAILED
CKSEQ30  RES      0
         SLD,AC1  -8                GET NEXT CHAR
         SLS,AC2  -24               RIGHT JUSTIFY
         CLM,AC2  NUMLIM            CHECK FOR VALID DIGIT
         BCS,9    CKSEQ50           NOT VALID
         AND,AC2  L(X'F')           CLEAN DIGIT
         CI,AC1   ' '               IS NEXT CHAR A BLANK
         BE       CKSEQ40           YES
         CLM,AC1  NUMLIM            IS LAST CHAR A VALID DIGIT
         BCS,9    CKSEQ50           NO, INVALID
         AND,AC1  L(X'F')           CLEAN DIGIT
         SLS,AC1  1                 MULTIPLY LAST DIGIT BY 10
         AW,AC2   AC1
         SLS,AC1  2
         AW,AC2   AC1               ACCUMULATE RESULT
CKSEQ40  RES      0
         CW,AC2   *DSADDR           IS SEQ # WITHIN ORIGINAL RANGE
         BG       CKSEQ50           NO, INVALID
         AI,SR3   1                 SET TO VALID
CKSEQ50  RES      0
         RETURN
         PAGE
*
*
* S11DRNG -- DELETE A RANGE OF LINES
*
* ENTRY PARAMETERS:
*         AC1 = FIRST KEY IN RANGE
*         AC2 = LAST KEY IN RANGE
*
S11DRNG  RES      0
         SAVRTN
         STW,AC2  DLTRN2            SAVE LAST KEY OF RANGE
         LW,AC2   AC1               GET 1ST KEY IN RANGE
DRNG50   RES      0
         BAL,SRTN S05DLINE          DELETE LINE
         CW,AC2   DLTRN2            IS IT AT END OF RANGE
         BGE      DRNG900           YES
         LI,AC2   0                 SET TO READ NEXT RECORD
         B        DRNG50
DRNG900  RES      0
         RETURN
         PAGE
*
*
* S11FP -- FREE DYNAMIC PAGE
*
* ENTRY PARAMETERS:
*         AC1 = NUMBER OF PAGES TO FREE
*
S11FP    RES      0
         SAVRTN
         BAL,SRTN S36M:FP           FREE DYNAMIC PAGES
         LCW,AC1  AC1
         AWM,AC1  DSPGCNT           DECR PAGE COUNT
         RETURN
         PAGE
*
*
* S11GET -- GET RECORD FROM DYNAMIC STORAGE
*
* ENTRY PARAMETERS:
*         INFOTBL = BYTE ADDR OF NEXT ENTRY IN DYNAMIC STORAGE.
*                   THIS POINTER IS AUTOMATICALLY INCREMENTED
*                   EACH TIME ROUTINE IS EXITED.
*
* EXIT PARAMETERS:
*         BUF1 = BYTE ADDR OF RECORD
*         AC1  = SIZE OF RECORD
*         AC2  = WRITE KEY OF RECORD IF ORIGINAL RECORD
*         AC3  = INSERT COUNT IF NOT ORIGINAL RECORD
*              = 0 IF ORIGINAL RECORD
*      NEXTKEY = NEXT ORIGINAL KEY TO BE STORED
*              = 0 IF NONE
*
S11GET   RES      0
         SAVRTN
         LI,SR3   0                 INIT RETURN TO RECORD OK
         LW,AC1   *INFOTBL          GET RECORD CONTROL WORD
         BEZ      GET800            FINISHED
         MTW,1    INFOTBL           INCR PAST CONTROL WORD
         LW,BUF1  INFOTBL           GET POINTER TO RECORD
         SLS,BUF1 2                 CONVERT TO BYTE POINTER
         LB,AC3   AC1               GET INSERT COUNT
         BNEZ     GET50             THIS IS INSERT RECORD
         AI,BUF1  4                 ORIGINAL RECORD, SKIP SEQ NO.
         MTW,1    INFOTBL           INCR PAST SEQUENCE NUMBER
         MTW,-4   AC1               REDUCE SIZE BY 4 FOR SEQ NO.
         LI,X1    1                 SET INDEX TO GET SEQ NO.
         LB,X1    AC1,X1            GET SEQ NO.
         LW,AC2   *DSADDR,X1        GET KEY FOR THIS RECORD
GET30    RES      0
         LW,D1    RNGP1             INIT TO RANGE + 1
         AI,X1    1                 INCR INDEX TO KEY TABLE
         CW,X1    *DSADDR           ANY MORE KEYS
         BG       GET35             NO
         LW,D1    *DSADDR,X1        GET NEXT KEY
         BLEZ     GET30             KEY DELETED, TRY AGAIN
GET35    RES      0
         STW,D1   NEXTKEY           SAVE NEXT KEY
GET50    RES      0
         AND,AC1  L(X'FFFF')        CLEAN RECORD SIZE
         LW,D1    AC1               GET SIZE
         BLEZ     GET70             ONLY CR
         AI,D1    3                 CONVERT TO WORD SIZE
         SLS,D1   -2
         AWM,D1   INFOTBL           INCR POINTER TO NEXT RECORD
         B        GET900
*
* HERE FOR SPECIAL CASE: RECORD = CR (XX#CR)
GET70    RES      0
         LI,AC1   1                 SET SIZE TO 1
         AI,BUF1  -1                DECR POINTER BY 1
         B        GET900
GET800   RES      0
         AI,SR3   1                 SET ERROR RETURN
GET900   RES      0
         RETURN
         PAGE
*
*
* S11GET%I -- INITIALIZE S11GET ROUTINE
*
* THIS ROUTINE SETS UP THE BASE ADDRESS OF THE INFO
* TABLE.  IT ALSO SETS UP 'NEXTKEY' THE FIRST TIME
* WHICH IS USED TO DETERMINE THE CORRECT INCREMENT
* FOR INSERT LINES.
*
S11GET%I RES      0
         SAVRTN
         LW,AC1   INFOTBL%          GET INFO TABLE BASE ADDRESS
         STW,AC1  INFOTBL           SET UP INFO TABLE POINTER
         LI,X1    0                 INIT INDEX TO 0
GET%I50  RES      0
         LW,AC1   RNGP1             INIT TO RANGE PLUS 1
         AI,X1    1                 INCR INDEX TO KEY TABLE
         CW,X1    *DSADDR           ANY MORE KEYS
         BG       GET%I70           NO
         LW,AC1   *DSADDR,X1        GET NEXT KEY
         BLEZ     GET%I50           KEY DELETED, TRY AGAIN
GET%I70  RES      0
         STW,AC1  NEXTKEY           SAVE NEXT KEY
         RETURN
         PAGE
*
*
* S11GP -- GET DYNAMIC PAGE
*
* ENTRY PARAMETERS:
*         AC1 = NUMBER OF PAGES TO GET
*
* EXIT PARAMETERS:
*         SR3 = 0 IF GET WAS OK
*             = 1 IF NOT OK
*
S11GP    RES      0
         SAVRTN
         STW,AC1  TEMP              SAVE NUMBER OF GET PAGES
         LI,SR3   0                 INIT TO OK
         BAL,SRTN S36M:GP           GET DYNAMIC PAGES
         CW,AC1   TEMP              WAS PAGE(S) AVAILABLE
         BE       GP50              YES
         AI,SR3   1                 NO, ERROR
GP50     RES      0
         LI,X1    511               CALCULATE LAST WORD OF PAGE
         AW,X1    BUF1
         STW,X1   DSEND             SAVE ADDR OF LAST WORD
         AWM,AC1  DSPGCNT           INCR PAGE COUNT
         RETURN
         PAGE
*
*
* S11MSG -- MOVES CURSOR TO TOP OF SCREEN AND WRITES MESSAGE
*           IN FIRST 2 LINES.
*
* INPUT PARAMETERS:
*         AC1 = STANDARD MESSAGE NUMBER
*         AC1 = O IF MESSAGE LINES ARE TO ONLY BE CLEARED
*         BLINKFLG = 1 IF BLINKING MESSAGE
*
S11MSG   RES      0
         SAVRTN
         STW,AC1  TEMP              SAVE MESSAGE NUMBER
         BAL,SRTN S11CHOME          HOME CURSOR
         BAL,SRTN S11LNCLR          CLEAR LINE
         LI,X1    1                 SET COUNT TO 1
         BAL,SRTN S11CDN            MOVE CURSOR DOWN
         BAL,SRTN S11LNCLR          CLEAR LINE
         BAL,SRTN S11CHOME          HOME CURSOR
         MTW,0    TEMP              WAS MESSAGE NUMBER = 0
         BEZ      MSG50             YES, NO MSG TO BE WRITTEN
         MTW,0    BLINKFLG          BLINKING MESSAGE
         BEZ      MSG30             NO
         BAL,SRTN S11SBLNK          START BLINKING MODE
MSG30    RES      0
         LW,AC1   TEMP              GET MESSAGE NUMBER
         BAL,SRTN S29STD            WRITE STANDARD MESSAGE
         MTW,0    BLINKFLG          BLINKING MESSAGE
         BEZ      MSG50             NO
         BAL,SRTN S11EBLNK          STOP BLINKING MODE
         MTW,-1   BLINKFLG          RESET BLINK FLAG
MSG50    RES      0
         RETURN
*
*
* S11MSGW -- WRITE 'WORKING' MESSAGE
*
S11MSGW  RES      0
         LI,AC1   60                SET FOR 'WORKING' MSG
         MTW,1    BLINKFLG          SET BLINKING MODE
         B        S11MSG            GO WRITE MESSAGE
         PAGE
*
*
* S11NXTAC -- READ RESPONSE TO 'NEXT ACTION' QUESTION
*
* EXIT PARAMETER:
*        SR3 = 0  IF RESPONSE IS NOT VALID
*        SR3 = 1  IF RESPONSE IS VALID
*        X1 = 1 IF 1ST CHAR IS 'R'
*           = 2 IF 1ST CHAR IS 'A'
*           = 3 IF 1ST CHAR IS 'E'
*           = 4 IF 1ST CHAR IS 'C'
*        X2 = 0 IS 2ND CHAR IS CR
*           = 1 IF 2ND CHAR IS 'N'
*           = 2 IF 2ND CHAR IS 'S'
*
*
S11NXTAC RES      0
         SAVRTN
         LI,BUF1  BA(MSGBUF)        GET BUFFER ADDR FOR RESPONSE
         BAL,SRTN S27RTNL           READ RESPONSE
         LI,SR3   0                 INIT TOTAL RESPONSE TO INVALID
         LI,X2    0                 INIT 2ND CHAR RESPONSE
         LI,X1    SZRTBL1-1         SET UP INDEX
         LB,AC3   MSGBUF            GET 1ST CHAR OF RESPONSE
NXTAC20  RES      0
         CB,AC3   RTBL1,X1          COMPARE FOR VALID RESPONSE
         BE       NXTAC50           VALID RESPONSE FOUND
         BDR,X1   NXTAC20           CONTINUE
NXTAC30  RES      0
         RETURN
NXTAC50  RES      0
         LI,X4    1                 SET INDEX TO READ 2ND CHAR
         LB,AC3   MSGBUF,X4         GET 2ND CHAR
         CI,AC3   #CR               IS 2ND CHAR = CR
         BE       NXTAC150          YES, SET VAILD RESPONSE
         LI,X2    SZRTBL2           SET UP INDEX
NXTAC70  RES      0
         CB,AC3   RTBL2,X2          COMPARE FOR VALID RESPONSE
         BE       NXTAC100          VALID RESPONSE FOUND
         BDR,X2   NXTAC70           CONTINUE
         B        NXTAC30           ERROR
NXTAC100 RES      0
         LI,X4    2                 SET INDEX TO READ 3RD CHAR
         LB,AC3   MSGBUF,X4         GET 3RD CHAR
         CI,AC3   #CR               IS 3RD CHAR = CR
         BNE      NXTAC30           NO, ERROR
NXTAC150 RES      0
         LI,SR3   1                 SET TO VALID RESPONSE
         B        NXTAC30
         PAGE
*
*
* S11RDCRT -- READ TRANSMITTED INFORMATION FROM CRT
*
S11RDCRT RES 0
         SAVRTN
         LI,AC1   0                 INITIALIZE TO 0
         STW,AC1  TRAILFLG            TRAILING BLANK LINE FLAG
         STW,AC1  BLNPTR              POINTER TO LAST BLANK LINE GROUP
         BAL,SRTN S36ECOFF          TURN ECHOPLEX OFF
         BAL,SRTN S11TRANS          INITIATE TRANSMIT FROM CRT
         B        RDCRT70           SKIP TYPE AHEAD CHECK 1ST TIME
RDCRT50  RES      0
         BAL,SRTN S36CKTYP          CHECK FOR TYPE AHEAD
         CI,SR3   0                 WAS THERE ANY
         BE       RDCRT150          NO
RDCRT70  RES      0
         LI,AC2   MXCRTLN           GET MAX CHARS PER LINE
         LI,BUF1  BA(STDWKBUF)      SET UP READ BUFFER ADDR
         BAL,SRTN S27READ           READ LINE FROM CRT
         BAL,SRTN S11CKBLN          CHECK FOR BLANK LINE
         CI,SR3   0                 IS LINE BLANK
         BE       RDCRT100          NO
         MTW,0    TRAILFLG          IS THIS A LEADING BLANK LINE
         BEZ      RDCRT50           YES
         MTW,0    BLNPTR            IS LINE FIRST OF A GROUP
         BNEZ     RDCRT110          NO
         LW,X1    INFOTBL           GET INFO TABLE POINTER
         STW,X1   BLNPTR            SAVE POINTER
         B        RDCRT110
RDCRT100 RES      0
         MTW,1    TRAILFLG          NO MORE LEADING BLANK LINES
         STW,SR3  BLNPTR            NON BLANK, INIT POINTER
RDCRT110 RES      0
         STW,AC1  *INFOTBL          STORE LINE SIZE
         BAL,SRTN S11CHKDS          CHECK FOR DYNAMIC STORAGE ROOM
         CI,SR3   0                 ENOUGH ROOM
         BNE      RDCRT950          NO
         LW,AC1   *INFOTBL          GET LINE SIZE FOR MOVE
         MTW,1    INFOTBL           INCR TABLE POINTER
         LW,AC2   INFOTBL           GET INFO TABLE POINTER
         SLS,AC2  2                 CONVERT TO BYTE POINTER
         MOVE,X1  *BUF1,*AC2,*AC1   MOVE LINE TO INFO TABLE
         AI,AC1   3                 CALCULATE NUMBER OF WORDS
         SLS,AC1  -2
         AWM,AC1  INFOTBL           INCR TABLE POINTER BY LINE SIZE
         B        RDCRT50
RDCRT150 RES      0
         LI,X1    40                SET LOOP COUNT
RDCRT160 RES      0
         BAL,SRTN S36CKTYP          CHECK FOR TYPE AHEAD AGAIN
         CI,SR3   0                 WAS THERE ANY
         BNE      RDCRT70           YES, GO BACK AND READ
         BDR,X1   RDCRT160          CONTINUE CHECKING
         LI,AC1   0
         STW,AC1  *INFOTBL          PUT 0 AT END OF TABLE
         MTW,0    BLNPTR            WERE THERE TRAILING BLANK LINES
         BEZ      RDCRT250          NO
         STW,AC1  *BLNPTR           YES, ERASE FROM INFO TABLE
RDCRT250 RES      0
         STW,AC1  INSCNT            INIT NUMBER OF INSERT LINES = 0
         STW,AC1  ENDFLG            END FLAG = OFF
*
* NOW GO THROUGH TABLE AND COUNT INSERT LINES
         LW,AC1   INFOTBL%          GET START OF INFO TABLE
         STW,AC1  INFOTBL           SET UP POINTER
RDCRT300 RES      0
         LW,AC1   *INFOTBL          GET NEXT LINE SIZE
         BEZ      RDCRT400          FINISHED
         STW,AC1  SIZESV            SAVE LINE SIZE
         MTW,1    INFOTBL           INCR TABLE POINTER
         LW,AC1   *INFOTBL          GET POSSIBLE SEQ NUMBER
         BAL,SRTN S11CKSEQ          VERIFY VALID SEQ NUMBER
         CI,SR3   0                 IS IT A SEQ NUMBER
         BNE      RDCRT350          YES
         MTW,0    INSCNT            IS THIS 1ST INSERT
         BGZ      RDCRT310          NO
         LW,AC3   INFOTBL           GET ADDR OF 1ST INSERT
         AI,AC3   -1
         STW,AC3  FRSTINS           SAVE ADDR OF 1ST INSERT
RDCRT310 RES      0
         MTW,1    INSCNT            COUNT THIS INSERT
         LI,X1    -4                SET INDEX TO STORE INS FLAG
         LI,AC1   1                 INSERT FLAG
         STB,AC1  *INFOTBL,X1       STORE INSERT FLAG
RDCRT320 RES      0
         MTW,0    ENDFLG            FINISHED
         BGZ      RDCRT900          YES
         LW,AC1   SIZESV            GET SIZE OF CURRENT LINE
         AI,AC1   3                 CALCULATE NUMBER OF WORDS
         SLS,AC1  -2
         AWM,AC1  INFOTBL           INCR TABLE POINTER BY LINE SIZE
         B        RDCRT300
*
* HERE IF AN ORIGINAL RECORD
RDCRT350 RES      0
         LI,X1    -3                SET INDEX TO STORE SEQ NO.
         STB,AC2  *INFOTBL,X1       SAVE SEQUENCE NUMBER
         LW,X1    AC2               SET INDEX TO SEQ NUMBER
         LW,AC1   *DSADDR,X1        GET CORRESPONDING KEY
         AND,AC1  L(X'7FFFFFFF')    RESET DELETE BIT
         STW,AC1  *DSADDR,X1        STORE BACK IN TABLE
RDCRT370 RES      0
         LW,AC1   INSCNT            GET NUMBER OF INSERT LINES
         BEZ      RDCRT320          NONE
         STB,AC1  *FRSTINS          SAVE COUNT BEFORE 1ST LINE
         LI,AC1   0
         STW,AC1  INSCNT            RESET INSERT COUNT TO 0
         B        RDCRT320
RDCRT400 RES      0
         MTW,1    ENDFLG            SET FINISHED FLAG
         B        RDCRT370
RDCRT900 RES      0
         LI,SR3   0                 SET TO NO ERROR
RDCRT950 RES      0
         BAL,SRTN S36ECON           TURN ECHOPLEX ON
         RETURN
         PAGE
*
*
* S11WRCRT -- READ LINES FROM TEXT WORKING STORAGE AND WRITE TO CRT.
*             RETURN WHEN SCREEN IS FULL OR END OF RANGE.
*
* ENTRY PARAMETERS:
*         RN1 = INITIAL WS LINE READ KEY
*
S11WRCRT RES      0
         SAVRTN
         LW,AC1   CRTDSPLN          GET NO OF SCREEN LINES FOR DISP
         STW,AC1  SCRNLNS           SAVE
         LI,AC1   0                 SET READ SIZE TO 0
         BAL,SRTN S27RTXT           POSITION TO 1ST LINE IN RANGE
         LI,AC2   -2                SET TO READ BACKWARD 1 RECORD
         BAL,SRTN S27RTXT           READ BACKWARD
         CI,SR3   2                 CHECK FOR BOF
         BNE      WRCRT25           NOT BOF
         LW,AC2   L(#ZROKEY)        BOF, USE KEY 0.0
WRCRT25  RES      0
         STW,AC2  RNGM1             SAVE RANGE - 1
         LW,AC2   RN1               GET 1ST KEY OF RANGE
WRCRT50  RES      0
         LI,BUF2  BA(STDINBUF)      SET UP READ BUFFER ADDR
         LI,AC1   #STDBUFSZ         SET UP READ SIZE
         BAL,SRTN S27RTXT           READ LINE FROM TXT FILE
         CI,SR3   3                 EOF
         BE       WRCRT500          YES
         CW,AC2   RN2               IS KEY BEYOND END OF RANGE
         BG       WRCRT450          YES
         STW,AC2  RN1               SAVE POSSIBLE START OF NEXT BLOCK
         STW,AC2  RNGP1             SAVE POSSIBLE RANGE + 1
         AI,AC1   -1                DECR SIZE BY 1 FOR ATTN
         STW,AC1  TEMP              SAVE SIZE OF LINE
         MTW,1    KEYTBL            INCR KEY TBL POINTER
         OR,AC2   L(X'80000000')    INIT DELETE BIT ON
         STW,AC2  *KEYTBL           SAVE CURRENT LINE KEY
         BAL,SRTN S11CHKSP          CHECK FOR SCREEN SPACE
         CI,SR3   0                 ENOUGH SPACE
         BNE      WRCRT900          NO
         MTW,1    SCRNLN#           INCR SCREEN LINE NUMBER
         LW,AC1   SCRNLN#           GET SCREEN LINE NUMBER
         BAL,SRTN S11WSL#           WRITE SCREEN LINE NUMBER
         LW,AC1   TEMP              GET SIZE OF LINE
         LI,BUF3  BA(STDINBUF)+1    SKIP OVER ATTN COUNT
         BAL,SRTN S27WTERM          PRINT LINE ON DISPLAY
         MTW,1    *DSADDR           INCR KEY COUNT
         LI,AC2   0                 SET TO READ NEXT RECORD
         B        WRCRT50
WRCRT450 RES      0
         MTW,1    ENDRNG            SET END OF RANGE FLAG
         STW,AC2  RNGP1             SAVE RANGE + 1
         STW,AC2  RN1               SAVE KEY AS START OF NEXT BLOCK
         B        WRCRT900
WRCRT500 RES      0
         MTW,1    ENDRNG            SET END OF RANGE FLAG
         LW,AC2   L(#MAXKEY+1)      GET MAX KEY + 1
         STW,AC2  RNGP1             SAVE AS RANGE + 1
         STW,AC2  RN1               SAVE AS START OF NEXT BLOCK
WRCRT900 RES      0
         RETURN
         PAGE
*
*
* S11WSL# -- WRITE CRT SCREEN LINE NUMBER
*
S11WSL#  RES      0
         SAVRTN
         BAL,SRTN S35CNVRT          CONVERT LINE NO TO EBCDIC
         SLD,AC1  48                SHIFT TO POSITION FOR STORE
         LW,AC2   L(X'FFFF0000')    SET UP STORE MASK
         STS,AC1  LNBUF             STORE IN MESSAGE BUFFER
         LI,AC1   4                 SET UP COUNT = 4
         LI,BUF1  BA(LNBUF)         SET UP MESSAGE ADDRESS
         BAL,SRTN S27PRINT          GO WRITE SCREEN LINE NO
         RETURN
         PAGE
*
*
* NEXT ACTION RESPONSE, 1ST CHAR TABLE
*
RTBL1    RES      0
         DATA,1   0,'R','A','E','C'
SZRTBL1  EQU      BA(%)-BA(RTBL1)   SIZE OF 1ST CHAR TABLE
*
         BOUND    4
*
*
* NEXT ACTION RESPONSE, 2ND CHAR TABLE
*
RTBL2    RES      0
         DATA,1   0,'N','S'
SZRTBL2  EQU      BA(%)-BA(RTBL2)   SIZE OF 2ND CHAR TABLE
*
         BOUND    4
*
*
         BOUND    8                 MOVE TO EVEN WORD ADDR
NUMLIM   DATA     '0','9'           DIGIT VERIFICATION LIMITS
         PAGE
*
* LOCAL VARIABLES
*
11D      CSECT    0                 START OF LOCALS
ADDFLG   RES      1                 'ADD' OPTION FLAG
BLINKFLG RES      1                 BLINKING MODE FLAG
BLNPTR   RES      1                 BLANK LINE POINTER
CHAR2    RES      1                 2ND NEXT ACTION CHAR
CMDERR   RES      1                 COMMAND ERROR FLAG
CRTRN1   RES      1                 FIRST CRT LINE KEY
CRTRN2   RES      1                 LAST CRT LINE KEY
DISPERR  RES      1                 DISPLAY ERROR FLAG
DISPFLG  DATA     0                 DISPLAY MODE FLAG (OFF)
DLTRN1   RES      1                 1ST KEY OF DELETE RANGE
DLTRN2   RES      1                 LAST KEY OF DELETE RANGE
DSADDR   RES      1                 ADDR OF START OF DYNAMIC STORAGE
DSEND    RES      1                 ADDR OF LAST WORD OF DS
DSPGCNT  RES      1                 NUMBER OF DYNAMIC STORAGE PAGES
ENDFLG   RES      1                 FINISHED FLAG
ENDRNG   RES      1                 END OF RANGE FLAG
FRSTINS  RES      1                 LOCATION OF FIRST INSERT LINE
KEYTBL   RES      1                 ADDR OF KEY TABLE
INFOTBL  RES      1                 ADDR OF START OF LINE INFORMATION
INFOTBL% RES      1                 CONSTANT BASE FOR INFOTBL
INSCNT   RES      1                 COUNT OF NUMBER OF INSERT LINES
INSERR   RES      1                 INSERT ERROR, 1ST BYTE CURRENT
INSINCR  RES      1                 INSERT INCREMENT
NEXTKEY  RES      1                 NEXT KEY
RNGM1    RES      1                 RANGE - 1
RNGP1    RES      1                 RANGE + 1
RN1      RES      1                 FIRST LINE IN RANGE
RN2      RES      1                 LAST LINE IN RANGE
SCRNLNS  RES      1                 NO OF SCREEN LINES USED FOR DISP
SCRNLN#  RES      1                 SCREEN LINE NUMBER
SIZESV   RES      1                 LINE SIZE SAVE WORD
SVKEY    RES      1                 SAVE KEY
TEMP     RES      1                 TEMP WORD
TRAILFLG RES      1                 TRAILING BLANK LINE FLAG
*
3010FLG  DATA     0                 3010 TERMINAL FLAG
3010FWD  DATA     0                 3010 FORWARD ONLY FLAG (OFF)
1200FLG  DATA     0                 1200 OUTPUT FLAG (OFF)
*
*
         BOUND    8
SVSTACK  RES      2                 RETURN STACK SAVE STATUS
*
*
MX#LN    EQU      99                MAX NUMBER OF CRT LINES
MXCRTLN  EQU      258               MAX CRT LINE SIZE
         PAGE
*
*
CRTTBL   RES      0                 CRT INFORMATION TABLE
CRTHDR   DATA     ' HDR'            CRTTBL HEADER WORD
CRTLINES DATA     24                LINES PER PAGE
CRTDSPLN DATA     20                NO OF SCREEN LINES USED FOR DISP
CRTCHARS DATA     80                CHARS PER LINE
CRTCRDSP DATA     1                 CR CHAR IS(0)/IS NOT(1) DISPLAYED
CRTTTYPE DATA     1                 TRANSMIT TYPE INDICATOR
CRTWAIT  DATA     1                 'WAIT' FLAG (1 = WAIT REQUIRED)
CRTCUP   DATA     X'021BC100'       CURSOR UP
CRTCRT   DATA     X'021BC300'       CURSOR RIGHT
CRTCDN   DATA     X'021BC200'       CURSOR DOWN
CRTCLF   DATA     X'021BC400'       CURSOR LEFT
CRTHOME  DATA     X'021BC800'       CURSOR HOME
CRTLNCLR DATA     X'021BD200'       LINE CLEAR
CRTPGCLR DATA     X'021BD100'       PAGE CLEAR
CRTTRANS DATA     X'021BE800'       TRANSMIT
CRTSBLNK DATA     X'021B8500'       START BLINKING FIELD
CRTEBLNK DATA     X'021BF400'       END BLINKING FIELD
CRTSTEXT DATA     X'051B5F02'       START TEXT
         DATA     X'1BB20000'
CRTETEXT DATA     X'01030000'       END TEXT
*
*
         PAGE
*
*
LNBUF    DATA     '  # '            SCREEN LINE NUMBER WRITE BUF
*
*
         USECT    #PLOC
         END
