* 02/04/76 -- 16:00
* MODULE NAME: TIOSM
* NUMBER: 27A
* PURPOSE: PERFORM ALL TERMINAL          I/O SERVICES
*          AND PRELIMINARY LINE EDITING
*
* ENTRY POINTS:
*
 DEF  S27RTNL,S27RTEL,S27READ           *READ LINE FROM TERMINAL
 DEF  S27WTERM,S27PRINT                 *WRITE LINE TO TERMINAL
 DEF  S27INIT,S27END                *INITIALIZE/RESTORE M:UC
 DEF  S27UCTAB,S27TABS              *SET TABS IN DCBS
 DEF  S27SETLP,S27LPRNT,S27EJLP     *LINE PRINTER OUTPUT
         DEF      S27XPRNT,S27XOPEN,S27XCLSE      *XGP FILE OUTPUT
         DEF      FILEKEY           KEY FOR FILE OUTPUT
*
*
         SYSTEM   TEXTDEF
         SYSTEM   ITEMDEF
         INVDCBTBL
         INVWSSTA
         INVLNSTA
         INVPRSTA
*
         REF      S36PRINT,S36INPUT
         REF      S36M:DRC,S36M:TABS
         REF      S36SCOC,S36RSCOC  SET/RESET COC LINE TABLE
         REF      S36M:INT          SET BREAK CONTROL
         REF      S36OPNLP,S36M:PAGE
         REF      S36CLOSE
         REF      S29STD,S38PSCAN,S38ISCAN
         REF      BUFSZ,M:UC
         REF      RECKEY            KEYED FILE KEY
         REF      F:LO              PRINTER OUTPUT DCB
         REF      TOPMRGN,LNCOUNT   TOP MARGIN FOR XGP
         REF      S40PRINT          XGP OUTPUT FORMATTER
         REF      S36OPNVP,S36CLSVP,S36WRVP  F:VP FILE I/O
         REF      S60XBAN           WRITE XGP BANNER
         REF      C02END            END COMMAND PROCESSING
         REF      S36WFKEY          WRITE KEYED FILE
         REF      DRCFPT,TABSFPT
         REF      FILEFLG           FILE OUTPUT FLAG
         REF      BATCHFLG          BATCH MODE FLAG
         REF      3010FLG           3010 TERMINAL FLAG
         REF      3010FWD           3010 FORWARD ONLY FLAG
         REF      M:SI              M:SI DCB
         REF      M:LO              M:LO DCB
         REF      F:LL              F:LL DCB
*
*
         PAGE
*
*
*
         DEF      27AP,27AD
*
27AP     EQU      %
         DATA     X'27A'            MODULE NUMBER
         DATA     X'020476'         DATE
         DATA     X'1600'           TIME
*
*
         TITLE    '** TIOSM(27A) **'
*
* TERMINAL I/O ROUTINES
*
*
*
*
S27RTNL  EQU      %                 READ NEW INPUT LINE
         SAVRTN
         STW,BUF1 FLNSTART          SAVE BUFFER ADDR
*
RDNL     EQU      %
         LI,AC1   0                 INITIALIZE:
         STW,AC1  ATTNFIN              LAST CHAR ATTN FLAG
         STW,AC1  ATTN                 ATTN FLAG
         STW,AC1  ATTNKNT              ATTN COUNT
         STW,AC1  FLNSZ                LINE SIZE
         LW,BUF1  FLNSTART          GET STARTING ADDR FOR READ
         LI,AC2   #MXLNSZ           GET MAX READ SIZE
         BAL,SRTN S27READ           READ LINE
         B        EDITLN            GO EDIT LINE
*
*
         PAGE
*
*
S27RTEL  EQU      %                 EDIT LINE
         SAVRTN
         STW,BUF2 FLNSTART          SAVE BUFFER ADDR
         STW,AC1  FLNSZ             LINE SIZE SO FAR
         LW,X1    FLNSTART          STARTING
         AW,X1    FLNSZ             ADD SIZE
         AI,X1    -1                LAST CHAR
         LB,AC2   0,X1              GET LAST CHAR IN LINE
         CI,AC2   #CR               TEST FOR CR
         BNE      EDIT2               NO, EDIT LINE
         MTW,-1   FLNSZ               YES, REDUCE LINE SIZE BY ONE
         BLEZ     RDNL              ZERO LINE SIZE, NEW LINE
*
EDIT2    EQU      %
         LW,BUF3  FLNSTART          GET BUFFER ADDR FOR WRITE
         LW,AC1   FLNSZ             GET LINE SIZE
         BAL,SRTN S27WTERM          WRITE LINE TO TERM
*
EDIT3    EQU      %
         LW,BUF1  FLNSTART
         AW,BUF1  FLNSZ             CALCULATE NEW START FOR READ
         LI,AC2   #MXLNSZ           GET MAX BUFFER SIZE
         SW,AC2   FLNSZ             CALCULATE WHAT'S LEFT
         BAL,SRTN S27READ           READ REMAINDER OF LINE
*
*
*
         PAGE
