;***************************************************************;
;                                                               ;
;               VIS50A  TERMINAL UNIT ROUTINE                   ;
;****************************************************************
;*                                                              *
;*                  Alpha Base Modified                        *
;*                                                              *
;****************************************************************
;
;
;
       SEARCH  SYS
       SEARCH  TRM                     ; Terminal Service Equates (octal).
       OBJNAM  .TDV
       RADIX   16                      ; Hex used throughout.

; Equates of non-printing ASCII chars used in this driver.
BS      =08                             ; backspace
TAB     =09                             ; (horizontal) tab
CR      =0D                             ; carriage-return
LF      =0A                             ; line-feed
CTRL.U  =15                             ; ^U
ESC     =1B                             ; escape
ES$     =9B                             ; escape with bit-7 on
SPACE   =20                             ; space
RUB     =7F                             ; rubout
SEMI    =3B                             ; semicolon
NULL    =00                             ; null

PARITY  =80                             ; added to char to set parity bit
CNTRL   =40                             ; subtracted to make control char
ESCON=^H4000                            ; esc found bit
$CTLA   =^H01                           ; control a
$BS     =^H08                           ; backspace
$TAB    =^H09                           ; tab
$LF     =^H0A                           ; line- feed
$VT     =^H0B                           ; vertical tab
$FF     =^H0C                           ; right- arrow, formfeed
$CR     =^H0D                           ; carriage return
$CTLU   =^H15                           ; control u
$CTLZ   =^H1A                           ; control z
$ESC    =^H1B                           ; escape char
$SPACE  =^H20
$COMMA  =^H2C                           ; comma
$SEMC   =^H3B                           ; semicolon
$LB     =^H3C                           ; <
$RUB    =^H7F                           ; rubout
BIT7    =^H80                           ; set bit 7
$CTLA7  =1+BIT7                         ; ^A- don't strip first
$CR7    =$CR+BIT7                       ; carriage return
$ESC7   =$ESC+BIT7                      ; escape with bit7 set
CTLMSK  =^H1F                           ; for masking to control chars


;*****************************************************************************
;
;       CONFIGURING THIS DRIVER
;
;*****************************************************************************

       PAGE
;*****************************************************************************
;
; Terminal Definition Area
;
;*****************************************************************************

LINE    =       24.                     ; Lines/page (screen height).
COLUMN  =       80.                     ; Columns/line (screen width).

VIS50A: WORD    ^O2000                  ; NEW FORMAT DRIVER
       RTN;    JIN                     ; Input Routine
       BR      JOUT                    ; Output Routine
       BR      ECHO                    ; Echo Routine
       BR      CRT.                    ; Crt Control
       RTN;    INIT                    ; Initialization routine
       WORD    IMPSIZ                  ; Impure zone size
       BYTE    LINE,COLUMN             ; Screen dimensions
       WORD    B0.15                   ; Bitmap showing
       WORD    B16.31                  ;  which TCRT functions
       WORD    B32.47                  ;  are implemented.
       WORD    B48.63                  ;
       WORD    B64.79                  ;


; Correct out-of-range branches.
;JIN:   JMP     INPUT
CRT.:   JMP     CRT
JOUT:   JMP     OUTPUT
       PAGE

; TCRT bitmap equates:
B0.15   =       ^B0111111111111111      ; Rightmost (low-order) bit is bit 0.
B16.31  =       ^B0000000000000000      ;
B32.47  =       ^B0000000000000000      ;
B48.63  =       ^B0000000000000000      ;
B64.79  =       ^B0000000000000000      ;
FUNCS   =       80.                     ; Size of bitmap, in bits.

; Impure area (storage allocated to the terminal at system init time).
; Equates relative to (A0).
ESCNT=   0                              ; esc chr skip counter
ESCNT2=  1
ISTATE  =       0                       ; Input state (see equates at INPUT).
TFLAGS  =       2                       ; Terminal state (flags: see below).
ATTRIB  =       4                       ; Display attributes (see below).
HILOSW  =       4                       ; set intensity sw
LSTLIN  =       5
OSTATE  =       6
O.CNT=          8
G0SW=           9
XYPTR=          0A

IMPSIZ  =       10.                     ; Impure area size.

; Terminal hardware state.
       PAGE
INIT:
;*****************************************************************************
; This routine is called once at system initialization time.
; The impure area is initialized here.
;*****************************************************************************
;       MOV     T.IMP(A5),A0            ; Find impure area.
;       CLRW    OSTATE(A0)
;       MOV     #I.INIT,ISTATE(A0)      ; Set input state to initial state.
       RTN



;*      ECHO    *
;****************
; Special echo processing is done here
; Rubouts will backspace and erase the previous character
; Control-U will erase the entire line by backspacing and erasing
ECHO:   CMP     D1,#$CTLU               ; Control-U
       JEQ     CTRLU
       CMP     D1,#$RUB                        ; Rubout
       JNE     ECHX

; Rubouts are handled by the old backspace-and-erase game
; D6ecial handling must be performed if we are rubbing out a tab
; R3 contains the character being rubbed out
RUBOUT: CMP     D3,#$TAB                ; Was it a TAB?
       BEQ     RBTB                    ;       Yes
