home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
archives
/
mskermit.tar.gz
/
mskermit.tar
/
msyp98.asm
< prev
next >
Wrap
Assembly Source File
|
1991-04-18
|
89KB
|
4,539 lines
;+ This is MSYP98.ASM VT100 emulation for NEC-PC9801 by.H.Fujii
;
; Update History
; 17-Apr-1991 vt_ourarg in vt100_modlin1 for modeline is changed.
; prn_out is replaced by pntchr.
; [these are done by Joe Doupnik]
; 01-Sep-1990 DCS is interpreted. Bugs for C0 characters in ESC/CSI seq.
; have been fixed.
; Saved CX in vt100_modlin.
; 29-Jul-1990 DCS is separated and ignored.
; 27-Jul-1990 For MS-Kermit v3.02
; 25-Jun-1990 Fixed bug of ESC FF (forgot to clear ESC flag).
; 04-Aug-1989 Fixed wrong ESC M (reverse index) and ESC E (next line).
; 30-May-1989 ESC [ 0 m resets colors to default (color in command mode).
; 21-Apr-1989 Backquote modification for display is moved to disp_char.
; 19-Apr-1989 Put CR/LF for CSI*;1H in the cooked-log file.
; 16-Apr-1989 Installed Cooked log
; 17-Jan-1989 Bug in VT100_color. Highlight color set was wrong.
; 03-Dec-1988 Bug report from Mikami-san at NTT software lab. for
; ESC[;r. The routine for 'set scroll region' is fixed.
; 06-Nov-1988 Bug found in VT100_SAVE. In some situation, VT100 screen
; is not restored correctly.
; 10-Sep-1988 Autoprint feateres are installed
; 14-Aug-1988 Roll-Up/Down features with simple circular movement.
;
; ESC sequence
; - General rule -
; 1) 2-byte sequence
; a) ESC Fs terminated by 6/0 - 7/14 (standard sequence)
; b) ESC Fp terminated by 3/0 - 3/15 (private sequence)
; c) ESC Fe terminated by 4/0 - 5/15 (C1 control character)
; 2) multibyte sequnce
; a) ESC I...I Fp terminated by 3/0 - 3/15 (private sequence)
; b) ESC I...I Ft terminated by 4/0 - 7/14 (standard sequence)
; where I is 2/0 - 2/15
;
; Cotrol sequence
; 1) CSI P...P I...I Ft terminated by 4/0 - 6/15 (standard sequence)
; 2) CSI P...P I...I Fp terminated by 7/0 - 7/14 (private sequence)
; where CSI is 9/11 or ESC 5/11 (one of ESC Fe sequnce)
; P is 3/0 - 3/15,
; 3/11 is separator
; 3/15 is private parameter introducer
; I is 2/0 - 2/15
;
; CRT display character
;
; Character plane
; F E D C B A 9 8 7 6 5 4 3 2 1 0
; +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
; | 0 | | ANK code | ANK
; +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
;
; +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
; |0| JIS 2nd | |JIS 1st - '20'X| Kanji Left half
; +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
; |1| JIS 2nd | |JIS 1st - '20'X| Kanji Right half
; +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
;
;
; Attribute plane
; F E D C B A 9 8 7 6 5 4 3 2 1 0
; +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
; | N/A | |G|R|B| | | | | |
; +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
; ^ ^ ^ ^ ^ ^ ^ ^
; | | | | | | | |
; | | | | | | | secret (0)
; | | | | | | blink (1)
; | | | | | reverse (1)
; | | | | underline (1)
; | | | vertical line/graph pattern
; color
;
;
; The following Japanese Industrial Standards specify the Kana-Kanji treatment
; for information interchange.
;
; JIS C 6226:
; Code of the Japanese Graphic Character Set
; for Information Intercahnge
;
; JIS C 6228:
; Code Extension Techniques for Use with the Code
; for Information Interchange .
;
; In these standards, each byte of the multi-byte code is in the range
; 2/1 - 7/14. Each character is specified by an index of the current character
; table. In 7-bit environment, every index is the character code itself (or the
; first byte of the multi-byte character code). In 8-bit environment, there are
; two sets of current character table, called GL and GR. A GL-character is
; specified by the character code itself, and a GR-character is specified by
; the character code with 8-th bits on.
; As intermediate character sets, four sets of characters can be used at onece.
; These sets are called G0, G1, G2 and G3. To invoke these sets to the current
; character set(s),
;
; in 7-bit environment,
;
; 0/F Shift In Invoke G0 character set
; 0/E Shift Out Invoke G1 character set
; ESC 6/E Locking Shift 2 Invoke G2 character set
; ESC 6/F Locking Shift 3 Invoke G3 character set
;
; ESC 4/E Single Shift 2 Invoke G2 character
; ESC 4/F Single Shift 3 Invoke G3 character
;
; in 8-bit environment,
;
; 0/F Locking Shift 0 Invoke G0 character set to GL
; 0/E Locking Shift 1 Invoke G1 character set to GL
; ESC 7/E Locking Shift 1 Right Invoke G1 character set to GR
; ESC 6/E Locking Shift 2 Invoke G2 character set to GL
; ESC 7/D Locking Shift 2 Right Invoke G2 character set to GR
; ESC 6/F Locking Shift 3 Invoke G3 character set to GL
; ESC 7/C Locking Shift 3 Right Invoke G3 character set to GR
;
; 8/E Single Shift 2 Invoke G2 character
; 8/F Single Shift 3 Invoke G3 character.
;
; To designate the single-byte character set, (JIS C 6228: 5.3.7)
; ESC 2/8 F and ESC 2/12 F to G0 character set
; ESC 2/9 F and ESC 2/13 F to G1 character set
; ESC 2/10 F and ESC 2/14 F to G2 character set
; ESC 2/11 F and ESC 2/15 F to G3 character set
;
; where F is a final character in the range 3/0 - 7/14 which specifies the
; character set. For example,
;
; F Character Set
; ---- -------------
; 4/1 UK
; 4/2 US (ASCII)
; 4/9 JIS Katakana
; 4/10 JIS Roman
; 4/11 Germany
; 5/2 France
; 5/4 Chinese Roman
; 5/9 Italy
; 5/10 Spain
; 5/11 Greek
; .
;
; To designate the multi-byte character set, (JIS C 6226: 5.3.8)
; ESC 2/4 F and ESC 2/4 2/12 F to G0 character set
; ESC 2/4 2/9 F and ESC 2/4 2/13 F to G1 character set
; ESC 2/4 2/10 F and ESC 2/4 2/14 F to G2 character set
; ESC 2/4 2/11 F and ESC 2/4 2/15 F to G3 character set
;
; where F is a final character in the range 3/0 - 7/14 which specifies the
; character set. For example,
;
; F Character Set
; --- -------------
; 4/0 JIS C 6226 - 1978
; 4/1 Chinese Kanji
; 4/2 JIS C 6226 - 1983
; .
;
; Corresponding Internatial Standard is ISO 2022.
;
include mssdef.h
include msxp98.h
;
NUL equ 0
CSI equ 9Bh
;
ROLLMEM_MIN equ 40 ; minimum & maximum number of
ROLLMEM_MAX equ 4000 ; paragraphs for roll-back buffer
;
CHR_REV equ 04h
CRT_TXT_SEG equ 0A000h
PRIVP_FLG equ 08000h
in_ESC_MODE equ 1
in_CSI_MODE equ 2
in_DCS_MODE equ 3
VT52_DCA_L equ 64
VT52_DCA_C equ 65
IN_SIXEL equ 66
public vt100,vt100_ini,vt100_save,vt100_restore,vt100_reset
public vt100_modlin, vt100_dump, vt100_color
public vt100_rupn, vt100_rdnn, vt100_prnl, vt100_prns
public set_modlin
public prn_chk
public char_SS, char_GL, char_GR
public gnrm_color, gbck_color
data segment public 'data'
extrn flags:byte, trans:byte
extrn cpu_clock:byte, vtgrph_flg:byte, vttest_flg:byte
extrn curkey_mode:byte, keypad_mode:byte
extrn display_mode:byte
extrn keyin_dos:byte
extrn kanji_rcode:byte, kanji_scode:byte
extrn vt100_cursr:byte
extrn vt100_flags:byte, vt100_pflag:byte
extrn vt100_lflag:byte, vt100_gflag:byte
extrn vt_ourarg:byte
extrn def_color:byte, scn_color:byte
vt_saveseg dw ? ; segment address to save screen
vt_rollseg dw ? ; segment address to roll-up screen
vt_rollmxs dw ? ; maximum segment address allocated
vt_rollmxl dw ?
vt_rollcur dw ? ; current segment address
vt_rollcln dw 0 ; current line number of the buffer
vt_rollfil dw 1
vt_rollnum dw 0
vt_init db 0
vt_wrap db 0 ; wrap request flag
vt_graph db 0
vt_chrset db 0
vt_chratr db 0 ; current character attributes
vt_blkatr db 0 ; blank area attributes
vt_nrmatr db 0E1h ; normal character attributes
vt_hglatr db 0C0h ; highlight character attribute
vt_modatr db 0C5h ; mode line character attributes
vt_in_stat db 0 ; in status line flag
vt_stat_type db 1 ; status line type
stat_col db 0 ; column in status line
stat_row db 24 ; row of the status line (from 0)
sixel_disp_on db 0, 0
save_flags db ?
save_graph db ?
save_chrset db ?
save_chratr db ?
save_blkatr db ?
vt_knjmode db 0 ; Kanji mode if 1
vt_kanji1 db 0 ; Kanji 1st byte
vt_kanji2 db 0
; The fllowing parameters are used for ESC/CSI/DCS sequence.
; seq_stage: 0 normal character stage
; 1 in ESC seq.
; 2 in ESC intermediate stage
; 3 in CSI (parameter) stage.
; 4 in CSI intermediate stage
; 5 in DCS (parameter) stage.
; 6 in DCS intermediate stage
;
spec_mode db 0
spec_stage db 0
I_pnt dw 0
I_buf db 128 dup (?)
P_pnt dw 0
P_buf dw 128 dup (?)
priv_pflg dw 0
priv_char db 0
char_SS dw 0 ; GL for single shift
char_GL dw ?
char_GR dw ?
char_save_SS dw ?
char_save_GL dw ?
char_save_GR dw ?
char_G0 db CSET_JISROMAN
char_G1 db CSET_DECGRAPH
char_G2 db CSET_JISKATAKANA
char_G3 db CSET_JISC6226
char_save_G0 db ?
char_save_G1 db ?
char_save_G2 db ?
char_save_G3 db ?
; Normal PC98 color table
;
gnrm_color db 000h,000h,000h ; 0:black
db 000h,000h,0ffh ; 1:blue
db 0ffh,000h,000h ; 2:red
db 0ffh,000h,0ffh ; 3:magenta
db 000h,0ffh,000h ; 4:green
db 000h,0ffh,0ffh ; 5:cyan
db 0ffh,0ffh,000h ; 6:yellow
db 0ffh,0ffh,0ffh ; 7:white
db 0afh,0afh,0afh ; 8:light-gray
db 000h,000h,0afh ; 9:dark-blue
db 0afh,000h,000h ; 10:dark-red
db 0afh,000h,0afh ; 11:dark-magenta
db 000h,0afh,000h ; 12:dark-green
db 000h,0afh,0afh ; 13:dark-cyan
db 0afh,0afh,000h ; 14:dark-yellow
db 07fh,07fh,07fh ; 15:dark-gray
;
gbck_color db 000h,000h,000h ; 0:
db 000h,000h,000h ; 1:
db 000h,000h,000h ; 2:
db 000h,000h,000h ; 3:
db 000h,000h,000h ; 4:
db 000h,000h,000h ; 5:
db 000h,000h,000h ; 6:
db 000h,000h,000h ; 7:
db 000h,000h,000h ; 8:
db 000h,000h,000h ; 9:
db 000h,000h,000h ; 10:
db 000h,000h,000h ; 11:
db 000h,000h,000h ; 12:
db 000h,000h,000h ; 13:
db 000h,000h,000h ; 14:
db 000h,000h,000h ; 15:
vt_gset db 0EAh,087h,009h,00Ch,00Dh,00Ah,0DFh,08Fh
db 015h,00Bh,09Bh,099h,098h,09Ah,08Fh,094h
db 094h,095h,081h,080h,093h,092h,090h,091h
db 096h,01Dh,01Ch,01Eh,01Fh,0F1h,0A5h,020h
even
C0_func_tab dw vt_disp_none ; 00H NUL
dw vt_disp_none ; 01H SOH
dw vt_disp_none ; 02H STX
dw vt_disp_none ; 03H ETX
dw vt_disp_none ; 04H EOT
dw vt_disp_none ; 05H ENQ
dw vt_disp_none ; 06H ACK
dw vt_disp_BEL ; 07H BEL
dw vt_disp_BS ; 08H BS
dw vt_disp_HT ; 09H HT
dw vt_disp_LF ; 0AH LF
dw vt_disp_LF ; 0BH VT
dw vt_disp_LF ; 0CH FF
dw vt_disp_CR ; 0DH CR
dw vt_disp_SO ; 0EH SO
dw vt_disp_SI ; 0FH SI
;
dw vt_disp_none ; 10H DLE
dw vt_disp_none ; 11H DC1 (XON)
dw vt_disp_none ; 12H DC2
dw vt_disp_none ; 13H DC3 (XOFF)
dw vt_disp_none ; 14H DC4
dw vt_disp_none ; 15H NAK
dw vt_disp_none ; 16H SYN
dw vt_disp_none ; 17H ETB
dw vt_disp_CAN ; 18H CAN
dw vt_disp_none ; 19H EM
dw vt_disp_SUB ; 1AH SUB
dw vt_disp_ESC ; 1BH ESC
dw vt_disp_none ; 1CH FS
dw vt_disp_GS ; 1DH GS
dw vt_disp_none ; 1EH RS
dw vt_disp_none ; 1FH US
;
even
vram_line dw 0000h ; 0-line
dw 00a0h ; 1
dw 0140h ; 2
dw 01e0h ; 3
dw 0280h ; 4
dw 0320h ; 5
dw 03c0h ; 6
dw 0460h ; 7
dw 0500h ; 8
dw 05a0h ; 9
dw 0640h ;10
dw 06e0h ;11
dw 0780h ;12
dw 0820h ;13
dw 08c0h ;14
dw 0960h ;15
dw 0a00h ;16
dw 0aa0h ;17
dw 0b40h ;18
dw 0be0h ;19
dw 0c80h ;20
dw 0d20h ;21
dw 0dc0h ;22
vram_botm_line dw 0e60h ;23
vram_last_line dw 0f00h ;24
;
I_am_vt52 db 3
db ESCAPE,"/Z"
I_am_vt102 db 5
db ESCAPE,"[?6c"
I_am_vt220 db 16
db ESCAPE,"[?62;1;2;6;7;8c"
I_am_fine db 4
db ESCAPE,"[0n"
My_cursor_is db ESCAPE,"["
db 10 dup (?)
cur_col db 0
cur_row db 0
cur_save_col db 0
cur_save_row db 0
text_col db 0
text_row db 0
text_top db 0
text_bottom db 0
color_index_table db 0, 2, 4, 6, 1, 3, 5, 7
;
vt_phys_top db 0
vt_phys_bottom db 23
vt_top db 0
vt_bottom db 23
tabstops db 80 dup (?) ; tab stop table
db 1,1 ; guard
nam_none db ' '
nam_vt52 db 'VT52 '
nam_vt100 db 'VT102 '
LED_buff db '....'
nam_tek db 'TEK4010/14'
nam_prn db ' PRN'
nam_nprn db ' '
dump_pntr dw ?
dump_buffer db 256 dup (?)
dump_mode db 0
watch_pnd dw 0
watch_buf db 12 dup (?)
watch_lvl db 0
watch_mod db 0
;
; Kermit mode line buffer
;
mode_len db 0
mode_ker db 'Esc-chr: '
mode_esc db '^]'
db ' help: '
mode_hlp db '^]'
db '? port:'
mode_prt db '1'
db ' speed:'
mode_spd db ' '
db ' parity:'
mode_pty db 'none'
db ' echo:'
mode_ech db 'rem'
db ' '
mode_trm db ' '
mode_prn db ' '
MODE_LINE_LENG = $ - mode_len
unkbaud db ' Unk ' ; must be 5 characters
baudname db ' 45.5'
db ' 50 '
db ' 75 '
db ' 110 '
db '134.5'
db ' 150 '
db ' 300 '
db ' 600 '
db ' 1200'
db ' 1800'
db ' 2000'
db ' 2400'
db ' 4800'
db ' 9600'
db '19200'
db '38400'
db '57.6K'
db '115 K'
BAUDNSIZ equ 18
parityname db 'even' ; must be 4 characters
db 'mark'
db 'none'
db 'odd '
db 'spc '
lclename db 'loc'
remename db 'rem'
data ends
code segment public 'code'
assume cs:code,ds:data,es:nothing
extrn sbrk:near ; memory allocation routine in mssker
extrn s2jis:near, jis2s:near ; in MSZP98
extrn set_cursor:near ; in MSZP98
extrn set_gpalette:near ; in MSGP98
extrn gdisp_on:near, gdisp_off:near ; in MSGP98
extrn tek4014_color:near ; in MSGP98
extrn set_gcolor:near ; in MSGP98
extrn pntchr:near
extrn outcapt:near ; in MSXP98
extrn set_cur_color:near ; in MSXP98
extrn sixel_in:near ; in MSGP98
extrn sixel_clear:near ; in MSGP98
extrn sixel:near ; in MSGP98
;
; VT100 terminal emulator
;
;
;-----------------------------------------------------------
;
; Initilization routine
; This is called from lclini, local initialization routine.
VT100_INI PROC NEAR
cmp vt_init,0
je vt100_ini_1
jmp vt100_ini_ex
vt100_ini_1:
mov vt_init,1
;
; Allocate memory to save screen
;
mov ax,2000h ; display + attributes
call sbrk
mov vt_saveseg,ax
;
; Check the memory size
;
mov bx,0FFFFh ; allocate full integer (must fail)
mov ah,ALLOC ; memory allocation
int DOS ; system call. BX has number of free para.
mov ax,bx
cmp ax,2000 ; keep 32K for COMMAND.COM (in parag. size)
ja vt100_ini_r1
mov ax,ROLLMEM_MIN
jmp vt100_ini_r2
vt100_ini_r1:
sub ax,2000
cmp ax,ROLLMEM_MAX
jbe vt100_ini_r2
mov ax,ROLLMEM_MAX
vt100_ini_r2:
xor dx,dx
mov cx,20 ; number of parag. per line
div cx
mov vt_rollmxl,ax
mov cx,20 ; number of parag. per line
mul cx
push ax ; save number of parag.
mov bx,ax
mov ah,ALLOC ; allocate memory
int DOS
mov vt_rollseg,ax
mov vt_rollcur,ax
mov vt_rollcln,0
mov vt_rollfil,1
pop bx
add ax,bx
mov vt_rollmxs,ax
;
vt100_ini_ex:
call vt100_soft_res ; reset software parameters
ret
VT100_INI ENDP
VT100_RESET PROC NEAR
call vt100_soft_res
call vt100_restore
call vt100_modlin
ret
VT100_RESET ENDP
VT100_SOFT_RES PROC NEAR
;
; Software reset terminal (* means not supported yet)
; * Text cursor On
; Insert/Replace Replace
; Origin Mode Absolute
; Autowrap Off
; * Keyboard Action Unlocked
; Keypad Mode Numeric
; Cursor Key Mode Normal
; Top Margin 1
; Bottom Margin 24
; Character Sets default
; Video Character Normal
;
push ax
push bx
;
mov sixel_disp_on,0 ; no sixel display
mov vt100_gflag,1
push si
mov si,offset def_color ; set color to default
call set_cur_color
call vt100_color
pop si
;
mov vt_in_stat,0 ; main screen
mov vt_stat_type,1
;
mov ax,'..' ; LED-clear
mov bx,offset LED_buff
mov [bx],ax
mov [bx+2],ax
;
and vt100_flags,(not INSERT_BIT)
and vt100_flags,(not ORIGIN_BIT)
and vt100_flags,(not AUTOWRAP_BIT)
mov vt100_pflag,0 ; flags for printer control
mov vt100_cursr,0 ; cursor style
mov curkey_mode,0
mov keypad_mode,0
mov cur_col,0
mov cur_row,0
mov cur_save_col,0
mov cur_save_row,0
mov al,vt_nrmatr
mov vt_chratr,al
mov vt_blkatr,al
mov al,vt_phys_top
mov vt_top,al
mov al,vt_phys_bottom
mov vt_bottom,al
mov priv_pflg,0
;
mov char_G0,CSET_JISROMAN
mov char_G1,CSET_DECGRAPH
mov char_G2,CSET_JISKATAKANA
mov char_G3,CSET_JISC6226
;
mov vt_graph,0
mov char_SS,0
mov char_GL,offset char_G0
mov char_GR,offset char_G3
;
; Erase save area
;
push es
push di
cld
mov ax,vt_saveseg
mov es,ax
mov di,0 ; offset address
mov cx,0800h
mov ax,0020h
rep stosw
mov al,vt_blkatr
xor ah,ah
mov cx,0800h
rep stosw
;
pop di
pop es
;
; Initialize TAB table
;
push cx
push dx
;
mov bx,offset tabstops
mov cx,80
xor ax,ax
vt_ini_t1:
mov dl,0
test ax,7
jnz vt_ini_t2
mov dl,1
vt_ini_t2:
push bx
add bx,ax
mov byte ptr [bx],dl
pop bx
inc ax
loop vt_ini_t1
;
pop dx
pop cx
;
call set_modlin ; set Kermit modeline buffer
call save_cursor
pop bx
pop ax
ret
VT100_SOFT_RES ENDP
;
; save VT100 screen
;
VT100_SAVE PROC NEAR
push ax
push cx
push dx
push ds
push es
;
cld
;
mov ah,0Dh ; stop display
int BIOS
;
mov ax,vt_saveseg
mov es,ax ; destination segment address
mov di,0
mov si,vram_line ; set source address [06-Nov-88]
push si ; save it for later use [06-Nov-88]
mov ax,CRT_TXT_SEG
mov ds,ax
mov cx,0800h
rep movsw
pop si ; remember source address [06-Nov-88]
add si,2000h ; attribute area
mov cx,0800h
rep movsw
;
pop es
pop ds
;
; clear mode line
;
mov al,vt_blkatr
call vt_stat_clr
;
mov ah,0Ch ; start dispay
int BIOS
;
mov ax,0
call set_cursor ; restore cursor attributes
;
mov si,offset gnrm_color
call set_gpalette
call gdisp_off
;
pop dx
pop cx
pop ax
;
ret
VT100_SAVE ENDP
;
; restore VT100 screen
;
VT100_RESTORE PROC NEAR
push ax
push bx
push cx
push dx
push ds
push es
;
cld
;
mov ah,0Dh ; stop display
int BIOS
;
mov ax,CRT_TXT_SEG
mov es,ax ; destination sagment address
mov di,vram_line
push di
mov ax,vt_saveseg
mov ds,ax
mov si,0
mov cx,0800h
rep movsw
pop di
add di,2000h ; attribute area
mov cx,0800h
rep movsw
;
mov ah,0Ch ; start dispay
int BIOS
;
pop es
pop ds
;
xor ax,ax
mov al,vt100_cursr
call set_cursor ; set cursor attributes
;
call locate_cur
;
call set_gcolor
call gdisp_on
;
pop dx
pop cx
pop bx
pop ax
;
ret
VT100_RESTORE ENDP
set_termnam proc near
push ax
push cx
push si
push di
push es
;
mov ax,ds
mov es,ax
; terminal type
mov cx,10 ; length of terminal name
mov si,offset nam_vt52
cmp flags.vtflg,ttvt52
je set_termnam1
mov si,offset nam_vt100
cmp flags.vtflg,ttvt100
je set_termnam1
mov si,offset nam_tek
cmp flags.vtflg,tttek
je set_termnam1
mov si,offset nam_none
set_termnam1:
mov di,offset mode_trm
rep movsb
;
pop es
pop di
pop si
pop cx
pop ax
ret
set_termnam endp
;
set_prnstat proc
push ax
push cx
push si
push di
push es
;
mov ax,ds
mov es,ax
;
; printer status
;
mov cx,4
mov si,offset nam_nprn
test vt100_pflag,(AUTOPRINT_BIT+PRINTCTRL_BIT)
jz set_prnstat1
mov si,offset nam_prn
set_prnstat1:
mov di,offset mode_prn
rep movsb
pop es
pop di
pop si
pop cx
pop ax
ret
set_prnstat endp
;
SET_MODLIN PROC NEAR
; set the mode line buffer
;
push es
mov ax,ds
mov es,ax
;
mov al,' '
mov ah,trans.escchr
cmp ah,020h
jge set_modlin1
mov al,'^'
or ah,040h
set_modlin1:
mov word ptr mode_esc,ax
mov word ptr mode_hlp,ax
;
mov al,vt_ourarg.baudb
mov si,offset unkbaud ; Assume unknown baud.
mov cx,5 ; length of baud space
cmp al,BAUDNSIZ ; too big?
jnb set_modlin2 ; yes, use default
mul cl
xor ah,ah
add ax,offset baudname
mov si,ax
set_modlin2:
mov di,offset mode_spd
rep movsb
;
mov al,vt_ourarg.prt
cmp al,'A'
jae set_modlin3
add al,'0' ; convert to character
set_modlin3:
mov mode_prt,al
;
mov al,vt_ourarg.parity
xor ah,ah
mov cx,4
imul cl
add ax,offset parityname
mov si,ax
mov di,offset mode_pty
rep movsb
;
mov si,offset lclename
test vt_ourarg.flgs,lclecho
jnz set_modlin4
mov si,offset remename
set_modlin4:
mov cx,3
mov di,offset mode_ech
rep movsb
;
call set_termnam
call set_prnstat
;
mov mode_len,MODE_LINE_LENG
;
pop es
ret
SET_MODLIN ENDP
;
vt_stat_clr proc near
;
; clear status line with attribute in AL.
;
push bx
push es
push di
push si
;
mov bx,ax
cld
mov ax,CRT_TXT_SEG
mov es,ax
mov di,vram_last_line
mov cx,80
xor ah,ah
mov al,' '
rep stosw
mov di,vram_last_line
add di,02000h
mov al,bl
mov cx,80
rep stosw
;
mov ax,bx
pop si
pop di
pop es
pop bx
ret
vt_stat_clr endp
;
VT100_MODLIN PROC NEAR
;
; Mode line display control
;
; Inputs:
; dx offset address of the mode line buffer;
; The 1st byte of the mode line buffer must contain the
; the number of characters in the buffer. If it is zero,
; the mode line is cleared.
;
push ax
push cx
cmp vt_stat_type,0 ; clear status buffer ?
jne vt100_modlin1 ; ne=no.
mov al,vt_blkatr ; attribute
call vt_stat_clr ; clear the status line
jmp vt100_modlin_ex ; and return
;
vt100_modlin1:
cmp vt_stat_type,1 ; Kermit mode line control ?
jne vt100_modlin2 ; ne=no.
test vt_ourarg.flgs,modoff ; mode line off ?
jz vt100_modlin1_1 ; z=no.
mov al,vt_blkatr
call vt_stat_clr
jmp vt100_modlin_ex
;
; display kermit mode line
;
vt100_modlin1_1:
mov al,vt_modatr
call vt_stat_clr
;
push es
push di
push si
;
cld
xor ch,ch
mov cl,mode_len
mov si,offset mode_ker
mov ax,CRT_TXT_SEG
mov es,ax
mov di,vram_last_line
xor ah,ah
vt100_modlin1_2:
mov al,[si]
mov es:[di],ax
inc si
add di,2
loop vt100_modlin1_2
;
pop si
pop di
pop es
jmp vt100_modlin_ex
;
vt100_modlin2:
;@@ mov al,vt_modatr
;@@ call vt_stat_clr
;
vt100_modlin_ex:
call locate_cur
;
pop cx
pop ax
ret
VT100_MODLIN ENDP
VT100_COLOR PROC NEAR
;
; Change color to the value specified in [si].
; [si] color index for foreground
; [si+1] color index for background
; [si+2] color index for highlight
; [si+3] color index for modeline
;
push ax
push cx
;
mov al,[si]
and vt_nrmatr,1Fh ; mask color attributes
and vt_chratr,1Fh
and vt_blkatr,1Fh
mov cl,5
shl al,cl
or vt_nrmatr,al
or vt_chratr,al
or vt_blkatr,al
;
push di
push si
mov al,[si+1]
xor ah,ah
mov si,offset gnrm_color
add si,ax
add si,ax
add si,ax
mov di,offset gbck_color
mov cx,16
vt100_color1:
mov al,[si]
mov [di],al
inc di
mov al,[si+1]
mov [di],al
inc di
mov al,[si+2]
mov [di],al
inc di
loop vt100_color1
pop si
pop di
;
mov al,[si+2]
and vt_hglatr,1Fh ; mask color attributes
mov cl,5
shl al,cl
or vt_hglatr,al
;
mov al,[si+3]
and vt_modatr,1Fh ; mask color attributes
mov cl,5
shl al,cl
or vt_modatr,al
;
pop cx
pop ax
ret
VT100_COLOR ENDP
mrsave proc near
;
; save n lines (given by CL) in roll-up buffer (circular).
;
push ax
push cx
push si
push di
push ds
push es
;
xor ch,ch ; clear high byte of CX
mov si,vram_line
mrsave1:
cmp cx,0
jle mrsave3
push cx
push ds
mov ax,vt_rollcur ; current roll-buffer segment
mov es,ax ; destination segment address
mov di,0 ; destination offset address
mov ax,CRT_TXT_SEG
mov ds,ax ; source segment address
push si ; save the source offset address
mov cx,80 ; words per line
rep movsw ; save the text area
pop si
add si,2000h ; offset address of the attribute area
mov cx,80
rep movsw ; save the attribute area
sub si,2000h ; return to text area
pop ds
pop cx
dec cx
inc vt_rollcln ; update lines
add vt_rollcur,20 ; update segment address. 20 parag. per line
mov ax,vt_rollfil
cmp ax,vt_rollmxl
jge mrsave2
inc vt_rollfil
mrsave2:
mov ax,vt_rollcln
cmp ax,vt_rollmxl ; exceed maximum lines ?
jl mrsave1
mov ax,vt_rollseg
mov vt_rollcur,ax
mov vt_rollcln,0
jmp mrsave1
mrsave3:
pop es
pop ds
pop di
pop si
pop cx
pop ax
ret
mrsave endp
prn_chk proc near
;
; Check the printer port
; carry on -- printer not ready
;
push ax
mov ah,ioctl
mov al,7 ; get output status of printer
push bx
mov bx,4 ; file handle for system printer
int dos
pop bx
jc prn_chk1 ; c = printer not ready
cmp al,0ffh ; Ready status?
je prn_chk2 ; e = Ready
prn_chk1:
call vt_bell
stc
prn_chk2:
pop ax
ret
prn_chk endp
VT100_RUPN proc near
;
; roll-up n lines (n is given in cx)
; cx will be broken when return.
; 1) copy the last line of the screen to the current save area
; 2) decrement the save area pointer
; 3) scroll down the screen by one line
; 4) copy the current save area to the top of screen
; 5) increment the number of moved lines
;
push ax
push dx
push si
push di
push es
;
vt100_rupn_1:
cmp cx,0
jg vt100_rupn_2
jmp vt100_rupn_ex
vt100_rupn_2:
mov ax,vt_rollnum
inc ax
cmp ax,vt_rollfil
jl vt100_rupn_3
jmp vt100_rupn_ex
;
vt100_rupn_3:
push cx ; save counter
mov ax,vt_rollcur
mov es,ax
mov di,0
;
push ds
;
mov ax,CRT_TXT_SEG
mov si,vram_botm_line
push si
mov cx,80
mov ds,ax
cld
rep movsw
pop si
add si,2000h ; attribute area
mov cx,80
rep movsw ; save attributes
;
pop ds
;
mov cx,20 ; one line (display + attributes)
cmp vt_rollcln,0
jg vt100_rupn_4
mov ax,vt_rollmxl
mov vt_rollcln,ax
mov ax,vt_rollmxs
mov vt_rollcur,ax
vt100_rupn_4:
dec vt_rollcln
mov ax,vt_rollcln
sub vt_rollcur,cx
;
mov cx,vram_botm_line
sub cx,vram_line
mov di,vram_last_line
dec di
mov si,vram_botm_line
dec si
std
mov ax,CRT_TXT_SEG
;
push ds
;
push cx
push di
push si
mov ds,ax
mov es,ax
std
rep movsb
pop si
pop di
pop cx
add si,2000h
add di,2000h
rep movsb
;
pop ds
cld
;
mov di,vram_line
mov si,0
mov ax,CRT_TXT_SEG
mov es,ax
mov ax,vt_rollcur
;
push ds
;
mov ds,ax
mov cx,80
push di
rep movsw
pop di
add di,2000h
mov cx,80
rep movsw
;
pop ds
;
inc vt_rollnum
pop cx ; restore line counter
dec cx
jmp vt100_rupn_1
;
vt100_rupn_ex:
pop es
pop di
pop si
pop dx
pop ax
ret
VT100_RUPN endp
VT100_RDNN proc near
;
; roll-down n lines (n is given in CX).
; CX will be broken when return.
; 1) copy the top of the screen to the current save area
; 2) increment the save area pointer
; 3) screen scroll up one line
; 4) copy the current save area to the bottom of the screen
; 5) decrement the number of moved lines
;
push ax
push dx
push si
push di
push es
;
vt100_rdnn_1:
cmp cx,0
jg vt100_rdnn_2
jmp vt100_rdnn_ex
vt100_rdnn_2:
mov ax,vt_rollnum
cmp ax,0
jg vt100_rdnn_3
jmp vt100_rdnn_ex
;
vt100_rdnn_3:
push cx ; save line counter
mov ax,vt_rollcur
mov es,ax
mov di,0
;
push ds
;
mov ax,CRT_TXT_SEG
mov si,vram_line
push si
mov cx,80
mov ds,ax
cld
rep movsw
pop si
add si,2000h ; attribute area
mov cx,80
rep movsw ; save attributes
;
pop ds
; increment save-area pointer
mov cx,20 ; one line (display + attributes)
inc vt_rollcln
add vt_rollcur,cx
mov ax,vt_rollcln
cmp ax,vt_rollmxl
jl vt100_rdnn_4
mov vt_rollcln,0
mov ax,vt_rollseg
mov vt_rollcur,ax
vt100_rdnn_4:
;
mov cx,vram_botm_line
sub cx,vram_line
mov di,vram_line
mov si,di
add si,160
mov ax,CRT_TXT_SEG
;
push ds
;
push cx
push di
push si
mov ds,ax
mov es,ax
rep movsb
pop si
pop di
pop cx
add si,2000h
add di,2000h
rep movsb
;
pop ds
;
mov di,vram_botm_line
mov si,0
mov ax,CRT_TXT_SEG
mov es,ax
mov ax,vt_rollcur
;
push ds
;
mov ds,ax
mov cx,80
push di
rep movsw
pop di
add di,2000h
mov cx,80
rep movsw
;
pop ds
;
dec vt_rollnum
pop cx ; restore line counter
dec cx
jmp vt100_rdnn_1
;
vt100_rdnn_ex:
pop es
pop di
pop si
pop dx
pop ax
ret
VT100_RDNN endp
scrn_mode proc near
;
; set screen mode to normal(AL=0)/reverse(AL=1)
; [NOTE]
; registers AX and BX are broken when return
;
push cx
push di
push es
;
mov bx,ax
mov ax,CRT_TXT_SEG
mov es,ax
mov di,vram_line
add di,2000h
mov cx,1920 ; 1920 = 80 x 24
cmp bl,0
je scrn_mode0
scrn_mode1:
; light background dark text.
test vt_nrmatr,CHR_REV
jz scrn_mode1L
jmp scrn_mode3
scrn_mode1L:
xor BYTE PTR es:[di],CHR_REV
add di,2
loop scrn_mode1L
or vt_nrmatr,CHR_REV
or vt_chratr,CHR_REV
or vt_blkatr,CHR_REV
jmp scrn_mode3
scrn_mode0:
; dark background light text.
test vt_nrmatr,CHR_REV
jnz scrn_mode0L
jmp scrn_mode3
scrn_mode0L:
xor BYTE PTR es:[di],CHR_REV
add di,2
loop scrn_mode0L
and vt_nrmatr,NOT CHR_REV
and vt_chratr,NOT CHR_REV
and vt_blkatr,NOT CHR_REV
scrn_mode3:
pop es
pop di
pop cx
ret
scrn_mode endp
locate_cur proc near
;
; locate cursor at (cur_row,cur_col)
;
; [NOTE]
; Registers ax, bx and dx are to be broken when return.
;
mov dh,cur_row
mov dl,cur_col
call move_cur
mov vt_wrap,0 ; new position clears wrap req. flag
ret
locate_cur endp
;
move_cur proc near
;
; Move cursor at (dh:row,dl:col)
; Registers ax, bx and dx are broken when return.
;
call vram_ofs ; get VRAM address in BX
shr bx,1
cli
move_cur1:
in al,60h
test al,04h ; test GDC status
jz move_cur1 ; z=not ready
mov al,49h
out 62h,al
mov al,bl
out 60h,al
mov al,bh
out 60h,al
sti
ret
move_cur endp
;
disp_char proc near
;
; Display character in AX on the screen.
; Cursor moves to the next character position.
; AX:will be broken when return.
;
cmp ax,00060h ; backquote special treatment
jne disp_char_mod1
mov ax,06009h ; for backquote
jmp disp_char_modx
disp_char_mod1:
;@@ cmp ax,0005Ch ; backslash
;@@ jne disp_char_mod2
;@@ mov ax,000EFh
disp_char_mod2:
disp_char_modx:
;
push es ; save segment reg.
mov dx,CRT_TXT_SEG ; set vram segment address
mov es,dx
cmp vt_wrap,0 ; wrap requested ?
je disp_char_nowrap ; e = no.
;
mov cur_col,0 ; return to left margin
mov bl,cur_row
cmp bl,vt_bottom ; exceed bottom margin ?
jl disp_char_wrap1 ; l = No.
je disp_char_wrap2
inc cur_row
mov bl,cur_row
cmp bl,vt_phys_bottom
jle disp_char_nowrap
mov bl,vt_phys_bottom
mov cur_row,bl
jmp disp_char_nowrap
disp_char_wrap1:
inc cur_row
jmp disp_char_nowrap
disp_char_wrap2:
push ax
mov al,vt_top
mov ah,vt_bottom
mov cx,1
call scroll_up
pop ax
disp_char_nowrap:
mov dh,cur_row ; get current cursor position
mov dl,cur_col
call vram_ofs ; get vram offset address in bx
mov di,bx ; set destination
test vt100_flags,INSERT_BIT ; insert mode ?
jz disp_char_noins ; z = no
cmp cur_col,79 ; at left margin ?
jge disp_char_noins ; ge = Yes. No characters shifted
mov cx,79
sub cl,cur_col ; get num. of chars. to be shifted
mov dh,cur_row
mov dl,79
call vram_ofs ; get destination offset address
mov di,bx ; set destination reg
mov si,bx
sub si,2 ; source offset address
push ds ; save data-seg. reg.
mov dx,CRT_TXT_SEG
mov ds,dx
std ; inverse direction
rep movsw ; shift the characters
cld ; reset direction flag
pop ds ; restore data-seg. reg.
disp_char_noins:
mov es:[di],ax ; put the character
xor ah,ah ; clear higher bit
mov al,vt_chratr ; load attribute
add di,02000h ; attribute offset address
stosw ; put attribute and increment address
pop es ; restore segment
inc cur_col ; update cursor position
mov al,cur_col
cmp al,79 ; exceed right margin ?
jbe disp_char_loc ; be = No.
mov cur_col,79 ; stay at right margin
test vt100_flags,AUTOWRAP_BIT ; Autowrap enable ?
jz disp_char_ex ; z = No. NoWrap
mov vt_wrap,1 ; wrap request
jmp disp_char_ex ; all done.
disp_char_loc:
call locate_cur
disp_char_ex:
ret
disp_char endp
save_cursor proc near
; saves
; 1) cursor position
mov al,cur_row
mov cur_save_row,al
mov al,cur_col
mov cur_save_col,al
; 2) graphic rendition
mov al,vt_graph
mov save_graph,al
mov al,vt_chrset
mov save_chrset,al
mov al,vt_chratr
mov save_chratr,al
mov al,vt_blkatr
mov save_blkatr,al
;
mov ax,char_SS
mov char_save_SS,ax
mov ax,char_GL
mov char_save_GL,ax
mov ax,char_GR
mov char_save_GR,ax
;
mov al,char_G0
mov char_save_G0,al
mov al,char_G1
mov char_save_G1,al
mov al,char_G2
mov char_save_G2,al
mov al,char_G3
mov char_save_G3,al
; 3) state of wrap flag
; 4) state of origin mode
mov al,vt100_flags
mov save_flags,al
; 5) state of selective erase
ret
save_cursor endp
restore_cursor proc near
; 1) state of selective erase
; 2) state of origin mode
and vt100_flags,(not ORIGIN_BIT)
mov al,save_flags
and al,ORIGIN_BIT
or vt100_flags,al
; 3) state of wrap flag
and vt100_flags,(not AUTOWRAP_BIT)
mov al,save_flags
and al,AUTOWRAP_BIT
or vt100_flags,al
; 4) graphic rendition
mov al,save_graph
mov vt_graph,al
mov al,save_chrset
mov vt_chrset,al
mov al,save_chratr
mov vt_chratr,al
mov al,save_blkatr
mov vt_blkatr,al
;
mov ax,char_save_SS
mov char_SS,ax
mov ax,char_save_GL
mov char_GL,ax
mov ax,char_save_GR
mov char_GR,ax
;
mov al,char_save_G0
mov char_G0,al
mov al,char_save_G1
mov char_G1,al
mov al,char_save_G2
mov char_G2,al
mov al,char_save_G3
mov char_G3,al
; 5) cursor position
mov al,cur_save_row
mov cur_row,al
mov al,cur_save_col
mov cur_col,al
call locate_cur
ret
restore_cursor endp
vt_dump proc near
;
; copy the one line image from es:[si] to dump buffer.
; input
; ES:SI
; outputs
; CX contains number of characters.
; ES:SI will be updated (points to the next line).
;
push ax
push di
;
mov dump_mode,0
mov di,offset dump_buffer
mov dump_pntr,di
mov cx,80
;
vt_dump1:
mov ax,es:[si]
cmp ah,0 ; 1 byte code ?
je vt_dump3 ; e = yes.
cmp al,09h ; ANK ?
jne vt_dump11 ; ne = no.
mov al,ah
mov ah,0
jmp vt_dump3
vt_dump11:
cmp dump_mode,0
je vt_dump12
mov byte ptr [di],ESCAPE
mov word ptr [di+1],'0)'
add di,3
mov dump_pntr,di
mov dump_mode,0
vt_dump12:
add ax,20h ; convert to jis
and ax,7F7Fh ; mask 8th bit
call jis2s ; convert to shift jis
mov [di],al
mov [di+1],ah
add di,2
add si,4
dec cx
mov dump_pntr,di
jmp vt_dump2
vt_dump3:
; check graphic code. It is overrap over the shift-JIS kanji code.
; In that case, we should put the ESC seq to change the character set.
cmp al,80h
jbe vt_dump6
cmp al,0FCh
ja vt_dump6
cmp al,09Fh
jbe vt_dump5
cmp al,0E0h
jb vt_dump6
vt_dump5:
cmp dump_mode,0
jne vt_dump4
mov byte ptr [di],ESCAPE
mov word ptr [di+1],'3)'
add di,3
mov dump_pntr,di
mov dump_mode,1
jmp vt_dump4
vt_dump6:
cmp dump_mode,0
je vt_dump4
mov byte ptr [di],ESCAPE
mov word ptr [di+1],'0)'
add di,3
mov dump_pntr,di
mov dump_mode,0
vt_dump4:
mov [di],al ; remove Kanji flag etc in ah.
inc di
add si,2
cmp al,' ' ; Is it blank ?
je vt_dump2 ; e = yes.
mov dump_pntr,di
vt_dump2:
dec cx
jcxz vt_dump7
jmp vt_dump1
;
vt_dump7:
mov di,dump_pntr
cmp dump_mode,0
je vt_dump8
mov byte ptr [di],ESCAPE
mov word ptr [di+1],'0)'
add di,3
vt_dump8:
mov ax,0A0Dh ; add CR/LF
mov [di],ax
add di,2
mov cx,di
sub cx,offset dump_buffer
;
pop di
pop ax
ret
vt_dump endp
vt_prn proc near
;
; copy the one line image from es:[si] to dump buffer as a printer
; image.
;
; input
; ES:SI
; outputs
; CX contains number of characters.
; ES:SI will be updated (points to the next line).
;
push ax
push di
;
mov dump_mode,0
mov di,offset dump_buffer
mov dump_pntr,di
mov cx,80
;
vt_prn1:
mov ax,es:[si]
cmp ah,0 ; 1 byte code ?
je vt_prn3 ; e = yes.
vt_prn11:
cmp dump_mode,0 ; in 2 byte mode ?
jne vt_prn12 ; ne = yes.
mov byte ptr [di],ESCAPE
mov byte ptr [di+1],'K' ; Kanji mode.
add di,2
mov dump_pntr,di
mov dump_mode,1
vt_prn12:
add ax,20h ; convert to jis
and ax,7F7Fh ; mask 8th bit
mov [di],al
mov [di+1],ah
add di,2
add si,4
dec cx
mov dump_pntr,di
jmp vt_prn2
vt_prn3:
cmp dump_mode,0 ; in 1 byte mode ?
je vt_prn4 ; e = yes.
mov byte ptr [di],ESCAPE
mov byte ptr [di+1],'H' ; High density pica mode.
add di,2
mov dump_pntr,di
mov dump_mode,0
vt_prn4:
mov [di],al ; remove Kanji flag etc in ah.
inc di
add si,2
cmp al,' ' ; Is it blank ?
je vt_prn2 ; e = yes.
mov dump_pntr,di
vt_prn2:
dec cx
jcxz vt_prn7
jmp vt_prn1
;
vt_prn7:
mov di,dump_pntr
cmp dump_mode,0
je vt_prn8
mov byte ptr [di],ESCAPE
mov byte ptr [di+1],'H'
add di,2
vt_prn8:
mov ax,0A0Dh ; add CR/LF
mov [di],ax
add di,2
mov cx,di
sub cx,offset dump_buffer
;
pop di
pop ax
ret
vt_prn endp
vt_bell proc near
push ax
push cx
;
mov al,06h
out 37h,al
mov cx,0D000h
vt_bell1:
loop vt_bell1
mov al,07h
out 37h,al
;
pop cx
pop ax
vt_bell endp
;---------------------------
VT100_DUMP PROC NEAR
;---------------------------
; Dump screen. This procedure dump the VT100 screen on the disk using
; MS-DOS function 40H (int 21H).
;
; Inputs
; BX file handle
;
; Outputs
; None
;
push cx
push dx
push es
push si
push di
mov ax,CRT_TXT_SEG
mov es,ax
mov si,vram_line
mov cx,24
vt100_dump0:
push cx
call vt_dump
mov ah,WRITE2 ; write function
mov dx,offset dump_buffer
int DOS
;
pop cx
loop vt100_dump0
;
pop di
pop si
pop es
pop dx
pop cx
ret
VT100_DUMP ENDP
;------------------------------------------------------------------------------
VT100_PRNC PROC NEAR
;
; Printer control (Transparent printing).
; - Watches the control seunce CSI 4 i (turns off printer controller mode).
; If this sequence is found, control returns to normal terminal mode.
; - Until CSI 4 i sequnce is found, all the received characters are sent to
; the printer without displaying them on the screen except NUL, XON, XOFF,
; CSI 5 i and CSI 4 i.
;
mov di,offset watch_buf ; get buffer pointer
add di,watch_pnd ; adjust pointer
mov [di],al ; save the character
inc watch_pnd ; increment the pointer
;
cmp watch_lvl,0 ; normal sequnce ?
jne vt100_prnc_n0 ; ne = no.
jmp vt100_prnc_L0
vt100_prnc_n0:
cmp watch_lvl,1 ; next ESC ?
jne vt100_prnc_n1 ; ne = no.
jmp vt100_prnc_L1
vt100_prnc_n1:
cmp watch_lvl,2 ; after CSI ?
jne vt100_prnc_n2 ; ne = no.
jmp vt100_prnc_L2
vt100_prnc_n2:
cmp watch_lvl,3 ; final character ?
jne vt100_prnc_n3 ; ne = no.
jmp vt100_prnc_L3
vt100_prnc_n3: ; *** if come here, PROGRAM ERROR ***
mov watch_lvl,0
mov watch_pnd,0
jmp vt100_prnc_OUT
;
vt100_prnc_L0:
mov watch_lvl,1 ; assume ESC
cmp al,ESCAPE ; ESC ?
je vt100_prnc_L0_1 ; e = yes.
mov watch_lvl,2 ; assume CSI
cmp al,CSI ; CSI ?
je vt100_prnc_L0_1 ; e = yes.
jmp vt100_prnc_OUT
;
vt100_prnc_L0_1:
mov di,offset watch_buf
mov watch_pnd,0
mov [di],al
inc watch_pnd
jmp vt100_prnc_ex
;
vt100_prnc_L1:
cmp al,'['
je vt100_prnc_L1_1
jmp vt100_prnc_OUT
vt100_prnc_L1_1:
mov watch_lvl,2
jmp vt100_prnc_ex
;
vt100_prnc_L2:
mov watch_mod,al
cmp al,'5'
je vt100_prnc_L2_1
cmp al,'4'
je vt100_prnc_L2_1
jmp vt100_prnc_OUT
vt100_prnc_L2_1:
mov watch_lvl,3
jmp vt100_prnc_ex
;
vt100_prnc_L3:
cmp al,'i'
jne vt100_prnc_OUT
mov watch_pnd,0 ; clear pending buffer
cmp watch_mod,'4' ; off the printer control ?
jne vt100_prnc_L3_1 ; ne = no.
and vt100_pflag,(not PRINTCTRL_BIT)
vt100_prnc_L3_1:
jmp vt100_prnc_ex
;
vt100_prnc_OUT:
mov di,offset watch_buf
mov cx,watch_pnd
vt100_prnc_OUT1:
mov ah,LSTOUT
mov dl,[di]
int DOS
jc vt100_prnc_OUT2
inc di
loop vt100_prnc_OUT1
mov watch_pnd,0
jmp vt100_prnc_ex
;
vt100_prnc_OUT2:
call vt_bell
and vt100_pflag,(not (AUTOPRINT_BIT+PRINTCTRL_BIT))
mov watch_pnd,0
;
vt100_prnc_ex:
xor ah,ah
xor cx,cx
ret
VT100_PRNC ENDP
;------------------------------------------------------------------------------
VT100_PRNL PROC NEAR
;
; Print the current line on the printer
;
push dx
;
push bx
mov dh,cur_row
mov dl,0
call vram_ofs
mov si,bx
pop bx
;
push es
mov ax,CRT_TXT_SEG
mov es,ax
call vt_prn
pop es
;
mov di,offset dump_buffer
vt100_prnl1:
mov al,[di]
call pntchr
jc vt100_prnl2
inc di
loop vt100_prnl1
jmp vt100_prnl3
;
vt100_prnl2:
call vt_bell
and vt100_pflag,(not (AUTOPRINT_BIT+PRINTCTRL_BIT))
;
vt100_prnl3:
;
pop dx
ret
VT100_PRNL ENDP
;------------------------------------------------------------------------------
VT100_PRNS PROC NEAR
;
; Print the current screen on the printer.
; Similar to dump.
;
push cx
push dx
push es
push si
push di
;
test vt100_pflag,AUTOPRINT_BIT ; printer off?
jnz vt100_prns1 ; nz = no not. it is on.
call prn_chk ; check the printer port
jnc vt100_prns1 ; nc = ready.
jmp vt100_prns5
;
vt100_prns1:
mov ax,CRT_TXT_SEG
mov es,ax
mov si,vram_line
mov cx,24
test vt100_pflag,PRINTEXT_BIT ; full screen printing?
jnz vt100_prns2 ; nz = yes.
mov al,vt_top ; determine start address
xor ah,ah
mov cx,ax
shl ax,1
mov si,offset vram_line
add si,ax
mov si,[si]
mov al,vt_bottom
xor ah,ah
xchg ax,cx
sub cx,ax
inc cx
vt100_prns2:
push cx
call vt_prn
mov di,offset dump_buffer
;
vt100_prns3:
mov al,[di]
call pntchr
jc vt100_prns4
inc di
loop vt100_prns3
;
pop cx
loop vt100_prns2
;
test vt100_pflag,PRINTFF_BIT ; must print FF ?
jz vt100_prns5 ; z = no.
mov al,FF
call pntchr
jc vt100_prns4
jmp vt100_prns5
;
vt100_prns4:
call vt_bell
and vt100_pflag,(not (AUTOPRINT_BIT+PRINTCTRL_BIT))
;
vt100_prns5:
pop di
pop si
pop es
pop dx
pop cx
ret
VT100_PRNS ENDP
;------------------------------------------------------------------------------
VT100 PROC NEAR
;
; The main program for VT100 emulator
; Inputs:
; AL character code
; Outputs:
; AH results
; 0:Normal, in this case,
; CX number of characters to be sent to communication port
; DS:SI character string to be sent
;
; AH non zero means 'change to the tek4010 emulation mode'
; 1:only change the mode. do not pass any character.
; 2:change the mode and send the character in AL.
; 3:change the mode and send the characters in DH and DL.
; DX character pair to be sent to tek4010 emulator if AH=3.
;
;------------------------------------------------------------------------------
;
; Character display routine in VT-100 mode
;
vt_disp:
mov vt_rollnum,0
;
cmp spec_mode,0 ; in special mode ?
je vt_disp_NRM ; e = No. go to normal process.
cmp spec_mode,IN_ESC_MODE ; in ESC sequence ?
jne vt_disp_01 ; ne = No. check other sequnce.
jmp vt_disp_inESC ; go to ESC sequence procedure.
vt_disp_01:
cmp spec_mode,IN_CSI_MODE ; in CSI sequence ?
jne vt_disp_02 ; ne = No. check other sequnce.
jmp vt_disp_inCSI ; go to CSI sequence procedure.
vt_disp_02:
cmp spec_mode,IN_DCS_MODE ; in DCS sequence ?
jne vt_disp_03 ; ne = No.
jmp vt_disp_inDCS ; go to DCS sequence procedure.
vt_disp_03:
mov spec_mode,0 ; May be my program error. treate as
; normal character.
;
vt_disp_NRM:
cmp al,080h ; C0/GL character ?
jae vt_disp_C1GR ; ae = No.
;
; C0/D0 character
;
cmp al,020h ; C0 code ?
jae vt_disp_GL ; ae = No. This is GL code.
jmp vt_disp_C0 ; do C0 control.
vt_disp_GL:
cmp al,07Fh ; DEL code ?
je vt_disp_ex ; e = Yes. Ignore this character.
cmp char_SS,0 ; single shift in progress ?
je vt_disp_GL2 ; e = No.
mov bx,char_SS ; single shift
jmp disp_out ; display character
vt_disp_GL2:
mov bx,char_GL ; GL character
jmp disp_out ; display character
vt_disp_ex:
mov ah,0 ; continue vt emulation
mov cx,0
ret
;
; C1/GR character
;
vt_disp_C1GR:
cmp al,0A0h ; C1 code ?
jae vt_disp_GR ; ae = No. This is GR code
jmp vt_disp_C1 ; do C1 control
vt_disp_GR:
cmp al,0FFh ; 8 bit DEL code ?
je vt_disp_ex ; e = Yes. Ignore this character
and al,07Fh
cmp char_SS,0 ; Single shift in progress ?
je vt_disp_GR2 ; e = No.
mov bx,char_SS ; set single shift
jmp disp_out
vt_disp_GR2:
mov bx,char_GR ; GR character
;-----------------------------------
; Display the character code.
; Inputs:
; AL: Character code
; BX: Address of the character set
;-----------------------------------
disp_out:
cmp vt_knjmode,0 ; multi-byte code in progress ?
jne disp_Kanji ; ne = Yes.
jmp disp_out0 ; 1st byte character code.
;
disp_Kanji:
mov vt_kanji2,al ; save Kanji 2nd byte
;
; test logging
;
cmp vt100_lflag,(LOGCOOK_BIT+LOGENAB_BIT) ; log enabled and cooked
jne disp_Kanji_1 ; ne = No.
mov ah,vt_kanji2
mov al,vt_kanji1
call jis2s ; convert to shift JIS
call outcapt ; log 1st byte
xchg ah,al
call outcapt ; log 2nd byte
disp_Kanji_1:
;
; Display Kanji
;
mov ah,vt_kanji2 ; restore Kanji 2nd byte
mov al,vt_kanji1 ; restore Kanji 1st byte
sub ax,020h
push ax
call disp_char
pop ax
or ax,8000h
call disp_char
mov vt_knjmode,0
mov char_SS,0 ; reset single shift
jmp vt_disp_ex
;
disp_out0:
mov ah,[bx] ; Get character set number
mov vt_graph,ah
xor ah,ah
cmp vt_graph,CSET_JISROMAN ; JIS roman character set ?
jne disp_out1
jmp disp_outit
disp_out1:
cmp vt_graph,CSET_DECGRAPH ; DEC special graphics character set ?
jne disp_out2
jmp disp_DECGRAPH
disp_out2:
cmp vt_graph,CSET_JISC6226 ; JIS 2-byte Kanji code ?
jne disp_out3
jmp disp_JISC6226
disp_out3:
cmp vt_graph,CSET_JISKATAKANA
jne disp_out4
jmp disp_JISKATAKANA
disp_out4:
jmp disp_outit
;---------------------------------------
disp_DECGRAPH:
cmp ax,060h
jge disp_DECGRAPH1
jmp disp_outit
disp_DECGRAPH1:
sub ax,060h
mov bx,offset vt_gset
add bx,ax
mov al,[bx]
jmp disp_outit
disp_JISC6226:
mov vt_kanji1,al
mov vt_knjmode,1
jmp vt_disp_ex
disp_JISKATAKANA:
or al,080h
disp_outit:
cmp vt100_lflag,(LOGCOOK_BIT+LOGENAB_BIT)
jne disp_outit_1
call outcapt
disp_outit_1:
call disp_char
mov char_SS,0 ; reset single shift
jmp vt_disp_ex
;
;-------------------------------------------------
; C0 control characters
; Note that only CAN and SUB clear ESC, CSI stage.
;-------------------------------------------------
vt_disp_C0:
push ax
mov bx,offset C0_func_tab ; jump table address
xor ah,ah
shl ax,1
add bx,ax
pop ax
jmp [bx]
;
; No action
;
vt_disp_none:
jmp vt_disp_ex
;
; BEL
;
vt_disp_BEL:
mov al,06h
out 37h,al
mov cx,0D000h
bell_loop:
loop bell_loop
mov al,07h
out 37h,al
jmp vt_disp_ex
;
; BS
;
vt_disp_BS:
mov vt_knjmode,0 ; clear multi-byte flag
cmp cur_col,0
jg vt_disp_BS_1
jmp vt_disp_ex
vt_disp_BS_1:
dec cur_col
call locate_cur
jmp vt_disp_ex
;
; HT
;
vt_disp_HT:
mov vt_knjmode,0 ; clear multi-byte flag
cmp vt100_lflag,(LOGCOOK_BIT+LOGENAB_BIT)
jne vt_disp_HT0
call outcapt
vt_disp_HT0:
push bx ; save BX register
mov bx,offset tabstops ; set address of tabstops
mov al,cur_col ; get current cursor position
xor ah,ah ; clear higher byte
add bx,ax ; tab table pointer
vt_disp_HT1:
cmp al,79 ; right margin ?
jge vt_disp_HT2 ; ge = Yes. do not move any more
inc al ; move position
inc bx ; update table pointer
cmp byte ptr [bx],0 ; TAB stop position ?
je vt_disp_HT1 ; e = No. increment pointer and cont.
;
vt_disp_HT2:
pop bx
mov cur_col,al ; save the new cursor position
call locate_cur ; and move the cursor
jmp vt_disp_ex
;
; LF
;
vt_disp_LF:
mov vt_knjmode,0 ; clear multi-byte flag
cmp vt100_lflag,(LOGCOOK_BIT+LOGENAB_BIT)
jne vt_disp_LF0
call outcapt
vt_disp_LF0:
test vt100_pflag,AUTOPRINT_BIT ; auto-print requested ?
jz vt_disp_LF5 ; z = no.
call vt100_prnl ; print the current line
vt_disp_LF5:
mov bl,vt_bottom ; get bottom margin
cmp cur_row,bl
jl vt_disp_LF2 ; above boundary
je vt_disp_LF1 ; on the boundary
inc cur_row
mov bl,vt_phys_bottom
cmp cur_row,bl ; screen boundary
jle vt_disp_LF3
mov cur_row,bl
jmp vt_disp_LF3
vt_disp_LF1:
mov cur_row,bl
mov al,vt_top
mov ah,vt_bottom
mov cx,1
call scroll_up
jmp vt_disp_LF3
vt_disp_LF2:
inc cur_row
vt_disp_LF3:
test vt100_flags,NEWLINE_BIT ; newline enabled ?
jz vt_disp_LF4 ; z = no.
mov cur_col,0
vt_disp_LF4:
call locate_cur
jmp vt_disp_ex
;
; CR
;
vt_disp_CR:
mov vt_knjmode,0 ; clear multi-byte flag
cmp vt100_lflag,(LOGCOOK_BIT+LOGENAB_BIT)
jne vt_disp_CR0
call outcapt
vt_disp_CR0:
mov cur_col,0
call locate_cur
jmp vt_disp_ex
;
; SO
;
vt_disp_SO:
mov vt_knjmode,0 ; clear multi-byte flag
mov char_GL,offset char_G1
jmp vt_disp_ex
;
; SI
;
vt_disp_SI:
mov vt_knjmode,0 ; clear multi-byte flag
mov char_GL,offset char_G0
jmp vt_disp_ex
;
; CAN
;
vt_disp_CAN:
mov vt_knjmode,0 ; clear multi-byte flag
mov spec_mode,0 ; clear ESC/CSI seq.
jmp vt_disp_ex
;
; SUB
;
vt_disp_SUB:
mov vt_knjmode,0 ; clear multi-byte flag
mov spec_mode,0 ; clear ESC/CSI seq.
mov ax,001Ah
jmp disp_outit ; and display it.
;
vt_disp_ESC:
mov vt_knjmode,0 ; clear multi-byte flag
mov spec_mode,in_ESC_MODE ; enter in ESC mode
mov spec_stage,0 ; show that just entered
mov I_pnt,0
mov bx,offset I_buf
mov word ptr [bx],0
jmp vt_disp_ex
;
; GS Enter tektronix mode if tek4010 enabled
;
vt_disp_GS:
test vt100_flags,AUTOTEK_BIT
jnz vt_disp_GS_01
jmp vt_disp_ex
vt_disp_GS_01:
mov vt_knjmode,0 ; clear multi-byte flag
mov spec_mode,0
mov ah,2 ; pass character in AL
mov cx,0
ret
;
;----------------------
; C1 control characters
;----------------------
vt_disp_C1:
mov vt_knjmode,0 ; clear multi-byte flag
cmp al,084h ; IND
jne vt_disp_C1_n84
jmp vt_C1_IND
vt_disp_C1_n84:
cmp al,085h ; NEL
jne vt_disp_C1_n85
jmp vt_C1_NEL
vt_disp_C1_n85:
cmp al,088h ; HTS
jne vt_disp_C1_n88
jmp vt_C1_HTS
vt_disp_C1_n88:
cmp al,08Dh ; RI
jne vt_disp_C1_n8D
jmp vt_C1_RI
vt_disp_C1_n8D:
cmp al,08Eh ; SS2
jne vt_disp_C1_n8E
jmp vt_C1_SS2
vt_disp_C1_n8E:
cmp al,08Fh ; SS3
jne vt_disp_C1_n8F
jmp vt_C1_SS3
vt_disp_C1_n8F:
cmp al,090h ; DCS
jne vt_disp_C1_n90
jmp vt_C1_DCS
vt_disp_C1_n90:
cmp al,09Bh ; CSI
jne vt_disp_C1_n9B
jmp vt_C1_CSI
vt_disp_C1_n9B:
cmp al,09Ch ; ST
jne vt_disp_C1_n9C
jmp vt_C1_ST
vt_disp_C1_n9C:
jmp vt_disp_ex
;--------------------------------------------
vt_disp_vt52ESC:
cmp al,'A'
jb vt_disp_vt52ESC_nD
cmp al,'D'
ja vt_disp_vt52ESC_nD
mov WORD PTR P_buf,1
jmp vt_CSI_ABCD
vt_disp_vt52ESC_nD:
cmp al,'H'
jne vt_disp_vt52ESC_nH
mov cur_col,0
mov cur_row,0
call locate_cur
jmp vt_esc_done
vt_disp_vt52ESC_nH:
cmp al,'I'
jne vt_disp_vt52ESC_nI
jmp vt_C1_RI
vt_disp_vt52ESC_nI:
cmp al,'J'
jne vt_disp_vt52ESC_nJ
mov WORD PTR P_buf,0
jmp vt_CSI_J
vt_disp_vt52ESC_nJ:
cmp al,'K'
jne vt_disp_vt52ESC_nK
mov WORD PTR P_buf,0
jmp vt_CSI_K
vt_disp_vt52ESC_nK:
cmp al,'Y'
jne vt_disp_vt52ESC_nY
mov spec_stage,VT52_DCA_L
vt_disp_vt52ESC_nY:
cmp al,'F' ; enter graphics mode ?
jne vt_disp_vt52ESC_nF
jmp vt_esc_done
vt_disp_vt52ESC_nF:
cmp al,'G' ; leave graphics mode ?
jne vt_disp_vt52ESC_nG
jmp vt_esc_done
vt_disp_vt52ESC_nG:
cmp al,'W' ; enter printer control mode ?
jne vt_disp_vt52ESC_nW
jmp vt_esc_done
vt_disp_vt52ESC_nW:
cmp al,'X' ; leave printer control mode ?
jne vt_disp_vt52ESC_nX
jmp vt_esc_done
vt_disp_vt52ESC_nX:
cmp al,'V' ; print cursor line ?
jne vt_disp_vt52ESC_nV
jmp vt_esc_done
vt_disp_vt52ESC_nV:
;
; Non VT52 sequence is interpreted as VT100 sequence.
;
add al,040h ; convert to C1
jmp vt_disp_c1
;
vt_disp_vt52ESC_YL:
xor ah,ah
sub ax,32
mov P_buf,ax
mov spec_stage,VT52_DCA_C
jmp vt_disp_ex
;
vt_disp_vt52ESC_YC:
push ax
xor ah,ah
sub ax,32
mov cur_col,al
mov ax,P_buf
mov cur_row,al
call locate_cur
pop ax
jmp vt_esc_done
;------------------------------------------------------------------------------
; ESC sequence analysis
; Note that VT100 allows many C0 characters in ESC-seq.
vt_disp_inESC:
cmp al,07Eh ; check the allowed range
ja vt_disp_inESCe ; error.
cmp al,020h ; normal GL character ?
jae vt_disp_inESC1 ; ae = yes.
; C0 control character
cmp spec_stage,0 ; 1st character in ESC seq.?
je vt_disp_inESC0 ; e = Yes. Need check ESC FF.
jmp vt_disp_C0
vt_disp_inESC0:
cmp al,0Ch ; FF ?
je vt_disp_ESC_FF ; e = Yes. Need special treatment.
jmp vt_disp_C0
;
; ESC FF:Enter tektronix mode if tek4010 enabled
;
vt_disp_ESC_FF:
test vt100_flags,AUTOTEK_BIT ; AutoTek enabled ?
jnz vt_disp_ESC_FF_do ; nz = Yes.
jmp vt_disp_C0
vt_disp_ESC_FF_do:
mov spec_mode,0 ; ESC sequnce done. [25-Jun-1990]
mov ah,3 ; pass character in DX
mov dh,ESCAPE
mov dl,al
mov cx,0
ret
;--------------
vt_disp_inESC1:
cmp spec_stage,0 ; 1st character in ESC seq.?
jne vt_disp_inESC2 ; ne = no, check the sequnce type
jmp vt_esc_1
vt_disp_inESC2:
cmp spec_stage,1 ; ESC with I sequence ?
jne vt_disp_inESC3
jmp vt_esc_2
vt_disp_inESC3:
cmp flags.vtflg,ttvt52
jne vt_disp_inESCe
;
cmp spec_stage,VT52_DCA_L
jne vt_disp_inESC4
jmp vt_disp_VT52ESC_YL
vt_disp_inESC4:
cmp spec_stage,VT52_DCA_C
jne vt_disp_inESCe
jmp vt_disp_VT52ESC_YC
vt_disp_inESCe:
mov spec_mode,0 ; Sequence error. Clear flags and
jmp vt_disp_NRM ; treat as normal case.
;--------------------------------
; 1st byte just after the ESC
; AL is in 2/0 - 7/E
vt_esc_1:
cmp al,02Fh
ja vt_esc_10 ; char is in 3/0 - 7/14, i.e., single
mov spec_stage,1 ; set mutibyte flag
jmp vt_esc_I ; and goto I-seq.
vt_esc_10:
cmp al,05Fh
ja vt_esc_do_s ; char is in 6/0 - 7/14, i.e., single
cmp al,040h
jb vt_esc_do_s ; char is in 3/0 - 3/15, i.e., single
; now AL is in 4/0 - 5/15, i.e., C1 except for a few cases
cmp al,'Z' ; DECDA ?
jne vt_esc_11
jmp vt_CSI_DA
vt_esc_11:
cmp flags.vtflg,ttvt52 ; vt52 mode ?
jne vt_esc_12 ; ne = no.
jmp vt_disp_vt52ESC
vt_esc_12:
add al,040h ; convert to C1
jmp vt_disp_c1 ; display the C1 character
;--------------------------------
; in multi-byte ESC seq.
; AL is 2/0 - 7/E
vt_esc_2:
cmp al,02Fh
jbe vt_esc_I ; char is in 2/0 - 2/15, i.e., I
jmp vt_esc_do_m ; char is in 3/0 - 7/14, i.e., final
vt_esc_I:
mov bx,offset I_buf
add bx,I_pnt
mov byte ptr [bx],al
inc I_pnt
jmp vt_disp_ex
;
vt_esc_done:
vt_CSI_done:
mov spec_mode,0
jmp vt_disp_ex
;
; Found the final character of the ESC sequence
;
; Single-byte ESC seq.
; 3/0 - 3/15 private seq.
; 6/0 - 7/14 standard seq.
vt_esc_do_s:
cmp al,6Eh
jne vt_esc_do_n6E
mov char_GL,offset char_G2
jmp vt_esc_done
vt_esc_do_n6E:
cmp al,6Fh
jne vt_esc_do_n6F
mov char_GL,offset char_G3
jmp vt_esc_done
vt_esc_do_n6F:
cmp al,7Ch
jne vt_esc_do_n7C
mov char_GR,offset char_G3
jmp vt_esc_done
vt_esc_do_n7C:
cmp al,7Dh
jne vt_esc_do_n7D
mov char_GR,offset char_G2
jmp vt_esc_done
vt_esc_do_n7D:
cmp al,7Eh
jne vt_esc_do_n7E
mov char_GR,offset char_G1
jmp vt_esc_done
vt_esc_do_n7E:
cmp al,63h ; ESC c
jne vt_esc_do_n63
call vt100_reset
jmp vt_esc_done
vt_esc_do_n63:
cmp al,3Dh ; ESC =
jne vt_esc_do_n3D
mov keypad_mode,1
jmp vt_esc_done
vt_esc_do_n3D:
cmp al,3Eh ; ESC >
jne vt_esc_do_n3E
mov keypad_mode,0
jmp vt_esc_done
vt_esc_do_n3E:
cmp al,37h ; ESC 7
jne vt_esc_do_n37
call save_cursor
jmp vt_esc_done
vt_esc_do_n37:
cmp al,38h ; ESC 8
jne vt_esc_do_n38
call restore_cursor
jmp vt_esc_done
vt_esc_do_n38:
cmp al,3Ch ; ESC < VT52 -> ANSI mode ?
jne vt_esc_do_n3C
mov flags.vtflg,ttvt100
call set_termnam
call vt100_modlin
jmp vt_esc_done
vt_esc_do_n3C:
jmp vt_esc_done
;
; Multi-byte ESC seq.
; 3/0 - 3/15 Private seq.
; 4/0 - 7/14 Standard seq.
vt_esc_do_m:
vt_esc_do32:
mov bx,offset I_buf
mov ah,byte ptr [bx]
cmp ah,24h ; multibyte designation code ?
jne vt_esc_do34
jmp vt_desig_m
vt_esc_do34:
cmp ah,28h ; singlebyte desig. code (2/8-2/15)?
jb vt_esc_do36 ; b = no.
cmp ah,2Fh ;
ja vt_esc_do36 ; a = no.
jmp vt_desig_s
vt_esc_do36:
cmp al,'0' ; Possible Select Tek mode ?
jne vt_esc_do37 ; ne = no
cmp I_pnt,2
jne vt_esc_do37
cmp ah,'%' ; Tek4105 Select code 1st byte ?
jne vt_esc_do37 ; ne = no
inc bx ; next int. char.
mov ah,byte ptr [bx]
cmp ah,'!' ; Tek4105 Select code 2nd byte ?
jne vt_esc_do37
mov vt100_gflag,5 ; Tek41xx screen color
mov ah,1 ; enter Tek mode
mov cx,0
mov spec_mode,0 ; clear ESC/CSI seq.
ret
vt_esc_do37:
jmp vt_esc_done ; unknown
;-------------------------------------
; designate single byte character set
;
vt_desig_s:
and ah,3
mov bx,offset char_G0
add bl,ah
mov ah,CSET_JISROMAN
cmp al,49h
jne vt_desig_s1
mov ah,CSET_JISKATAKANA
jmp vt_desig_s2
vt_desig_s1:
cmp al,30h
jne vt_desig_s2
mov ah,CSET_DECGRAPH
vt_desig_s2:
mov byte ptr [bx],ah
jmp vt_esc_done
;
; designate multi-byte character set.
;
vt_desig_m:
mov ah,0
cmp I_pnt,1
jbe vt_desig_m1
add bx,1
mov ah,byte ptr [bx]
and ah,3
vt_desig_m1:
mov bx,offset char_G0
add bl,ah
mov ah,CSET_JISC6226
mov byte ptr [bx],ah
jmp vt_esc_done
;----------------------------------------------------
; Control seuence analysis
; Note that VT100 allows C0 characters in CSI seq.
vt_disp_inCSI:
cmp al,07Eh ; check the range
ja vt_disp_inCSIe ; error.
cmp al,020h ; C0 character ?
jae vt_disp_inCSI1 ; ae = no. It is GL.
jmp vt_disp_C0
vt_disp_inCSI1:
cmp spec_stage,0 ; 1st character in CSI ?
jne vt_disp_inCSI2 ; ne = No.
jmp vt_CSI_1 ; CSI with Parameters
vt_disp_inCSI2:
cmp spec_stage,1 ; in intermediates ?
jne vt_disp_inCSI3
jmp vt_CSI_2 ; CSI with Intermediates
vt_disp_inCSI3:
vt_disp_inCSIe:
mov spec_mode,0 ; clear flags and treat as normal
jmp vt_disp_NRM
;
vt_disp_inCSIx:
mov spec_mode,0
jmp vt_disp_ex
;-----------------------------------------------------
; DCS analysis
;-----------------------------------------------------
vt_disp_inDCS:
cmp al,07Fh ; check the range
jae vt_disp_inDCSe ; sequence error.
cmp al,08h
jb vt_disp_inDCSe
cmp al,0Dh
jbe vt_disp_inDCS1
cmp al,020h
jb vt_disp_inDCSe
vt_disp_inDCS1:
cmp spec_stage,IN_SIXEL
jne vt_disp_inDCS2
call sixel
jmp vt_disp_ex
vt_disp_inDCS2:
jmp vt_DCS_1
vt_disp_inDCSe:
mov spec_mode,0 ; sequence error.
jmp vt_disp_NRM
;--------------------------
vt_DCS_do:
cmp al,'q' ; sixel ?
jne vt_DCS_do_nq
mov spec_stage,IN_SIXEL
call sixel_in
mov vt100_gflag,2
mov sixel_disp_on,1
vt_DCS_do_nq:
jmp vt_disp_ex
;----------------------------------------------------------
; CSI & DCS sequence analysys
;----------------------------------------------------------
vt_DCS_1:
vt_CSI_1:
cmp al,030h ; Parameter (3/0-3/15) ?
jb vt_CSI_2
cmp al,03Fh
jbe vt_CSI_Para
mov spec_stage,1
vt_CSI_2:
cmp al,020h ; Intermediate (2/0-2/15) ?
jb vt_CSI_3
cmp al,02Fh
jbe vt_CSI_Intr
cmp al,040h ; Terminator (4/0-7/14) ?
jb vt_CSI_3
cmp spec_mode,IN_CSI_MODE
jne vt_CSI_2_1
jmp vt_CSI_do
vt_CSI_2_1:
jmp vt_DCS_do
vt_CSI_3:
jmp vt_CSI_done
;
; Parameter (3/0-3/15)
;
vt_CSI_Para:
cmp al,03ah
jae vt_CSI_Para1
mov bx,offset P_buf
add bx,P_pnt
mov cx,[bx] ; cx = previous value
and cx,7FFFh ; mask private parameter flag
mov dx,cx
shl dx,1
shl dx,1
add dx,cx ; dx = cx*5
shl dx,1 ; dx = (previous value)*10
xor ah,ah
sub ax,030h
add ax,dx ; ax is (previous value)*10 + new
or ax,priv_pflg ; set private parameter flag
mov [bx],ax ; save it
jmp vt_disp_ex
vt_CSI_Para1:
cmp al,'?' ; Private parameter ? (3/15)
jne vt_CSI_Para11
mov priv_pflg,PRIVP_FLG
jmp vt_disp_ex
vt_CSI_Para11:
add P_pnt,2 ; separator
mov bx,offset P_buf
add bx,P_pnt
mov word ptr [bx],0 ; clear for next parameter
jmp vt_disp_ex
;
; Intermediate (2/0-2/15)
;
vt_CSI_Intr:
mov bx,offset I_buf
add bx,I_pnt
mov byte ptr [bx],al
inc I_pnt
jmp vt_disp_ex
;------------------------
; Do the control sequence
;------------------------
vt_CSI_do:
cmp al,'K'
jne vt_CSI_do_10
jmp vt_CSI_K
vt_CSI_do_10:
cmp al,'J'
jne vt_CSI_do_20
jmp vt_CSI_J
vt_CSI_do_20:
cmp al,'H'
jne vt_CSI_do_25
jmp vt_CSI_H
vt_CSI_do_25:
cmp al,'f'
jne vt_CSI_do_30
jmp vt_CSI_H
vt_CSI_do_30:
cmp al,'A'
jb vt_CSI_do_40
cmp al,'D'
ja vt_CSI_do_40
jmp vt_CSI_ABCD
vt_CSI_do_40:
cmp al,'r'
jne vt_CSI_do_50
jmp vt_CSI_SCR
vt_CSI_do_50:
cmp al,'L'
jne vt_CSI_do_60
jmp vt_CSI_L
vt_CSI_do_60:
cmp al,'M'
jne vt_CSI_do_70
jmp vt_CSI_M
vt_CSI_do_70:
cmp al,'m'
jne vt_CSI_do_80
jmp vt_CSI_CATR
vt_CSI_do_80:
cmp al,'c'
jne vt_CSI_do_90
jmp vt_CSI_DA
vt_CSI_do_90:
cmp al,'h'
jne vt_CSI_do_100
jmp vt_CSI_SET_M
vt_CSI_do_100:
cmp al,'l'
jne vt_CSI_do_110
jmp vt_CSI_RESET_M
vt_CSI_do_110:
cmp al,'n'
jne vt_CSI_do_120
jmp vt_CSI_DSR
vt_CSI_do_120:
cmp al,'q'
jne vt_CSI_do_130
jmp vt_CSI_LED
vt_CSI_do_130:
cmp al,'P'
jne vt_CSI_do_140
jmp vt_CSI_DCH
vt_CSI_do_140:
cmp al,'@'
jne vt_CSI_do_150
jmp vt_CSI_ICH
vt_CSI_do_150:
cmp al,'X'
jne vt_CSI_do_160
jmp vt_CSI_ECH
vt_CSI_do_160:
cmp al,'g'
jne vt_CSI_do_170
jmp vt_CSI_TBC
vt_CSI_do_170:
cmp al,'i'
jne vt_CSI_do_180
jmp vt_CSI_PRN
vt_CSI_do_180:
cmp al,'}'
jne vt_CSI_do_190
jmp vt_CSI_DECSASD
vt_CSI_do_190:
cmp al,'~'
jne vt_CSI_do_200
jmp vt_CSI_DECSSDT
vt_CSI_do_200:
vt_CSI_do_ex:
jmp vt_CSI_done
;
vt_CSI_DA:
; Device attributes
mov si,offset I_am_vt52
cmp flags.vtflg,ttvt52
je vt_CSI_DA_1
mov si,offset I_am_vt102
vt_CSI_DA_1:
xor cx,cx
mov cl,[si]
inc si
mov spec_mode,0 ; done the sequence
mov ah,0
ret
;
vt_CSI_DSR:
;
; Device status report
; Host to VT VT returns
; CSI 5 n CSI 0 n no mulfunction
; CSI 3 n mulfunction
;
; CSI 6 n CSI Pr;Pc R cursor position is Pr(row)
; Pc (column)
;
mov spec_mode,0 ; done the sequence
mov si,offset P_buf ; get param. buff address
mov bx,[si] ; get parameter value
cmp bx,5
je vt_CSI_DSR5
cmp bx,6
je vt_CSI_DSR6
jmp vt_CSI_do_ex
;
vt_CSI_DSR5:
mov si,offset I_am_fine
xor cx,cx
mov cl,[si]
inc si
mov ah,0
ret
vt_CSI_DSR6:
mov si,offset My_cursor_is
add si,2
mov cx,2
;
xor ax,ax
mov al,cur_row
inc ax
cmp ax,100
jb vt_CSI_DSR61
mov bx,100
div bl
or al,30h
mov byte ptr [si],al
inc si
inc cx
mov al,ah
xor ah,ah
jmp vt_CSI_DSR62
vt_CSI_DSR61:
cmp ax,10
jb vt_CSI_DSR63
vt_CSI_DSR62:
mov bx,10
div bl
or al,30h
mov byte ptr [si],al
inc si
inc cx
mov al,ah
xor ah,ah
vt_CSI_DSR63:
or al,30h
mov byte ptr [si],al
inc si
inc cx
;
mov byte ptr [si],';'
inc si
inc cx
;
xor ax,ax
mov al,cur_col
inc ax
cmp ax,100
jb vt_CSI_DSR64
mov bx,100
div bl
or al,30h
mov byte ptr [si],al
inc si
inc cx
mov al,ah
xor ah,ah
jmp vt_CSI_DSR65
vt_CSI_DSR64:
cmp ax,10
jb vt_CSI_DSR66
vt_CSI_DSR65:
mov bx,10
div bl
or al,30h
mov byte ptr [si],al
inc si
inc cx
mov al,ah
xor ah,ah
vt_CSI_DSR66:
or al,30h
mov byte ptr [si],al
inc si
inc cx
;
mov byte ptr [si],'R'
inc si
inc cx
;
mov si,offset My_cursor_is
mov ah,0
ret
;
; Character attributes
; 0 All off
; 1 Bold (Highlight)
; 4 Underscored
; 5 Blinking
; 7 Reverse
; 22 Normal intensity
; 24 Not underlined
; 25 Not blinking
; 27 Positive image
; 30-37 Foreground color = 30 + colors (colors: 1=red, 2=green, 4=blue)
;
vt_CSI_CATR:
push cx
push si
mov si,offset P_buf
mov cx,P_pnt
shr cx,1
inc cx
vt_CSI_CATR1:
mov bx,[si]
cmp bx,0
jne vt_CSI_CATR2
push si
mov si,offset def_color ; reset to default color
call set_cur_color
call vt100_color
pop si
call set_gcolor
mov al,vt_nrmatr
mov vt_chratr,al
jmp vt_CSI_CATRX
vt_CSI_CATR2:
cmp bx,1
jne vt_CSI_CATR3
mov al,vt_chratr ; Bold
and al,01Fh
or al,vt_hglatr
mov vt_chratr,al
jmp vt_CSI_CATRX
vt_CSI_CATR3:
cmp bx,4
jne vt_CSI_CATR5
or vt_chratr,8 ; Underscored
jmp vt_CSI_CATRX
vt_CSI_CATR5:
cmp bx,5
jne vt_CSI_CATR7
or vt_chratr,2 ; Blinking
jmp vt_CSI_CATRX
vt_CSI_CATR7:
cmp bx,7
jne vt_CSI_CATR22
test vt_nrmatr,CHR_REV
jz vt_CSI_CATR7_1
and vt_chratr,(not CHR_REV)
jmp vt_CSI_CATRX
vt_CSI_CATR7_1:
or vt_chratr,CHR_REV
jmp vt_CSI_CATRX
vt_CSI_CATR22:
cmp bx,22
jne vt_CSI_CATR24
jmp vt_CSI_CATRX
vt_CSI_CATR24:
cmp bx,24
jne vt_CSI_CATR25
and vt_chratr,0F7h ; not Underscored
jmp vt_CSI_CATRX
vt_CSI_CATR25:
cmp bx,25
jne vt_CSI_CATR27
and vt_chratr,0FDh ; not blinking
jmp vt_CSI_CATRX
vt_CSI_CATR27:
cmp bx,27
jne vt_CSI_CATR30
test vt_nrmatr,CHR_REV
jz vt_CSI_CATR27_1
or vt_chratr,CHR_REV
jmp vt_CSI_CATRX
vt_CSI_CATR27_1:
and vt_chratr,(not CHR_REV) ; positive image
jmp vt_CSI_CATRX
vt_CSI_CATR30:
cmp bx,30
jb vt_CSI_CATR40
cmp bx,37
ja vt_CSI_CATR40
mov ax,bx
sub ax,30
mov bx,offset color_index_table
add bx,ax
mov al,[bx]
push si
mov si,offset scn_color
mov [si],al
call vt100_color ; set color
pop si
jmp vt_CSI_CATRX
vt_CSI_CATR40:
cmp bx,40
jb vt_CSI_CATRX
cmp bx,47
ja vt_CSI_CATRX
mov ax,bx
sub ax,40
mov bx,offset color_index_table
add bx,ax
mov al,[bx]
push si
mov si,offset scn_color
mov [si+1],al
call vt100_color
pop si
call set_gcolor
;
vt_CSI_CATRX:
add si,2
dec cx
jcxz vt_CSI_CATRXX
jmp vt_CSI_CATR1
vt_CSI_CATRXX:
pop si
pop cx
jmp vt_CSI_do_ex
; LED control
vt_CSI_LED:
push cx
push si
mov si,offset P_buf
mov cx,P_pnt
shr cx,1
inc cx
vt_CSI_LED1:
mov bx,[si]
cmp bx,0
jb vt_CSI_LEDX
jne vt_CSI_LED2
mov ax,'..'
mov bx,offset LED_buff
mov [bx],ax
mov [bx+2],ax
jmp vt_CSI_LED3
vt_CSI_LED2:
cmp bx,4
ja vt_CSI_LEDX
mov ax,bx
dec bx
add bx,offset LED_buff
add al,'0'
mov [bx],al
vt_CSI_LED3:
vt_CSI_LEDX:
add si,2
loop vt_CSI_LED1
call set_termnam
call vt100_modlin
pop si
pop cx
jmp vt_CSI_do_ex
;
; Set mode
; 2 Keyboard locked
; 4 Insert mode
; 12 Send-Receive off
; 20 LF is newline
; ?1 Cursor Key is application
; ?3 132 column
; ?4 Smooth scroll
; ?5 Reverse screen
; ?6 Origin mode relative
; ?7 Auto Wrap on
; ?8 Auto repeate on
; ?18 Print form feed on
; ?19 Print extent is full screen
; ?25 Text cursor enable on
; ?38 Tektronix graphic mode
;
vt_CSI_SET_M:
push cx
push si
mov si,offset P_buf
mov cx,P_pnt
shr cx,1
inc cx
vt_CSI_SET_M0:
mov bx,[si]
vt_CSI_SET_M4:
cmp bx,4 ; 4 = Insert mode ?
jne vt_CSI_SET_M5 ; ne = no
or vt100_flags,INSERT_BIT
jmp vt_CSI_SET_MX
vt_CSI_SET_M5:
vt_CSI_SET_M20:
cmp bx,20 ; 20 = Newline mode ?
jne vt_CSI_SET_M21 ; ne = no
or vt100_flags,NEWLINE_BIT
jmp vt_CSI_SET_MX
vt_CSI_SET_M21:
;
; Private sequence
;
vt_CSI_SET_MP1:
cmp bx,1+PRIVP_FLG ; ?1 = Cursor key application ?
jne vt_CSI_SET_MP2 ; ne = no
mov curkey_mode,1
jmp vt_CSI_SET_MX
vt_CSI_SET_MP2:
vt_CSI_SET_MP3:
cmp bx,3+PRIVP_FLG ; ?3 = 132 Column ?
jne vt_CSI_SET_MP4
jmp vt_CSI_SET_MX
vt_CSI_SET_MP4:
vt_CSI_SET_MP5:
cmp bx,5+PRIVP_FLG ; ?5 = reverse screen ?
jne vt_CSI_SET_MP6
mov ax,1
call scrn_mode
jmp vt_CSI_SET_MX
vt_CSI_SET_MP6:
cmp bx,6+PRIVP_FLG ; ?6 = Origin relative mode ?
jne vt_CSI_SET_MP7
or vt100_flags,ORIGIN_BIT
mov al,vt_top
mov cur_row,al
mov cur_col,0
call locate_cur
jmp vt_CSI_SET_MX
vt_CSI_SET_MP7:
cmp bx,7+PRIVP_FLG ; ?7 = AutoWrap ?
jne vt_CSI_SET_MP8
or vt100_flags,AUTOWRAP_BIT
jmp vt_CSI_SET_MX
vt_CSI_SET_MP8:
cmp bx,18+PRIVP_FLG ; ?18 = Print form feed
jne vt_CSI_SET_MP19
or vt100_pflag,PRINTFF_BIT
jmp vt_CSI_SET_MX
vt_CSI_SET_MP19:
cmp bx,19+PRIVP_FLG ; ?19 = Print Extent
jne vt_CSI_SET_MP20
or vt100_pflag,PRINTEXT_BIT
jmp vt_CSI_SET_MX
vt_CSI_SET_MP20:
vt_CSI_SET_MP38:
cmp bx,38+PRIVP_FLG ; ?38 = Tektronix mode
jne vt_CSI_SET_MP39
pop si
pop cx
mov spec_mode,0 ; done the sequence.
mov vt100_gflag,4 ; Tek40xx color
mov ah,1 ; do not pass the character
mov al,0
mov cx,0
ret
vt_CSI_SET_MP39:
vt_CSI_SET_MX:
add si,2
dec cx
jcxz vt_CSI_SET_MX0
jmp vt_CSI_SET_M0
vt_CSI_SET_MX0:
pop si
pop cx
jmp vt_CSI_do_ex
;
; Reset mode
; 2 Keyboard Unlocked
; 4 Replace mode
; 12 Send-Receive on
; 20 LF is line feed
; ?1 Normal cursor key
; ?2 Enter VT52 mode
; ?3 80 column
; ?4 Jump scroll
; ?5 Normal screen
; ?6 Orgin mode is absolute
; ?7 Auto wrap off
; ?8 Auto repeat off
; ?18 Print form feed off
; ?19 Print extent is scroll region
; ?25 Text cursor enable off
;
vt_CSI_RESET_M:
push cx
push si
mov si,offset P_buf
mov cx,P_pnt
shr cx,1
inc cx
vt_CSI_RESET_M0:
mov bx,[si]
vt_CSI_RESET_M4:
cmp bx,4 ; 4 = Replace mode ?
jne vt_CSI_RESET_M5 ; ne = no.
and vt100_flags,(not INSERT_BIT)
jmp vt_CSI_RESET_MX
vt_CSI_RESET_M5:
vt_CSI_RESET_M20:
cmp bx,20 ; 20 = Linefeed mode ?
jne vt_CSI_RESET_M21 ; ne = no.
and vt100_flags,(not NEWLINE_BIT)
jmp vt_CSI_RESET_MX
vt_CSI_RESET_M21:
;
; Private sequence
;
vt_CSI_RESET_MP1:
cmp bx,1+PRIVP_FLG ; ?1 = Normal cursor key ?
jne vt_CSI_RESET_MP2
mov curkey_mode,0
jmp vt_CSI_RESET_MX
vt_CSI_RESET_MP2:
cmp bx,2+PRIVP_FLG ; ?2 = Enter VT52 mode ?
jne vt_CSI_RESET_MP3
mov flags.vtflg,ttvt52
call set_termnam ; set terminal name
call vt100_modlin ; re-display mode line
jmp vt_CSI_RESET_MX
vt_CSI_RESET_MP3:
vt_CSI_RESET_MP5:
cmp bx,5+PRIVP_FLG ; ?5 = normal screen ?
jne vt_CSI_RESET_MP6
mov ax,0
call scrn_mode
jmp vt_CSI_RESET_MX
vt_CSI_RESET_MP6:
cmp bx,6+PRIVP_FLG ; ?6 = Origin absolute mode ?
jne vt_CSI_RESET_MP7
and vt100_flags,(not ORIGIN_BIT)
mov cur_row,0
mov cur_col,0
call locate_cur
jmp vt_CSI_RESET_MX
vt_CSI_RESET_MP7:
cmp bx,7+PRIVP_FLG
jne vt_CSI_RESET_MP8
and vt100_flags,(not AUTOWRAP_BIT)
jmp vt_CSI_RESET_MX
vt_CSI_RESET_MP8:
cmp bx,18+PRIVP_FLG
jne vt_CSI_RESET_MP19
and vt100_pflag,(not PRINTFF_BIT)
jmp vt_CSI_RESET_MX
vt_CSI_RESET_MP19:
cmp bx,19+PRIVP_FLG
jne vt_CSI_RESET_MP20
and vt100_pflag,(not PRINTEXT_BIT)
jmp vt_CSI_RESET_MX
vt_CSI_RESET_MP20:
vt_CSI_RESET_MX:
add si,2
dec cx
jcxz vt_CSI_RESET_MX0
jmp vt_CSI_RESET_M0
vt_CSI_RESET_MX0:
pop si
pop cx
jmp vt_CSI_do_ex
;
vt_CSI_ABCD:
mov bx,offset P_buf
mov bx,[bx]
cmp bx,1
jae vt_CSI_ABCD1
mov bx,1
vt_CSI_ABCD1:
cmp al,'B'
je vt_CSI_CUD
cmp al,'C'
je vt_CSI_CUR
cmp al,'D'
je vt_CSI_CUL
vt_CSI_CUU:
xor ah,ah
mov al,cur_row
sub ax,bx
xor bh,bh
mov bl,vt_top
cmp ax,bx
jge vt_CSI_CUU1
mov ax,bx
vt_CSI_CUU1:
mov cur_row,al
jmp vt_CSI_ABCD_ex
vt_CSI_CUD:
xor ah,ah
mov al,cur_row
add ax,bx
cmp al,vt_bottom
jle vt_CSI_CUD1
mov al,vt_bottom
vt_CSI_CUD1:
mov cur_row,al
jmp vt_CSI_ABCD_ex
vt_CSI_CUR:
xor ah,ah
mov al,cur_col
add ax,bx
cmp ax,79
jle vt_CSI_CUR1
mov ax,79
vt_CSI_CUR1:
mov cur_col,al
jmp vt_CSI_ABCD_ex
vt_CSI_CUL:
xor ah,ah
mov al,cur_col
sub ax,bx
cmp ax,0
jge vt_CSI_CUL1
mov ax,0
vt_CSI_CUL1:
mov cur_col,al
vt_CSI_ABCD_ex:
call locate_cur
jmp vt_CSI_do_ex
;
vt_CSI_K:
mov bx,offset P_buf
mov ax,[bx]
cmp ax,0
jne vt_CSI_K1
mov dh,cur_row
mov dl,cur_col
call vram_ofs
mov ax,bx
mov dh,cur_row
mov dl,79
jmp vt_CSI_KX
vt_CSI_K1:
cmp ax,1
jne vt_CSI_K2
mov dh,cur_row
mov dl,0
call vram_ofs
mov ax,bx
mov dh,cur_row
mov dl,cur_col
jmp vt_CSI_KX
vt_CSI_K2:
cmp ax,2
jne vt_CSI_K3
mov dh,cur_row
mov dl,0
call vram_ofs
mov ax,bx
mov dh,cur_row
mov dl,79
jmp vt_CSI_KX
vt_CSI_K3:
jmp vt_CSI_do_ex
vt_CSI_KX:
call vram_ofs
call vt_erase
jmp vt_CSI_do_ex
;
vt_CSI_L:
mov al,cur_row
cmp al,vt_top
jge vt_CSI_L01
jmp vt_CSI_do_ex
vt_CSI_L01:
cmp al,vt_bottom
jle vt_CSI_L02
jmp vt_CSI_do_ex
vt_CSI_L02:
mov bx,offset P_buf
mov cx,[bx]
cmp cx,0
jg vt_CSI_L1
mov cx,1
vt_CSI_L1:
mov ah,vt_bottom
call scroll_down
mov cur_col,0
call locate_cur
jmp vt_CSI_do_ex
vt_CSI_M:
mov al,cur_row
cmp al,vt_top
jge vt_CSI_M01
jmp vt_CSI_do_ex
vt_CSI_M01:
cmp al,vt_bottom
jle vt_CSI_M02
jmp vt_CSI_do_ex
vt_CSI_M02:
mov bx,offset P_buf
mov cx,[bx]
cmp cx,0
jg vt_CSI_M1
mov cx,1
vt_CSI_M1:
mov ah,vt_bottom
call scroll_up
mov cur_col,0
call locate_cur
jmp vt_CSI_do_ex
vt_CSI_J:
mov bx,offset P_buf
mov ax,[bx]
cmp ax,0
jg vt_CSI_J1
mov dh,cur_row
mov dl,cur_col
call vram_ofs
mov ax,bx
mov dh,vt_phys_bottom
mov dl,79
call vram_ofs
jmp vt_CSI_JX
vt_CSI_J1:
cmp ax,1
jg vt_CSI_J2
mov dh,0
mov dl,0
call vram_ofs
mov ax,bx
mov dh,cur_row
mov dl,cur_col
call vram_ofs
jmp vt_CSI_JX
vt_CSI_J2:
cmp sixel_disp_on,1
jne vt_CSI_J2_1
call sixel_clear
mov vt100_gflag,1
mov sixel_disp_on,0
vt_CSI_J2_1:
mov dh,0
mov dl,0
call vram_ofs
mov ax,bx
mov dh,vt_phys_bottom
mov dl,79
call vram_ofs
vt_CSI_JX:
call vt_erase
jmp vt_CSI_do_ex
;
; Cursor Position CUP CSI Pl ; Pc H
;
vt_CSI_H:
mov bx,offset P_buf
mov ax,[bx]
cmp ax,1
jae vt_CSI_H1
mov ax,1
vt_CSI_H1:
test vt100_flags,ORIGIN_BIT ; relative mode ?
jz vt_CSI_H2 ; z = no.
add al,vt_top ; convert to absolute
cmp al,vt_bottom
jbe vt_CSI_H3
mov al,vt_bottom
jmp vt_CSI_H31
vt_CSI_H2:
cmp ax,24
jbe vt_CSI_H3
mov ax,24
vt_CSI_H3:
dec ax
vt_CSI_H31:
mov cur_row,al
xor ax,ax
cmp P_pnt,2
jb vt_CSI_H6
mov ax,[bx+2]
cmp ax,1
jae vt_CSI_H4
mov ax,1
vt_CSI_H4:
cmp ax,80
jbe vt_CSI_H5
mov ax,80
vt_CSI_H5:
dec ax
vt_CSI_H6:
mov cur_col,al
;
; put the CR/LF for the cooked log.
;
cmp vt100_lflag,(LOGCOOK_BIT+LOGENAB_BIT)
jne vt_CSI_H61
;@@ cmp al,0
;@@ jne vt_CSI_H61
mov al,0Dh ; put CR
call outcapt
mov al,0Ah ; put LF
call outcapt
vt_CSI_H61:
;
call locate_cur
jmp vt_CSI_do_ex
;
; Chracter editing functions
; CSI Pn @ ICH Inserts Pn blank characters
; CSI Pn P DCH Deletes Pn characters
; CSI Pn X ECH Erases Pn characters
; In each function, action starts from current cursor position
; and the cursor does not move.
;
; Insert characters (ICH) -- CSI Pn @
vt_CSI_ICH:
vt_CSI_ICH1:
mov bx,offset P_buf ; get the address of the parameter
mov cx,[bx] ; get the parameter value
cmp cx,0
jg vt_CSI_ICH2
mov cx,1 ; use default
vt_CSI_ICH2:
std ; backward direction
mov dl,79 ; set destination (row,col)
mov dh,cur_row
call vram_ofs
mov di,bx ; set destination address
xor ax,ax
mov al,cur_col
mov bx,ax ; save column position
add ax,cx ; ax = cur_col + Pn
cmp ax,79 ; inside the right margin ?
jle vt_CSI_ICH3 ; le = Yes.
mov cx,80
sub cx,bx ; cx = 80 - cur_col
jmp vt_CSI_ICH4
vt_CSI_ICH3:
push cx ; save Pn
mov dx,79
sub dx,cx ; dx = 79 - Pn
mov dh,cur_row
call vram_ofs ; get VRAM offset address
mov si,bx ; set source address
mov cx,80
sub cx,ax ; cx = 80 - cur_col - Pn
mov ax,CRT_TXT_SEG
push es ; save segment registers
push ds
mov es,ax ; set segment registers
mov ds,ax
push si
push di
push cx
rep movsw ; move the characters
pop cx
pop di
pop si
add di,2000h ; attribute area
add si,2000h
rep movsw ; move the attributes
sub di,2000h
pop ds
pop es
pop cx ; restore Pn
vt_CSI_ICH4:
push es
push cx
push di
mov ax,CRT_TXT_SEG
mov es,ax
mov ax,20h ; set blank code
rep stosw
pop di
pop cx
add di,2000h ; attribute area
mov al,vt_nrmatr ; set normal attributes
rep stosw
pop es
cld ; reset direction flag
jmp vt_CSI_do_ex
; Delete characters (DCH) -- CSI Pn P
vt_CSI_DCH:
vt_CSI_DCH1:
mov bx,offset P_buf ; get the address of the parameter
mov cx,[bx] ; get the parameter value
cmp cx,0
jg vt_CSI_DCH2
mov cx,1 ; use default
vt_CSI_DCH2:
cld
xor ax,ax
mov al,cur_col
mov dh,cur_row
mov dl,cur_col
call vram_ofs ; get the destination address
mov di,bx ; set the destination address
mov bx,ax ; save column position
add ax,cx ; ax = cur_col + Pn
cmp ax,79 ; inside the right margin ?
jle vt_CSI_DCH3 ; le = Yes.
mov cx,80
sub cx,bx ; cx = 80 - cur_col
jmp vt_CSI_DCH4
vt_CSI_DCH3:
push cx
mov cx,80
sub cx,ax ; cx = 80 - cur_col - Pn
mov dh,cur_row ; set curosr pointer
mov dl,al
call vram_ofs ; get VRAM offset address
mov si,bx ; set the source address
mov ax,CRT_TXT_SEG
push es ; save segment registers
push ds
mov es,ax ; set segment registers
mov ds,ax
push si
push di
push cx
rep movsw ; move the characters
pop cx
pop di
pop si
add di,2000h
add si,2000h
rep movsw ; move the attributes
sub di,2000h
pop ds
pop es
pop cx
vt_CSI_DCH4:
push es
push cx
push di
mov ax,CRT_TXT_SEG
mov es,ax
mov ax,20h ; set blank code
rep stosw
pop di
pop cx
add di,2000h
mov al,vt_blkatr ; set blank attributes
rep stosw
pop es
jmp vt_CSI_do_ex
; Erase characters (ECH) -- CSI Pn X
vt_CSI_ECH:
vt_CSI_ECH1:
mov bx,offset P_buf ; get the address of the parameter
mov cx,[bx] ; get the parameter value
cmp cx,0
jg vt_CSI_ECH2
mov cx,1 ; use default
vt_CSI_ECH2:
cld
xor ax,ax
mov al,cur_col
mov dh,cur_row
mov dl,cur_col
call vram_ofs ; get the destination address
mov di,bx ; set the destination address
mov bx,ax ; save column position
add ax,cx ; ax = cur_col + Pn
cmp ax,79 ; inside the right margin ?
jle vt_CSI_ECH3 ; le = Yes.
mov cx,80
sub cx,bx ; cx = 80 - cur_col
vt_CSI_ECH3:
push es
push cx
push di
mov ax,CRT_TXT_SEG
mov es,ax
mov ax,20h ; set blank code
rep stosw
pop di
pop cx
add di,2000h
mov al,vt_nrmatr ; set normal attributes
rep stosw
pop es
jmp vt_CSI_do_ex
; Tabulation Clear (TBC)
; CSI g
; CSI 0 g Clears a horizontal tab stop at cursor position
; CSI 3 g Clears all horizontal tab stops
vt_CSI_TBC:
mov bx,offset P_buf
mov ax,[bx] ; get the parameter value
cmp ax,0 ; zero ?
je vt_CSI_TBC0 ; e = yes.
cmp ax,3 ; 3 ?
je vt_CSI_TBC3 ; e = yes.
jmp vt_CSI_do_ex ; not supported
;
vt_CSI_TBC0:
xor ax,ax
mov al,cur_col ; get current cursor position
mov bx,offset tabstops
add bx,ax
mov byte ptr [bx],0 ; clear the tab
jmp vt_CSI_do_ex
;
vt_CSI_TBC3:
push es
push di
mov ax,ds
mov es,ax ; set destination segment
mov di,offset tabstops ; set destination offset
mov cx,80 ; number of bytes
mov ax,0 ; data = 0
cld
rep stosb ; store it
pop di
pop es
jmp vt_CSI_do_ex
; Printer control
; * not implemented yet
; CSI i Prints the screen (full/scroll region) display.
; CSI 0 i Same as above.
; * CSI 4 i Turns off printer controller mode.
; * CSI 5 i Turns on printer controller mode (transparent printing).
; CSI ? 1 i Prints the display line containing the cursor.
; CSI ? 4 i Turns off auto print mode.
; CSI ? 5 i Turns on auto print mode.
;
vt_CSI_PRN:
mov bx,offset P_buf
mov ax,[bx] ; get the parameter value
cmp ax,0 ; 0
je vt_CSI_PRN_S0 ; e = yes.
cmp ax,1+PRIVP_FLG ; ?1
je vt_CSI_PRN_P1 ; e = yes.
cmp ax,4+PRIVP_FLG ; ?4
je vt_CSI_PRN_P4 ; e = yes.
cmp ax,5+PRIVP_FLG ; ?5 ?
je vt_CSI_PRN_P5 ; e = yes.
jmp vt_CSI_do_ex ; not supported
;
vt_CSI_PRN_S0:
call vt100_prns
jmp vt_CSI_do_ex
;
vt_CSI_PRN_P1:
test vt100_pflag,AUTOPRINT_BIT ; printer off?
jnz vt_CSI_PRN_P1_1 ; nz = no not. it is on.
call prn_chk ; check the printer port
jc vt_CSI_PRN_P1_2 ; c = not ready.
vt_CSI_PRN_P1_1:
call vt100_prnl
vt_CSI_PRN_P1_2:
jmp vt_CSI_do_ex
;
vt_CSI_PRN_P4:
and vt100_pflag,(not AUTOPRINT_BIT) ; turns off the printer
call set_prnstat ; show printer status
call vt100_modlin ; re-display mode line
jmp vt_CSI_do_ex
;
vt_CSI_PRN_P5:
test vt100_pflag,AUTOPRINT_BIT ; printer off?
jnz vt_CSI_PRN_P5_1 ; nz = no not. do nothing.
call prn_chk ; check the printer port
jc vt_CSI_PRN_P5_1 ; c = not ready.
or vt100_pflag,AUTOPRINT_BIT ; turns on auto print
call set_prnstat ; show printer status
call vt100_modlin ; re-display mode line
vt_CSI_PRN_P5_1:
jmp vt_CSI_do_ex
; Set scroll region.
; It is NOT clear that this command affects the cursor position
; or not. In my experence, cursor moves to the left-top corner of the
; entire screen (i.e., same as <ESC>[1;1H ).
; - The above statement was wrong. In ORIGIN mode, the cursor goes to
; left-top corner of the scroll region. Thanx for VTTEST. [01-Oct-88].
; - Bugs for funny scroll region are fixed. Thanx for VTTEST. [01-Oct-88].
; - Bug for ESC[;r is fixed. [03-Dec-88].
vt_CSI_SCR:
mov bx,offset P_buf
cmp P_pnt,2 ; have good number of parameters ?
je vt_CSI_SCR1 ; e = yes.
ja vt_CSI_SCR7 ; a = too many. Ignore. [03-Dec-88].
mov ax,[bx]
mov bx,24 ; set to default
jmp vt_CSI_SCR2
vt_CSI_SCR1:
mov ax,[bx]
mov bx,[bx+2]
vt_CSI_SCR2:
cmp ax,1
jae vt_CSI_SCR3
mov ax,1
vt_CSI_SCR3:
cmp bx,0 ; Pb = 0? [03-Dec-88]
ja vt_CSI_SCR31 ; a = no. [03-Dec-88]
mov bx,24 ; set to default. [03-Dec-88].
jmp vt_CSI_SCR4 ; [03-Dec-88].
vt_CSI_SCR31: ; [03-Dec-88].
cmp bx,24
jbe vt_CSI_SCR4
mov bx,24
vt_CSI_SCR4:
cmp ax,bx ; Pt < Pb ?
jae vt_CSI_SCR7 ; ae = no. Do nothing.
vt_CSI_SCR5:
dec ax
dec bx
mov vt_top,al
mov vt_bottom,bl
test vt100_flags,ORIGIN_BIT ; origin relative mode ?
jnz vt_CSI_SCR6 ; nz = Yes. Use vt_top.
mov ax,0
vt_CSI_SCR6:
mov cur_row,al
mov cur_col,0
call locate_cur
vt_CSI_SCR7:
jmp vt_CSI_do_ex
;
vt_CSI_DECSASD:
cmp I_pnt,1 ; requires 1 intermediate char.
je vt_CSI_DECSASD_1 ; e=yes, we have.
jmp vt_CSI_do_ex
vt_CSI_DECSASD_1:
cmp I_buf,'$' ; required character ?
je vt_CSI_DECSASD_2 ; e=yes, we have.
jmp vt_CSI_do_ex
vt_CSI_DECSASD_2:
mov ax,P_buf ; P_buf always has at least 0.
cmp ax,0
je vt_CSI_DECSASD_3
jmp vt_CSI_DECSASD_5
;
vt_CSI_DECSASD_3:
cmp vt_in_stat,0 ; already in main screen ?
jne vt_CSI_DECSASD_4
jmp vt_CSI_do_ex
vt_CSI_DECSASD_4:
mov vt_in_stat,0
mov al,cur_row
mov stat_row,al
mov al,cur_col
mov stat_col,al
mov al,text_row
mov cur_row,al
mov al,text_col
mov cur_col,al
mov al,text_top
mov vt_top,al
mov al,text_bottom
mov vt_bottom,al
call locate_cur
jmp vt_CSI_do_ex
;
vt_CSI_DECSASD_5:
cmp vt_in_stat,1 ; already in status line ?
jne vt_CSI_DECSASD_6
jmp vt_CSI_do_ex
vt_CSI_DECSASD_6:
cmp vt_stat_type,2 ; host writable status line ?
je vt_CSI_DECSASD_7 ; e=yes.
jmp vt_CSI_do_ex
vt_CSI_DECSASD_7:
mov vt_in_stat,1
mov al,cur_row
mov text_row,al
mov al,cur_col
mov text_col,al
mov al,vt_top
mov text_top,al
mov al,vt_bottom
mov text_bottom,al
;
mov al,stat_col
mov cur_col,al
mov al,stat_row
mov cur_row,al
mov vt_top,al
mov vt_bottom,al
call locate_cur
jmp vt_CSI_do_ex
;
vt_CSI_DECSSDT:
cmp I_pnt,1 ; requires 1 intermediate char.
je vt_CSI_DECSSDT_1 ; e=yes, we have.
jmp vt_CSI_do_ex
vt_CSI_DECSSDT_1:
cmp I_buf,'$' ; required character ?
je vt_CSI_DECSSDT_2 ; e=yes, we have.
jmp vt_CSI_do_ex
vt_CSI_DECSSDT_2:
mov ax,P_buf ; P_buf always has at least 1 param.
cmp ax,2 ; allowed parameter?
jbe vt_CSI_DECSSDT_3 ; be=yes.
jmp vt_CSI_do_ex
vt_CSI_DECSSDT_3:
cmp al,vt_stat_type ; same type?
jne vt_CSI_DECSSDT_4 ; ne=no.
jmp vt_CSI_do_ex
vt_CSI_DECSSDT_4:
cmp ax,2 ; host writable ?
jne vt_CSI_DECSSDT_5 ; ne=no.
push ax
mov al,vt_blkatr
call vt_stat_clr ; clear status line
pop ax
mov stat_col,0 ; cursor move to left margin
vt_CSI_DECSSDT_5:
mov vt_stat_type,al
call vt100_modlin
jmp vt_CSI_do_ex
;
; Erase from VRAM address AX to BX
;
vt_erase:
cld
push es
mov cx,bx
sub cx,ax
shr cx,1
inc cx
mov di,ax
push cx
push di
mov ax,CRT_TXT_SEG
mov es,ax
mov ax,0020h
rep stosw
pop di
add di,2000h
pop cx
xor ah,ah
mov al,vt_blkatr
rep stosw
pop es
ret
;-------------
; Scroll-down
;-------------
; scroll down n-lines in the region [Pt,Pb]. The cursor does not move.
;
; Input paramters:
; al: top row position Pt
; ah: bottom row position Pb
; cl: number of lines n (must be > 0)
; Registers:
; ax, bx, cx, dx, si, di are broken
scroll_down:
mov bl,ah
sub bl,al
cmp cl,bl ; n <= bottom - top ?
jle scroll_down_2 ; yes, text remains.
jmp scroll_down_3 ; no text remains.
scroll_down_2:
mov dh,ah
sub dh,cl
mov dl,79
call vram_ofs
mov si,bx ; si is VRAM(bottom-n,79)
mov dh,al
xor dl,dl
call vram_ofs
mov cx,si
sub cx,bx
shr cx,1 ; byte counts -> word counts
inc cx ; number of words to be moved
mov dh,ah
mov dl,79
call vram_ofs
mov di,bx ; di is VRAM(bottom,79)
push es
push ds
mov ax,CRT_TXT_SEG
mov bl,vt_blkatr ; save attribute before ds cahnge
mov es,ax
mov ds,ax
push cx ; save word count
push di ; save destination address
push si ; save source address
std
rep movsw ; move the text codes
mov cx,di
sub cx,si
shr cx,1
mov ax,0020h ; fill blank
rep stosw
;
pop si
pop di
pop cx ; cx, si, di are restored
add di,2000h ; attribute block
add si,2000h
rep movsw ; move the attributes
mov cx,di
sub cx,si
shr cx,1
mov al,bl ; fill attributes
xor ah,ah
rep stosw
;
cld
pop ds
pop es
jmp scroll_down_ex
scroll_down_3:
mov dh,al
xor dl,dl
call vram_ofs
mov cx,bx
mov dh,ah
mov dl,79
call vram_ofs
mov ax,cx
call vt_erase
scroll_down_ex:
ret
;
;-----------
; Scroll-up
;-----------
; scroll up n-lines in the region [Pt,Pb]. The cursor does not move.
;
; Input paramters:
; al: top row position Pt
; ah: bottom row position Pb (ah must be > al)
; cl: number of lines n (must be > 0)
; Registers:
; ax, bx, cx, dx, si, di are broken
scroll_up:
cmp al,0
jne scroll_up_1
call mrsave ; save into roll buffer
scroll_up_1:
mov bl,ah
sub bl,al
cmp cl,bl ; n <= bottom - top ?
jle scroll_up_2 ; yes, text remains.
jmp scroll_up_3 ; no text remains.
scroll_up_2:
mov dh,al
add dh,cl
xor dl,dl
call vram_ofs
mov si,bx ; si is VRAM(top+n,0)
mov dh,ah
xor dl,79
call vram_ofs
mov cx,bx
sub cx,si
shr cx,1 ; byte counts -> word counts
inc cx ; number of words to be moved
mov dh,al
xor dl,dl
call vram_ofs
mov di,bx ; di is VRAM(top,0)
push es
push ds
mov ax,CRT_TXT_SEG
mov bl,vt_blkatr ; save attribute before ds cahnge
mov es,ax
mov ds,ax
push cx ; save word count
push di ; save destination address
push si ; save source address
cld
rep movsw ; move the text codes
mov cx,si
sub cx,di
shr cx,1
mov ax,0020h ; fill blank
rep stosw
;
pop si
pop di
pop cx ; cx, si, di are restored
add di,2000h ; attribute block
add si,2000h
rep movsw ; move the attributes
mov cx,si
sub cx,di
shr cx,1
mov al,bl ; fill attributes
xor ah,ah
rep stosw
;
cld
pop ds
pop es
jmp scroll_up_ex
scroll_up_3:
mov dh,al
xor dl,dl
call vram_ofs
mov cx,bx
mov dh,ah
mov dl,79
call vram_ofs
mov ax,cx
call vt_erase
scroll_up_ex:
ret
;
; Calculate VRAM offset address from (col,row)
; Inputs:
; dh: row (0-vt_phys_bottom)
; dl: col (0-79)
; Output:
; bx: VRAM offset address
;
; dx is broken when return
vram_ofs:
xor bx,bx
mov bl,dh
shl bx,1
add bx,offset vram_line
mov bx,[bx]
xor dh,dh
shl dl,1
add bx,dx
ret
; C1 8-bit control character
;-----------------------------
; Single shift 2 (8/14); ESC N
;-----------------------------
; Temporarily invokes G2 character set into GL for the next graphic
; character.
vt_c1_SS2:
mov char_SS,offset char_G2
jmp vt_esc_done
;-----------------------------
; Single shift 3 (8/15); ESC O
;-----------------------------
; Temporarily invokes G3 character set into GL for the next graphic
; character.
vt_c1_SS3:
mov char_SS,offset char_G3
jmp vt_esc_done
;----------------------
; Index ( 8/4 ); ESC D
;----------------------
; Moves the cursor down one line in the same column. If the cursor
; is at the bottom margin, the screen perform a scroll-up.
vt_c1_IND:
mov ah,cur_row
cmp ah,vt_bottom
jl vt_c1_IND_1
je vt_c1_IND_2
jmp vt_esc_done
vt_c1_IND_1:
inc ah
mov cur_row,ah
call locate_cur
jmp vt_esc_done
vt_c1_IND_2:
mov al,vt_top
mov cx,1
call scroll_up
jmp vt_esc_done
;-------------------------------
; Reverse index ( 8/13 ); ESC M
;-------------------------------
; Moves the cursor up one line in the same column. If the cursor is
; at the top margin, the screen performs a scroll-down.
vt_c1_RI:
mov al,cur_row
cmp al,vt_top
jg vt_c1_RI_1
je vt_c1_RI_2 ; [04-Aug-1989]
cmp al,0 ; [04-Aug-1989]
jg vt_c1_RI_1 ; [04-Aug-1989]
jmp vt_esc_done ; [04-Aug-1989]
vt_c1_RI_1:
dec al
jmp vt_c1_RI_3
vt_c1_RI_2:
mov al,vt_top
mov ah,vt_bottom
mov cx,1
call scroll_down
mov al,vt_top
vt_c1_RI_3:
mov cur_row,al
call locate_cur
jmp vt_esc_done
;--------------------------
; Next line ( 8/5 ); ESC E
;--------------------------
; Moves the cursor to the first position on the next line.
; If the cursor is at the bottom margin, the screen performs a
; scroll-up.
vt_c1_NEL:
mov ah,cur_row
cmp ah,vt_bottom
jl vt_c1_NEL_1
je vt_c1_NEL_2
cmp ah,vt_phys_bottom ; [04-Aug-1989]
jl vt_c1_NEL_1 ; [04-Aug-1989]
jmp vt_esc_done
vt_c1_NEL_1:
inc ah
mov cur_row,ah
mov cur_col,0
call locate_cur
jmp vt_esc_done
vt_c1_NEL_2:
mov al,vt_top
mov cx,1
call scroll_up
mov cur_col,0
call locate_cur
jmp vt_esc_done
;----------------------------------
; Horizontal tab set (8/08); ESC H
;----------------------------------
vt_c1_HTS:
xor ax,ax
mov al,cur_col
mov bx,offset tabstops
add bx,ax ; tab pointer
mov byte ptr [bx],1
jmp vt_esc_done
;
;-------------------------------------------
; Device Control String (9/0); ESC P
;-------------------------------------------
vt_c1_DCS:
mov spec_mode,in_DCS_MODE
mov P_pnt,0
mov bx,offset P_buf
mov word ptr [bx],0
mov I_pnt,0
mov bx,offset I_buf
mov byte ptr [bx],0
mov priv_pflg,0
jmp vt_disp_ex
;
;-------------------------------------------
; Control Sequence Introducer (9/11); ESC [
;-------------------------------------------
vt_c1_CSI:
mov spec_mode,in_CSI_MODE
mov P_pnt,0
mov bx,offset P_buf
mov word ptr [bx],0
mov I_pnt,0
mov bx,offset I_buf
mov byte ptr [bx],0
mov priv_pflg,0
jmp vt_disp_ex
;
;-------------------------------------------
; String Terminator (9/12); ESC \
;-------------------------------------------
vt_c1_ST:
mov spec_mode,0
jmp vt_disp_ex
;
VT100 ENDP
code ends
end