*
*
EDITLN   EQU      %
         STW,AC1  LNSZTMP           SAVE READ SIZE
         STW,SR3  ACTTYPE           SAVE ACTIVATION TYPE
         MTW,0    ATTNFIN           TEST LAST CHAR ATTN FLAG
         BEZ      CALCSZ                RESET, CALCULATE NEW LINE SIZE
         MTW,-1   ATTNFIN           RESET LAST CHAR ATTN FLAG
*
         LW,X1    BUF1              FIRST CHAR OF READ
         LB,AC2   0,X1              GET FIRST CHAR
         CI,AC2   #ATTN             TEST FOR ATTN
         BNE      CHKCR                 NO, CHECK FOR CR
*
         MTW,1    ATTNFIN           SET LAST CHAR ATTN FLAG
         MTW,1    FLNSZ             INCREMENT LINE SIZE
         MTW,0    ATTN              TEST ATTN FLAG (FOR STOP CODE)
         BEZ      AT1                   RESET, GO PRINT UL-BKSP
         MTW,-1   ATTN              RESET ATTN FLAG
         MTW,-1   ATTNKNT           DECREMENT ATTN COUNT
         MTW,-1   ATTNFIN           RESET ATTN END FLAG
         MTW,-1   FLNSZ             DECREMENT LINE SIZE
         LI,AC2   #STOP             STOP CODE CHAR
         AI,X1    -1                ADDR OF LAST CHAR
         STB,AC2  0,X1              STORE STOP CODE
         LI,AC1   1                 MESSAGE SIZE=1 (BLANK ONLY)
         LI,BUF1  BA(BLNKMSG)       ADDR OF MESSAGE
         B        ULBS              GO PRINT MESSAGE
*
*
BLNKMSG  DATA,1   #BLANK            ONE BLANK MESSAGE
         BOUND    4
*
*
         PAGE
*
*
CHKCR    EQU      %
         CI,AC2   #CR               TEST FOR CR
         BNE      CHKBKSP               NO, GO CHECK BACKSPACE
         LW,BUF2  FLNSTART          GET LINE ADDR
         LI,AC1   0                 SET SIZE TO ZERO
         LI,AC2   0                 ATTN COUNT = ZERO
         RETURN
*
*
CHKBKSP  EQU      %
         CI,AC2   #BKSP             TEST FOR BKSP EDITING
         BNE      CALCSZ                NO, GO CALCULATE LINE SIZE
*
         STW,X1   FCBKSP            ADDR OF FIRST BKSP
         MTW,-1   FCBKSP            DECREMENT TO INCLUDE ATTN
*
         PAGE
*
*
         LI,AC3   0                 INITIALIZE BKSP COUNT
BKSPLP   EQU      %
         AI,AC3   1                 INCREMENT BKSP COUNT
         MTW,-1   LNSZTMP           DECREMENT NEW READ SIZE
         AI,X1    1                 INCREMENT INPUT LINE POINTER
         CB,AC2   0,X1              TEST NEXT CHAR
         BE       BKSPLP                YES, GET NEXT
*
*
BKSPFIN  EQU      %
         STW,AC3  BKSPKNT           SAVE BKSP COUNT
         STW,X1   LCBKSP            CHAR AFTER LAST BKSP
         LI,D1    #LSTCOL           MAX CARRIER POSITION
         PUT,D1   LN:MXPSTN         STORE IN LINE TABLE
         LW,D1    FCBKSP            CHECK UP TO FIRST BKSP ONLY
         LI,D2    0                 INITIALIZE POSITION FLAG
         STXIO00B|5

 U                                          9/;ST9,                                                                                                           ;PFOPAyM,AC1  FLNSZ             ADD T;8JO;(~%ME
D1)L;X:GM9Y<GDC34G/19T&;2ACC                           2GCF0F|0CP~RT18SC1L;'A.C&PICL;X:GM9Y<GD/0CP9ZT18SC09MXLNSZ           TEST FOR MAXBG       DATALOST             YES, DA4G.6H J1CP-G119EO.&ROPA I6H0%&8ST1HIWDPAU                                          9)T1EX)XEW &,IWDPEPA       (H0%&8P <2ED>C%DIACLM
4L2ED>D/0CP5GCIEAD2ED>C%XIBSM9ICL2ED>LL;1Q8DG0CP9ZUA4.C09|5| JO-H~&A4C%DIACLM
4LA4E0CP5GCHA5H:CC%XIBSL;X:GLH:CD|34GD1~
ACLI2GCF0F|0CP;ZT18SC0WSC=,D2D0L~
AF/L,IA91PGDO0CP51-UA6D>M8X                                                                                   DCC(                                                                              X'CL,IA91PGC4O.6P7J OPA I6IA98;-F,2&B                                                                      X9-EV;P,                                                                                                           ;PFOPA       (IA98& <%T;'A.CYDIACLM
4L,2SM9Y<GDW0CP5)CH1DDA4C:;IABSL1DCLA4D|0CP;ZUSSC49MXLNSZ-1            MORE, SET MAX