* 02/04/76 -- 14:00
* MODULE NAME: SCAN
* NUMBER: 38
* PURPOSE: SCAN AND FORMAT INPUT AND OUTPUT LINES
*
* ENTRY POINTS:
         DEF      S38PSCAN          FORMAT PRINT LINES
         DEF      S38ISCAN          SCAN INPUT LINES
         DEF      S38INS1           INSERT LAST LINE OF GROUP
         DEF      S38INS2           INSERT NON-LAST LINE OF GROUP
*
         REF      S08FMTPR          PRINT FORMATTED LINE
         REF      S08PRLN           PRINT OUTPUT LINE
         REF      S09RESLN          RESET OUTPUT LINE
         REF      S26CMD            INTERPRET COMMANDS
         REF      TRMTYPE           TERMINAL TYPE
         REF      LSTPLN            PARAGRAPH LAST-LINE FLAG
         REF      DISPFLG           DISPLAY MODE FLAG
         REF      PHKTFLG           PHRASE KEEP-TOGETHER FLAG
*
*
         SYSTEM   TEXTDEF
         SYSTEM   ITEMDEF
            INVPRSTA
            INVLNSTA
            INVCMDSTA
            INVWSSTA
*
         DEF      38P,38D
38P      EQU      %
         DATA     X'38'             MODULE NUMBER
         DATA     X'020476'         DATE
         DATA     X'1000'           TIME
*
         TITLE    '** SCAN(38) **'
*
* S38PSCAN -- SCAN AND FORMAT OUTPUT LINE
*
* EXIT PARAMETERS: AC1=ATTN COUNT
*                  AC2=ATTN FLAG
*                  AC3=LAST CHAR IN INPUT LINE
*
S38PSCAN EQU      %
         SAVRTN
*
         GET,D1   LN:OUTPTR         SAVE START ADDR OF OUTPUT LINE
         STW,D1   FSTOUT
         GET,D1   LN:INPTR          SAVE LW INPUT LINE POINTER
         STW,D1   LWINPTR
         GET,D1   LN:INSZ           SAVE LW INPUT LINE SIZE
         STW,D1   LWINSZ
*
         LI,AC1   0                 INITIALIZE:
         STW,AC1  ATTNFLG               ATTN FLAG
         STW,AC1  ATTNCNT               ATTN COUNT
         STW,AC1  LSTCHAR               LAST CHAR
         STW,AC1  WRDCNT                WORD COUNT
         STW,AC1  DTABFLG               DISPLAY TABS FLAG
*
GETLNSTA EQU      %
         LCI      SZLNSTA           GET LINE STATUS SIZE
         LM,X1    LNSTA             GET LINE STATUS TABLE
         STM,X1   SAVLNSTA          STORE LINE STATUS TABLE
*
         LI,D1    WA(UNFBRTBL)      GET ADDR OF UNF. BRANCH TABLE
         JLEZ,D2  PR:FMTFLG,STBRTBL TEST FORMAT FLAG-IF RESET, STORE
         JEZ,D2   PR:NLFLG,GETFMTBR TEST NEW-LINE FLAG
*
*
         PAGE
*
*
         LI,AC2   #BLANK            GET BLANK FOR COMPARE
TSTLBLP  EQU      %                 NEW-LINE FLAG SET, REMOVE LB
         CB,AC2   0,X1              GET NEXT INPUT CHAR
         BNE      GETFMTBR              NO, NO MORE LEADING BLANKS
*
MVLBPTR  EQU      %
         AI,X1    1                 INCREMENT INPUT LINE POINTER
         MTW,-1   INSZ              DECREMENT INPUT LINE SIZE
         B        TSTLBLP           TEST NEXT CHAR
*
GETFMTBR EQU      %
         LI,D1    WA(FMTBRTBL)      GET ADDR OF FORMATTED BRANCH TABLE
STBRTBL  EQU      %
         STW,D1   BRTBL             SAVE ADDR OF BRANCH TABLE
*
*
         PAGE
*
*
GETNXTIN EQU      %
         MTW,-1   INSZ              DECREMENT INPUT SIZE
         BLZ      INLNFIN               ZERO, RETURN
         LB,AC2   0,X1              GET NEXT INPUT CHAR
         AI,X1    1                 INCREMENT INPUT POINTER
         STW,AC2  LSTCHAR           SAVE LAST INPXT CHAR
*
         LI,X3    SZCHTBL           GET SIZE OF CHAR TABLE
TSTCHLP  EQU      %
         CB,AC2   CHTBL,X3          TEST FOR SPECIAL CHAR FOUND
         BG       *BRTBL            BRANCH IF NOT A SPECIAL CHARACTER
         BE       EXUCHBR               YES, GO EXECUTE BRANCH
         BDR,X3   TSTCHLP               NO, TEST NEXT CHAR
*
EXUCHBR  EQU      %
         EXU      *BRTBL,X3         EXECUTE BRANCH INSTRUCTION
