;***************************************************************************;

;                                                                           ;

;                      Hazeltine 1500 Terminal Driver                       ;

;                           By David F. Pallmann                            ;

;                                                                           ;

; MODIFIED FOR SUPERVUE TERMINALS BY GLEN A FINE

;***************************************************************************;



       SEARCH  SYS

       SEARCH  SYSSYM

       SEARCH  TRM



       OBJNAM  HA1500.TDV



       TFEATS=TD$LID!TD$CID!TD$DIM!TD$EOS!TD$EOL!TD$BLN!TD$UND!TD$RVA!TD$MLT

       LI=126.                         ;Hazeltine 1500 lead-in code (tilde)



;********************

;*       HZ1500     *

;********************

;Terminal driver communications area

HZ1500: WORD    TD$NEW                  ;terminal attributes

       BR      JMPINP                  ;input routine

       RTN                             ;output routine

       BR      ECHO                    ;echo routine

       BR      JMPCRT                  ;crt control

       RTN                             ;no init routine yet

       WORD    0                       ;no impure area yet

       BYTE    24.                     ;number of rows

       BYTE    80.                     ;number of columns

;       LWORD   TFEATS                  ;terminal has:

       LWORD   ^H0FFFFFFFF             ;  insert/delete line

       BLKB    32.                     ;  insert/delete character

       WORD    [SUP],[ER ],[VUE]       ;  dim video attribute

       RAD50   /FKEYS/                 ;  erase to end of screen

                                       ;  erase to end of line



JMPINP: JMP     INP                     ;go handle input characters

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                  ; escape

       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





;********************

;*      INP         *

;********************

;Input character processing subroutine

;Return a negative flag to indicate possible multi-byte key codes

;Detect a negative flag which indicates the multi-byte processing return

INP:    BMI     INMLT                   ;skip if multi-byte processing

       CMPB    D1,#1                   ;function code?

       BEQ     INPM                    ;  yes - could be multi-byte sequence

       CMPB    D1,#33                  ;escape?

       BEQ     INPM                    ;  yes - could be multi-byte sequence

       AND     #177,D1                 ;strip char to 7 bits

       CMPB    D1,#'_                  ;underscore?

       BEQ     100$                    ; yes - swap case

       CMPB    D1,#177                 ;del?

       BNE     110$                    ; no



100$:   XORB    #40,D1                  ;swap case bit



110$:   LCC     #0

       RTN



INPM:   LCC     #PS.N                   ;possible multi-byte - return N flag

       RTN



;Multi-byte processing is done here

;This occurs when TRMSER has accumulated all bytes of a multi-byte keystroke

;D0 contains the character count and A0 indexes the data string

;A5 indexes the terminal definition block and must be preserved

;The translated character must be returned in D1 for storage

;This routine may destroy only A0,A3,A6,D0,D6,D7

INMLT:  MOVB    (A0)+,D1                ;get the first character

       DECB    D0                      ;no translation if single character

       BEQ     INMX

       CMPB    D1,#1                   ;function sequences start with SOH

       BEQ     INMF                    ;  function sequence -

;Escape sequences are translated directly by setting bit 7 on

;This will cause them to map to 240-377

       MOVB    (A0)+,D1                ;get the second character

INMG:   ORB     #200,D1                 ;set bit 7 on

       BIT     #T$XLT,@A5              ;are we doing translation?

       BEQ     INMNOT                  ;  no - check for another translation

INMX:   LCC     #0                      ;reset the flags

INMX2:  RTN



;Function codes require additional translation so that they become 200-237

INMF:   MOVB    (A0)+,D1                ;get the second character

       SUBB    #'@,D1                  ;offset so that F1 becomes 0

       BR      INMG                    ;  and go finish up



;Come here if program is not doing translation and we must do our own

INMNOT: LEA     A6,XLTTBL               ;index the translation table

10$:    MOVB    (A6)+,D7                ;get character

       BEQ     INMX2                   ;  end of table - ignore the character

       CMPB    D1,D7                   ;is it in the table?

       BEQ     20$                     ;  yes -

       INC     A6                      ;  no - bypass translation

       BR      10$                     ;loop for more -



;Come here to translate the character

20$:    MOVB    @A6,D1                  ;translate the character

       BR      INMX



;Translation table

XLTTBL:

;;;     BYTE    314,3                   ;CANCEL = Control-C

;;;     BYTE    302,3                   ;SHIFT + CANCEL = Control-C

;;;     BYTE       ,15                  ;EXECUTE = Return

;;;     BYTE    276,15                  ;SHIFT + EXECUTE = Return

;;;     BYTE    313,'U-100              ;DEL LINE = Control-U

       BYTE    000,000



PAGE



;********************

;*       CRT        *

;********************

;Special crt control processing

;D1 contains the control code for X,Y 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    LI,17.,0,0

       ADD     #95._10-1,D1

       CMPB    D1,#31.

       BHIS    100$

       ADDB    #96.,D1



100$:   TTY                             ;send column first

       ROR     D1,#8.

       TTY                             ;send row second

       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    LI,28.,0

       EVEN

CRTZ:   TTYL    CRTNUL                  ;output some nulls

       RTN



;Command processing per director tables

CRTU:   PUSH    A2                      ;save A2

       ASL     D1                      ; times 2 (word offset).

       CMP     D1,#CRCB-CRCA           ;check for valid code

       BHI     CRTX                    ;  and bypass if bad

       LEA     A2,CRCA-2               ;index the table

       ADD     D1,A2                   ;add command code

       MOVW    @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



