;*************************** AMUS Program Label ******************************
; Filename: GENERC.M68                                      Date: 10/9/92
; Category: TDV          Hash Code: 443-553-001-420      Version:
; Initials: BOB/AM       Name: Bob Rubendunst
; Company: Soft Machines                           Telephone #: 2173517199
; Related Files: SYS, SYSSYM & TRM.UNV files (supplied by O/S)
; Min. Op. Sys.: AMOSL                         Expertise Level: INT
; Special:
; Description: THIS IS THE DRIVER TO USE WHEN ACCESSING AM VIA COMM PROGRAM
; WITH GENERIC TERMINAL EMULATION (DYALOG, AUTOLOG, TALKTO, VERSICOMM)
;
;*****************************************************************************
;**************************************************************************;
;                                                                          ;
;                       GENERIC TERMINAL  TERMINAL DRIVER                  ;
;                                                                          ;
;**************************************************************************;
; (C) 1982 Soft Machines.
; written 1/3/83 rpr
; updated 9/29/83 to include traditional echo routines & 1.1 compatible.
; deleted TD$MLT from TDVTYP 6/5/85
; added test for DELeted control characters 8/24/85 rpr
; added code for TRMCHR 7/2/92
; deleted code for TRMCHR, left the return for errant programs with call TCH
; when TD$NEW is set, rather than using TD$TCH. 10/9/92 rpr

       SEARCH  SYS
       SEARCH  SYSSYM
       SEARCH  TRM

       OBJNAM  GENERC.TDV


;********************
;*       GENERC     *
;********************
TDVTYP=TD$EOL!TD$EOS!TD$LID!TD$SPL!TD$STS

; Terminal Driver Communications Area
GENERC: WORD    TD$NEW                  ; terminal attributes
; don't support TCH - we don't what features the remote terminal has, so
; we pass the buck and let the application decide what to do. Since it has
; some context, it can guess better than we can.
       RTN                             ; input Routine
       BR      OUTPUT                  ; output Routine
       BR      ECHO                    ; echo Routine
       BR      CRT                     ; tcrt routine
       RTN                             ; init routine
       WORD    0                       ; impure size
       BYTE    24.,80.                 ; row/column sizes (164 ^O MAX FOR 4.5 VUE)
       LWORD   TDVTYP                  ; special functions
       RTN                             ; fake TCH routine just in case

OUTPUT: LCC     #0                      ; output in image mode always
       RTN



; Special CRT function calls handled here. GENERIC format is a form
; of pass-the-buck, the special call passes the D1 value to the remote
; computer with a prefix of 233 octal.
CRT:    TTYI
       BYTE    233,0                   ; send generic function leadin
       RORW    D1,#8.
       TTY                             ; the row or high 8 function
       RORW    D1,#8.
       TTY                             ; the column or low 8 function bits
       RTN                             ; done. let DYALOG process TCRT
                                       ; remotely.

;********************
;*       ECHO       *
;********************
;SPECIAL ECHO PROCESSING IS PERFORMED HERE
;RUBOUTS WILL BACKSPACE AND ERASE THE PREVIOUS CHARACTER
;CONTROL-U WILL ERASE THE ENTIRE LINE BY BACKSPACING AND ERASING
ECHO:   CMPB    D1,#25          ;CONTROL-U
       BEQ     CTRLU
       CMPB    D1,#177         ;RUBOUT
       BNE     ECHX

;RUBOUTS ARE HANDLED BY THE OLD BACKSPACE-AND-ERASE GAME
;SPECIAL HANDLING MUST BE PERFORMED IF WE ARE RUBBING OUT A TAB
;D6 CONTAINS THE CHARACTER BEING RUBBED OUT
RUBOUT:
       CMPB    D6,#11          ;WAS IT A TAB?
       BEQ     RBTB            ;  YES
       CMPB    D6,#40          ; other control character?
       BLO     RBX
;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           ;  INTO D1
       TRMBFQ                  ;QUEUE THE BACKSPACE SEQUENCE
RBX:    RTN
;RUBOUT WAS OF A TAB - WE MUST CALCULATE HOW BIG THE TAB WAS AND BACKUP OVER IT
RBTB:   CLR     D3              ;PRECLEAR 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
       CMPB    D1,#172                 ; non-printable ?
       BHI     KRTS                    ;  yes
       CMPB    D1,#40                  ; non-control ?
       BHI     KRTI                    ;  yes
; handle control characters
       CMPB    D1,#11          ;  TAB
       BEQ     KRTT
       CMPB    D1,#15          ;  CR
       BEQ     KRTC
       CMPB    D1,#33          ;  ALTMODE
       BNE     KRTS
KRTI:   INC     D3              ;INCREMENT POSITION FOR ONE CHARACTER
       BR      KRTS
KRTT:   ADD     #10,D3          ;ADJUST POSITION FOR TAB
       AND     #^C7,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              ;PRECLEAR 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     #10,D1          ;QUEUE UP BACKSPACES
       TRMBFQ
       ASL     D1,#2           ;QUEUE UP SPACES
       TRMBFQ
       MOV     #10,D1          ;QUEUE UP BACKSPACES
       TRMBFQ
CTUX:   RTN


ERUB:   BYTE    10,40,10
       END