* 03/23/77 -- 11:30
* MODULE NAME: EXEC
* NUMBER: 1
* PURPOSE: MAIN CONTROL PROGRAM FOR UTS/TEXT
*
*
         SYSTEM   TEXTDEF
         SYSTEM   ITEMDEF
         INVCMDSTA
         INVWSSTA
         INVHDRSTA
         INVTAGSTA
         INVLNSTA
*
         DEF      TEXTMAIN          ENTRY POINT FOR TEXT
         DEF      S01SCAN           SCAN INPUT LINES FOR COMMANDS
         DEF      S01TXTLN          WRITE TEXT AND HEADER LINES
         DEF      ZRORTNST          INITIALIZE RETURN STACK
         DEF      CMDERRFG          COMMAND ERROR FLAG
*
         REF      S02INIT,S27RTNL,S26CMD,S27WTXT
         REF      S38ISCAN,S29STD
         REF      S27WHDR
         REF      S27RTEL
         REF      S07RDTAG,S07TGOCC
         REF      ZRTNSTK
         REF      DISPFLG           DISPLAY MODE FLAG
         REF      DISPERR           DISPLAY ERROR FLAG
         REF      BATCHFLG          BATCH MODE FLAG
         REF      S27PRINT          PRINT A LINE
         REF      S04FCHK           FILE OUTPUT MODE CHECK
*
*
*
         DEF      1P,1D
1P       EQU      %
         DATA     X'01'             MODULE NUMBER
         DATA     X'032377'         DATE
         DATA     X'1130'           TIME
*
         TITLE    '** EXEC(1) **'
*
* TEXTMAIN -- ENTRY POINT FOR TEXT
*
*
TEXTMAIN EQU      %
         LI,D1    1
         PUT,D1   #PRNTFLG          INITIALIZE PRINT FLAG
         BAL,SRTN S02INIT
*
ZRORTNST EQU      %
         LCI      2                 INITIALIZE RETURN STACK
         LM,AC1   ZRTNSTK
         STM,AC1  RTNSTACK
*
NEWLINE  EQU      %
         LI,BUF1  0                 INITIALIZE TO 0
         STW,BUF1 CMDERRFG            COMMAND ERROR FLAG
         LW,BUF1  BATCHFLG          IF BATCH MODE
         STB,BUF1 BATCHFLG            SET TO USE F:LL DCB
         LI,BUF1  BA(STDINBUF)+1    GET INPUT BUFFER ADDR
         AW,BUF1  BATCHFLG          IF BATCH MODE ADD ATTN
         BAL,SRTN S27RTNL           READ NEW INPUT LINE
         MTW,0    BATCHFLG          BATCH
         BLEZ     NEWLINE5          NO
         LI,BUF1  BA(STDINBUF)+2    GET INPUT BUFFER ADDR
         BAL,SRTN S27PRINT          PRINT LINE
         LI,D1    #ATTN             GET AN ATTN CHAR
         AI,BUF2  -1                BACK UP FOR ATTN STORE
         STB,D1   0,BUF2            STORE ATTN AS FIRST CHAR
         AI,AC1   1                 ADD 1 TO SIZE FOR ATTN
         LI,AC2   1                 SET TO 1 ATTN
         B        GOSCAN
NEWLINE5 RES      0
         GET,D1   #LKEYVAL          GET LAST KEY
         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)        SET UP COUNT
         PUT,D1   #NXTKEY           SET NEXT KEY VALUE
*
GOSCAN   EQU      %
         BAL,SRTN S01SCAN           SCAN INPUT LINE
         CI,AC1   0                 TEST FOR ZERO LINE SIZE
         BGZ      TSTERR               >0, GO WRITE TEXT LINE
TSTACTN  EQU      %
         JEZ,D1   #APADDR,NEWLINE   TEST FOR ACTION PROGRAM
         DEPZ,D2  #APADDR           RESET ACTN PROG ADDR
         BAL,SRTN *D1               GO TO ACTION PROGRAM
         B        TSTACTN           TEST FOR MORE ACTION
*
*
         PAGE
*
*
TSTERR   EQU      %
         MTW,0    BATCHFLG          BATCH
         BLEZ     TSTERR5           NO
         LI,AC1   69                SET UP 'INVALID BATCH COM' MSG
         BAL,SRTN S29STD            GO WRITE MESSAGE
         B        NEWLINE
