; TVI950.TDV - driver for Televideo 950
;
; Copyright [c] Noel Alaska Systems Technology, 1983.
; 07/10/83 - revised for AMOSL release 1.0b - new TCRT order for many
; of the fancy things - also pick up new SV and AB defined
; calls. Add input translation for certain keys. Install
; function-code bitmap per new SuperVue specs.
; 08/08/83 - correct function-code bitmap per Jim Rea.
; T$AB is a bit I define in terminal status word that tells VTAM
; 'func' keys will be used for alt escape, tchar, and pchar. So
; it will 'passthru' ^G, ^[, and ^_ to the controlled job, only
; recognizing them when the parity bit is set - which the input
; routine of this driver does when it translates the func keys.
;************************
;* TVI * TDV communications area
;************************
TVI: WORD TD$NEW ; TERMINAL ATTRIBUTES
BR INPUT ; INPUT ROUTINE
BR OUTP ; OUTPUT ROUTINE
BR ECHO ; ECHO ROUTINE
BR TCRT ; CRT CONTROL
RTN ; TDV INIT ROUTINE (none)
WORD 0 ; IPA SIZE (bytes)
BYTE 24. ; number of rows
BYTE 80. ; number of columns
LWORD -1 ; Alpha's function word
WORD FN.2 ; Vendor's function bitmap
WORD FN.1
WORD FN.4
WORD FN.3
WORD FN.6
WORD FN.5
WORD FN.8
WORD FN.7
WORD FN.A
WORD FN.9
BLKW 6.
WORD [SUP],[ER],[VUE]
WORD 0,0,0
OUTP: JMP OUTPUT ; "the long branch"
ECHO: JMP ECHO2 ; "the long branch"
TCRT: JMP CRT ; "the long branch"
CKLESC: 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
INX: LCC #0 ; no - normal processing
RTN
INPM: LCC #PS.N ; possible multi-byte - return N flag
RTN
; --- get here for multi-byte sequence ---
INMLT: MOVB (A0)+,D1 ; get the first character
ANDB #177,D1
DECB D0 ; no translation if single character
BEQ INMX
CMPB D1,#1 ; function sequences start with SOH
BNE INMNOT ; - escape sequence -
;Function codes translation
INMF: MOVB (A0)+,D1 ; get the second character
ANDB #177,D1 ; remove parity
LEA A6,XLAT1 ; index the translation table
10$: MOVB (A6)+,D7 ; get character
BEQ 30$ ; end of table - take char as is
CMPB D1,D7 ; this one it?
BEQ 20$ ; yes -
INC A6 ; no - keep looken
BR 10$
20$: MOVB @A6,D1 ; translate the sequence
ORW #T$AB,@A5 ; force T$AB bit
BR INMX
30$: MOV T.IBF(A5),A6
ADD T.ICC(A5),A6
MOVB #07,@A6 ; force ^G ahead of this char
INC T.ICC(A5)
INC T.BCC(A5)
INMX: LCC #0 ; reset the flags
INMX2: RTN
;Escape code translation
INMNOT: MOVB (A0)+,D1 ; get the second character
ANDB #177,D1 ; remove parity
LEA A6,XLAT2 ; index the translation table
10$: MOVB (A6)+,D7 ; get character
BEQ 30$ ; end of table - take char(s) as is
CMPB D1,D7 ; this one it?
BEQ 20$ ; yes -
INC A6 ; no - keep looken
BR 10$
20$: MOVB @A6,D1 ; translate the sequence
BR INMX
30$: CALL 40$ ; accept sequence 'as is'
MOVB #33,@A6
35$: CALL 40$
MOVB D1,@A6
DEC D0
BEQ INMX2
MOVB (A2)+,D1
BR 35$
40$: MOV T.IBF(A5),A6 ; subroutine inserts char
ADD T.ICC(A5),A6
INC T.ICC(A5)
INC T.BCC(A5)
RTN
XLAT1: BYTE 'E,207 ; func E is alternate escape [vtam]
BYTE 'e,207 ;
BYTE 'P,237 ; func P is picture request [vtam]
BYTE 'p,237 ;
BYTE 'T,235 ; func T is toggle request [vtam]
BYTE 't,235 ;
BYTE 0,0 ; end of table
EVEN
XLAT2: BYTE 'Q,^H06 ; ins chr
BYTE 'R,^H1A ; delete line
BYTE 'W,^H04 ; del chr
BYTE 'E,^H02 ; ins line
BYTE 'I,^H01 ; bs (backtab) ^A
BYTE 'j,^H0B ; shifted up arrow
BYTE 0,0 ; end of table
EVEN
PAGE
;************************
;* OUTPUT * Output routine for Televideo 950
;************************
OUTPUT: SAVE A3
CMPB D1,#12 ; is this a linefeed?
BNE 0$ ; NO
LEA A3,T.OQX(A5) ; YES - point at output queue
QINS A3 ; get another queue block
MOV #4,0(A3) ; we use image-mode output
MOV #3,4(A3) ; we send 3 bytes
PEA 1$ ; point to data to send
POP 10(A3) ; put data addr into queue block
CLR D1 ; tell TRMSER to ignore this LF
0$: LCC #10 ; normal positioning
REST A3
RTN
PAGE
;************************
;* CRT * crt routine for televideo 950
;************************
CRT: TSTW D1 ; is it cursor position?
BMI CRTS ; NO
TTYI ; send position command
BYTE 233,75,0,0
ADD #^H1F1F,D1 ; add position offsets
ROR D1,#8. ; send row
TTY
ROL D1,#8. ; send col
TTY
ORW #T$AB,@A5 ; force T$AB bit
RTN
CRTS: AND #377,D1 ; strip the high byte
ASL D1 ; times 2 (word offset).
SAVE A2,D1 ; save A2 and command code
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
MOVW @A2,D1 ; pick up data field offset
ADD D1,A2 ; make absolute data address
TTYL @A2 ; print the data field
CRTX: REST A2,D1 ; restore A2 and command code
; TSTB D1 ; pause if clear screen
; BEQ 0$
; CMPB D1,#10. ; pause if erase to end of screen
; BEQ 0$
RTN
; ----- televideo 950 doesn't seem to need waits, even @ 19200 -----
; 0$: SSTS -(SP) ; stack status
; 1$: SVLOK ; lock so things can't change
; MOVW @A5,D7
; ANDW #T$OIP,D7 ; is output in progress?
; BNE 2$ ; YES - wait
; TST T.OQX(A5) ; is output queued?
; BNE 2$ ; YES - wait
; LSTS (SP)+ ; restore status
; RTN ; return to user
; 2$: JWAIT J.TOW ; let TRMSER wake us (UNLOCK's)
; BR 1$ ; re-test
; 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-.
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-.,C79-.
WORD C80-.,C81-.,C82-.,C83-.,C84-.,C85-.,C86-.,C87-.,C88-.,C89-.
WORD C90-.,C91-.,C92-.,C93-.,C94-.,C95-.,C96-.,C97-.,C98-.,C99-.
WORD C100-.,C101-.,C102-.,C103-.,C104-.,C105-.,C106-.,C107-.,C108-.,C109-.
WORD C110-.,C111-.,C112-.,C113-.,C114-.,C115-.,C116-.,C117-.,C118-.,C119-.
WORD C120-.,C121-.,C122-.,C123-.,C124-.,C125-.,C126-.,C127-.,C128-.,C129-.
WORD C130-.,C131-.,C132-.,C133-.,C134-.,C135-.,C136-.,C137-.,C138-.,C139-.
WORD C140-.,C141-.,C142-.,C143-.,C144-.,C145-.,C146-.,C147-.,C148-.,C149-.
WORD C150-.,C151-.,C152-.,C153-.,C154-.,C155-.,C156-.
CRCB:
PAGE
C0: BYTE 233,'*,0 ; clear screen
C1: BYTE 30.,0 ; cursor home (move to column 1,1)
C2: BYTE 215,0 ; cursor return (move to column 1)
C3: BYTE 11.,0 ; cursor up
C4: BYTE 10.,0 ; cursor down
C5: BYTE 8.,0 ; cursor left
C6: BYTE 12.,0 ; cursor right
C7: BYTE 233,43,0 ; lock keyboard
C8: BYTE 233,42,0 ; unlock keyboard
C9: BYTE 233,'T,0 ; erase to end of line
C10: BYTE 233,'Y,0 ; erase to end of screen
C11: BYTE 233,'),0 ; enter backgroud display mode (reduced intensity).
C12: BYTE 233,'(,0 ; enter foreground display mode (normal intensity)
C13: BYTE 233,'&,0 ; enable protected fields
C14: BYTE 233,'',0 ; disable protected fields
C15: BYTE 233,'R,0 ; delete line
C16: BYTE 233,'E,0 ; insert line
C17: BYTE 233,'W,0 ; delete character
C18: BYTE 233,'Q,0 ; insert character
C19: BYTE 233,'?,0 ; read cursor address
C20: BYTE 233,'1,0 ; read character at current cursor position
C21: BYTE 233,'G,'2,0 ; start blink field
C22: BYTE 233,'G,'0,0 ; end blink field
C23: BYTE 233,'$,0 ; start line drawing mode (enable alternate character set)
C24: BYTE 233,'%,0 ; end line drawing mode (disable alternate character set)
C25: ; set horizontal position
C26: ; set vertical position
C27: BYTE 0 ; set terminal attributes
C28: BYTE 233,'.,'1,0 ; cursor on
C29: BYTE 233,'.,'0,0 ; cursor off
C30: BYTE 233,'G,'8,0 ; start underscore [102]
C31: BYTE 233,'G,'0,0 ; end underscore [102
C32: BYTE 233,'G,'4,0 ; start reverse video [102]
C33: BYTE 233,'G,'0,0 ; end reverse video [102]
C34: BYTE 233,'G,'6,0 ; start reverse blink [102]
C35: BYTE 233,'G,'0,0 ; end reverse blink [102]
C36: BYTE 233,'o,0 ; turn off screen display [102]
C37: BYTE 233,'n,0 ; turn on screen display [102]
C38: BYTE 30.,0 ; top left corner
C39: BYTE 233,75,40,156,0 ; top right corner
C40: BYTE 233,75,67,40,0 ; bottom left corner
C41: BYTE 233,75,67,156,0 ; bottom right corner
C42: BYTE '-,0 ; top intersect
C43: BYTE '|,0 ; right intersect
C44: BYTE '|,0 ; left intersect
C45: BYTE '-,0 ; bottom intersect
C46: BYTE '-,0 ; horizontal line
C47: BYTE '|,0 ; vertical line
C48: BYTE '+,0 ; intersection
C49: ; solid block
C50: ; slant block
C51: BYTE '#,0 ; cross-hatch block
C52: BYTE '=,0 ; double line horizontal
C53: BYTE '|,0 ; 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: BYTE 0 ; activate split segment 1
C63: BYTE 233,'f,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: ; paragraph
C70: ; dagger
C71: ; section
C72: ; cent sign
C73: ; one-quarter
C74: ; one-half
C75: ; degree
C76: ; trademark
C77: ; copyright
C78: BYTE ' ,0 ; registered
C79: ; undefined
C80: ; undefined
C81: ; undefined
C82: ; undefined
C83: ; undefined
C84: ; undefined
C85: ; undefined
C86: ; undefined
C87: ; undefined
C88: ; undefined
C89: ; undefined
C90: ; undefined
C91: ; undefined
C92: ; undefined
C93: ; undefined
C94: ; undefined
C95: ; undefined
C96: ; undefined
C97: ; undefined
C98: ; undefined
C99: ; undefined
C100: ; undefined
C101: ; undefined
C102: ; undefined
C103: ; undefined
C104: ; undefined
C105: ; undefined
C106: ; undefined
C107: ; undefined
C108: ; undefined
C109: ; undefined
C110: ; undefined
C111: ; undefined
C112: ; undefined
C113: ; undefined
C114: ; undefined
C115: ; undefined
C116: ; undefined
C117: ; undefined
C118: ; undefined
C119: ; undefined
C120: ; undefined
C121: ; undefined
C122: ; undefined
C123: ; undefined
C124: ; undefined
C125: ; undefined
C126: ; undefined
C127: BYTE 0 ; undefined
; ----- begin SuperVue defined calls ------
C128: BYTE 233,'f,0 ; start line 25 (line 0 on some terms)
C129: BYTE 215,0 ; end line 25 "
C130: BYTE 33,'!,1,0 ; line lock on
C131: BYTE 33,'!,2,0 ; line lock off
C132: BYTE 233,'f,40,215,0 ; clear line 25
C133: ; start underline (per char type)
C134: BYTE 0 ; end underline "
; ----- begin Alpha-Base defined calls -----
C135: BYTE 233,'d,0 ; set SCREEN DARK
C136: BYTE 233,'b,0 ; set SCREEN BRIGHT
C137: BYTE 233,'>,0 ; key click on
C138: BYTE 233,'<,0 ; key click off
C139: BYTE 233,'G,'1,0 ; blank on
C140: BYTE 233,'G,'0,0 ; blank off
C141: BYTE 233,'G,'>,0 ; reverse/blink/underline on
C142: BYTE 233,'G,'0,0 ; reverse/blink/underline off
C143: BYTE 233,'G,'<,0 ; reverse/underline on
C144: BYTE 233,'G,'0,0 ; reverse/underline off
C145: BYTE 233,'G,':,0 ; blink/underline on
C146: BYTE 233,'G,'0,0 ; blink/underline off
C147: BYTE 233,'.,'1,0 ; cursor blink block
C148: BYTE 233,'.,'2,0 ; cursor steady block
C149: BYTE 233,'.,'3,0 ; cursor blink underline
C150: BYTE 233,'.,'4,0 ; cursor steady underline
C151: BYTE 233,'f ; send msg to host msg fld (centered)
ASCII / /
BYTE 0
C152: BYTE 215,0 ; end line 25
C153: BYTE 233,'g,0 ; Turn L25 Msg ON
C154: ; undefined
C155: ; undefined
C156: BYTE 0 ; undefined