;****************************************************************
;*                                                              *
;*             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 pa
ge
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