;********************
;* HZ1420 *
;********************
;Terminal driver communications area
HZ1420: 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:
; insert/delete line
; insert/delete character
; dim video attribute
; erase to end of screen
; erase to end of line
;********************
;* 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
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
;********************
;* 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
;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-.,C12-.,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-.,C59-.
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 of line
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 0 ;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: BYTE 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 mode (disable 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: BYTE 0 ;start underscore [102]
C31: BYTE 0 ;end underscore [102
C32: BYTE 0;3,'G,'4,0 ;start reverse video [102]
C33: BYTE 0;3,'G,'0,0 ;end reverse video [102]
C34: BYTE 0;3,'G,'6,0 ;start reverse blink [102]
C35: BYTE 0;3,'G,'0,0 ;end reverse blink [102]
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 line
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
C67: 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