;*; Updated on 01-Nov-91 at 4:00 PM by James A. Jarboe I V; edit time: 0:13:16 ;**************************************************************************** ;* * ;* ANSI Terminal Driver * ;* VT100, Link MC70, Wyse 350 terminals * ;* * ;**************************************************************************** ;Copyright (C) 1991 UltraSoft Corporation. All Rights Reserved. ; ;[101] 01-Nov-91 by James A. Jarboe I V ; TCHBMP was incorrect. ; ;[100] 31 August 1991 16:32 Edited by David Pallmann ; Created. OBJNAM .TDV ASMMSG "== ANSI Terminal Driver ==" SEARCH SYS SEARCH SYSSYM SEARCH TRM TDVFLG =TD$LID!TD$CID!TD$DIM!TD$EOS!TD$EOL!TD$BLN!TD$UND!TD$RVA TDVFLG =TDVFLG!TD$MLT!TD$MOD!TD$CLR!TD$132 ESC =33 ;********** ;* ANSI * ;********** ;Terminal driver communications area ANSI: WORD TD$NEW!TD$TCH ; terminal attributes BR JMPINP ; input routine RTN ; BR ECHO ; echo routine BR JMPCRT ; crt control BR JMPINI ; no init routine yet WORD 4 ; impure area of 4 bytes (last 2 unused) BYTE 24. ; number of rows BYTE 80. ; number of columns LWORD TDVFLG ; terminal has: ; insert/delete line ; insert/delete character ; dim video attribute ; erase to end of screen ; erase to end of line ; multi-byte keystrokes BR JMPTCH ; return terminal characteristics JMPINP: JMP INP ; go handle input characters JMPTCH: JMP TCH ; go return terminal characteristics JMPCRT: JMP CRT ; go handle tcrt codes JMPINI: JMP INI ; go initialize terminal ;******************** ;* 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,#ESC ; 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,#ESC ; escape? BEQ INPM ; yes - could be multi-byte sequence 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 CMPB D1,#ESC ; is first character ESC? BNE INMX ; no CMPB D0,#2 ; check size BLO INMX ; <2 characters - no translation MOVB @A0,D1 ; get second character LEA A6,XLTTBL ; point to translation table 10$: TSTB @A6 ; end of table? BEQ INMQ ; yes - escape sequence is invalid CMPB D1,(A6)+ ; match? BEQ 20$ ; yes INC A6 ; no - increment index BR 10$ ; and try next table entry 20$: MOVB @A6,D1 ; put translated char in D1 BR INMX ; and return to program INMQ: MOVB #'?,D1 ; INMX: LCC #0 ; reset the flags INMX2: RTN XLTTBL: BYTE ^H08,'H-'@ ; left arrow = ESC ^H BYTE ^H0A,'J-'@ ; down arrow = ESC ^J BYTE ^H0B,'K-'@ ; up arrow = ESC ^K BYTE ^H0C,'L-'@ ; right arrow = ESC ^L BYTE ^H01,160. ; s/up arrow = 160. BYTE ^H02,161. ; s/down arrow = 161. BYTE ^H03,162. ; s/left arrow = 162. BYTE ^H04,163. ; s/right arrow = 163. BYTE ^H06,164. ; insert = 164. BYTE ^H05,165. ; delete = 165. BYTE ^H07,166. ; home = 166. BYTE ^H0D,167. ; end = 167. BYTE ^H22,168. ; page up = 168. BYTE ^H24,169. ; page down = 169. BYTE 'A,128. ; F1 = ESC A = 128. BYTE 'B,129. ; F2 = ESC B = 129. BYTE 'C,130. ; F3 = ESC C = 130. BYTE 'D,131. ; F4 = ESC D = 131. BYTE 'E,132. ; F5 = ESC E = 132. BYTE 'F,133. ; F6 = ESC F = 133. BYTE 'G,134. ; F7 = ESC G = 134. BYTE 'H,135. ; F8 = ESC H = 135. BYTE 'I,136. ; F9 = ESC I = 136. BYTE 'J,137. ; F10 = ESC J = 137. BYTE 'K,138. ; F11 = ESC K = 138. BYTE 'L,139. ; F12 = ESC L = 139. BYTE 'a,140. ; sF1 = ESC a = 140. BYTE 'b,141. ; sF2 = ESC b = 141. BYTE 'c,142. ; sF3 = ESC c = 142. BYTE 'd,143. ; sF4 = ESC d = 143. BYTE 'e,144. ; sF5 = ESC e = 144. BYTE 'f,145. ; sF6 = ESC f = 145. BYTE 'g,146. ; sF7 = ESC g = 146. BYTE 'h,147. ; sF8 = ESC h = 147. BYTE 'i,148. ; sF9 = ESC i = 148. BYTE 'j,149. ; sF10 = ESC j = 149. BYTE 'k,150. ; sF11 = ESC k = 150. BYTE 'l,151. ; sF12 = ESC l = 151. BYTE 0,0 ; ** end of table ** PAGE ;********* ;* INI * ;********* ;Handle initialization of the terminal INI: MOV T.IDV(A5),A6 ; index the interface driver [106] CMP -(A6),#<[PSE]_16.>+[UDO]; is it the pseudo interface driver? [106] BEQ 5$ ; yes - no initialization wanted [106] CMP QFREE,#12. ; are there at least 12 queue blocks? [106] BLO 5$ ; no - skip the initialization [106] SAVE D1,D2 ; save registers MOV #5,D3 ; get size of first command LEA A6,INISTS ; index the first init string MOV A6,D1 TRMBFQ ;de-comment this section for Link MC-70 or Wyse 370 terminal to pre-load ;function keys. ; ; MOV #FKYSIZ,D3 ; get size of first command ; LEA A6,INIFKY ; index the first init string ; MOV A6,D1 ; TRMBFQ REST D1,D2 ; restore registers 5$: MOV T.IMP(A5),A6 ; index impure area MOVB #1,(A6)+ ; store foreground color MOVB #0,(A6)+ ; store background color ; MOVW #80.,@A6 ; preset to 80 columns RTN 10$: MOV #78.,D3 ; output 78 spaces MOV #40,D1 TRMBFQ RTN INISTS: BYTE ESC,'[,'2,'$,'~ ; show top and bottom status lines INIFKY: BYTE ESC,'P ; F1 = ESC A ASCII "1;1;|42\1B41" BYTE ESC,'\ BYTE ESC,'P ; F2 = ESC B ASCII "1;1;|51\1B42" BYTE ESC,'\ BYTE ESC,'P ; F3 = ESC C ASCII "1;1;|52\1B43" BYTE ESC,'\ BYTE ESC,'P ; F4 = ESC D ASCII "1;1;|53\1B44" BYTE ESC,'\ BYTE ESC,'P ; F5 = ESC E ASCII "1;1;|54\1B45" BYTE ESC,'\ BYTE ESC,'P ; F6 = ESC F ASCII "1;1;|37\1B46" BYTE ESC,'\ BYTE ESC,'P ; F7 = ESC G ASCII "1;1;|38\1B47" BYTE ESC,'\ BYTE ESC,'P ; F8 = ESC H ASCII "1;1;|39\1B48" BYTE ESC,'\ BYTE ESC,'P ; F9 = ESC I ASCII "1;1;|40\1B49" BYTE ESC,'\ BYTE ESC,'P ; F10 = ESC J ASCII "1;1;|41\1B4A" BYTE ESC,'\ BYTE ESC,'P ; F11 = ESC K ASCII "1;1;|43\1B4B" BYTE ESC,'\ BYTE ESC,'P ; F12 = ESC L ASCII "1;1;|44\1B4C" BYTE ESC,'\ BYTE ESC,'P ; sF1 = ESC a ASCII "1;1;|22\1B61" BYTE ESC,'\ BYTE ESC,'P ; sF2 = ESC b ASCII "1;1;|31\1B62" BYTE ESC,'\ BYTE ESC,'P ; sF3 = ESC c ASCII "1;1;|32\1B63" BYTE ESC,'\ BYTE ESC,'P ; sF4 = ESC d ASCII "1;1;|33\1B64" BYTE ESC,'\ BYTE ESC,'P ; sF5 = ESC e ASCII "1;1;|34\1B65" BYTE ESC,'\ BYTE ESC,'P ; sF6 = ESC f ASCII "1;1;|17\1B66" BYTE ESC,'\ BYTE ESC,'P ; sF7 = ESC g ASCII "1;1;|18\1B47" BYTE ESC,'\ BYTE ESC,'P ; sF8 = ESC h ASCII "1;1;|19\1B68" BYTE ESC,'\ BYTE ESC,'P ; sF9 = ESC i ASCII "1;1;|20\1B69" BYTE ESC,'\ BYTE ESC,'P ; sF10 = ESC j ASCII "1;1;|21\1B6A" BYTE ESC,'\ BYTE ESC,'P ; sF11 = ESC k ASCII "1;1;|23\1B6B" BYTE ESC,'\ BYTE ESC,'P ; sF12 = ESC l ASCII "1;1;|24\1B6C" BYTE ESC,'\ BYTE ESC,'P ; up arrow = ESC ^K ASCII "1;1;|59\1B0B" BYTE ESC,'\ BYTE ESC,'P ; down arrow = ESC ^J ASCII "1;1;|60\1B0A" BYTE ESC,'\ BYTE ESC,'P ; left arrow = ESC ^H ASCII "1;1;|61\1B08" BYTE ESC,'\ BYTE ESC,'P ; right arrow = ESC ^L ASCII "1;1;|62\1B0C" BYTE ESC,'\ BYTE ESC,'P ; s/up arrow = ESC ^A ASCII "1;1;|06\1B01" BYTE ESC,'\ BYTE ESC,'P ; s/down arrow = ESC ^B ASCII "1;1;|07\1B02" BYTE ESC,'\ BYTE ESC,'P ; s/left arrow = ESC ^C ASCII "1;1;|08\1B03" BYTE ESC,'\ BYTE ESC,'P ; s/right arrow = ESC ^D ASCII "1;1;|09\1B04" BYTE ESC,'\ BYTE ESC,'P ; insert = ESC ^F ASCII "1;1;|64\1B06" BYTE ESC,'\ BYTE ESC,'P ; delete = ESC ^E ASCII "1;1;|68\1B05" BYTE ESC,'\ BYTE ESC,'P ; home = ESC ^G ASCII "1;1;|47\1B07" BYTE ESC,'\ BYTE ESC,'P ; end = ESC ^M ASCII "1;1;|74\1B0D" BYTE ESC,'\ BYTE ESC,'P ; page up = ESC ^R ASCII "1;1;|75\1B22" BYTE ESC,'\ BYTE ESC,'P ; page down = ESC ^T ASCII "1;1;|65\1B24" BYTE ESC,'\ BYTE 0 FKYSIZ=.-INIFKY EVEN 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 #24.,D6 ; get row count MOVW D6,TC.ROW(A1) ; transfer row count MOVW #80.,TC.COL(A1) ; set column count MOVB (A6)+,D6 ; get foreground color MOVW D6,TC.FGC(A1) MOVB (A6)+,D6 ; get background color MOVW D6,TC.BGC(A1) MOVW #8.,TC.CLR(A1) ; eight colors MOVW #0.,TC.TSL(A1) ; set length of top status line MOVW #0.,TC.SSL(A1) ; set length of shifted status line MOVW #78.,TC.USL(A1) ; set length of unshifted status line MOVW #0,TC.SVA(A1) ; set number of saved characters MOV D2,D7 ; get TRMCHR argument flags AND #TC$BMP,D7 ; does user want bitmap? BEQ 20$ ; no - skip bitmap transfer code ;User has requested bitmap -- return it to him PUSH A1 ; save argument block index ADDW #TC.BMP,A1 ; index bitmap return area LEA A6,TCHBMP ; index our bitmap MOV #<256./16.>-1,D7 ; get amount to transfer 10$: MOVW (A6)+,(A1)+ ; transfer to user DBF D7,10$ ; loop until done POP A1 ; restore register 20$: RTN ; return to TRMCHR monitor routine ;Define feature bitmap TCHBMP: BYTE ^B01111111 ; 0 - 7 BYTE ^B10011110 ; 8 - 15 (no protected fields) BYTE ^B11100111 ; 16 - 23 (no read at cursor) BYTE ^B11110001 ; 24 - 31 (no horiz or vert pos) BYTE ^B11111111 ; 32 - 39 BYTE ^B11111111 ; 40 - 47 BYTE ^B01111111 ; 48 - 55 BYTE ^B01111111 ; 56 - 63 (no split) BYTE ^B11111111 ; 64 - 71 BYTE ^B01111111 ; 72 - 79 BYTE ^B00000011 ; 80 - 87 (no alternate page) [107] BYTE ^B00000000 ; 88 - 95 BYTE ^B00000000 ; 96 - 103 (no smooth scroll) BYTE ^B00000000 ; 104 - 111 BYTE ^B00000000 ; 112 - 119 BYTE ^B00000000 ; 120 - 127 (spare) BYTE ^B00000110 ; 128 - 135 BYTE ^B00000000 ; 136 - 143 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: SAVE D1 ; TSTW D1 ; is it cursor position? BMI CRTU ; no ;Cursor positioning - D1 contains X,Y coordinates TTYI BYTE ESC,'[,0,0 SAVE D0 MOV D1,D0 RORW D1,#8. AND #377,D1 DCVT 0,OT$TRM TTYI BYTE ';,0 MOV D0,D1 AND #377,D1 DCVT 0,OT$TRM TTYI BYTE 'f,0 REST D0 REST D1 ; RTN ;Special commands - D1 contains the command code in the low byte CRTU: MOV D1,D7 ; RORW D7,#8. ; CMPB D7,#-2 ; BEQ SETFGD ; CMPB D7,#-3 ; JEQ SETBGD ; CMPB D7,#-1 ; JNE CRTR ; AND #377,D1 ; strip the high byte ;Command processing per director tables 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 ; 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: POP A2 ; restore A2 CRTR: REST D1 ; RTN SETFGD: AND #377,D1 ; 10$: CMPB D1,#7 ; BLOS 20$ ; SUBB #8.,D1 ; BR 10$ ; 20$: MOV JOBCUR,A6 ; index job MOV JOBTRM(A6),A6 ; index terminal control area MOV T.IMP(A6),A6 ; index impure area MOVB D1,@A6 ; store new foreground color BNE 30$ ; not zero TSTB 1(A6) ; is background also black? BNE 30$ ; no MOVB #1,D1 ; yes - change to white MOVB D1,@A6 ; 30$: TTYI ; BYTE ESC,'[,'4,'8,';,0 ; EVEN ; LEA A2,FGDTBL ; ADD D1,A2 ; MOVB @A2,D1 ; TTY ; TTYI ; BYTE 'w,0 ; EVEN ; SF.RTN: REST D1 ; RTN ; ;table of foreground colors FGDTBL: BYTE '5 ; 0 black BYTE '0 ; 1 white BYTE '2 ; 2 blue BYTE '1 ; 3 magenta (red) BYTE '1 ; 4 red BYTE '3 ; 5 yellow (amber) BYTE '6 ; 6 green BYTE '7 ; 7 cyan EVEN SETBGD: AND #377,D1 ; 10$: CMPB D1,#7 ; BLOS 20$ ; SUBB #8.,D1 ; BR 10$ ; 20$: MOV JOBCUR,A6 ; index job MOV JOBTRM(A6),A6 ; index terminal control area MOV T.IMP(A6),A6 ; index impure area MOVB D1,1(A6) ; store new background color TTYI ; BYTE ESC,'[,'4,'9,';,0 ; EVEN ; LEA A2,BGDTBL ; ADD D1,A2 ; ADD D1,A2 ; MOVB (A2)+,D1 ; TTY ; MOVB @A2,D1 ; TTY ; TTYI ; BYTE 'w,0 ; EVEN ; SB.RTN: REST D1 ; RTN ; ;table of background colors BGDTBL: BYTE '0,'1 ; 0 black BYTE '6,'4 ; 1 white BYTE '0,'1 ; 2 blue BYTE '5,'0 ; 3 magenta BYTE '4,'8 ; 4 red BYTE '6,'0 ; 5 yellow BYTE '1,'2 ; 6 green BYTE '1,'5 ; 7 cyan EVEN ;Escape sequence translation table ; EXTB: BYTE 67,73,105,111,120,121,122,124,127,131,377,377 EVEN ;Byte offset and data tables follow for all commands ; CRCA: WORD C0-.,C1-.,C2-.,C3-.,C4-.,C5-.,C6-.,C7-. WORD C8-.,C9-.,C10-.,C11-.,C12-.,C13-.,C14-.,C15-. WORD C16-.,C17-.,C18-.,C19-.,C20-.,C21-.,C22-.,C23-. WORD 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-. WORD C108-.,C109-.,C110-.,C111-.,C112-.,C113-.,C114-.,C115-. WORD C116-.,C117-.,C118-.,C119-.,C120-.,C121-.,C122-.,C123-. WORD C124-.,C125-.,C126-.,C127-.,C128-.,C129-.,C130-.,C131-. CRCB: PAGE ;*************************** ;* * ;* Special CRT Functions * ;* * ;*************************** ; ; NOTE: special functions blinking/reverse_video/underlining are coded to ; print an extraneous space. This makes the driver compatible with ; such software as AlphaMENU that is coded in expectation of ; TeleVideo-type graphics that print an attribute character. ; ; If the space is not desireable for your application, remove all ; references to the number 40. For example: ; ; change BYTE ESC,'[,'X,40,0 to BYTE ESC,'[,'X,0 ; C0: BYTE ESC,'[,'2,'J ;ED clear screen C1: BYTE ESC,'[,'0,';,'0,'H,0 ;CUP cursor home C2: BYTE ESC,'E,0 ;NEL cursor return C3: BYTE ESC,'[,'1,'A,0 ;CUU cursor up C4: BYTE ESC,'[,'1,'B,0 ;CUD cursor down C5: BYTE ESC,'[,'1,'D,0 ;CUB cursor left C6: BYTE ESC,'[,'1,'C,0 ;CUF cursor right C7: ;XXX lock keyboard C8: BYTE 0 ;XXX unlock keyboard C9: BYTE ESC,'[,'0,'K,0 ;EL erase to end of line C10: BYTE ESC,'[,'0,'J,0 ;ED erase to end of screen C11: BYTE ESC,'[,'2,'m,0 ;SGR enter backgroud display mode (reduced intensity). C12: BYTE ESC,'[,'0,'m,0 ;SGR enter foreground display mode (normal intensity) C13: ;XXX enable protected fields C14: BYTE 0 ;XXX disable protected fields C15: BYTE ESC,'[,'1,'M,0 ;DL delete line C16: BYTE ESC,'[,'1,'L,0 ;IL insert line C17: BYTE ESC,'[,'1,'P,0 ;DCH delete character C18: BYTE ESC,'[,'1,'@,0 ;ICH insert character C19: ;XXX read cursor address C20: BYTE 0 ;XXX read character at current cursor position C21: BYTE ESC,'[,'5,'m,40,0 ;SGR start blink field C22: BYTE ESC,'[,'0,'m,40,0 ;SGR end blink field C23: BYTE ESC,'(,'0,0 ;XXX start line drawing mode (enable alternate character set) C24: BYTE ESC,'(,'B,0 ;XXX end line drawing mode (disable alternate character set) C25: ;XXX set horizontal position C26: ;XXX set vertical position C27: BYTE 0 ;XXX set terminal attributes C28: BYTE ESC,'[,'?,'2,'5,'h,0 ;RM cursor on C29: BYTE ESC,'[,'?,'2,'5,'l,0 ;SM cursor off C30: BYTE 40,ESC,'[,'4,'m,0 ;SGR start underscore [102] C31: BYTE ESC,'[,'0,'m,40,0 ;SGR end underscore [102 C32: BYTE 40,ESC,'[,'7,'m,0 ;SGR start reverse video [102] C33: BYTE ESC,'[,'0,'m,40,0 ;SGR end reverse video [102] C34: BYTE 40,ESC,'[,'7,'m,0 ;SGR start reverse blink [102] C35: BYTE ESC,'[,'0,'m,40,0 ;SGR end reverse blink [102] C36: BYTE ESC,'[,'3,'0,'h,0 ;XXX turn off screen display [102] C37: BYTE ESC,'[,'3,'0,'l,0 ;XXX turn on screen display [102] C38: BYTE 'l,0 ;XXX top left corner C39: BYTE 'k,0 ;XXX top right corner C40: BYTE 'm,0 ;XXX bottom left corner C41: BYTE 'j,0 ;XXX bottom right corner C42: BYTE 'w,0 ;XXX top intersect C43: BYTE 'u,0 ;XXX right intersect C44: BYTE 't,0 ;XXX left intersect C45: BYTE 'v,0 ;XXX bottom intersect C46: BYTE 'q,0 ;XXX horizontal line C47: BYTE 'x,0 ;XXX vertical line C48: BYTE 'n,0 ;XXX intersection C49: BYTE 'a,0 ;XXX solid block C50: BYTE 'a,0 ;XXX slant block C51: BYTE 'a,0 ;XXX cross-hatch block C52: BYTE 'q,0 ;XXX double line horizontal C53: BYTE 'x,0 ;XXX double line vertical C54: ;XXX send message to function key line BYTE ESC,'[,'1,'$,'} ; <- select bottom status line BYTE ESC,'[,'1,';,'1,'H ; <- position at (1,1) BYTE ESC,'[,'0,'K ; <- clear to end of line BYTE 0 C55: ;XXX send message to shifted function key line BYTE ESC,'[,'1,'$,'} ; <- select bottom status line BYTE ESC,'[,'1,';,'1,'H ; <- position at (1,1) BYTE ESC,'[,'0,'K ; <- clear to end of line BYTE 0 C56: BYTE ESC,'[,'0,'v,0 ;XXX set normal display format C57: BYTE ESC,'[,'1,'v,0 ;XXX set horizontal split (follow with row code) C58: BYTE ESC,'[,'8,'v,0 ;XXX set vertical split (39 char columns) C59: BYTE ESC,'[,'8,'v,0 ;XXX set vertical split (40 char columns) C60: BYTE ESC,'[,'8,'v,0 ;XXX set vertical split column to next char C61: BYTE ESC,'[,'0,'t,0 ;XXX activate split segment 0 C62: BYTE ESC,'[,'2,'t,0 ;XXX activate split segment 1 C63: BYTE 0 ;XXX send message to host message field C64: BYTE '^,0 ;XXX up-arrow C65: BYTE 'V,0 ;XXX down-arrow C66: BYTE 200+'7,0 ;XXX raised dot C67: BYTE '`,0 ;XXX end of line marker C68: BYTE 'u,0 ;XXX horizontal tab symbol C69: BYTE 200+'6,0 ;XXX paragraph C70: BYTE 'n,0 ;XXX dagger C71: BYTE 200+'',0 ;XXX section C72: BYTE 200+'",0 ;XXX cent sign C73: BYTE 200+'<,0 ;XXX one-quarter C74: BYTE 200+'=,0 ;XXX one-half C75: BYTE 200+'0,0 ;XXX degree C76: BYTE 'T,0 ;XXX trademark C77: BYTE 200+'),0 ;XXX copyright C78: BYTE 200+'.,0 ;XXX registered C79: BYTE 0 ;XXX print screen C80: BYTE ESC,'[,'?,'3,'h,0 ;XXX reserved for set to wide mode C81: BYTE ESC,'[,'?,'3,'l,0 ;XXX reserved for set to normal mode C82: ;XXX enter transparent print mode C83: ;XXX exit transparent print mode C84: ;XXX begin writing to alternate page C85: ;XXX end writing to alternate page C86: ;XXX toggle page C87: ;XXX copy to alternate page C88: ;XXX insert column C89: ;XXX delete column C90: ;XXX block fill with attribute C91: ;XXX block fill with character C92: ;XXX draw a box C93: ;XXX scroll box up one line C94: ;XXX scroll box down one line C95: ;XXX select jump scroll C96: ;XXX select fast smooth scroll C97: ;XXX select med-fast smooth scroll C98: ;XXX select med-slow smooth scroll C99: ;XXX select slow smooth scroll C100: ;XXX start underscore/blink C101: ;XXX end underscore/blink C102: ;XXX start underscore/reverse C103: ;XXX end underscore/reverse C104: ;XXX start underscore/reverse/blink C105: ;XXX end underscore/reverse/blink C106: C107: C108: C109: C110: C111: C112: C113: C114: C115: C116: C117: C118: C119: C120: C121: C122: C123: C124: C125: C126: C127: C128: BYTE 0 C129: BYTE ESC,'[,'0,'$,'},0 ; end status line C130: BYTE ESC,'[,'1,'$,'} ; <- select bottom status line BYTE ESC,'[,'1,';,'1,'H ; <- position at (1,1) BYTE ESC,'[,'0,'K ; <- clear to end of line BYTE 0 EVEN C131: BYTE 0 END .