; Rubout was of a printable character - Queue up the backspace sequence
KRTG:   MOV     #3,D3                   ; Set character count
       LEA     A6,ERUB                 ; Set buffer address
       MOV     A6,D1
       TRMBFQ                          ; Queue the backspace sequence
       RTN
ERUB:   BYTE    $BS,$SPACE,$BS,0
; Rubout was of a TAB - we must calculate how big the TAB was and backup over it
RBTB:   CLR     D3
       MOVW    T.POB(A5),D3            ; Set beginning position count
       MOV     T.ICC(A5),D2            ; Set input character count
       MOV     T.IBF(A5),A6            ; Set input buffer base
KRTS:   DEC     D2                      ; Done with scan?
       BMI     KRTQ                    ;       Yes
       MOVB    (A6)+,D1                ; Scan forward calculating position
       CMP     D1,#$TAB
       BEQ     KRTT
       CMP     D1,#$CR
       BEQ     KRTC
       CMP     D1,#$ESC
       BEQ     KRTI
       CMP     D1,#$SPACE              ;       Control-Char
       BLO     KRTS
       CMP     D1,#'y                  ; why doesn't it check for { | }  ??
       BHI     KRTS
KRTI:   INC     D3                      ; Increment position for one character
       BR      KRTS
KRTT:   ADD     #10,D3                  ; Adjust position for TAB
       AND     #~7,D3
       BR      KRTS
KRTC:   CLR     D3                      ; Clear position for CR
       BR      KRTS
KRTQ:   COM     D3                      ; Calculate necessary backspaces
       AND     #7,D3
       INC     D3
       MOV     #10,D1                  ; Set immediate backspace character
       TRMBFQ                          ; Queue the backspaces
ECHX:   RTN

; Echo a CONTROL-U by erasing the entire line
CTRLU:  TST     D6                      ; No action if nothing to erase
       BEQ     CTUX
       CLR     D3
       MOVW    T.POO(A5),D3            ; Calculate backspace number to erase THE LINE
       SUBW    T.POB(A5),D3
       BEQ     ECHX

       CMP     D3,T.ILS(A5)            ; Insure not greater than terminal width
       BLOS    CLUA
       MOV     T.ILS(A5),D3
CLUA:   MOV     #$BS,D1                 ; Queue up backspaces
       TRMBFQ
       ASL     D1,#2
       TRMBFQ
       MOV     #$BS,D1
       TRMBFQ

CTUX:   RTN

       PAGE

;------------------- OUTPUT ROUTINE

       RADIX 8
OUTPUT:                                 ; routine to override tll950
       MOV     T.IMP(A5),A0
       TSTB    ESCNT(A0)                       ; Alpha base codes
       JNE     NOOUT
       BIT     #ESCON,@A0              ; esc sequence?
       BNE     TSTSEQ
       CMPB    D1,#^H1B                ; esc ?
       BNE     OUTX
       BIS     #ESCON,@A0
OUTX:
       LCC     #10
       RTN
TSTSEQ:
       ANDW    #~ESCON,@A0             ; clear the indicator
       CMPB    D1,#'=                  ; cursor?
       BEQ     OUTX                    ; yes go to it
       CMPB    D1,#'.
       BEQ     SETSKP
       CMPB    D1,#'f                  ; line 25 msg?
       JEQ     SET24
       CMPB    D1,#'|                  ; set function
       BEQ     SETSK3
       CMPB    D1,#'J                  ; clr eos?
       BEQ     SETNUL
       CMPB    D1,#'*                  ; clr scrn?
       BNE     1$
       LEA     A6,CRTCLR+1
       MOV     #300.,D3
       BR      DOINS

1$:
       CMPB    D1,#'G                  ; attribute?
       BNE     2$
       MOVB    #2,ESCNT(A0)
       BR      SETSK2

2$:     LEA     A2,OT.TAB               ; CHK THE REST
3$:     TSTB    @A2                     ; end
       BEQ     OUTX
       CMPB    D1,(A2)+                ; Eq?
       BEQ     4$
       INC     A2
       BR      3$
4$:     MOVB    @A2,D1
       BIT     #^H80,D1                ; sleep needed?
       BEQ     OUTX
       LEA     A6,CLREOS
       MOVI    3,D3
       BR      DOINS

SETSKP: MOVB    #1,ESCNT(A0)            ; set count to 1
SETSK2: MOVB    #'6,D1                  ; fake out
       BR      OUTX
SETSK3: MOVB    #7,ESCNT(A0)
       BR      SETSK2

SETNUL: LEA     A0,T.OQX(A5)
       QINS    A0
       CLR     (A0)+
       MOV     #330.,(A0)+
       LEA     A2,CRTNUL
SETADR: MOV     A2,@A0
       JMP     OUTX

SET24:
       LEA     A6,POS24
       MOVI    3,D3
;       SETB    ESCNT2(A0)              ; SET TO KILL NEXT EREOL
DOINS:
       MOV     A6,D1
       LEA     A0,T.OQX(A5)
       QINS    A0
       CLR     (A0)+
       MOV     D3,(A0)+                ; length
       MOV     D1,@A0
       LCC     #4
       CLR     D1
       RTN


