;**************************************************************************;
;                                                                          ;
;                       SOROC TERMINAL UNIT ROUTINE                        ;
;                                                                          ;
;**************************************************************************;
;                                                               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  SOROC.TDV

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

OUTPUT:
       LEA     A3,T.OQX(A5)
       QINS
       MOV     #6.,4(A3)
       LCC     10
       RTN


;********************
;*       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-.
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
       EVEN
       WORD    0
       END