*
STORCHAR MTW,1    WRDCNT            INCREMENT CURRENT WORD SIZE
INCRPSTN EQU      %
         MTW,1    CPSTN             INCREMENT CARRIER POSITION
*
STCHAR   EQU      %
         STB,AC2  0,X2              STORE OUTPUT CHAR
         AI,X2    1                 INCREMENT OUTPUT POINTER
         MTW,1    OUTSZ             INCREMENT OUTPUT SIZE
         B        GETNXTIN          GET NEXT INPUT CHAR
*
*
         PAGE
*
* BRANCH TABLES
*
CHTBL    EQU      %                 BRANCH TABLE CHARACTERS
         DATA,1   0,#ATTN,#TAB,#BKSP,#CR,#STOP,#BLANK,'@'
SZCHTBL  EQU      BA(%)-BA(CHTBL)-1
         BOUND    4
*
UNFBRTBL EQU      %                 UNFORMATTED OUTPUT BRANCH TABLE
         B        INCRPSTN          NOT BRANCH TABLE CHAR
         B        ATTNFND           ATTN
         B        TABFND            TAB
         B        BKSPFND           BKSP
         B        STCHAR            CR
         B        STOPFND           STOP CODE
         B        INCRPSTN          BLANK
         B        ATFND             '@' SIGN
*
FMTBRTBL EQU      %                 FORMATTED OUTPUT BRANCH TABLE
         B        STORCHAR          NOT BRANCH TABLE CHARACTER
         B        ATTNFND           ATTN
         B        FMTTAB            TAB
         B        INCRWRD           BKSP
         B        FMTCR             CR
         B        INCRWRD           STOP CODE
         B        TRMWRD            BLANK
         B        INCRWRD           '@' SIGN
*
*
         PAGE
*
*
ATTNFND  EQU      %
         JLZ,D1   PR:FMTFLG,AEATTN  TEST FOR 'AS-ENTERED' MODE
         LCI      2                 SAVE INPUT AND OUTPUT POINTERS
         STM,X1   SAVLNSTA
         PUT,X1   #CMDST            SAVE ADDR OF COMMAND START
*
GETCMDLP EQU      %
         MTW,-1   INSZ              DECREMENT INPUT SIZE
         BLZ      SETCMD                ZERO, SET COMMAND
         LB,AC2   0,X1              GET NEXT CHAR
         AI,X1    1                 INCREMENT INPUT POINTER
         CI,AC2   #ATTN             TEST FOR ATTN (TO END COMMAND)
         BNE      GETCMDLP              NO, GET NEXT INPUT CHAR
SETCMD   EQU      %
         LW,D1    X1                GET INPUT POINTER
         SW,D1    INPTR             SUBTRACT COMMAND START POINTER
         PUT,D1   #NCHCMD           STORE NUMBER OF COMMAND CHARS
         LI,D1    1                 SET I/O FLAG FOR OUTPUT COMMAND
         PUT,D1   #IOFLG
*
         CI,AC2   #CR               TEST FOR CR AT END OF COMMAND
         BNE      STINPTR               NO, STORE INPUT POINTER
         STW,D1   INSZ                  YES, SET INPUT SIZE TO 1
         AI,X1    -1                MOVE INPUT POINTER TO CR
*
STINPTR  EQU      %
         STW,X1   INPTR             STORE NEXT INPUT POINTER
         BAL,SRTN S26CMD            GO INTERPRET COMMAND
*
*
         PAGE
*
*
CMDRTN   EQU      %
         LCI      2                 RESTORE INPUT/OUTPUT POINTERS
         LM,X1    SAVLNSTA
         JEZ,D1   #APADDR,GETNXTIN  TEST ACTION PROGRAM ADDR
         DEPZ,D2  #APADDR           RESET ACTION PROG ADDR
         STW,D1   APADDR            SAVE ACTION PROGRAM ADDR
         LCI      SZLNSTA           RESTORE LINE STATUS TABLE
         LM,X1    SAVLNSTA
         STM,X1   LNSTA
         MTW,0    INSFLG            INSERT MODE
         BNEZ     INSENPT           YES
         BAL,SRTN *APADDR           GO TO COMMAND ACTION PROGRAM
INSENPT  RES      0
*
         JLEZ,D1  PR:FMTFLG,GETLNSTA TEST FOR FORMATTING
         GET,D1   LN:CPSTN              YES, GET NEW CARRIER POSITION
         CW,D1    CPSTN             DID ROUTINE ADD CHARS TO OUTPUT
         BE       %+2
         MTW,1    WRDCNT                YES, INCREMENT SIZE OF WORD
         CW,D1    MXPSTN            TEST IF PAST MAX CARRIER POSITION
         BG       GOBACK                YES, GO BACK TO PREVIOUS WORD
         LCI      SZLNSTA           ADVANCE STATUS TO END OF THIS STRING
         LM,X1    LNSTA
         STM,X1   SAVLNSTA
         B        GETNXTIN          GO GET NEXT CHAR
