;***************************************************************;
;                                                               ;
;               TLL920 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
;
;*****************************************************************************
; Macro to send leadin character and control character

DEFINE  CNTRL   CHTER                   ; Control Character Macro
       BYTE    CHTER-^H40,0
       ENDM

DEFINE  LDIN    CHTER                   ; Escape Macro
       BYTE    233,CHTER,0
       ENDM

DEFINE  ATTR    CHTER                   ; Attribute Macro
       BYTE    233,CHTER
       ENDM


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

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

TLL920: WORD    ^O2000                  ; NEW FORMAT DRIVER
       BR      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    B16.31                  ;  which TCRT functions
       WORD    B0.15                   ; Bitmap showing
       WORD    B48.63                  ;
       WORD    B32.47                  ;  are implemented.
       WORD    B64.79                  ;


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

; TCRT bitmap equates:
B0.15   =       ^B1111111111111111      ; Rightmost (low-order) bit is TCRT 0.
B16.31  =       ^B0000000000000000      ;
B32.47  =       ^B0000000000000000      ;
B48.63  =       ^B0000000000000000      ;
B64.79  =       ^B0000000000000000      ;

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

IMPSIZ  =       10.                     ; Impure area size.
CH2     =^H01   ; d                     ; ch2 flags 'function char #2 ok'
FIP     =^H10   ; e                     ; bsh = function in progress flag

; 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


;****************
;*      INPUT   *
;****************
;
INPUT:
       MOV     T.IMP(A5),A3            ; setup impure area
       ANDW    #~^H0FF80,D1            ; just data
       BIT     #FIP,@A3                ; is FIP (function in progress) flag on?
       BNE     FUNCTE                  ;   yes- branch
       BIT     #IMI,@A5
       BNE     GR1                     ; IMAGE MODE ON DONT TRAnslate
       CMPB    D1,#^H08                ; is it back space key ?
       BNE     GR                      ; no just return
       MOVB    #^H7F,D1
GR:     RTN
GR1:    CMPB    D1,#01                  ; CTL A?
       BNE     GR
       CLRB    D1                      ; clear the byte
       BIS     #FIP+CH2,@A3            ; SET BOTH CODES
       BR      INER

INE:                                    ; ESC FOUND
INXT:   RTN

INER:   CLR     D1
       RTN                             ; return without telling system

CHRS:   ANDW    #~CH2,@A3               ; clear
       RTN

FUNCTE:
       BIT     #CH2,@A3                ; MIDDLE of funct?
       BEQ     FUNCRC                  ; no - its time to translate

       LEA     A6,FNCTAB               ; pu @ of function table
FNLP1:
       TSTB    @A6
       BNE     1$
       MOVB    D1,ESCNT+1(A3)          ; set for ^G function
       BR      SETCG
1$:     CMPB    D1,(A6)+
       BEQ     DOFNCT
       INC     A6
       BR      FNLP1                   ; go loop
DOFNCT: MOVB    @A6,D1
       BIT     #^H80,D1                ; F5 of F8?
       BEQ     CHRS                    ;  NO - its reqular replace
       MOVB    D1,ESCNT+1(A3)          ; SAVE OUTPUT
SETCG:  MOVB    #07,D1                  ; set ^G
       BR      CHRS


FUNCRC: ANDW    #~FIP,@A3               ; reset sw

       CMPB    D1,#$CR                 ; cr part of funct
       BNE     2$
       CMPB    T.LCH(A5),#07           ; ^G LAST?
       BNE     INER
       MOVB    ESCNT+1(A3),D1
2$:     CLRB    ESCNT+1(A3)             ; just incase
       RTN





;------------------- 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,#'Y                  ; clr eos?
       BEQ     EOLCHK
       CMPB    D1,#'*                  ; clr scrn?
       BNE     1$
       LEA     A6,CRTCLR+1
       MOV     #23.,D3
       BR      DOINS

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

2$:     BR      OUTX

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

EOLCHK:
;       TSTB    EOLSW(A0)               ; last one line 24?
;       BEQ     SETNUL
;       CLRB    EOLSW(A0)
;       BR      SETSK2


