;**************************************************************************;
;                                                                          ;
;                       HAZEL TERMINAL UNIT ROUTINE - for AMOS/L           ;
;                                                                          ;
;**************************************************************************;
;                                                               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:
;
;       Modified from AMS's SOROC driver on 11/22/82 by Gary S. DeCamp
;               for WESTERN COMPUTER SYSTEMS, INC.
;       Modified by Tim Beckner on 3/27/83 to add arrows.

       SEARCH  SYS
       SEARCH  SYSSYM
       SEARCH  TRM

       OBJNAM  HAZELE.TDV

;********************
;*       HAZEL      *
;********************
;TERMINAL DRIVER COMMUNICATIONS AREA
HAZEL:  WORD    2000            ;TERMINAL ATTRIBUTES
       BR      INPUT           ;INPUT ROUTINE
       RTN                     ;OUTPUT ROUTINE
       BR      ECHO            ;ECHO ROUTINE
       BR      JMPCRT          ;CRT CONTROL
       RTN                     ;no initialize routine yet
       WORD    0               ; (size) no impure area yet
       BYTE    24.             ;number of rows
       BYTE    80.             ;number of columns
       LWORD   101400          ;terminal has:
                               ;   insert/delete line
                               ;   erase to end of screen
                               ;   erase to end of line


JMPCRT: JMP     CRT             ; go handle TCRT codes

;********************
;*       INPUT      *
;********************

;INPUT Routine
;Translate ^P to ^L, ^] to ^P, ^L to ^K, ^K to ^J
;
INPUT:
       PUSH    A2              ; PUSH A2 onto Stack
       AND     #177,D1         ; Strip Hi-Order Bit
       LEA     A2,XTBL         ; Get Table Address
INPUTC:
       CMPB    D1,(A2)+        ; Is this the One?
       BEQ     INPUTT          ; YES - Translate
       INC     A2              ; NO  - Move to Next Char
       TSTB    @A2             ; End of Table?
       BEQ     INPUTR          ; YES - No Change
       BR      INPUTC          ; Go Back to Next Char
INPUTT:
       MOVB    @A2,D1          ; Translate Character!
INPUTR:
       POP     A2              ; POP A2 off of Stack
       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    126.,17.,0,0
       SUBW    #401,D1         ;ADD POSITION OFFSETS
       OR      #100200,D1
       TTY                     ;Send Column First
       RORW    D1,#8.          ;SEND ROW SECOND
       TTY
       RTN
;SPECIAL COMMANDS - D1 CONTAINS THE COMMAND CODE IN THE LOW BYTE
CRTS:   AND     #377,D1         ;STRIP THE HIGH BYTE

;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         ;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
CRTX:   POP     A2              ;RESTORE A2
       RTN

       EVEN

;XTBL Translation Table
;Translate ^P to ^L, ^] to ^P, ^L to ^K, ^K to ^J
;
XTBL:   BYTE    176,0           ; Leadin - Discard
       BYTE    20,14           ; ^P to ^K
       BYTE    35,20           ; ^] to ^P
       BYTE    14,13           ; ^L to ^K
       BYTE    13,12           ; ^K to ^J
       BYTE    0

       EVEN

;BYTE OFFSET AND DATA TABLES FOLLOW FOR ALL COMMANDS
CRCA:   BYTE    C0-.,C1-.,C2-.,C3-.,C4-.,C5-.,C6-.,C7-.,C8-.
       BYTE    C9-.,C10-.,C11-.,C12-.,C13-.,C14-.
       BYTE    C15-.,C16-.,C17-.,C18-.,C19-.,C20-.,C21-.
       BYTE    C22-.,C23-.,C24-.,C25-.,C26-.,C27-.
CRCB:
C0:     BYTE    126.,28.,0      ;Clear screen and set normal intensity
C1:     BYTE    126.,18.,0      ;CURSOR HOME
C2:     BYTE    215,0           ;CURSOR RETURN
C3:     BYTE    126.,12.,0      ;CURSOR UP
C4:     BYTE    126.,11.,0      ;CURSOR DOWN
C5:     BYTE    8.,0            ;CURSOR LEFT
C6:     BYTE    16.,0           ;CURSOR RIGHT
C7:     BYTE    126.,21.,0      ;LOCK KEYBOARD
C8:     BYTE    126.,6.,0       ;UNLOCK KEYBOARD
C9:     BYTE    126.,15.,0      ;ERASE TO END OF LINE
C10:    BYTE    126.,24.,0      ;ERASE TO END OF SCREEN
C11:    BYTE    126.,25.,0      ;Background display (low intensity)
C12:    BYTE    126.,31.,0      ;Foreground display (high intensity)
C13:    BYTE    0               ;ENABLE PROTECTED FIELDS
C14:    BYTE    0               ;DISABLE PROTECTED FIELDS
C15:    BYTE    126.,19.,0      ;Delete line
C16:    BYTE    126.,26.,0      ;Insert line
C17:    BYTE    0               ;Delete character
C18:    BYTE    0               ;Insert character
C19:    BYTE    126.,5,0        ;Read cursor address
C20:    BYTE    0               ;Read character at cursor address
C21:    BYTE    0               ;Start blinking field
C22:    BYTE    0               ;End blinking field
C23:    BYTE    0               ;Start line drawing mode
C24:    BYTE    0               ;End line drawing mode
C25:    BYTE    0               ;Set horizontal position
C26:    BYTE    0               ;Set vertical position
C27:    BYTE    126.,36.,0      ;Return to Switches

       EVEN
       END