*
*
         PAGE
*
*
AEATTN   EQU      %
         MTW,0    DISPFLG           IN DISPLAY MODE
         BNEZ     DSPATTN           YES
         JNEZ,D1  PR:LPFLG,LPATTN   TEST FOR LP DEVICE
         MTW,0    ATTNFLG           TEST ATTN FLAG
         BNE      ATTN2                 SET, 2ND ATTN
         MTW,1    ATTNFLG           SET ATTN FLAG
*
ATTN1    EQU      %
         LI,AC2   #BSUL             GET UL-BS SEQUENCE
         B        STBSUL            STORE UL-BS SEQUENCE
*
ATTN2    EQU      %
         MTW,-1   ATTNFLG           RESET ATTN FLAG
         LI,AC2   #ULBS             GET BS-UL SEQUENCE
*
STBSUL   EQU      %
         MTW,1    ATTNCNT           INCREMENT ATTN COUNT
         LB,AC3   TRMTYPE           GET TERMINAL TYPE
         CI,AC3   3                 TEST FOR TTY (<=3)
         BLE      TTYATTN              YES, SET TTY ATTN
*
         STB,AC2  0,X2              STORE FIRST CHAR IN UL-BS SEQUENCE
         AI,X2    1                 INCREMENT OUTPUT POINTER
         MTW,1    OUTSZ             INCREMENT OUTPUT SIZE
         SLS,AC2  -8                SHIFT NEXT CHAR TO STORE POSITION
         B        STCHAR            STORE NEXT CHAR
*
TTYATTN  EQU      %
         LI,AC2   #UL               UNDERLINE ONLY FOR TTY
         B        INCRPSTN          GO STORE CHAR
*
LPATTN   EQU      %
         LI,AC2   X'5B'             '%' CHAR FOR LP ATTN
         B        INCRPSTN          GO STORE CHAR
*
DSPATTN  RES      0
         LI,AC2   '@'               REPLACE ATTN WITH '@'
         B        INCRPSTN
*
*
         PAGE
*
*
STOPFND  EQU      %
         JLZ,D1   PR:FMTFLG,AESTOP  TEST FOR 'AS-ENTERED'
         JEZ,D1   PR:HFSAV,TSTLPSTP TEST FOR HEADING/FOOTING LINE
         MTW,0    NSTOP                 YES, TEST FOR FIRST STOP CODE
         BNE      GETNXTIN          NOT FIRST, GET NEXT INPUT CHAR
*
         LW,D1    X2                GET NEXT OUTPUT POINTER
         SW,D1    FSTOUT            SUBTRACT OUTPUT START ADDR
         AI,D1    1
         STW,D1   NSTOP             SAVE DISP.FOR PAGE NUMBER
         AI,X2    4                 INCREMENT OUTPUT POINTER
         MTW,4    CPSTN             INCREMENT CARRIER POSITION
         MTW,4    OUTSZ             INCREMENT OUTPUT SIZE
         B        GETNXTIN          GET NEXT INPUT CHAR
*
TSTLPSTP EQU      %
         JNEZ,D1  PR:LPFLG,STCHAR   BRANCH IF OUTPUT TO LP
         MTW,1    NSTOP             INCREMENT STOP COUNT
         B        STCHAR            GO STORE STOP CODE
*
AESTOP   EQU      %
         LI,AC2   #UL               GET UNDERLINE CHAR
         B        INCRPSTN          GO STORE
*
*
         PAGE
*
*
TABFND   EQU      %
         MTW,0    DISPFLG           IN DISPLAY MODE
         BNEZ     DSPTABS           YES
         LI,X3    1                 START AT FIRST TAB SETTING
GETABLP  EQU      %
         JEZ,D1   (WS:TABS,X3),ZROTABS  TEST NEXT TAB SETTING
         AI,X3    1                 INCREMENT TAB INDEX
         AI,D1    -1
         CW,D1    CPSTN             COMPARE TO PRESENT POSITION
         BLE      GETABLP               <=, TEST NEXT SETTING
         STW,D1   CPSTN                 >, SAVE NEW POSITION
         B        STCHAR            GO STORE TAB CHAR
*
ZROTABS  EQU      %
         LI,AC2   #BLANK            NO TAB SETTING, STORE BLANK
         B        INCRPSTN
*
DSPTABS  RES      0
         CW,X2    DTABFLG           WAS LAST CHAR = TAB
         BNE      DTABS20           NO
         AI,X2    -1                DECR OUTPUT POINTER
         B        DTABS40
*
* HERE IF 1ST TAB IN SEQUENCE
DTABS20  RES      0
         MTW,1    CPSTN             INCR CARRIER POSITION
         MTW,1    OUTSZ             INCR OUTPUT SIZE
         LI,AC2   '@'               GET A '@' CHAR
         STB,AC2  0,X2              STORE '@' IN OUTPUT LINE
         AI,X2    1                 INCR OUTPUT POINTER
