;**************************************************************** ;* * ;* FREEDOM 200 TERMINAL UNIT ROUTINE * ;* * ;* by * ;* * ;* ULTRASCIENCE DIVISION OF GIBBS LABORATORIES * ;* * ;* Copyright Ultrascience 1985 (C) * ;* * ;* 1824 WILMETTE AVE, WILMETTE, IL 60091 * ;* * ;* 312/256-0080 * ;* * ;* REV. 5.1 LAST UPDATE 01/26/85 * ;* * ;**************************************************************** ; ; IMPORTANT MESSAGE: ; ; THIS PROGRAM OR ANY PART OF THIS PROGRAM MAY NOT BE COPIED FOR ; PROFIT BY ANYONE OTHER THAN ULTRASCIENCE. ANYONE WISHING TO ; USE THE PROGRAM MAY DO SO AT NO CHARGE, PROVIDED THEY NOTIFY ; ULTRASCIENCE THAT THEY ARE USING THE PROGRAM AND AGREE TO SEND ; INFORMATION ABOUT BUGS OR IMPROVEMENTS TO ULTRASCIENCE. THIS ; BUG AND IMPROVEMENT INFORMATION WILL BE AVAILABLE TO ALL USERS ; OF THE PROGRAM. ; ; Ultrascience can provide specialized manuals for a modest fee. ; SEARCH SYS SEARCH SYSSYM SEARCH TRM OBJNAM .TDV ;Define capability flags TFC2 = TD$LID!TD$CID TFC3 = TD$RVA!TD$DIM TFC4 = TD$BLN!TD$UND TFC5 = TD$EOS!TD$EOL TFC6 = TD$SPL!TD$STS TFC7 = TD$AMS!TD$MLT TFCT = TFC2!TFC3!TFC4!TFC5!TFC6!TFC7 ;******************** ;* FRE200 * ;******************** ;Terminal driver communications area WORD TD$NEW ; terminal attributes BR JMPINP ; input routine RTN ; output routine (not neccesary) BR JMPECH ; echo routine BR JMPCRT ; crt control BR JMPINI ; INIT routine WORD 24 ; impure area size BYTE 24.,80. ; 24 X 80 screen size LWORD TFCT ; terminal functions ; SuperVue standard function bitmap LWORD ^B11111111111111111111111111111111 ; 000-031 LWORD ^B11111111111111111000000010001110 ; 032-063 LWORD ^B11100000100101010011000000000001 ; 064-095 LWORD ^B11110000000000000000000000000000 ; 096-127 LWORD ^B00000111111111111111111111000000 ; 128-159 LWORD ^B00000000000000000000000000000000 ; 160-191 LWORD ^B00000000000000000000000000000000 ; 192-223 LWORD ^B00000000000000000000000000000000 ; 224-255 RAD50 /SUPER VUE/ RAD50 /FRE200/ JMPINP: JMP INP JMPECH: JMP ECHO JMPCRT: JMP CRT ; go handle TCRT codes JMPINI: JMP INI ; Macro to send leadin character and control character DEFINE CNTRL CHTER ; Control Character Macro BYTE CHTER-100,0 EVEN ENDM DEFINE ESC CHTER,EXTRA ; Escape Macro IF B,EXTRA, BYTE 233,CHTER,0 IF NB,EXTRA, BYTE 233,CHTER,EXTRA,0 EVEN ENDM DEFINE ENH CHTER,OPT BYTE 233,'G IF B,CHTER, BYTE '0 IF NB,CHTER, BYTE CHTER IF NB,OPT, BYTE 40,0 IF B,OPT, BYTE 0 ENDM ;******************** ;* 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 ; 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 INP: SAVE A3 ; save reg. MOV T.IMP(A5),A3 ; get impure area pointer MOVW #T$IMI!T$XLT,D7 ; set image and translate mode mask ANDW @A5,D7 ; any of the modes on ? (function key translation) BEQ INPEXT ; no, no function key handling CMPB 20(A3),#-1 ; is this a returning translated key ? BEQ WHOXLT ; yes, go process it some more TSTB 20(A3) ; function key xlation in progress ? BNE FCTPRO ; jump if function processing in progress CMPB D1,#1 ; function lead-in ? BEQ LEADIN ; yes, do it CMPB D1,#33 ; function lead-in ? BNE INPEXT ; no, skip it LEADIN: MOVB D1,20(A3) ; save byte MOV A5,14(A3) ; save TRMDEF MOV #2000.,4(A3) ; set time count (0.2 seconds) CLR @A3 ; clear timer link LEA A6,FCTCHR ; index timer routine MOV A6,10(A3) ; reset flag TIMER @A3 ; queue up timer entry KILLD1: MOVB #']-100,D1 ; kill character with harmless character INPEXT: REST A3 ; restore reg. LCC #0 ; set normal processing RTN ; get back to TRMSER ; Function key processing FCTPRO: CMPB D1,#1 ; ^A ? BEQ KILLD1 ; yes, kill it CMPB D1,#33 ; ESC ? BEQ KILLD1 ; yes, kill it CMPB 20(A3),#33 ; escape lead-in ? BEQ ESCIN ; yes, do simple conversion CMPB 20(A3),#1 ; ^A lead-in ? BNE KILLD1 ; no, extra data - kill it CTAIN: SUBB #100,D1 ; convert character to control chr. ESCIN: ORB #200,D1 ; set high bit so converter can differentiate MOVB D1,20(A3) ; save byte for FRE200.SVX BR KILLD1 ; go away after doing character WHOXLT: CLRW 20(A3) ; done translation MOVW #T$XLT,D7 ; prepare to check escape processing bit ANDW @A5,D7 ; does program translate or should we do it ? BNE INPEXT ; they'll do it ; We translate LEA A6,XTABL ; get conversion table address XLOOP: MOVB (A6)+,D7 ; get byte from table BEQ INPEXT ; jump if end of table (unsupported function) CMPB D1,D7 ; found a match ? BEQ L416 ; yes, swap bytes INC A6 ; get past conversion byte BR XLOOP ; continue checking L416: MOVB @A6,D1 ; convert the character BR INPEXT ; return to INPUT routine for exit to TRMSER ; Send queued up character FCTCHR: SAVE A0,A5,D1 ; save regs. MOV @A0,A5 ; get TRMDEF pointer MOVB 4(A0),D1 ; get character to send SETB 4(A0) ; say we've done it TRMICP ; put character in input buffer REST A0,A5,D1 ; restore regs. RTN ; get back to monitor ; Translation table XTABL: BYTE 200,33 ; f1 - ESC Unshifted function keys BYTE 201,0 ; f2 - trap BYTE 202,0 ; f3 - trap BYTE 203,0 ; f4 - trap BYTE 204,'X-100 ; f5 - match BYTE 205,'O-100 ; f6 - concatenate BYTE 206,'E-100 ; f7 - end of file BYTE 207,'T-100 ; f8 - next page BYTE 210,'N-100 ; f9 - end of line BYTE 211,'W-100 ; f10 - next word BYTE 240,33 ; F1 - ESC Shifted function keys BYTE 241,0 ; F2 - trap BYTE 242,0 ; F3 - trap BYTE 243,0 ; F4 - trap BYTE 244,'P-100 ; F5 - mark BYTE 245,'\-100 ; F6 - toggle line ins. mode BYTE 246,'S-100 ; F7 - center page BYTE 247,'R-100 ; F8 - previous page BYTE 250,'U-100 ; F9 - beginning of page BYTE 251,'A-100 ; F10 - previous word BYTE 305,'B-100 ; line insert BYTE 241.,'Q-100 ; toggle character insert mode BYTE 321,'F-100 ; insert character BYTE 322,'Z-100 ; delete line BYTE 324,'V-100 ; delete word BYTE 327,'D-100 ; delete character BYTE 331,'Y-100 ; delete to end of line BYTE 000,000 ;******************** ;* INI * ;******************** ;Handle initialization of the terminal INI: SAVE A6,D1,D2,D3 ; save registers MOV #INISIZ,D3 ; get size of string to send LEA A6,INISTR ; index the string MOV A6,D1 TRMBFQ ; output the string MOV T.IMP(A5),A6 ; get impure area CLR @A6 ; SET 14(A6) ; REST A6,D1,D2,D3 ; restore registers RTN INISTR: CNTRL '^ ESC '* ; Re-program down arrow, word left, word right, scroll up, scroll down BYTE 233,'|,'O-100,'1,'J-100,'Y-100 BYTE 233,'|,'J-100,'1,'A-100,'Y-100 BYTE 233,'|,'K-100,'1,'W-100,'Y-100 BYTE 233,'|,'H-100,'1,'R-100,'Y-100 BYTE 233,'|,'I+100,'1,'T-100,'Y-100 BYTE 233,'|,40,'1,'H-100,'Y-100 BYTE 233,'g,233,'f ASCII / Terminal operating under Ultrascience FRE200.TDV ver. 5.1/ BYTE 15,233,'O-100 ASCII / System booting.../ BYTE 12,12,15,'. BYTE 200 INISIZ=.-INISTR EVEN ;******************** ;* CRT * ;******************** ;SPECIAL CRT CONTROL PROCESSING ;D1 CONTAINS THE CONTROL CODE FOR X,T 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,'=,0,0 ADD #17437,D1 ;ADD POSITION OFFSETS (37) 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 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 RTN ; Word 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-. ; [101] WORD C42-.,C43-.,C44-.,C45-.,C46-.,C47-.,C48-.,C49-.; [101] 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-. WORD C79-.,C80-.,C81-.,C82-.,C83-.,C84-.,C85-.,C86-.,C87-. WORD C88-.,C89-.,C90-.,C91-.,C92-.,C93-.,C94-.,C95-.,C96-. WORD C97-.,C98-.,C99-.,C100-.,C101-.,C102-.,C103-.,C104-. WORD C105-.,C106-.,C107-.,C108-.,C109-.,C110-.,C111-.,C112-. WORD C113-.,C114-.,C115-.,C116-.,C117-.,C118-.,C119-.,C120-. WORD C121-.,C122-.,C123-.,C124-.,C125-.,C126-.,C127-.,C128-. WORD C129-.,C130-.,C131-.,C132-.,C133-.,C134-.,C135-.,C136-. WORD C137-.,C138-.,C139-.,C140-.,C141-.,C142-.,C143-.,C144-. WORD C145-.,C146-.,C147-.,C148-.,C149-.,C150-.,C151-.,C152-. WORD C153-.,C154-.,C155-.,C156-.,C157-.,C158-.,C159-.,C160-. WORD C161-.,C162-.,C163-.,C164-.,C165-.,C166-.,C167-.,C168-. WORD C169-.,C170-.,C171-.,C172-.,C173-.,C174-.,C175-.,C176-. WORD C177-.,C178-.,C179-.,C180-.,C181-.,C182-.,C183-.,C184-. WORD C185-.,C186-.,C187-.,C188-.,C189-.,C190-.,C191-.,C192-. WORD C193-.,C194-.,C195-.,C196-.,C197-.,C198-.,C199-.,C200-. WORD C201-.,C202-.,C203-.,C204-.,C205-.,C206-.,C207-.,C208-. WORD C209-.,C210-.,C211-.,C212-.,C213-.,C214-.,C215-.,C216-. WORD C217-.,C218-.,C219-.,C220-.,C221-.,C222-.,C223-.,C224-. WORD C225-.,C226-.,C227-.,C228-.,C229-. CRCB: C0: ESC '*,200 ; Clear screen C1: CNTRL '^ ; Cursor Home (move to column 1,1) C2: CNTRL 'M ; Cursor Return (move to column 1) C3: CNTRL 'K ; Cursor Up C4: CNTRL 'J ; Cursor Down C5: CNTRL 'H ; Cursor Left C6: CNTRL 'L ; Cursor Right C7: ESC '# ; Lock Keyboard C8: ESC '" ; Unlock Keyboard C9: ESC 'T ; Erase to End of Line C10: ESC 'Y ; Erase to End of Screen C11: ESC ') ; Enter Background Display Mode (reduced intensity) C12: ESC '( ; Enter Foreground Display mode (normal intensity) C13: ESC '& ; Enable Protected fields C14: ESC '' ; Disable Protected Fields C15: ESC 'R ; Delete Line C16: ESC 'E ; Insert Line C17: ESC 'W ; Delete Character C18: ESC 'Q ; Insert Character C19: ESC '? ; Read Cursor Address C20: ESC 3 ; Read Character at Current Cursor Position C21: BYTE 40 ENH '2 ; Start Blinking Field C22: ENH ,1 ; End Blinking Field C23: ESC '$ ; Start Line Drawing Mode (enable alternate chr. set) C24: ESC '% ; End Line Drawing Mode (disable alternate chr. set) C25: ESC '[ ; Set Horizontal Position C26: ESC '] ; Set Vertical Position C27: BYTE 0 ; Set Terminal Attributes C28: ESC '.,'3 ; Cursor on C29: ESC '.,'0 ; Cursor off C30: BYTE 40 ENH '8 ; Start underline field C31: ENH ,1 ; End underline field C32: BYTE 40 ENH '4 ; Start reverse video field C33: ENH ,1 ; End reverse video field C34: BYTE 40 ENH '6 ; Start reverse blink field C35: ENH ,1 ; End reverse blink field C36: ENH 'n ; Turn off screen display C37: ENH 'o ; Turn on screen display C38: BYTE 'F,0 ; Top left corner C39: BYTE 'G,0 ; Top right corner C40: BYTE 'E,0 ; Bottom left corner C41: BYTE 'H,0 ; Bottom right corner C42: BYTE 'N,0 ; Top intersect C43: BYTE 'L,0 ; Right intersect C44: BYTE 'M,0 ; Left intersect C45: BYTE 'O,0 ; Bottom intersect C46: BYTE 'K,0 ; Horizontal line C47: BYTE 'J,0 ; Vertical line C48: BYTE 'I,0 ; Intersection C49: ; Solid block C50: BYTE 0 ; Slant block C51: BYTE '#,0 ; Cross-hatch block C52: BYTE '=,0 ; Double line horizontal C53: BYTE 'H,0 ; Double line vertical C54: ; Send message to function key C55: BYTE 0 ; Send message to shifted function key C56: BYTE 233,"m0,40,'7,0 ; Set normal display format C57: ESC 'm,'0 ; Set horizontal split (follow with row code) C58: ; Set vertical split (30 chr. columns) C59: ; Set vertical split (40 chr. columns) C60: ; Set vertical split column to next chr. C61: ; Activate split segment 0 C62: ; Activate split segment 1 C63: ESC 'f ; Send message to host message field C64: BYTE '+,0 ; Up arrow C65: BYTE '-,0 ; Down arrow C66: BYTE 0 ; Raised dot C67: ; End of line marker C68: ; Horizontal tab symbol C69: ; Paragraph C70: ; Dagger C71: BYTE 0 ; Section C72: BYTE '',0 ; Cent sign C73: ; One quarter C74: BYTE 0 ; One half C75: BYTE 'i,0 ; Degree C76: BYTE 0 ; Trademark C77: BYTE '* ; Copyright C78: BYTE 0 ; Registered C79: ESC 'P ; Print screen C80: ; Set 130 col. screen C81: BYTE 0 ; Set 80 col. screen C82: ESC '` ; Enable transparent print mode C83: ESC 'a ; Disable 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: BYTE 0 ; Scroll box down one line C95: ESC '9 ; Select jump scroll C96: ; Select fast smooth scroll C97: ; Select med-fast smooth scroll C98: ; Select med-slow smooth scroll C99: ESC '8 ; Select slow smooth scroll C100: ; C101: ; C102: ; C103: ; C104: ; C105: ; C106: ; C107: ; C108: ; C109: ; C110: ; C111: ; C112: ; C113: ; C114: ; C115: ; C116: ; C117: ; C118: ; C119: ; C120: ; Previous page C121: ; Next page C122: ; C123: ; C124: ; C125: ; C126: ; C127: ; ; SuperVUE, AlphaWRITE & AlphaBASE C128: ESC 'f ; Start line 25 C129: BYTE 15,233,'g,0 ; End line 25 C130: ESC '!,'1 ; Line lock on C131: ESC '!,'2 ; Line lock off C132: BYTE 233,'f,15,0 ; Clear line 25 C133: ENH '8 ; Start Underline C134: ENH ; End Underline C135: ESC 'd ; Normal background C136: ESC 'b ; Reverse background C137: ESC '> ; Key click on C138: ESC 74 ; Key click off C139: ENH '1 ; Start blank field C140: ENH ; End blank field C141: ENH '> ; Start Inverse Video / Blinking / Underline C142: ENH ; End Inverse Video / Blinking / Underline C143: ENH 74 ; Start Inverse Video / Underline C144: ENH ; End Inverse Video / Underline C145: ENH ': ; Start Blinking / Underline C146: ENH ; End Blinking / Underline C147: ESC '.,'2 ; Cursor blinking block C148: ESC '.,'0 ; Cursor steady block C149: ESC '.,'3 ; Cursor blinking line C150: ESC '.,'4 ; Cursor steady line C151: ESC 'f ; Start line 25 C152: BYTE 15,0 ; End line 25 C153: BYTE 233,'O-100,233,'g,0 ; Enable line 25 C154: ; C155: ; C156: ; C157: ; C158: ; C159: ; C160: ; C161: ; C162: ; C163: ; C164: ; C165: ; C166: ; C167: ; C168: ; C169: ; C170: ; C171: ; C172: ; C173: ; C174: ; C175: ; C176: ; C177: ; C178: ; C179: ; C180: ; C181: ; C182: ; C183: ; C184: ; C185: ; C186: ; C187: ; C188: ; C189: BYTE 0 ; C190: ESC 'P ; Print screen C191: ESC '` ; Start transparent print C192: ESC 'a ; End transparent print C193: ESC '@ ; Start simultaneous print C194: ESC 'A ; End simultaneous print C195: ; C196: BYTE 0 ; C197: ESC 'L-100,'1 ; Double wide characters C198: ESC 'L-100,'2 ; Double wide/ double high characters C199: ESC 'L-100,'0 ; Normal size C200: ENH '@ ; Start Half Bright C201: ENH ; End Half Bright C202: ENH '2 ; Start Blinking C203: ENH ; End Blinking C204: ENH '8 ; Start Underline C205: ENH ; End Underline C206: ENH '4 ; Start Inverse Video C207: ENH ; End Inverse Video C208: ENH 'B ; Start Half Bright / Blinking C209: ENH ; End Half Bright / Blinking C210: ENH 'H ; Start Half Bright / Underline C211: ENH ; End Half Bright / Underline C212: ENH 'D ; Start Half Bright / Inverse Video C213: ENH ; End Half Bright / Inverse Video C214: ENH ': ; Start Blinking / Underline C215: ENH ; End Blinking / Underline C216: ENH '6 ; Start Blinking / Inverse Video C217: ENH ; End Blinking / Inverse Video C218: ENH 74 ; Start Underline / Inverse Video C219: ENH ; End Underline / Inverse Video C220: ENH 'J ; Start Half Bright / Blinking / Underline C221: ENH ; End Half Bright / Blinking / Underline C222: ENH 'F ; Start Half Bright / Blinking / Inverse Video C223: ENH ; End Half Bright / Blinking / Inverse Video C224: ENH 'L ; Start Half Bright / Underline / Inverse Video C225: ENH ; End Half Bright / Underline / Inverse Video C226: ENH '> ; Start Blinking / Underline / Inverse Video C227: ENH ; End Blinking / Underline / Inverse Video C228: ENH 'N ; Start Half Bright / Blinking / Underline / Inverse Video C229: ENH ; End Half Bright / Blinking / Underline / Inverse Video EVEN END .