;**************************************************************************;
;                                                                          ;
;                       SOROC TERMINAL UNIT ROUTINE                        ;
;                                                                          ;
;**************************************************************************;
;                                                               ASL-02011-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:
;
;[100] 3 May 1982
;       Move cursor TCRT calls to correspond to new standard. /RBC
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                                       ;
;       MODIFIED TO SOLVE TYPE-AHEAD PROBLEM ON 03/01/83                ;
;       BY:  Robert C. Strunk                                           ;
;            Software Systems Consulting Incorporated                   ;
;            2701 Spring Grove Av, Cincinnati, OH 45225                 ;
;                                                                       ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

       SEARCH  SYS
       SEARCH  SYSSYM
       SEARCH  TRM

       OBJNAM  IQ135.TDV

CTRL    =       ^C<^B1_6>       ;CONTROL CHAR MASK
BIT7    =       ^B1_7           ;BIT-7
ESC     =       <'[&CTRL>!BIT7  ;ESCAPE


;********************
;*       SOROC      *
;********************
;TERMINAL DRIVER COMMUNICATIONS AREA
SOROC:  WORD    2000            ; terminal attributes
       RTN                     ; input routine
       RTN                     ; output routine
       BR      ECHO            ; echo routine
       BR      JMPCRT          ; crt control
       RTN                     ; no INIT routine yet
       WORD    6               ; impure area FOR CURSOR POSITIONING
       BYTE    24.,80.         ; SCREENSIZE
       LWORD   151400          ; terminal has:
                               ;   insert/delete line
                               ;   insert/delete character
                               ;   dim video attribute
                               ;   erase to end of screen
                               ;   erase to end of line

JMPCRT: JMP     CRT             ; go handle TCRT codes

;********************
;*       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:    SAVE    A2,D3           ;SAVE TBUF'S REGISTERS
       MOVW    JOBCMS(A0),D3   ;TEST COMMAND FILE PROCESSING
       ANDW    #C.TRC,D3       ;IS TRACE MODE ON?
       BNE     CRTT            ;BRANCH IF SO
       MOVW    JOBCMS(A0),D3   ;TEST COMMAND FILE PROCESSING
       ANDW    #C.SIL,D3       ;IS OUTPUT SILENCED?
       BNE     CRTX            ;BRANCH IF IT IS
CRTT:   TSTW    D1              ;IS IT CURSOR POSITION?
       BMI     CRTS            ;  NO
;CURSOR POSITIONING - D1 CONTAINS X,Y COORDINATES
       MOV     T.IMP(A5),A2    ;PICKUP IMPURE AREA
       MOV     CURP,@A2        ;PLACE PREFIX FOR CURSOR POSITIONING
       ADDW    #^H1F1F,D1      ;COMPUTE POSITION OFFSETS
       RORW    D1,#8.          ;SWAP ROW AND COLUMN NUMBERS
       MOVW    D1,4(A2)        ;SEND ROW AND COLUMN (IN ORDER)
       ADDW    #1,A2           ;PASS OVER THE FIRST NULL
       BR      CRTO
CURP:   BYTE    0,4,ESC,'=      ;PREFIX FOR CURSOR POSITIONING
;SPECIAL COMMANDS - D1 CONTAINS THE COMMAND CODE IN THE LOW BYTE
CRTS:   AND     #^H0FF,D1       ;STRIP THE HIGH BYTE
;COMMAND PROCESSING PER DIRECTOR TABLES
CRTU:   ASL     D1              ; DOUBLE THE CODE (word offset).
       CMPW    D1,#CRCB-CRCA   ;CHECK FOR VALID CODE
       BHI     CRTX            ;  AND BYPASS IF BAD
       LEA     A2,CRCA         ;INDEX THE TABLE
       ADDW    D1,A2           ;ADD COMMAND CODE
       MOVW    @A2,D1          ;PICK UP DATA FIELD OFFSET
       ADD     D1,A2           ;MAKE ABSOLUTE DATA ADDRESS
;SEE IF WE CAN ARRANGE TO HAVE THE WHOLE STRING OUTPUT UN-INTERRUPTED
CRTO:   MOV     T.OBS(A5),D1    ;PICKUP TOTAL BUFFER SIZE
       SUB     T.OBX(A5),D1    ;SUB CURR BUFF CNT TO GET # CHAR POS LEFT
       CLR     D3              ;PREPARE TO
       MOVB    (A2)+,D3        ; PICKUP LENGTH OF DATA
       BEQ     CRTX            ;BRANCH IF NOTHING TO OUTPUT
       CMP     D1,D3           ;ENOUGH ROOM FOR WHOLE STRING?
       BGE     CRTM            ;BRANCH IF SO
       SVLOK                   ;PREVENT (I/O) INTERRUPTS
       TST     T.OBX(A5)       ;WE WANT AN EMPTY BUFFER
       BEQ     CRTW            ;BRANCH IF IT'S EMPTY NOW
       JWAIT   J.TOW           ;WAIT HERE FOR EMPTY BUFFER
