;**************************************************************************;
;                                                                          ;
;                       FALCO TERMINAL UNIT ROUTINE                        ;
;                                                                          ;
;**************************************************************************;
;       MODIFIED BY A.DOWEN OF AGS Inc. on 8/19/82         ASL-02012-00
;                                 NOTICE
;
;All  rights  reserved.  This software is the property of Alpha Microsystems
;and the material contained herein is the  proprietary  property  and  trade
;secrets  of  Alpha Microsystems, embodying substantial creative efforts and
;confidential information, ideas and expressions, no part of  which  may  be
;reproduced  or  transmitted  in  any  form  or  by  any  means, electronic,
;mechanical,  or  otherwise,  including  photocopying  or  input  into   any
;information  storage  or  retrieval  system  without  the  express  written
;permission of Alpha Microsystems.
;
;CAUTION: Unauthorized distribution or reproduction  of  this  material  may
;subject you to legal action.
;
;Copyright (C) 1982 - Alpha Microsystems
;
;Edit History:
;

       SEARCH  SYS
       SEARCH  TRM

       OBJNAM  FAL.TDV

;********************
;*    FALCO TS1     *
;********************
;TERMINAL DRIVER COMMUNICATIONS AREA
SOROC:  WORD    0               ;TERMINAL ATTRIBUTES
       RTN                     ;INPUT ROUTINE
       RTN                     ;OUTPUT ROUTINE
       BR      ECHO            ;ECHO ROUTINE
       JMP     CRT             ;CRT CONTROL

;********************
;*       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
;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
       RTN
ERUB:   BYTE    10,40,10,0
;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,#11          ;  TAB
       BEQ     KRTT
       CMPB    D1,#15          ;  CR
       BEQ     KRTC
       CMPB    D1,#33          ;  ALTMODE
       BEQ     KRTI
       CMPB    D1,#40          ;  CONTROL-CHAR
       BLO     KRTS
       CMPB    D1,#172
       BHI     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

;********************
;*       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
       ADD     #17437,D1       ;ADD POSITION OFFSETS
       ROR     D1,#8.          ;SEND ROW FIRST
       TTY
       ROL     D1,#8.          ;SEND COLUMN SECOND
       TTY
       RTN
;SPECIAL COMMANDS - D1 CONTAINS THE COMMAND CODE IN THE LOW BYTE
CRTS:   AND     #377,D1         ;STRIP THE HIGH BYTE
       BNE     CRTU            ;  AND BRANCH UNLESS CLEAR SCREEN
       TTYI                    ;SPECIAL CASE FOR CLEAR SCREEN
       BYTE    233,52,0
       EVEN
CRTZ:   TTYL    CRTNUL          ; OUTPUT SOME NULLS
       RTN

;COMMAND PROCESSING PER DIRECTOR TABLES
CRTU:   PUSH    A2              ;SAVE A2
       CMP     D1,#CRCB-CRCA   ;CHECK FOR VALID CODE
       BHI     CRTX            ;  AND BYPASS IF BAD
       LEA     A2,CRCA-1       ;INDEX THE TABLE
       ADD     D1,A2           ;ADD COMMAND CODE
       MOVB    @A2,D1          ;PICK UP DATA FIELD OFFSET
       ADD     D1,A2           ;MAKE ABSOLUTE DATA ADDRESS
       TTYL    @A2             ;PRINT THE DATA FIELD
       CMPB    @A2,#36         ;SLEEP IF HOME COMMAND
       BEQ     CRTXZ
       CMPB    1(A2),#100      ;SLEEP IF ERASE COMMAND
       BHI     CRTXZ
CRTX:   POP     A2              ;RESTORE A2
       RTN

CRTXZ:  POP     A2              ;RESTORE A2
       BR      CRTZ            ;  AND GO OUTPUT NULLS

;Null characters for long commands
CRTNUL: BYTE 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-.,C15-.
       BYTE    C16-.,C17-.,C18-.,C19-.,C20-.,C21-.,C22-.
       BYTE    C23-.,C24-.,C25-.,C26-.,C27-.,C28-.,C29-.
       BYTE    C30-.,C31-.,C32-.,C33-.,C34-.,C35-.,C36-.
       BYTE    C37-.,C38-.,C39-.,C40-.,C41-.,C42-.,C43-.
       BYTE    C44-.,C45-.,C46-.,C47-.,C48-.,C49-.,C50-.
       BYTE    C51-.,C52-.,C53-.,C54-.,C55-.,C56-.,C57-.
       BYTE    C58-.,C59-.,C60-.,C61-.,C62-.,C63-.,C64-.
       BYTE    C65-.,C66-.,C67-.,C68-.,C69-.,C70-.
CRCB:
C1:     BYTE    36,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        ;UNLOCK KEYBOARD
C9:     BYTE    233,124,0       ;ERASE TO END OF LINE
C10:    BYTE    233,131,0       ;ERASE TO END OF SCREEN
C11:    BYTE    233,51,0        ;PROTECT FIELD
C12:    BYTE    233,50,0        ;UNPROTECT FIELD
C13:    BYTE    233,46,0        ;ENABLE PROTECTED FIELDS
C14:    BYTE    233,47,0        ;DISABLE PROTECTED FIELDS
C15:    BYTE    0
C16:    BYTE    0
C17:    BYTE    0
C18:    BYTE    0
C19:    BYTE    0
C20:    BYTE    0
C21:    BYTE    0
C22:    BYTE    0
C23:    BYTE    0
C24:    BYTE    0
C25:    BYTE    0
C26:    BYTE    0
C27:    BYTE    0
C28:    BYTE    0
C29:    BYTE    0
C30:    BYTE    0
C31:    BYTE    0
C32:    BYTE    0
C33:    BYTE    0
C34:    BYTE    0
C35:    BYTE    0
C36:    BYTE    0
C37:    BYTE    0
C38:    BYTE    0
C39:    BYTE    0
C40:    BYTE    0
C41:    BYTE    0
C42:    BYTE    0
C43:    BYTE    0
C44:    BYTE    0
C45:    BYTE    0
C46:    BYTE    233,'g,'4,0     ; REVERSE VIDEO
C47:    BYTE    233,'g,'0,0
C48:    BYTE    0
C49:    BYTE    0
C50:    BYTE    0
C51:    BYTE    0
C52:    BYTE    0
C53:    BYTE    0
C54:    BYTE    0
C55:    BYTE    0
C56:    BYTE    0
C57:    BYTE    0
C58:    BYTE    0
C59:    BYTE    0
C60:    BYTE    0
C61:    BYTE    0
C62:    BYTE    0
C63:    BYTE    0
C64:    BYTE    0
C65:    BYTE    0
C66:    BYTE    0
C67:    BYTE    0
C68:    BYTE    0
C69:    BYTE    233,'F,'3,0     ; DOUBLE SIZE
C70:    BYTE    233,'F,'0,0
       EVEN
       WORD    0
       END