TSTERR5  RES      0
         CI,SR3   0                 TEST FOR EMBEDDED COMMAND ERROR
         BE       WRTXTLN              NO, WRITE TEXT LINE
         BAL,SRTN S27RTEL              YES, PRINT AND EDIT REST OF LINE
         B        GOSCAN            NOW RE-SCAN LINE
*
WRTXTLN  EQU      %
         MTW,0    CMDERRFG          DID ACTION PROGRAM SET ERROR FLAG
         BNEZ     NEWLINE           YES, DON'T WRITE LINE
         BAL,SRTN S04FCHK           CHECK FOR FILE OUTPUT MODE
         LI,BUF3  BA(STDINBUF)      GET BUFFER ADDR FOR WRITE
         STB,AC2  0,BUF3            STORE ATTN COUNT IN FIRST BYTE
         AI,AC1   1                 INCREMENT SIZE BY ONE
*
         GET,D1   #NXTKEY           GET NEXT WRITE KEY
         CW,D1    L(#MAXKEY)        CHECK FOR MAX KEY
         BG       LNERR                >9999.999, ERROR
         PUT,D1   #LKEY                KEY OK, STORE IN LAST KEY
         PUT,D1   #CLP              AND IN CLP
         LW,AC2   D1                GET KEY FOR WRITE
*
         BAL,SRTN S01TXTLN          GO WRITE TEXT LINE
         B        NEWLINE           GET NEXT INPUT LINE
*
LNERR    EQU      %                 LINE NUMBER ERROR
         LI,AC1   25                'DOCUMENT TOO LARGE' MESSAGE
         BAL,SRTN S29STD            GO PRINT MESSAGE
         B        NEWLINE           GO GET NEW LINE
*
*
         PAGE
*
* SCAN LINE FOR COMMANDS
*
* ENTRY: BUF2 = ADDR OF BUFFER
*        AC1  = NUMBER OF CHARS
*             = 0 IF SYSTEM COMMAND
*        AC2  = NUMBER OF ATTN CHARS
*
S01SCAN  EQU      %
         SAVRTN
*
         LI,SR3   0                 INITIALIZE:
         PUT,SR3  #APADDR              ACTION PROGRAM ADDR
         PUT,SR3  HDR:WRD              HEADER CONTROL WORD
         CI,AC1   0                 TEST FOR ZERO SIZE
         BLE      SCANRTN              YES, RETURN
         CI,AC2   0                 TEST FOR ATTN CHARS
         BLE      SCANRTN               NONE, RETURN
         STW,BUF2 LNSTART               YES, SAVE LINE STARTING ADDR
         LCI      2
         STM,AC1  ARGSAVE           SAVE NUMBER OF CHARS AND ATTN COUNT
*
         LI,D1    0
         STW,D1   ATTNFLG           INITIALIZE ATTN FLAG
         STW,D1   ATTNKNT           INITIALIZE ATTN COUNT
         STW,D1   CRFLG             INITIALIZE CRFLG
         PUT,D1   LN:CPSTN          SET CARRIER POS. TO ZERO
         LI,D1    #MXLNSZ           GET MAX CARRIER POSITION
         PUT,D1   LN:MXPSTN         STORE IN LINE TABLE
         PUT,AC1  LN:INSZ           NUMBER OF INPUT CHARS
         AW,AC1   LNSTART           CALCULATE LAST CHAR ADDR
         STW,AC1  LSTCHAR           SAVE LAST CHAR ADDR
         LW,X1    LNSTART           LINE STARTING ADDR
*
*
         PAGE
*
*
LINESCAN EQU      %
         PUT,X1   LN:INPTR          SET STARTING CHAR FOR SCAN
         BAL,SRTN S38ISCAN          SCAN INPUT LINE
         GET,D1   LN:OUTSZ          GET LINE SIZE DIFFERENCE
         AWM,D1   LNSZ              MODIFY ORIGINAL LINE SIZE
         AI,SR3   WA(SCANTBL)       CALCULATE BRANCH ADDR
         B        *SR3
*
SCANTBL  EQU      %
         B        ATTNFND           ATTN CHAR FOUND
         B        CRFND             LINE SIZE ZERO
         B        CRFND             MAX POSITION
*
*
ATTNFND  EQU      %                 ATTN CHARACTER FOUND
         MTW,1    ATTNKNT           INCREMENT ATTN COUNT
         LW,D1    ATTNFLG           TEST ATTN FLAG
         BNEZ     ATTNSET               SET
*
         STW,X1   ATTNFLG               RESET, STORE CHAR INDEX
         B        LINESCAN          NON-ZERO, CONTINUE SCAN
*
ATTNSET  EQU      %
         PUT,D1   #CMDST            STORE IN CMDSTA
         STW,X1   CHARINDX          SAVE CHAR INDEX
         SW,X1    ATTNFLG           CALCULATE COMMAND SIZE
         PUT,X1   #NCHCMD           STORE IN CMDSTA
         LI,D1    0
         PUT,D1   #IOFLG            SET I/O FLAG FOR INPUT COMMAND
         STW,D1   ATTNFLG           RESET ATTN FLAG
         LW,BUF2  LNSTART           GET START-OF-LINE ADDR
         BAL,SRTN S26CMD            INTERPRET COMMAND
*
         PAGE
*
*
TSTCMD   EQU      %
         CI,SR3   0                 TEST FOR EMBEDDED COMMAND ERROR
         BNE      ECMDERR              YES, HANDLE ERROR
         JEZ,D1   #EMBFLG,SYSCMD    TEST EMBEDDED COMMAND FLAG
         JEZ,D1   #APADDR,TSTCRFLG     SET, TEST FOR ACTION PROG
         DEPZ,D2  #APADDR           RESET RCTION PROG ADDR
         LW,BUF2  LNSTART           GET ADDR OF LINE START
         BAL,SRTN *D1               GO HANDLE CMD ACTION
*
TSTCRFLG EQU      %
         MTW,0    CRFLG             TEST CR FLAG FOR END-OF-LINE
         BGZ      RESARGS             SET, NOW RETURN
         LW,X1    CHARINDX            NOT SET, RESTORE LINE POINTER
         B        LINESCAN          CONTINUE LINE SCAN
*
SYSCMD   EQU      %                 SYSTEM COMMAND FOUND
         LI,AC1   0                 SET LINE SIZE TO ZERO
         B        SCANRTN           RETURN
*
*
         PAGE
*
*
ECMDERR  EQU      %
         GET,X1   #CMDST            GET ADDR OF COMMAND START
         AI,X1    -1                DECREMENT TO ATTN
         MTW,0    DISPFLG           DISPLAY MODE
         BNEZ     DISPCK            YES
         CW,X1    LNSTART           TEST FOR LINE START
         BLE      SYSCMD               YES, SYSTEM COMMAND
         LI,AC2   #CR               GET CR CHAR
         STB,AC2  0,X1              STORE AT NEW END OF LINE
         LI,AC1   0                 INITIALIZE RETURN SIZE
         SW,X1    LNSTART           CALC NEW LINE SIZE
         BLEZ     SCANRTN              ZERO, RETURN
         AI,X1    1                 INCREMENT SIZE FOR CR
         STW,X1   LNSZ              STORE LINE SIZE
*
         MTW,-2   ATTNKNT           DECR. ATTN COUNT
         LW,AC2   CRFLG             GET CR FLAG
         AWM,AC2  ATTNKNT           ADD TO ATTN COUNT
         BLEZ     ERRCRTN              ATTN COUNT ZERO, RETURN
*
TAGTEST  EQU      %
         JEZ,X1   HDR:NTAGS,ERRCRTN TEST FOR TAGS ON LINE
         LI,AC1   WA(STDX2BUF)         YES, GET TAG BUFFER
         STW,AC1  TAGBUF            STORE ADDR IN TAG BUFFER
*
*
         PAGE
*
*
TSTNXTAG EQU      %
         GET,AC2  HDR:TAGKEY,X1     GET KEY FOR TAG RECORD
         GET,D1   HDR:TAGDISP,X1    GET DISP. IN LINE
         STW,D1   TAGDISP           SAVE DISP.
         STW,X1   TAGINDX           SAVE TAG INDEX
         LI,X1    0                 SET TAG SIZE/BA
         BAL,SRTN S07RDTAG          GO REAG TAG RECORD
*
         GET,AC1  #NXTKEY           GET CURRENT RECORD KEY
         LI,AC2   0                 SET NEW TAG OCC. TO ZERO
         LW,AC3   TAGDISP           GET DISP. IN LINE
         BAL,SRTN S07TGOCC          DELETE TAG OCC.
         LW,X1    TAGINDX           GET TAG INDEX
         BDR,X1   TSTNXTAG          GO DELETE NEXT OCC
         LI,SR3   1                 SET ERROR RETURN
         B        ERRCRTN           RETURN
*
*
DISPCK   RES      0
         MTW,1    DISPERR           INDICATE ERROR CONDITION
         LI,AC2   '@'               GET '@' CHAR
         STB,AC2  0,X1              REPLACE 1ST ATTN WITH '@'
         LW,X1    CHARINDX          RESTORE LINE POINTER
         MTW,-1   ATTNKNT           ADJUST ATTN COUNT
         MTW,0    CRFLG             WAS LAST CHAR = CR
         BNEZ     RESARGS           YES
         AI,X1    -1                MOVE INPUT POINTER BACK 1 CHAR
         STB,AC2  0,X1              REPLACE 2ND ATTN WITH '@'
         AI,X1    1                 INCR INPUT PONTER
         B        LINESCAN          CONTINUE SCAN
*
*
         PAGE
*
*
CRFND    EQU      %                 CR FOUND
         LW,X1    LSTCHAR           SET INDEX TO LAST CHAR
         MTW,1    CRFLG             SET CR FLAG
         LW,D1    ATTNFLG           TEST ATTN FLAG
         BGZ      ATTNSET               SET, INTERPRET COMMAND
*
*
RESARGS  EQU      %
         LI,SR3   0                 SET NO ERROR RETURN
ERRCRTN  EQU      %
         LW,BUF2  LNSTART           GET ADDR OF LINE
         LCI      2                 GET LINE SIZE AND ATTN COUNT
         LM,AC1   ARGSAVE
*
SCANRTN  EQU      %
         RETURN
*
*
         PAGE
*
* WRITE TEXT FILE LINE AND HEADER LINE(IF CONTROL WORD SET)
*
* ENTRY: BUF3= START OF LINE
*        AC1 = SIZE OF LINE
*        AC2 = KEY FOR WRITE
*
S01TXTLN EQU      %
         SAVRTN
*
         CI,AC1   0                 TEST FOR ZERO SIZE
         BLE      TXTLNRTN             YES, RETURN
         GET,D1   #NLINES           GET CURRENT NUMBER OF LINES
         AI,D1    1                 INCREMENT FOR NEW LINE
         PUT,D1   #NLINES           STORE NEW NUMBER OF LINES
*
         BAL,SRTN S27WTXT           WRITE TEXT FILE LINE
         CI,SR3   X'57'             IS STORAGE EXHAUSTED
         BEZ      TXTLN10           YES
         JEZ,D1   HDR:WRD,TXTLNRTN  TEST FOR HEADER INFO
         GET,D1     HDR:NTAGS       GET NUMBER OF TAGS IN LINE
         AI,D1    1                 CONVERT TO BYTES
         SLS,D1   2
         LW,AC1   D1                SIZE FOR WRITE
         LI,BUF3  BA(HDRSTA)        ADDR OF HDR RECORD
         BAL,SRTN S27WHDR           WRITE HEADER RECORD
         CI,SR3   X'57'             IS STORAGE EXHAUSTED
         BNEZ     TXTLNRTN          NO
TXTLN10  RES      0
         LI,AC1   1
         PUT,AC1  #PRNTFLG          TURN PRINT FLAG ON
         LI,AC1   81                SET UP 'WS SPACE EXHAUSTED' MSG
         BAL,SRTN S29STD            GO WRITE MESSAGE
*
TXTLNRTN EQU      %
         RETURN
*
*
         PAGE
*
* EXEC -- LOCAL VARIABLES
*
*
1D       CSECT    0
*
CRFLG    RES      1                 CR FLAG
ATTNFLG  RES      1                 ATTN FLAG
CHARINDX RES      1                 CHARACTER INDEX
LNSTART  RES      1                 ADDR OF FIRST CHAR IN LINE
LSTCHAR  RES      1                 ADDR OF LAST CHAR OF READ
ARGSAVE  EQU      %
LNSZ     RES      1                 SIZE OF LINE
ATTNKNT  RES      1                 NUMBER OF ATTN CHARS
TAGINDX  RES      1                 TAG INDEX
TAGDISP  RES      1                 TAG OCC. DISPLACEMENT
CMDERRFG RES      1                 COMMAND ERROR FLAG
*
*
*
         USECT    #PLOC
         END      TEXTMAIN