CRTW:   SVUNLK                  ;ALLOW INTERRUPTS
;ACTUALLY DISPOSE OF CHARACTER STRING TO OUTPUT BUFFER
CRTM:   PUSH    A2              ;SAVE ADDR OF OUTPUT FIELD
       TBUF                    ;PRINT THE DATA FIELD
       POP     A2              ;RESTORE ADDR OF OUTPUT FIELD
       CMPB    1(A2),#100      ;SLEEP IF LONG COMMAND (E.G. ERASE)
       BLOS    CRTX
       LEA     A2,CRTNUL       ;POINT TO PAD CHARACTERS
       CLR     D3              ;PREPARE TO
       MOVB    (A2)+,D3        ; PICKUP LENGTH OF DATA
       TBUF                    ;STALL THE PROGRAM A WHILE
CRTX:   REST    A2,D3           ;RESTORE TBUF'S REGISTERS
       RTN

;Null characters for long commands
CRTNUL: BYTE    11.,BIT7,BIT7,BIT7,BIT7,BIT7,BIT7,BIT7,BIT7,BIT7,BIT7,BIT7
       EVEN

;BYTE OFFSET AND DATA TABLES FOLLOW FOR ALL COMMANDS
CRCA:   WORD    C0-.,C1-.,C2-.,C3-.,C4-.,C5-.,C6-.,C7-.,C8-.
       WORD    C9-.,C10-.,C11-.,C12-.,C13-.,C14-.,C15-.,C16-.
       WORD    C17-.,C18-.,C19-.,C20-.,C21-.,C22-.,C23-.,C24-.
       WORD    C25-.,C26-.,C27-.,C28-.,C29-.
CRCB:
C0:     BYTE    2,ESC,<'*&CTRL>!BIT7    ;ERASE SCREEN
C1:     BYTE    2,'^&CTRL,BIT7  ;CURSOR HOME
C2:     BYTE    1,<'M&CTRL>!BIT7        ;CURSOR RETURN
C3:     BYTE    1,'K&CTRL       ;CURSOR UP
C4:     BYTE    1,'J&CTRL       ;CURSOR DOWN
C5:     BYTE    1,'H&CTRL       ;CURSOR LEFT
C6:     BYTE    1,'L&CTRL       ;CURSOR RIGHT
C7:     BYTE    2,ESC,'#        ;LOCK KEYBOARD
C8:     BYTE    2,ESC,'"        ;UNLOCK KEYBOARD
C9:     BYTE    2,ESC,'T        ;ERASE TO END OF LINE
C10:    BYTE    2,ESC,'Y        ;ERASE TO END OF SCREEN
C11:    BYTE    2,ESC,')        ;PROTECT FIELD (WRT LOW ON)
C12:    BYTE    2,ESC,'(        ;UNPROTECT FIELD (WRT LOW OFF)
C13:    BYTE    2,ESC,'&        ;PROTECT MODE ON (LOW INTENS CHAR PROTECTED)
C14:    BYTE    2,ESC,''        ;PROTECT MODE OFF (NOTHING PROTECTED)
C15:    BYTE    2,ESC,'R        ;DELETE LINE
C16:    BYTE    2,ESC,'E        ;INSERT LINE
C17:    BYTE    2,ESC,'W        ;DELETE CHARACTER
C18:    BYTE    2,ESC,'Q        ;INSERT CHARACTER
C19:    BYTE    2,ESC,'?        ;READ CURSOR ADDRESS
C20:    BYTE    2,ESC,'1        ;READ CHARACTER AT CURSOR
C21:    BYTE    2,ESC,'V&CTRL   ;START BLINKING FIELD
C22:    BYTE    2,ESC,'D&CTRL   ;END BLINKING FIELD
C23:    BYTE    3,ESC,'-,'4     ;ENABLE ALT CHAR SET (E.G. LINE DRAWING)
C24:    BYTE    3,ESC,'-,'5     ;DISABLE ALT CHAR SET
C25:                            ;SET HORIZONTAL POSITION
C26:    BYTE    0               ;SET VERTICAL POSITION
C27:    BYTE    2,ESC,'.        ;SET TERMINAL CHARACTERISTICS (WATCH THIS!)
C28:    BYTE    7,ESC,'.        ;CURSOR ON
       ASCII   /2601/
       BYTE    'N&CTRL
C29:    BYTE    7,ESC,'.        ;CURSOR OFF
       ASCII   /2600/
       BYTE    'N&CTRL
       EVEN

       END