;**************************************************************************; ; ; ; TELEVIDEO TERMINAL UNIT ROUTINE ; ; ; ;**************************************************************************; ; PSL-00154-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: ; ;[106] 8 May 1985 ; Correct my boo-boo in edit 105. /RJH ;[105] 2 May 1985 ; Fixed problem with rubbing out control characters. /RJH ;[104] 30 NOV 1984 ; Updated to meet the new standards: Updated the TRMCHR routine to support ; the new fields. Also to return the bitmap. /bys ;[103] 24 April 1984 ; Add latest video attribute TCRT calls and implement printer control ; TCRT's. /RBC ;[102] 8 September 1982 ; Add extended display functions. /RBC ;[101] 2 Aug 1982 ; Added multi-byte function code processing to input routine. /DW ;[100] 3 May 1982 ; Move cursor TCRT calls to correspond to new standard. /RBC SEARCH SYS SEARCH SYSSYM SEARCH TRM OBJNAM T925TO.TDV TFEATS=TD$LID!TD$CID!TD$DIM!TD$EOS!TD$EOL!TD$BLN!TD$UND!TD$RVA!TD$MLT ;******************** ;* TELVID * ;******************** ;Terminal driver communications area TELVID: WORD TD$NEW!TD$TCH ; 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 ROWCNT: BYTE 24. ; number of rows COLCNT: 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 BR JMPTCH JMPINP: JMP INP ; go handle input characters JMPCRT: JMP CRT ; go handle tcrt codes JMPTCH: JMP TCH ; go handle TRMCHR routine ;******************** ;* 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 CMPB D6,#40 ; no, was it a control char. [105] BLO RBX ; yes - [105][106] ;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 RBX: RTN ; [105] 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 ;******************** ;* 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 ; ;++++++ NEW STUFF FOR AUTO TURN-ON WITH TRMOFF.LIT +++++++++ ; PUSH D1 ;save everything (paranoid we are) PUSH D7 PUSH A6 PUSH D3 CLR D1 ;clear the reg MOVW T.STS(A5),D6 ;get the terminal status word PUSH D6 ;and save the original ANDW #20000,D6 ;get this bit CMPW D6,#20000 ;see if this bit is on (tv OFF) BLO CONT ;NO, tv is ON, so normal processing POP D6 ;tv OFF, so get the status word MOVW #20000,D7 ;and the bit indicating it's OFF COMW D7 ;complement ANDW D7,D6 ;and turn this bit off (tv will be ON) MOVW D6,@A5 ;move this into the status word LEA A6,C37 ;get the "turn on" byte string address MOV A6,D1 ;move this address to D1 for TRMBFQ MOV #2,D3 ;the number of bytes for turn on TRMBFQ ;turn tv ON CONT: POP D6 ;restore junk POP D3 POP A6 POP D7 POP D1 ; ;++++++ END OF "NEW HOT STUFF" - ZOUNDS! ++++++++++++++++ ; 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 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 ;******************** ;* TCH * ;******************** ;Handle TRMCHR call ;A1 points to argument block, A2 indexes this TDV, D2 contains flags ;Can only use A1,A2,A6,D1,D2,D6,D7 TCH: MOV TD.FLG(A2),TC.FLG(A1) ; transfer flags ; MOV JOBCUR,A6 ; index job ; MOV JOBTRM(A6),A6 ; index terminal control area ; MOV T.IMP(A6),A6 ; index impure area CLR D6 ; preclear register MOVB ROWCNT(A2),D6 ; get row count MOVW D6,TC.ROW(A1) ; transfer row count MOVB COLCNT(A2),D6 ; Get column count [103] MOVW D6,TC.COL(A1) ; transfer column count. [103] ; MOVW @A6,TC.COL(A1) ; transfer column count [103] CLRW TC.CLR(A1) ; no colors MOVW #0,TC.TSL(A1) ; set length of top status line [104] MOVW #0,TC.SSL(A1) ; set length of shifted status line [104] MOVW #0,TC.USL(A1) ; set length of unshifted status line [104] MOV D2,D7 ; get TRMCHR argument flags [104] AND #TC$BMP,D7 ; does user want bitmap [104] BEQ 20$ ; no - skip transfer code [104] ; user has requested bitmap -- return to him PUSH A1 ; save argument block index [104] ADDW #TC.BMP,A1 ; index bitmap return area [104] LEA A6,TCHBMP ; index our bitmap [104] MOV #<256./16.>-1,D7 ; get amount to transfer [104] 10$: MOVW (A6)+,(A1)+ ; transfer to user [104] DBF D7,10$ ; loop until done [104] POP A1 ; restore register [104] 20$: RTN ; return to TRMCHR monitor routine ; Define feature bitmap TCHBMP: BYTE ^B11111111 ; 0 - 7 BYTE ^B11111111 ; 8 - 15 BYTE ^B01111111 ; 16 - 23 BYTE ^B11111000 ; 24 - 31 (no horiz or vertical pos) BYTE ^B00111111 ; 32 - 39 BYTE ^B11100000 ; 40 - 47 BYTE ^B00001001 ; 48 - 55 BYTE ^B00000000 ; 56 - 63 BYTE ^B11111111 ; 64 - 71 BYTE ^B11111111 ; 72 - 79 BYTE ^B00001100 ; 80 - 87 (no alternate page ) BYTE ^B10000000 ; 88 - 95 (no smooth scroll) BYTE ^B11110000 ; 96 - 103 BYTE ^B00000011 ; 104 - 111 (no non-space attributes) BYTE ^B00000000 ; 112 - 119 (no non-space attributes) BYTE ^B00001111 ; 120 - 127 (cursor blink & steady) BYTE ^B00000000 ; 128 - 135 (no top status line ) BYTE ^B00000000 ; 136 - 143 (no AM-70 style color) BYTE ^B00000000 ; 144 - 151 BYTE ^B00000000 ; 152 - 159 BYTE ^B00000000 ; 160 - 167 BYTE ^B00000000 ; 168 - 175 BYTE ^B00000000 ; 176 - 183 BYTE ^B00000000 ; 184 - 191 BYTE ^B00000000 ; 192 - 199 BYTE ^B00000000 ; 200 - 207 BYTE ^B00000000 ; 208 - 215 BYTE ^B00000000 ; 216 - 223 BYTE ^B00000000 ; 224 - 231 BYTE ^B00000000 ; 232 - 239 BYTE ^B00000000 ; 240 - 247 BYTE ^B00000000 ; 248 - 255 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 233,75,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 233,52,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-.,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-. WORD C109-.,C110-.,C111-.,C112-.,C113-.,C114-.,C115-.,C116-.,C117-. WORD C118-.,C119-.,C120-.,C121-.,C122-.,C123-.,C124-.,C125-.,C126-. WORD C127-.,C128-.,C129-.,C130-.,C131-.,C132-.,C133-.,C134-.,C135-. WORD C136-.,C137-.,C138-.,C139-.,C140-.,C141-.,C142-.,C143-.,C144-. WORD C145-.,C146-.,C147-. CRCB: PAGE C1: BYTE 30.,0 ; cursor home (move to column 1,1) C2: BYTE 200+13.,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: ; 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 233,'.,0 ; set terminal attributes C28: BYTE 233,'.,'2,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: ; 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 ; bottom intersect C46: BYTE '-,0 ; horizontal line C47: BYTE '|,0 ; vertical line C48: BYTE '+,0 ; intersection C49: ; solid block C50: ; slant block C51: BYTE 'O,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 C79: BYTE 33,'P,0 ; print screen C80: ; reserved for set to wide mode C81: BYTE 0 ; reserved for set to normal mode C82: BYTE 33,'`,0 ; enter transparent print mode C83: BYTE 33,'a,0 ; exit transparent print mode C84: ; begin writing to alternate page C85: ; end writing to alternate page C86: ; toggle page C87: ; copy to alternate page C88: ; insert column C89: ; delete column C90: ; block fill with attribute C91: ; block fill with character C92: ; draw a box C93: ; scroll box up one line C94: ; scroll box down one line C95: ; select jump scroll C96: ; select fast smooth scroll C97: ; select med-fast smooth scroll C98: ; select med-slow smooth scroll C99: BYTE 0 ; select slow smooth scroll C100: BYTE 33,'G,':,0 ; start underscore/blink C101: BYTE 33,'G,'0,0 ; end underscore/blink C102: BYTE 33,'G,'<,0 ; start underscore/reverse C103: BYTE 33,'G,'0,0 ; end underscore/reverse C104: BYTE 33,'G,'>,0 ; start underscore/reverse/blink C105: BYTE 33,'G,'0,0 ; end underscore/reverse/blink C106: ; start underscore w/o space C107: ; end underscore w/o space C108: ; start reverse w/o space C109: ; end reverse w/o space C110: ; start reverse/blinking w/o space C111: ; end reverse/blinking w/o space C112: ; start underscore/blinking w/o space C113: ; end underscore/blinking w/o space C114: ; start underscore/reverse w/o space C115: ; end underscore/reverse w/o space C116: ; start underscore/reverse/blinking w/o space C117: ; end underscore/reverse/blinking w/o space C118: ; start blink w/o space C119: BYTE 0 ; end blink w/o space C120: BYTE 233,'.,'1,0 ; set cursor to blinking block C121: BYTE 233,'.,'2,0 ; set cursor to steady block C122: BYTE 233,'.,'3,0 ; set cursor to blinking underline C123: BYTE 233,'.,'4,0 ; set cursor to steady underline C124: ; spare C125: ; spare C126: ; spare C127: BYTE 0 ; spare C128: BYTE 33,'F,'!,0 ; select top status line C129: BYTE 177 ; end of all status line C130: BYTE 33,'z,40,0 ; select unshifted status line C131: BYTE 33,'Z,40,0 ; select shifted status line C132: ; select black text C133: ; select white text C134: ; select blue text C135: ; select magneta text C136: ; select red text C137: ; select yellow text C138: ; select green text C139: ; select cyan text C140: ; select black reverse text C141: ; select white reverse text C142: ; select blue reverse text C143: ; select magneta reverse text C144: ; select red reverse text C145: ; select yellow reverse text C146: ; select green reverse text C147: BYTE 0 ; select cyan reverse text EVEN END .