*
         MTW,1    CPSTN             INCR CARRIER POSITION
         MTW,1    OUTSZ             INCR OUTPUT SIZE
DTABS40  RES      0
         LI,AC2   'T'               GET A 'T' CHAR
         STB,AC2  0,X2              STORE 'T' IN OUTPUT LINE
         AI,X2    1                 INCR OUTPUT POINTER
*
         STW,X2   DTABFLG           SAVE OUTPUT POINTER
         MTW,1    DTABFLG           INCR TO CHAR AFTER FINAL '@'
         LI,AC2   '@'               GET A '@' CHAR
         B        INCRPSTN          GO STORE IN LINE
*
LPTABS   EQU      %
         SW,D1    CPSTN             CALC NUMBER OF BLANKS
         LW,BUF1  X2                GET NEXT OUTPUT ADDR
         STB,D1   BUF1              STORE COUNT FOR INSERT
         MBS,0    L(#BLANKS)        INSERT BLANKS
         LW,X2    BUF1              GET NEW OUTPUT POINTER
         AWM,D1   OUTSZ             INCR SIZE
         AWM,D1   CPSTN             INCR POSITION
         B        GETNXTIN          GET NEXT INPUT CHAR
*
BKSPFND  EQU      %
         MTW,-1   CPSTN             DECREMENT CARRIER POSITION
         BGEZ     STCHAR            GO STORE BKSP IF CPSTN NOT NEG.
         MTW,1    CPSTN             INCREMENT CPSTN AND SKIP BKSP
         B        GETNXTIN
*
ATFND    RES      0
         MTW,0    DISPFLG           IN DISPLAY MODE
         BEZ      INCRPSTN          NO
         MTW,1    CPSTN             INCR CARRIER POSITION
         MTW,1    OUTSZ             INCR OUTPUT SIZE
         STB,AC2  0,X2              STORE CHAR IN LINE
         AI,X2    1                 INCR OUTPUT POINTER
         B        INCRPSTN
*
         PAGE
INLNFIN  EQU      %
         LI,D1    0                 SET INPUT LINE SIZE TO ZERO
         STW,D1   INSZ
*
RESLNSTA EQU      %
         LCI      SZLNSTA-2         RESTORE LINE STATUS TABLE
         LM,X3    SAVLNSTA+2
         LCI      SZLNSTA
         STM,X1   LNSTA
*
RTNPSCAN EQU      %
         LCI      3                 GET RETURN ARGS
         LM,AC1   ATTNCNT
         RETURN
*
*
         PAGE
*
*
INCRWRD  EQU      %
         MTW,1    WRDCNT            INCREMENT CURRENT WORD SIZE
         B        UNFBRTBL,X3       GO HANDLE CHARACTER
*
TRMWRD   EQU      %
         MTW,0    WRDCNT            TEST WORD SIZE
         BEZ      UNFBRTBL,X3           ZERO, GO HANDLE CHARACTER
         MTW,0    PHKTFLG           PHRASE KEEP-TOGETHER
         BNEZ     INCRWRD           YES, NOT END OF WORD
         AI,X1    -1                    NON-ZERO, DECREMENT INPUT PTR
         MTW,1    INSZ              INCREMENT INPUT SIZE
*
TSTLNSZ  EQU      %
         LW,D1    CPSTN             GET CURRENT POSITION
         CW,D1    MXPSTN            TEST FOR MAX POSITION
         BG       GOBACK                >, GO BACK TO PREVIOUS WORD
         BE       ENDFMTLN              =, END OF OUTPUT LINE
*
         LCI      SZLNSTA-2         NOT END OF LINE, SAVE STATUS
         LM,X3    SAVLNSTA+2
         LCI      SZLNSTA
         STM,X1   LWLNSTA
*
         LI,D1    0
         STW,D1   WRDCNT            SET NEXT WORD SIZE TO ZERO
         PUT,D1   PR:NLFLG          RESET NEW-LINE FLAG
         B        GETNXTIN          GET NEXT INPUT CHARACTER
*
FMTTAB   EQU      %
         JNEZ,D1  PR:PRFLG,TRMWRD   TEST NEW PARAGRAPH FLAG
         LI,AC2   #BLANK            GET BLANK CHAR
         LI,X3    0                 SET INDEX FOR UNF BRANCH
         B        TRMWRD            GO TEST TERM WORD
*
*
         PAGE
*
*
GOBACK   EQU      %
         JNEZ,D1  PR:NLFLG,ENDFMTLN IF NEW-LINE FLAG SET, END OF LINE
         LCI      SZLNSTA           GET LINE STATUS FOR PREVIOUS WORD
         LM,X1    LWLNSTA
         STM,X1   SAVLNSTA
*
ENDFMTLN EQU      %
         LI,D1    1                 SET END-OF-LINE FLAG
         PUT,D1   PR:LNFIN
         MTW,0    INSZ              TEST REMAINING IN SIZE
         BLEZ     RESLNSTA             ZERO, RETURN
*
TSTLNEND EQU      %
         LB,AC2   0,X1              GET NEXT INPUT CHAR
         CI,AC2   #BLANK            TEST FOR BLANK
         BE       MVLNSTA              YES, INCR. PTRS
         CI,AC2   #TAB              TEST FOR TAB
         BE       MVLNSTA              YES, INCR PTRS
         CI,AC2   #CR               TEST FOR END-OF-LINE
         BNE      RESLNSTA             NO, RETURN
*
MVLNSTA  EQU      %
         MTW,-1   INSZ              DECR. INPUT SIZE
         BLEZ     RESLNSTA             ZERO, RETURN
         AI,X1    1                 INCR. POINTER
         B        TSTLNEND          TEST NEXT CHAR
*
*
         PAGE
*
*
FMTCR    EQU      %
         MTW,0    WRDCNT            TEST FOR WORD STARTED
         BEZ      INLNFIN              NO, INPUT LINE FINISHED
         LW,D1    MXPSTN               YES, GET MAX POSITION
         SW,D1    CPSTN             SUBTRACT CURRENT POSITION
         BLZ      GOBACK               <0, GO BACK
         MTW,0    INSFLG            INSERT MODE
         BEZ      FMTCR40           NO
         LW,X4    SVINPTR           GET INPUT POINTER OF MAIN LINE
FMTCR30  RES      0
         LB,AC3   0,X4              GET NEXT MAIN LINE CHAR
         CI,AC3   #BLANK            IS CHAR = ' '
         BE       FMTCR45           YES
         CI,AC3   #CR               IS CHAR = CR
         BE       FMTCR45           YES
         CI,AC3   #TAB              IS CHAR = TAB
         BE       FMTCR45           YES
         AI,X4    1                 INCREMENT MAIN LINE INPUT POINTER
         AI,D1    -1                DECREMENT REMAINING SPACE COUNT
         BLZ      GOBACK            NO MORE SPACE
         B        FMTCR30
FMTCR40  RES      0
         AI,D1    -2                   >=0, TEST FOR MORE ROOM
         BLEZ     ENDFMTLN          NO ROOM, END OF LINE
*
FMTCR45  RES      0
         LCI      SZLNSTA-2         SAVE LAST WORD ENDING
         LM,X3    SAVLNSTA+2
         LCI      SZLNSTA
         STM,X1   LWLNSTA
*
         DEPZ,D1  PR:NLFLG          RESET NEW-LINE FLAG
         MTW,0    INSLFLG           LAST LINE OF INSERT GROUP
         BNEZ     INLNFIN           YES, DONT ADD BLANK(S)
         LW,X3    X2                GET OUTPUT POINTER
         AI,X3    -1                DECR. TO LAST CHAR
         LB,AC3   0,X3              GET LAST CHAR
         CI,AC3   X'F0'             TEST FOR CONTROL CHAR
         BAZ      INLNFIN              YES, INPUT LINE DONE
         LI,AC1   2                 MAX OF TWO BLANKS ADDED
         LI,X4    SZTRMTBL          SIZE OF TERM. CHAR TABLE
*
*
         PAGE
*
*
TSTPERLP EQU      %
         CB,AC3   TRMTBL,X4         TEST FOR PERIOD,ETC.
         BE       ADDBLNKS             YES, GO ADD BLANKS
         BDR,X4   TSTPERLP             NO, TEST NEXT
         LI,AC1   1                 ONE BLANK ONLY
*
ADDBLNKS EQU      %
         LI,AC2   #BLANK            GET BLANK CHAR
         AI,AC1   -1                DECR. BLANK COUNT
         BLEZ     INCRPSTN          ONE ONLY, GO STORE
         STB,AC2  0,X2              TWO, STORE FIRST
         AI,X2    1                 INCR. OUT POINTER
         MTW,1    CPSTN             AND CARRIER POSITION
         MTW,1    OUTSZ             AND OUTPUT LINE SIZE
         B        INCRPSTN          NOW STORE 2ND BLANK
*
*
TRMTBL   DATA,1   0,'!',':','?','.'  CHARS THAT NEDD 2 BLANKS
SZTRMTBL EQU      BA(%)-BA(TRMTBL)-1
         BOUND    4
*
*
         PAGE
*
*
* S38INS1 -- INSERT CHARACTERS IN CURRENT SCAN LINE.
*            THE INSERT STRING IS THE LAST LINE OR ONLY
*            LINE OF A GROUP.
*
*            FORMATTED MODE - SPECIAL END OF INPUT LINE PROCESSING
*                             IS INHIBITED (E.G. SPACE AFTER LAST
*                             CHARACTER).
*            UNFORMATTED MODE - END OF LINE IS NOT FORCED
*                               IMMEDIATELY AFTER INSERT STRING.
*
* S38INS2 -- INSERT CHARACTERS IN CURRENT SCAN LINE.
*            THE INSERT STRING IN NOT THE LAST LINE OF A GROUP.
*
*            FORMATTED MODE - NORMAL END OF INPUT LINE PROCESSING
*                             IS PERFORMED AT END OF INSERT STRING.
*            UNFORMATTED MODE - END OF LINE IS FORCED AFTER INSERT
*                               STRING.
*
* ENTRY:  BUF1 = BYTE ADDRESS OF INSERT LINE
*         AC1  = SIZE OF INSERT LINE
*
* THIS ROUTINE TAKES THE SPECIFIED INPUT CHARACTER STRING
* AND INSERTS IT FOR FORMATTING ACCCORDING TO THE CURRENT
* PRINT SPECIFICATIONS FOR PRINTOUT
*
* ALL INPUT STRINGS SHOULD BE TERMINATED WITH A CR CHARACTER.
*
S38INS1  RES      0
         LI,D1    1                 SET FOR LAST LINE OF GROUP
         JGZ,D2   PR:FMTFLG,SNSRT10 BRANCH IF FORMATTED MODE
         AI,AC1   -1                STRIP OFF CR CHAR
         B        SNSRT10
S38INS2  RES      0
         LI,D1    0                 SET FOR NON-LAST LINE OF GROUP
SNSRT10  RES      0
         STW,D1   INSLFLG           SET LAST LINE FLAG
         MTW,1    INSFLG            SET INSERT FLAG
         SAVRTN
         GET,D1   LN:INPTR
         STW,D1   SVINPTR           SAVE CURRENT INPUT POINTER
         GET,D1   LN:INSZ
         STW,D1   SVINSZ            SAVE CURRENT INPUT SIZE
         LW,D1    BUF1
         PUT,D1   LN:INPTR          SET UP NEW INPUT POINTER
         PUT,AC1  LN:INSZ           SET UP NEW INPUT SIZE
SNSRT50  RES      0
         BAL,SRTN S38PSCAN          GO SCAN INSERT STRING
         JGZ,D1   PR:FMTFLG,SNSRT80  BRANCH IF FORMATTED MODE
         LW,D2    LSTCHAR           GET LAST INPUT CHAR
         CI,D2    #CR               WAS IT A CR CHAR
         BNE      SNSRT500          NO, EXIT
         BAL,SRTN S08PRLN           PRINT LINE
         BAL,SRTN S09RESLN          RESET OUTPUT LINE
         B        SNSRT400          GO EXIT
SNSRT80  RES      0
         LI,D2    0
         PUT,D2   PR:PRFLG          RESET NEW PARAGRAPH FLAG
         STW,D2   LSTPLN            RESET PARAGRAPH LAST-LINE FLAG
         JEZ,D1   PR:LNFIN,SNSRT500 IF OUTPUT LINE NOT FINISHED, EXIT
         BAL,SRTN S08FMTPR          PRINT FORMATTED LINE
         JGZ,D1   LN:INSZ,SNSRT50   IF MORE INPUT, GO SCAN
SNSRT400 RES      0
         GET,X2   LN:OUTPTR         GET NEW OUTPUT POINTER
         GET,D1   LN:OUTSZ          GET NEW OUTPUT SIZE
         STW,D1   OUTSZ             SAVE
         GET,D1   LN:CPSTN          GET NEW CARRIER POSITION
         STW,D1   CPSTN             SAVE
         GET,D1   LN:STKEY          GET NEW START KEY
         STW,D1   STKEY             SAVE
         GET,D1   LN:NSTOP          GET NEW STOP COUNT
         STW,D1   NSTOP             SAVE
SNSRT500 RES      0
         LCI      SZLNSTA-3
         LM,X4    SAVLNSTA+3        GET SAVED STATUS TABLE
         LW,X1    SVINPTR           GET OLD INPUT POINTER
         LW,X3    SVINSZ            GET OLD INPUT SIZE
         LCI      SZLNSTA
         STM,X1   LNSTA             RESTORE OLD STATUS TABLE
         LI,D1    0
         STW,D1   INSFLG            RESET INSERT FLAG
         STW,D1   INSLFLG           RESET LAST INSERT LINE FLAG
         RETURN
         PAGE
*
* S38ISCAN -- SCAN INPUT LINE
*
* EXIT PARAMETER: SR3=0 FOR ATTN FOUND
*                    =1 FOR INPUT BUFFER EMPTY
*                    =2 FOR MAX CARRIER POSITION
*                 X1 =ADDR OF CHAR AFTER RETURN CHARACTER
*                 LN:OUTSZ=INPUT LINE SIZE CHANGE (EG. '@@'='@')
*
S38ISCAN EQU      %
         SAVRTN
*
         LCI      SZLNSTA           GET LINE STATUS TABLE
         LM,X1    LNSTA
         STM,X1   SAVLNSTA          SAVE LINE STATUS TABLE
         LI,D1    0                 INITIALIZE MAX FLAG
         STW,D1   CPMAXFLG
         STW,D1   OUTSZ             SAVE AS INITIAL OUTPUT LINE SIZE
*
NWINCHAR EQU      %
         MTW,-1   INSZ              DECREMENT INPUT SIZE
         BLZ      INBUFZRO              ZERO, RETURN
         LB,AC2   0,X1              GET NEXT CHAR IN LINE
         AI,X1    1                 INCREMENT INPUT LINE POINTER
*
         LI,X3    SZINTBL           GET SIZE OF BRANCH TABLE
INCOMPLP EQU      %
         LW,X4    INCMPTBL,X3       GET NEXT TABLE ENTRY
         CB,AC2   X4                TEST CHAR
         BG       INCRCP            BRANCH IF NOT A SPECIAL CHARACTER
         BE       0,X4                  EQUAL, HANDLE CHARACTER
         BDR,X3   INCOMPLP              NOT EQUAL, TEST NEXT
*
*
         PAGE
*
*
INCRCP   EQU      %
         LW,D1    CPSTN             GET CURRENT CARRIER POSITION
         AI,D1    1                 INCREMENT FOR CHAR
CHKPSTN  EQU      %
         CW,D1    MXPSTN            TEST FOR MAX POSITION
         BG       CPMAXFND              YES, GO HANDLE MAX POSITION
         STW,D1   CPSTN                 NO, STORE NEW CARRIER POSITION
         B        NWINCHAR          GET NEXT INPUT CHAR
*
*
INCMPTBL EQU      %-1
         GEN,8,24 #ATTN,INATTN      ATTN CHAR
         GEN,8,24 #TAB,INTAB        TAB CHAR
         GEN,8,24 #BKSP,INBKSP      BKSP CHAR
         GEN,8,24 #CR,NWINCHAR      CR CHAR (NO ACTION)
         GEN,8,24 #STOP,NWINCHAR    STOP CODE
         GEN,8,24 '@',INATSGN       '@' CHAR, USED FOR DISPLAY MODE
SZINTBL  EQU      %-INCMPTBL-1      SIZE OF BRANCH TABLE
*
*
         PAGE
*
*
INATTN   EQU      %
         LI,BUF1  0                 SET RETURN CODE TO 0
         B        RTNISCAN          RETURN
*
INTAB    EQU      %
         LI,X3    1                 START WITH FIRST TAB SETTING
INTABLP  EQU      %
         JEZ,D1   (WS:TABS,X3),INCRCP   GET NEXT TAB SETTING
         AI,D1    -1
         CW,D1    CPSTN             COMPARE TO CARRIER POSITION
         BG       CHKPSTN               >, GO CHECK NEW POSITION
         AI,X3    1                     <=, TEST NEXT TAB SETTING
         B        INTABLP           GET NEXT TAB SETTING
*
INBKSP   EQU      %
         MTW,0    CPMAXFLG          TEST CP MAX FLAG
         BLEZ     DECRPSTN             RESET MAX FLAG
         MTW,-1   CPMAXFLG             SET, DECR.
         B        SHFTINLN          GO SHIFT INPUT LINE
*
DECRPSTN EQU      %
         MTW,-1   CPSTN             DECREMENT CARRIER POSITION
         BGEZ     NWINCHAR          GET NEXT CHARACTER
         MTW,1    CPSTN             SET BACK TO ZERO
         B        SHFTINLN          GO SHIFT LINE
*
         PAGE
INATSGN  RES      0
         MTW,0    DISPFLG           IN DISPLAY MODE
         BEZ      INCRCP            NO
         STW,X1   TEMP              SAVE CURRENT INPUT POINTER
*
* HERE TO CHECK FOR DOUBLE 'AT' SIGN ('@@' = '@')
         LB,AC2   0,X1              GET NEXT CHAR
         CI,AC2   '@'               IS CHAR = '@'
         BNE      ATSGN25           NO
         AI,X1    1                 INCR INPUT POINTER
         MTW,-1   INSZ              DECR LINE SIZE BY 1
         MTW,-1   OUTSZ             DECR OUTPUT LINE SIZE BY 1
         B        SHFTINLN          SHIFT LINE TO DELETE 2ND '@'
*
* HERE TO TEST FOR SPECIAL DISPLAY MODE TAB(S) '@TTT...T@'
ATSGN20  RES      0
         AI,X1    1                 INCR INPUT POINTER
ATSGN25  RES      0
         LB,AC2   0,X1              GET NEXT CHAR
         CI,AC2   'T'               IS CHAR = 'T'
         BE       ATSGN20           YES
         CI,AC2   '@'               IS CHAR = '@'
         BNE      ATSGN90           NO, NOT SPECIAL TAB(S)
         AI,X1    -1                DECR INPUT POINTER
         LW,AC2   X1                GET DESTINATION ADDR FOR SHIFT
         LW,AC3   INSZ              GET SIZE FOR SHIFT
         STB,AC3  AC2               STORE SIZE
         MBS,AC2  2                 SHIFT LINE LEFT 2 CHARS
         MTW,-2   INSZ              DECR LINE SIZE BY 2
         MTW,-2   OUTSZ             DECR OUTPUT LINE SIZE BY 2
         AI,X1    -1                DECR INPUT POINTER
         LI,AC2   #TAB              GET A TAB CHAR
         CW,X1    TEMP              CHECK FOR ONLY 1 TAB CHAR
         BL       ATSGN45           YES
ATSGN40  RES      0
         STB,AC2  0,X1              SUBSTITUTE TAB FOR 'T'
         AI,X1    -1                DECR INPUT POINTER
         CW,X1    TEMP              FINISHED
         BGE      ATSGN40           NO
ATSGN45  RES      0
         STB,AC2  0,X1              STORE LAST TAB CHAR
         AI,X1    1                 INCR INPUT POINTER
         B        INTAB             GO HANDLE TAB(S)
*
* HERE TO SUBSTITUTE ATTN CHAR FOR '@' CHAR
ATSGN90  RES      0
         LW,X1    TEMP              RESTORE INPUT POINTER
         LI,AC2   #ATTN             GET ATTN CHAR
         AI,X1    -1                DECR INPUT LINE POINTER
         STB,AC2  0,X1              REPLACE '@' WITH ATTN
         AI,X1    1                 INCR INPUT LINE POINTER
         B        INATTN
         PAGE
*
*
CPMAXFND EQU      %
         MTW,1    CPMAXFLG          INCR. CP MAX FLAG
SHFTINLN EQU      %
         AI,X1    -1                DECREMENT INPUT LINE POINTER
         LW,AC2   X1                GET ADDR FOR MOVE
         LW,AC3   INSZ              SIZE FOR SHIFT
         BLEZ     INBUFZRO             ZERO, RETURN
         STB,AC3  AC2               STORE COUNT FOR SHIFT
         MBS,AC2  1                 SHIFT LINE
         B        NWINCHAR          GET NEXT CHAR
*
INBUFZRO EQU      %                 INPUT BUFFER EMPTY
         LI,BUF1  1                 SET RETURN CODE
         LW,D1    CPSTN             GET CURRENT POSITION
         CW,D1    MXPSTN            TEST FOR MAX POSITION
         BL       RTNISCAN             NO, RETURN
         LI,BUF1  2                    YES, SET PROPER RETURN
*
RTNISCAN EQU      %
         LCI      SZLNSTA-1         GET LOCAL LINE STATUS TABLE
         LM,X2    SAVLNSTA+1
         LCI      SZLNSTA           STORE LINE STATUS TABLE
         STM,X1   LNSTA
         LW,SR3   BUF1              SET RETURN CODE
         RETURN
         PAGE
*
* LOCAL VARIABLES FOR SCAN ROUTINE
38D      CSECT    0                 START OF LOCALS
APADDR   RES      1                 ACTION PROGRAM ADDR
FSTOUT   RES      1                 ADDR OF FIRST OUTPUT CHAR
WRDCNT   RES      1                 SIZE OF CURRENT WORD
BRTBL    RES      1                 ADDR OF BRANCH TABLE
*
ATTNCNT  RES      1                 ATTN COUNT
ATTNFLG  RES      1                 ATTN FLAG
LSTCHAR  RES      1                 LAST CHAR
CPMAXFLG RES      1
*
SAVLNSTA EQU      %                 LOCAL LINE STATUS TABLE
         RES      SZLNSTA
LWLNSTA  EQU      %                 LAST WORD LINE STATUS TABLE
         RES      SZLNSTA
*
INPTR    EQU      SAVLNSTA+:EO(LN:INPTR)     INPUT LINE POINTER
OUTPTR   EQU      SAVLNSTA+:EO(LN:OUTPTR)    OUTPUT LINE POINTER
INSZ     EQU      SAVLNSTA+:EO(LN:INSZ)      INPUT LINE SIZE
OUTSZ    EQU      SAVLNSTA+:EO(LN:OUTSZ)     OUTPUT LINE SIZE
STKEY    EQU      SAVLNSTA+:EO(LN:STKEY)     OUTPUT LINE 1ST KEY
CPSTN    EQU      SAVLNSTA+:EO(LN:CPSTN)     CURRENT CARRIER POSITION
MXPSTN   EQU      SAVLNSTA+:EO(LN:MXPSTN)    MAX CARRIER POSITION
NSTOP    EQU      SAVLNSTA+:EO(LN:NSTOP)     NUMBER OF STOP CODES
*
LWINPTR  EQU      LWLNSTA+:EO(LN:INPTR)           LW INPUT POINTER
LWINSZ   EQU      LWLNSTA+:EO(LN:INSZ)            LW INPUT SIZE
*
SVINPTR  RES      1                 INPUT POINTER SAVE WORD
SVINSZ   RES      1                 INPUT SIZE SAVE WORD
TEMP     RES      1                 TEMP WORD
DTABFLG  RES      1                 DISPLAY TABS FLAG
INSLFLG  DATA     0                 INSERT LAST LINE FLAG
INSFLG   DATA     0                 INSERT FLAG
         USECT    #PLOC
         END