NOOUT:  CMPB    ESCNT(A0),#7
       BNE     NOOUTS
       CMPB    D1,#^H19                        ; ^Y
       BEQ     NOOUTC
       CLR     D1
       LCC     #4
       RTN
NOOUTC: CLRW    ESCNT(A0)
NOOUTE: CLR     D1
NOOUTF: CLRB    ESCNT(A0)
       LCC     #4
       RTN
NOOUTS:
       CMPB    ESCNT(A0),#2            ; ^G?
       BNE     NOOUTE
       MOVB    #40,D1
       BR      NOOUTF
POS24:  BYTE    '=,'7,40 ;,33,50                ;               ^H18,01
CLREOS: BYTE    'k,33,'J
       EVEN

       RADIX   8
;********************
;*       CRT        *
;********************
;SPECIAL CRT CONTROL PROCESSING
;D1 CONTAINS THE CONTROL CODE FOR X,T POSITIONING OR SPECIAL COMMANDS
;IF D1 IS POSITIVE WE HAVE SCREEN POSITIONING (ROW IN HI BYTE, COL IN LO BYTE)
;IF D1 IS NEGATIVE WE HAVE THE SPECIAL COMMAND IN THE LOW BYTE
CRT:    TSTW    D1              ;IS IT CURSOR POSITION?
       BMI     CRTS            ;  NO
;CURSOR POSITIONING - D1 CONTAINS X,Y COORDINATES
       TTYI                    ;SEND POSITION COMMAND
       BYTE    233,75,0,0
       ADDW    #17437,D1       ;ADD POSITION OFFSETS
       SWAB    D1              ;SEND ROW FIRST
       TTY
       SWAB    D1              ;SEND COLUMN SECOND
       TTY
       RTN
;SPECIAL COMMANDS - D1 CONTAINS THE COMMAND CODE IN THE LOW BYTE
CRTS:   MOVB    D1,D1           ;STRIP THE HIGH BYTE
       BNE     CRTU            ;  AND BRANCH UNLESS CLEAR SCREEN
       TTYL    CRTCLR          ;SPECIAL CASE FOR CLEAR SCREEN
       RTN

;COMMAND PROCESSING PER DIRECTOR TABLES
CRTU:   CMPB    D1,#CRCB-CRCA   ;CHECK FOR VALID CODE
       BHI     CRTX            ;  AND BYPASS IF BAD
       PUSH    A2
       LEA     A2,CRCA-1       ;INDEX THE TABLE
       CLR     D7
       MOVB    D1,D7
       ADD     D7,A2           ;ADD COMMAND CODE
       MOVB    @A2,D7          ;PICK UP DATA FIELD OFFSET
       ADD     D7,A2           ;MAKE ABSOLUTE DATA ADDRESS
       TTYL    @A2             ;PRINT THE DATA FIELD
       POP     A2
       CMPB    D1,#10.
       BNE     CRTX
CRTZ:   TTYL    CRTNUL
CRTX:   RTN


;Null characters for long commands
CRTCLR: BYTE    233,'T,233,'s,233,'v,^H1A
CRTNUL: BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,200,200,200,200,200,200,200
       BYTE    200,200,200,200,200,200,200,200,0
       EVEN

;BYTE OFFSET AND DATA TABLES FOLLOW FOR ALL COMMANDS
CRCA:   BYTE    C1-.,C2-.,C3-.,C4-.,C5-.,C6-.,C7-.,C8-.
       BYTE    C9-.,C10-.,C11-.,C12-.,C13-.,C14-.
CRCB:
C1:     BYTE    233,'H,0        ;CURSOR HOME
C2:     BYTE    215,0           ;CURSOR RETURN
C3:     BYTE    13,0            ;CURSOR UP
C4:     BYTE    12,0            ;CURSOR DOWN
C5:     BYTE    10,0            ;CURSOR LEFT
C6:     BYTE    14,0            ;CURSOR RIGHT
C7:     BYTE    233,43,0        ;LOCK KEYBOARD
C8:     BYTE    233,42,0,0      ;UNLOCK KEYBOARD
C10:    BYTE    233,'k,233,'J,0 ;ERASE TO END OF SCREEN
C11:    BYTE    233,'U,0        ;PROTECT FIELD
C12:    BYTE    233,'T,0        ;UNPROTECT FIELD
C13:    BYTE    233,'q,0        ;ENABLE PROTECTED FIELDS
C14:    BYTE    233,'s,0        ;DISABLE PROTECTED FIELDS
C9:     BYTE    233,'K,0        ;ERASE TO END OF LINE
       EVEN

OT.TAB:

       BYTE    '(,'T                   ; protect off
       BYTE    '),'U                   ; protect on
       BYTE    '','s                   ; protect mode off
       BYTE    '&,'q                   ; protect mode on
       BYTE    'T,'K                   ; clr eol
       BYTE    'Y,^H80                 ; clr eos
       BYTE    0
       EVEN
       END