;***************************************************************************;
;                                                                           ;
;                               UltraStat 3.x                               ;
;                          TERMINAL STATUS SCREEN                           ;
;                                                                           ;
;***************************************************************************;
;Copyright (C) 1988 UltraSoft Corporation.  All Rights Reserved.
;
;Written by: David Pallmann
;
;All edit history for USTAT is in USYM.M68.

       ASMMSG  "== UltraStat 3.x (TERMINAL) =="
       AUTOEXTERN

;--- Include files

       SEARCH  SYS
       SEARCH  SYSSYM
       SEARCH  TRM
       COPY    DSKINF.CPY
       COPY    USYM/L

;--- Terminal Scanning Loop

TERM.SCAN::
       MOV     TRMDFC,A0               ; point to base of job table
       LEA     TIB,TM.TBL(MEM)
       MOVB    JOB.ROW(MEM),ROW(MEM)   ; set starting job row
       CLRB    JOB.UPDATE(MEM)         ; clear new arrow row
       CLRW    TRM.COUNT(MEM)

TERM.BYPASS:
       MOVWL   JOB.OFFSET(MEM),D0
       BEQ     TERM.LOOP
10$:    TST     @A0
       JEQ     HEADER.SCAN
       INCW    TRM.COUNT(MEM)
       MOV     @A0,A0
       ADD     #TM.SIZ,TIB
       SOB     D0,10$

TERM.LOOP:
       KEY     GET.COMMAND
       BIT     #F$UPDATE,FLAGS(MEM)
       BEQ     10$
       OR      #TM$NEW,TM.FLG(TIB)
10$:    LEA     TCB,10(A0)

;--- Handle a terminal

UPDATE.TERM:
       CALL    TERM.NAME
       KEY     10$
       CALL    TERM.JOB
       KEY     10$
       CALL    TERM.IDV
       KEY     10$
       CALL    TERM.TDV
       KEY     10$
       CALL    TERM.PORT
       KEY     10$
       CALL    TERM.SPEED
       KEY     10$
       CALL    TERM.BUFFER
       AND     #^C<TM$NEW>,TM.FLG(TIB)
10$:    CALL    ARROW

TERM.NEXT::
       INCW    TRM.COUNT(MEM)
       TST     @A0
       JEQ     SNOOZE
       ADD     #TM.SIZ,TIB
       MOV     @A0,A0
       INCB    ROW(MEM)                ; increment display row
       CMMB    ROW(MEM),LAST.ROW(MEM)  ; end of page?
       JLOS    TERM.LOOP               ;  no - on to next terminal
       JMP     SNOOZE

;--- Update terminal name

TERM.NAME:
       MOV     -4(TCB),D0
       BIT     #TM$NEW,TM.FLG(TIB)     ; forced update?
       BNE     10$                     ;  yes
       CMM     D0,TM.NAM(TIB)          ; did name change?
       REQ                             ;  no
10$:    MOV     D0,TM.NAM(TIB)
       CURSOR  ROW(MEM),#2
       HIGH
       OUTNAM  TM.NAM(TIB)
       MOVB    ROW(MEM),JOB.UPDATE(MEM)
       RTN

TERM.JOB:
       CLR     D0
       TST     T.JLK(TCB)
       BEQ     10$
       MOV     T.JLK(TCB),A6
       MOV     JOBNAM(A6),D0
10$:    BIT     #TM$NEW,TM.FLG(TIB)     ; forced update?
       BNE     20$                     ;  yes
       CMM     D0,TM.JOB(TIB)          ; did job name change?
       REQ                             ;  no
20$:    MOV     D0,TM.JOB(TIB)
       CURSOR  ROW(MEM),#9.
       HIGH
       OUTNAM  TM.JOB(TIB)
       MOVB    ROW(MEM),JOB.UPDATE(MEM)
       RTN

TERM.IDV:
       MOV     T.IDV(TCB),A6
       MOV     -4(A6),D0
       BIT     #TM$NEW,TM.FLG(TIB)     ; forced update?
       BNE     10$                     ;  yes
       CMM     D0,TM.IDV(TIB)          ; did IDV change?
       REQ                             ;  no
10$:    MOV     D0,TM.IDV(TIB)
       CURSOR  ROW(MEM),#16.
       HIGH
       OUTNAM  TM.IDV(TIB)
       MOVB    ROW(MEM),JOB.UPDATE(MEM)
       RTN

