;***************************************************************************; ; ; ; Teleray 10 Terminal Driver ; ; ; ; Author: David F. Pallmann ; ; Copyright (C) 1984 - LMS Technical Services, Inc. ; ; ; ;***************************************************************************; OBJNAM TELRAY.TDV SEARCH SYS SEARCH SYSSYM SEARCH TRM ESC=33 ; (lead-in code) ;Terminal driver communications area TELRAY: WORD TD$NEW ;Terminal attributes BR JMPINP ;Input routine RTN ;Output routine BR ECHO ;Echo routine BR JMPCRT ;CRT control RTN ;No init routine WORD 0 ;No impure area BYTE 24. ;Row count BYTE 80. ;Column count LWORD TD$LID!TD$CID!TD$DIM!TD$EOS!TD$EOL!TD$BLN!TD$UND!TD$RVA!TD$MLT JMPINP: JMP INPUT ;Jump to input routine JMPCRT: JMP CRT ;Jump to CRT routine ;********** ;* ECHO * ;********** ;Special echo processing is performed here ;s will backspace and erase the previous character ;^U will erase the entire line by backspacing and erasing ECHO: CMPB D1,#'U-'@ ;^U BEQ CTRLU CMPB D1,#177 ; BNE ECHX ;Character deletions are handled by the old backspace-and-erase game ;Special handling must be performed if we are deleting out a ;D6 contains the character being deleted RUBOUT: CMPB D6,#'I-'@ ;was it a ? BEQ RBTB ; yes ;Delete 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 ;Deletion was of a - we must calculate how big the 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 ; BEQ KRTT CMPB D1,#15 ; BEQ KRTC CMPB D1,#33 ; 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 AND #^C7,D3 BR KRTS KRTC: CLR D3 ;clear position for 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 ^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 ;*********** ;* INPUT * ;*********** ;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 INPUT: 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 CMPB D1,#'V-'@ ;DOWN ARROW? BNE 10$ MOVB #'J-'@,D1 10$: LCC #0 ; no - normal processing 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 ;Unshifted function keys map to 200-212 ;Shifted function keys map to 240-252 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 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 ESC,'Y,0,0 ADD #17437,D1 ;add position offsets ROR D1,#8. ;send row first TTY ROL D1,#8. ;send column second TTY 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 ESC,14,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),#'f ;no nulls if program status cmd ;; BEQ CRTX ;; CMPB 1(A2),#'G ;no nulls for attribute cmd ;; BEQ CRTX ;; 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-.,C9-.,C10-. WORD C11-.,C12-.,C13-.,C14-.,C15-.,C16-.,C17-.,C18-.,C19-.,C20-. WORD C21-.,C22-.,C23-.,C24-.,C25-.,C26-.,C27-.,C28-.,C29-.,C30-. WORD C31-.,C32-.,C33-.,C34-.,C35-. CRCB: PAGE ;Macro CRT defines CRT codes and sets SuperVUE attribute bits DEFINE CRT CODE1,CODE2,CODE3 IF NB,CODE1,BYTE CODE1 IF NB,CODE2,BYTE CODE2 IF NB,CODE3,BYTE CODE3 BYTE 0 ENDM C0: CRT ;clear screen C1: CRT ESC,'H ;Home cursor C2: CRT 200+13. ;Cursor to column 1 C3: CRT ESC,'A ;Cursor up C4: CRT ESC,'B ;Cursor down C5: CRT ESC,'D ;Cursor left C6: CRT ESC,'C ;Cursor right C7: CRT ESC,'b ;Lock keyboard C8: CRT ESC,'c ;Unlock keyboard C9: CRT ESC,'K ;Erase to end of line C10: CRT ESC,'J ;Erase to end of screen C11: CRT ESC,'R,'B ;Low intensity C12: CRT ESC,'R,'@ ;High intensity C13: CRT ESC,'W ;Enable protected fields C14: CRT ESC,'X ;Disable protected fields C15: CRT ESC,'M ;Delete line C16: CRT ESC,'L ;Insert line C17: CRT ESC,'Q ;Delete character C18: CRT ESC,'P ;Insert character C19: CRT ESC,'a ;Read cursor address C20: CRT ;Read character at current cursor position C21: CRT ESC,'R,'A ;Blink on C22: CRT ESC,'R,'@ ;Blink off C23: CRT ;Start line drawing mode C24: CRT ;End line drawing mode C25: CRT ;Set horizontal position C26: CRT ;Set vertical position C27: CRT ;Set terminal attributes C28: CRT ;Cursor on C29: CRT ;Cursor off C30: CRT ESC,'R,'H ;Underscore on C31: CRT ESC,'R,'@ ;Underscore off C32: CRT ESC,'R,'D ;Reverse video on C33: CRT ESC,'R,'@ ;Reverse video off C34: CRT ESC,'R,'E ;Reverse blink on C35: CRT ESC,'R,'@ ;Reverse blink off EVEN END .