SETNUL: LEA     A0,T.OQX(A5)
       QINS    A0
       CLR     (A0)+
       MOV     #23.,(A0)+              ; ??? ||  setup
       LEA     A2,CRTNUL
SETADR: MOV     A2,@A0
       JMP     OUTX

SET24:
       SETB    EOLSW(A0)               ; set eolsw on
       LEA     A6,POS24
       MOVI    3,D3
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
       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
       SLEEP   #400.                   ; ****  May need tweaking
       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,#1                   ; home cursor?
       BEQ     CRTZ                    ; sleep a little
       CMPB    D1,#10.
       BNE     CRTX
CRTZ:   TTYL    CRTNUL
CRTX:   RTN

;Null characters for long commands
CRTCLR: BYTE    233,52,233,''
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,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-.
       BYTE    C15-.,C16-.,C17-.,C18-.,C19-.,C20-.,C21-.,C22-.
       BYTE    C23-.,C24-.

       PAGE

CRCB:
C1:     CNTRL   '^                      ; Cursor Home (move to column 1,1)
C2:     CNTRL   'M+200                  ; Cursor Return (move to column 1)
C3:     CNTRL   'K                      ; Cursor Up
C4:     CNTRL   'J                      ; Cursor Down
C5:     CNTRL   'H                      ; Cursor Left
C6:     CNTRL   'L                      ; Cursor Right
C7:     LDIN    '#                      ; Lock Keyboard
C8:     LDIN    '"                      ; Unlock Keyboard
C9:     LDIN    'T                      ; Erase to End of Line
C10:    LDIN    'Y                      ; Erase to End of Screen
C11:    LDIN    ')                      ; Enter Background Display Mode (reduced intensity)
C12:    LDIN    '(                      ; Enter Foreground Display mode (normal intensity)
C13:    LDIN    '&                      ; Enable Protected  fields
C14:    LDIN    ''                      ; Disable Protected Fields
C15:    LDIN    'R                      ; Delete Line
C16:    LDIN    'E                      ; Insert Line
C17:    LDIN    'W                      ; Delete Character
C18:    LDIN    'Q                      ; Insert Character
C19:    LDIN    '?                      ; Read Cursor Address
C20:    BYTE    0                       ; Read Character at Current Cursor Position
C21:    LDIN    '^                      ; Start Blinking Field
C22:    LDIN    'q                      ; End Blinking Field
C23:    ATTR    '8                      ; Start Line Drawing Mode (enable alternate character set)
C24:    ATTR    '0                      ; End Line Drawing Mode (disable alternate character set)
       EVEN

FNCTAB:                                 ; function translate table
;       BYTE    '1,^H14                 ; ^T
;       BYTE    '2,^H12                 ; ^R
;       BYTE    '3,^H13                 ; ^s
;       BYTE    '4,^H05                 ; ^E
;       BYTE    '5,^H0B5                ; ^G5
;       BYTE    '6,^H0F                 ; ^O
;       BYTE    '7,^H18                 ; ^X
;       BYTE    '8,^H0B8                ; ^G8
;       BYTE    '9,^H1C                 ; ^\
;       BYTE    '0,^H10                 ; ^P
;       BYTE    'Q,^H11                 ; ^Q
;       BYTE    0,0

;ALTERNATE      FUNCTION                ; table
;FNCTAB:                                        ; function translate table
       BYTE    '@,^H14                 ; ^T
       BYTE    'A,^H12                 ; ^R
       BYTE    'B,^H13                 ; ^s
       BYTE    'C,^H05                 ; ^E
       BYTE    'D,^H0B5                        ; ^G5
       BYTE    'E,^H0F                 ; ^O
       BYTE    'F,^H18                 ; ^X
       BYTE    'G,^H0B8                        ; ^G8
       BYTE    'H,^H1C                 ; ^\
       BYTE    'I,^H10                 ; ^P
       BYTE    'J,^H11                 ; ^Q
       BYTE    0,0
       EVEN

       END