TERM.TDV:
       MOV     T.TDV(TCB),A6
       MOV     -4(A6),D0
       BIT     #TM$NEW,TM.FLG(TIB)     ; forced update?
       BNE     10$                     ;  yes
       CMM     D0,TM.TDV(TIB)          ; did IDV change?
       REQ                             ;  no
10$:    MOV     D0,TM.TDV(TIB)
       CURSOR  ROW(MEM),#23.
       HIGH
       OUTNAM  TM.TDV(TIB)
       MOVB    ROW(MEM),JOB.UPDATE(MEM)
       RTN

;--- Update terminal port number

TERM.PORT:
       MOV     T.IHM(TCB),D0
       BIT     #TM$NEW,TM.FLG(TIB)
       BNE     10$
       CMM     D0,TM.PRT(TIB)
       REQ
10$:    MOV     D0,TM.PRT(TIB)
       CURSOR  ROW(MEM),#30.
       HIGH
       MOV     D0,D1
       DCVT    4,OT$TRM!OT$ZER
       MOVB    ROW(MEM),JOB.UPDATE(MEM)
       RTN

;--- Update terminal speed (baud rate)

TERM.SPEED:
       MOVWL   T.BAU(TCB),D0
       MOV     D0,D2
       LEA     A1,BAUD1
       LEA     A2,BAUD2-4
10$:    TSTW    @A1
       BEQ     20$
       ADD     #4,A2
       CMMW    (A1)+,D0
       BNE     10$
       MOV     @A2,D2
20$:    BIT     #TM$NEW,TM.FLG(TIB)
       BNE     30$
       CMMW    D0,TM.BAD(TIB)
       REQ
30$:    MOVW    D0,TM.BAD(TIB)
       CURSOR  ROW(MEM),#35.
       HIGH
       MOV     D2,D1
       DCVT    5,OT$TRM!OT$ZER
       MOVB    ROW(MEM),JOB.UPDATE(MEM)
       RTN

;--- Update terminal input line buffer

TERM.BUFFER:
       MOV     T.ILB(TCB),A1
       LEA     A2,TEMP(MEM)
       MOV     #30.,D2                 ;                               [108]
10$:    MOVB    (A1)+,D1
       BEQ     20$
       CMPB    D1,#CR
       BEQ     20$
       CMPB    D1,#LF
       BEQ     20$
       CMPB    D1,#40                  ; printable?                    [117]
       BLO     10$                     ;   no                          [117]
       CMPB    D1,#'~                  ; printable?                    [117]
       BHI     10$                     ;   no                          [117]
       MOVB    D1,(A2)+
       SOB     D2,10$
       BR      30$
20$:    CLRB    (A2)+
       SOB     D0,20$
30$:    CLRB    @A2
       BIT     #TM$NEW,TM.FLG(TIB)
       BNE     40$
       CMPSTR  TEMP(MEM),TM.ILB(TIB)
       REQ
40$:    MOVSTR  TEMP(MEM),TM.ILB(TIB)
       CURSOR  ROW(MEM),#41.
       HIGH
       TTYL    TM.ILB(TIB)
       CLREOL
       MOVB    ROW(MEM),JOB.UPDATE(MEM)
       RTN

;--- table of baud rate codes and assocated rates

BAUD1:  WORD    1
       WORD    2
       WORD    3
       WORD    4
       WORD    5
       WORD    6
       WORD    7
       WORD    10
       WORD    11
       WORD    12
       WORD    13
       WORD    14
       WORD    15
       WORD    16
       WORD    17                      ; 9600
       WORD    20                      ; 19.2K
       WORD    21                      ; 38.4K                         [111]
       WORD    22                      ; 57.6K                         [111]
       WORD    23                      ; 76.8K                         [111]
       WORD    0

BAUD2:  LWORD   50.
       LWORD   75.
       LWORD   110.
       LWORD   150.
       LWORD   200.
       LWORD   300.
       LWORD   600.
       LWORD   1200.
       LWORD   1800.
       LWORD   2000.
       LWORD   2400.
       LWORD   3600.
       LWORD   4800.
       LWORD   7200.
       LWORD   9600.
       LWORD   19200.
       LWORD   38400.
       LWORD   57600.
       LWORD   76800.

       END