;Escape sequence translation table

;

EXTB:   BYTE    67,73,105,111,120,121,122,124,127,131,377,377





;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:   WORD    C1-.,C2-.,C3-.,C4-.,C5-.,C6-.,C7-.,C8-.

       WORD    C9-.,C10-.,C11-.,C13-.,C14-.

       WORD    C15-.,C16-.,C17-.,C18-.,C19-.,C20-.,C21-.,C22-.

       WORD    C23-.,C24-.,C25-.,C26-.,C27-.,C28-.,C29-.

       WORD    C30-.,C31-.,C32-.,C33-.,C34-.,C35-.,C36-.,C37-.,C38-.,C39-.

       WORD    C40-.,C41-.,C42-.,C43-.,C44-.,C45-.,C46-.,C47-.,C48-.,C49-.

       WORD    C50-.,C51-.,C52-.,C53-.,C54-.,C55-.,C56-.,C57-.,C58-.

       WORD    C60-.,C61-.,C62-.,C63-.,C64-.,C65-.,C66-.,C67-.,C68-.,C69-.

       WORD    C70-.,C71-.,C72-.,C73-.,C74-.,C75-.,C76-.,C77-.,C78-.

CRCB:

       PAGE



C1:     BYTE    LI,22,0                 ;cursor home (move to column 1,1)

C2:     BYTE    15,12,0                 ;cursor return (move to column 1)

C3:     BYTE    LI,14,0           ;cursor up

C4:     BYTE    12,0                    ;cursor down

C5:     BYTE    10,0                    ;cursor left

C6:     BYTE    20,0                    ;cursor right

C7:     BYTE    0                       ;lock keyboard

C8:     BYTE    0                       ;unlock keyboard

C9:     BYTE    LI,17,0                 ;erase to end o

C10:    BYTE    LI,30,0                 ;erase to end of screen

C11:    BYTE    LI,31,0                 ;enter backgroud display mode (reduced intensity).

C12:    BYTE    LI,37,0                 ;enter foreground display mode (normal intensity)

C13:    BYTE    0                       ;enable protected  fields

C14:    BYTE                      ;disable protected fields

C15:    BYTE    LI,19.,0                ;delete line

C16:    BYTE    LI,26.,0                ;insert line

C17:    BYTE    0                       ;delete character

C18:    BYTE    0                       ;insert character

C19:    BYTE    0                       ;read cursor address

C20:      0                       ;read character at current cursor position

C21:    BYTE    0                       ;start blink field

C22:    BYTE    0                       ;end blink field

C23:                                    ;start line drawing mode (enable alternate character set)

C24:                                    ;end line drawing modable alternate character set)

C25:                                    ;set horizontal position

C26:    BYTE    0                       ;set vertical position

C27:    BYTE    0               ;set terminal attributes

C28:    BYTE    0               ;cursor on

C29:    BYTE    0               ;cursor off

C30:    BYT               ;start underscore                       [102]

C31:    BYTE    0               ;end underscore                 [102

C32:    BYTE    LI,31,0

C33:    BYTE    LI,37,0

C34:    BYTE    LI,31,0

C35:    BYTE    LI,37,0

C36:    BYTE    0;3,'o,0                ;turn off screen display          [102]

C37:    BYTE    0;3,'n,0                ;turn on screen display         [102]

C38:                                    ;top left corner

C39:                                    ;top right corner

C40:                                    ;bottom left corner

C41:                                    ;bottom right corner

C42:                                    ;top intersect

C43:                              ;right intersect

C44:                                    ;left intersect

C45:    BYTE    0;,0                    ;bottom intersect

C46:    BYTE    0;,0                    ;horizontal line

C47:    BYTE    0;,0                    ;vertical line

C48:    BYTE    0;,0                    ;intersection

C49:                                    ;solid block

C50:                             ;slant block

C51:    BYTE    0;,0                    ;cross-hatch block

C52:                                    ;double line horizontal

C53:                                    ;double line vertical

C54:                                    ;send message to function key line

C55:                                    ;send message to shifted function key C56:                                    ;set normal display format

C57:                                    ;set horizontal split (follow with row code)

C58:                                    ;set vertical split (39 char columns)

C59:                                    ;set vertical split (40 char columns)

C60:                                    ;set vertical split column to next char

C61:                                    ;activate split segment 0

C62:                                    ;activate split segment 1

C63:    BYTE    0                       ;send message to host message field

C64:    BYTE    '^,0                    ;up-arrow

C65:    BYTE    '|,0                    ;down-arrow

C66:    BYTE    '`,0                    ;raised dot

C BYTE    0                       ;end of line marker

C68:    BYTE    '[,0                    ;horizontal tab symbol

C69:    BYTE    ' ,0                    ;paragraph

C70:    BYTE    ' ,0                    ;dagger

C71:    BYTE    ' ,0                    ;section

C72:    BYTE    ' ,0                    ;cent sign

C73:    BYTE    ' ,0
 ;one-quarter

C74:    BYTE    ' ,0                    ;one-half

C75:    BYTE,0                    ;degree

C76:    BYTE    ' ,0                    ;trademark

C77:    BYTE    ' ,0                    ;copyright

C78:    BYTE    ' ,0                    ;registered

       EVEN



       END