; MXCON.ASM
; MXCON.COM Copyrights(c)1994 MIYAZAKI
; MXCONBO.COM Arranged 1995 by Boko.
		.286
	; 1995/01/16 Nifty:FOAU2初公開版
	;	つねにGVRAMを表示するよう修正
	;	ｶｰｿﾙ情報をDOS内部のワークから取得､BIOS(INT90)のフックを廃止
	;	全角文字上の全角カーソル
	;	charpal の背景拡大機能に対応
	; 1995/02/06 ﾌﾘｺﾚ10 応募版
	;	ｶｰｿﾙのちらつき修正
	;	ﾊﾟﾚｯﾄ設定ﾙｰﾝﾁ変更
	;	4ﾌﾟﾚｰﾝすべて表示する
code		segment
		assume	cs:code,ds:nothing,es:nothing,ss:nothing

		org	02ch
envseg		label	word

		org	080h
cmdline		label	byte

		org	100h
entry:		jmp	main

gvram0		equ	0c000h
gvram		equ	0c019h
cvram		equ	0c800h
kvram		equ	0ca00h
ankcg		equ	0cb00h
io_work		equ	00040h
	; ＣＲＴＣアドレス
CRTC_ADR_REG	equ	00440h
	; ＣＲＴＣデータ
CRTC_DAT_REG	equ	00442h

max_x		equ	80
max_y		equ	24
max_y2		equ	25
chrsiz		equ	16
linsiz		equ	16

irq_code 	equ	0bh
	; 画面更新間隔の設定
vs_time		equ	4

;*****************************
;*	work vram eria
;****************************
	; 常駐ﾁｪｯｸ用ID文字列
chk_str		db	'MXCONBO'
vs_cnt		db	vs_time
vs_chk		db	0
		align 4
dmy_ram		dw	(max_x*max_y2) dup(0)
cursor_e_ad	dw	0
cursor_a_ad	dw	0
cursor_f_ad	dw	0
cursor_s_ad	dw	0
cursor_p_adr	label	dword
cursor_p_ad	dw	0
		dw	io_work
cur_xy		dw	0		; low x , hi y
vs_para		db	0,0
vs_off		dw	?
vs_seg		dw	?
old_off		dw	?
old_seg		dw	?
irq_map		db	0,0,0,0
vdb_ent		db	0
cur_attr	db	02h		; size = 2
attr_flag	db	?
		even
int_ent 	proc	far
		mov	dx,05cah
		out	dx,al
		sti

		dec	cs:[vs_cnt]
		jne	int_rt
		mov	cs:[vs_cnt],vs_time

		mov	ax,cs
		mov	ds,ax
	; 二重ｴﾝﾄﾘｰは禁止
		cmp	[vs_chk],0
		jne	int_rt
	; TVRAM書き込みﾌﾗｸﾞﾁｪｯｸ&ｸﾘｱ
		mov	dx,05c8h
		in	al,dx
		test	al,80h
		jne	int_go
	; ｶｰｿﾙ位置ﾁｪｯｸ
		les	bx,[cursor_p_adr]
		mov	ax,es:[bx]
		cmp	ax,[cur_xy]
		je	int_rt

int_go:		mov	[vs_chk],1		;多重割り込み防止
		call	_cflush
		mov	cs:[vs_chk],0

int_rt:		ret
int_ent 	endp

		assume	cs:code,ds:code,es:code,ss:nothing

;****************************************
; wrt_ank
;   al:char ah:attr
;   cx:x    bx:y(VRAMｱﾄﾞﾚｽ)
;****************************************
		align	4
_wrt_ank 	proc	near
		push	ds
		push	si
		push	es
		push	di
		push	cx
		push	bx

		mov	dx,ax
		sub	dh,dh		; char=>ankcg address [si]
		shl	dx,4		; * 16
		mov	si,dx
		mov	di,bx
		add	di,cx

		mov	bl,ah
		mov	cl,bl		;cl
		and	bx,7
	; 高輝度?
	; 94/01/05 ﾌﾞﾘﾝｸ属性も
		test	cl,30h		;cl
		je	$i147
		or	bl,8		;at

$i147:
	; ﾘﾊﾞｰｽ?
		test	cl,08h
		je	$i148
		dec	bh		;bk bh=0ffh

$i148:
	; ﾌｫﾝﾄROMのｾｸﾞﾒﾝﾄ
		mov	ax,ankcg
		mov	ds,ax
	; VRAMのｾｸﾞﾒﾝﾄｾｯﾄ
		mov	ax,gvram
		mov	es,ax
	; ANKCGを選択
		mov	dx,0ff99h
		mov	al,01h
		out	dx,al
	; vramﾌﾟﾚｰﾝ選択
	; (4ﾌﾟﾚｰﾝに書き込み)
		mov	dx,0ff81h
		mov	cx,80-1
	; 色が同じなら消さない
		cmp	cs:[attr_flag],0
		je	same_attr_a
		mov	al,0fh
		out	dx,al
		cmp	al,bl
		je	$sclr
	; 文字を消す
		sub	al,al
		rept	16
		stosb
		add	di,cx
		endm

		sub	di,80*16
	; vramﾌﾟﾚｰﾝ
	; IRGBの選択
same_attr_a:
		mov	al,bl
		out	dx,al

$sclr:		or	bh,bh
		jne	$ff100
	; 文字書き込み
	; (ﾉｰﾏﾙ)
		lodsw
		mov	es:[di],al
		mov	es:[di+80* 1],ah
		lodsw
		mov	es:[di+80* 2],al
		mov	es:[di+80* 3],ah
		lodsw
		mov	es:[di+80* 4],al
		mov	es:[di+80* 5],ah
		lodsw
		mov	es:[di+80* 6],al
		mov	es:[di+80* 7],ah
		lodsw
		mov	es:[di+80* 8],al
		mov	es:[di+80* 9],ah
		lodsw
		mov	es:[di+80*10],al
		mov	es:[di+80*11],ah
		lodsw
		mov	es:[di+80*12],al
		mov	es:[di+80*13],ah
		lodsw
		mov	es:[di+80*14],al
		mov	es:[di+80*15],ah
$ff101:
	; Kvram選択
		mov	dx,0ff99h
		xor	al,al
		out	dx,al

		pop	bx
		pop	cx
		pop	di
		pop	es
		pop	si
		pop	ds
		ret	

		align	4
	; 文字書き込み
	; (ﾘﾊﾞｰｽ)
$ff100:
		rept	16
		lodsb
		xor	al,bh
		stosb
		add	di,cx
		endm

		jmp	$ff101
_wrt_ank	endp
;************************************
; wrt_kan
;   dx:漢字(反転注意)	ah:attr
;   cx:x          	bx:y
;************************************
		align	4
_wrt_kan 	proc	near
		push	es
		push	di
		push	cx
		push	bx

		mov	di,bx
		add	di,cx		;di=vram_address
		mov	cl,ah

		mov	bx,cx
		mov	cx,dx
		xchg	ch,cl

;****** bug fix start *******
		cmp	ch,70h
		jb	cnv_end
		cmp	ch,74h
		ja	cnv_end
		cmp	cl,60h
		jb	cnv_end
		cmp	cl,7eh
		ja	cnv_end
		add	cx,07c0h

;		jmp short cnv_end
;		align	4
;Not_Cnv:	cmp	ch,75h
;		je	Ext_Cnv
;		cmp	ch,76h
;		jne	Cnv_End
;Ext_Cnv:	sub	ch,75h
;		sub	cl,21h
;		mov	al,94
;		mul	ch
;		xor	ch,ch
;		add	ax,cx
;		mov	dx,ax
;		shr	dx,5 	; dx / 32
;		and	ax,1Fh	; ax % 32
;		mov	ch,dl	; dx * 256
;		mov	cl,al
;		add	cx,0900h

cnv_end:
;******* bug fix end ********

		xchg	ch,cl
		mov	ax,cx
		mov	cx,bx
		mov	dx,0ff94h
		out	dx,al
		inc	dx
		mov	al,ah
		out	dx,al

		mov	bl,cl	;cl
		and	bx,7

		test	cl,30h	;cl
		je	$i247
		or	bl,8			;at

$i247:
		test	cl,08h	;cl
		je	$i248
		dec	bh			;bk bh=0ffh

$i248:		mov	ax,gvram
		mov	es,ax
		mov	dx,0ff81h
		mov	cx,80-2
		cmp	cs:[attr_flag],0
		je	same_attr_k
		mov	al,0fh
		out	dx,al
		cmp	al,bl
		je	$sclr_k

		sub	ax,ax

$f251:		rept	16
		stosw
		add	di,cx
		endm

		sub	di,80*16
same_attr_k:
		mov	al,bl
		out	dx,al

$sclr_k:	mov	dx,0ff96h
		and	bh,bh
		jne	$f277
$ff200:
		insb
		inc	dx
		insb
		add	di,cx
		rept	15
		dec	dx
		insb
		inc	dx
		insb
		add	di,cx
		endm
$ff201:
		pop	bx
		pop	cx
		pop	di
		pop	es
		ret	

		align	4

$f277:
		in	al,dx
		xor	al,bh
		stosb
		inc	dx
		in	al,dx
		xor	al,bh
		stosb
		add	di,cx

		rept	15
		dec	dx
		in	al,dx
		xor	al,bh
		stosb
		inc	dx
		in	al,dx
		xor	al,bh
		stosb
		add	di,cx
		endm
		jmp	$ff201
_wrt_kan	endp

;***********************************************
;仮想ＶＲＡＭ部（ＤＭＹＣＯＮ　Ｖｅｒ２．０３）
;                             ｂｙ （山）
;***********************************************
		public	_cflush
_cflush		proc 	near
		push	ds
		cld
	; tvramの
	; セグメント設定
		mov	ax,cvram	; cp
		mov	ds,ax
		xor	si,si
	; ダミーram(比較先)
	; セグメント設定
		mov	ax,cs		; dp
		mov	es,ax
		mov	di,offset dmy_ram

		xor	cx,cx		; x:cx
		xor	bx,bx		; y:bx
		align	4

cf_lp1:
		mov	ax,[si]
		sub	ah,es:[di+1]
		mov	es:[attr_flag],ah
	; tvram attrから
	; 2 バイト取得
		mov	ax,[si]
	; 漢字フラグ?
		test	ah,40h
		je	short cf_ank
	; 漢字vramから
	; 2 バイト取得
		mov	dx,[si+2000h]
	; tvramとﾀﾞﾐｰ
	; vramとの比較
		cmp	dh,es:[di+0]
		jne	short cf_knj
		cmp	dl,es:[di+2]
		jne	short cf_knj
		cmp	ah,es:[di+1]
		je	short cf_ked

cf_knj:
	; ﾀﾞﾐｰvramを更新して
	; tvramの内容と
	; 等しくする
		mov	es:[di+1],ah
		mov	es:[di+0],dh
		mov	es:[di+2],dl
		mov	byte ptr es:[di+3],0bfh
	; 2ﾊﾞｲﾄ文字の表示
		call	_wrt_kan
cf_ked:		add	si,4
		add	di,4
		add	cx,2
		jmp	short cf_end
		align	4

cf_ank:
	; tvramとﾀﾞﾐｰvramとの比較
		cmp	ax,es:[di]
	; ﾀﾞﾐｰvramの更新
		stosw
		je	short cf_aed
		call	_wrt_ank
cf_aed:		add	si,2
		inc	cx

cf_end:		cmp	cx,max_x
		jb	short cf_lp1
		sub	cx,max_x
		add	bx,80*linsiz
		cmp	bx,max_y2*80*linsiz
		jb	short cf_lp1

		pop	ds

;*****************************
; locate
;*****************************
_locate		proc	near

		mov	al,0fh
		mov	dx,0fda0h
		out	dx,al

	; ｶｰｿﾙｱﾄﾘﾋﾞｭｰﾄ
		mov	ax,io_work
		mov	es,ax
		mov	bx,[cursor_a_ad]
		mov	al,es:[bx]
		and	al,060h
		cmp	al,020h
		je	loca_ret
	; ｶｰｿﾙ表示/非表示
		mov	bx,[cursor_f_ad]
		cmp	byte ptr es:[bx],0
		jne	loca_ret
	; ｶｰｿﾙ行桁位置
		inc	BX
		mov	cx,es:[bx]
		mov	[cur_xy],cx
		sub	cx,00101h
		mov	bl,ch
		xor	ch,ch

		mov	ax,max_x
		mul	bl
		add	ax,cx
		shl	ax,1
		add	ax,offset dmy_ram
		mov	di,ax
	; ｶｰｿﾙの幅(Byte/Word)設定
		mov	byte ptr [loca1+1],0f6h	; ｶｰｿﾙ半角
		test	byte ptr [di+1],040h
		je	l_ank
		mov	byte ptr [loca1+1],0f7h	; ｶｰｿﾙ全角
l_ank:
		xor	byte ptr [di+1],007h

		shl	bx,4		; y *= 16
		xor	ah,ah
		mov	di,[cursor_e_ad]
		mov	al,byte ptr es:[di]
		mov	di,[cursor_s_ad]
		sub	al,byte ptr es:[di]
		inc	ax
		mov	[cur_attr],al
		mov	al,byte ptr es:[di]
		add	bx,ax
		mov	ax,80

		mul	bx		; y *= 80
		add	ax,cx		; y + x
		mov	di,ax

		mov	ax,gvram
		mov	es,ax
		mov	dx,0ff81h
		mov	al,00000001b
		call	loca_sub
		mov	al,01000010b
		call	loca_sub
		mov	al,10000100b
		call	loca_sub
		mov	al,11001000b
		call	loca_sub
loca_ret:
		ret	

loca_sub:	out	dx,al
		push	di
		xor	cx,cx
		mov	cl,[cur_attr]

loca1:		not	byte ptr es:[di]	; 実行時に書換えしてます。
		add	di,80
		loop	loca1
		pop	di
		ret
_locate		endp

_cflush		endp

start_init	label	word

;********************************************************
;	割り込みの設定
;********************************************************

vs_set		proc	near
		push	ds

		cli
	; FM音源ﾀｲﾏB割り込み
	; 標準DOSｺﾝｿｰﾙ停止
		mov	dx,04d8h
vs_set_1:	in	al,dx
		test	al,80h
		jnz	vs_set_1
		mov	dx,04d8h
		mov	al,27h
		out	dx,al
	; wait
		jmp short $+2
		jmp short $+2

		mov	dx,04d8h
vs_set_2:	in	al,dx
		test	al,80h
		jnz	vs_set_2
		mov	dx,04dah
		mov	al,00h
		out	dx,al
		sti
	; vsync割込ｱﾄﾞﾚｽの取り出し
		mov	ah,01h
		mov	dl,irq_code
		int	0aeh
	; 旧vsync割込ｱﾄﾞﾚｽ保存
		mov	cs:[old_off],di
		mov	cs:[old_seg],ds
	; vsync割込ﾙｰﾁﾝ登録
		push	cs
		pop	ds
		mov	di,offset int_ent
		mov	cs:[vs_off],di
		mov	cs:[vs_seg],ds
		mov	di,offset vs_para
		mov	ah,00h
		mov	dl,irq_code
		int	0aeh
	; 割込許可ﾃﾞｰﾀ取り出し
		mov	ah,03h
		mov	di,offset irq_map
		int	0aeh
	; VSYNC割り込み許可
		or	byte ptr ds:[di+2],08h
		mov	ah,02h
		int	0aeh
	; VSYNC割り込み要因ｸﾘｱ
		mov	dx,05cah
		out	dx,al
		pop	ds
		ret
vs_set		endp

vs_reset 	proc	near
		push	ds

		push	cs
		pop	ds
	; 割込許可ﾃﾞｰﾀ取り出し
		mov	ah,03h
		mov	di,offset irq_map
		int	0aeh
	; VSYNC割り込み禁止
		and	byte ptr cs:[di+2],0f7h
		mov	ah,02h
		int	0aeh
	; 旧vsync割込ﾙｰﾁﾝ復旧
		mov	di,es:[old_off]
		mov	ds,es:[old_seg]
		mov	ah,00h
		mov	dl,irq_code
		int	0aeh

	; FM音源ﾀｲﾏB割り込み
	; 標準DOSｺﾝｿｰﾙ再開
		cli
		mov	dx,04d8h
vs_reset_1:	in	al,dx
		test	al,80h
		jnz	vs_reset_1
		mov	dx,04d8h
		mov	al,27h
		out	dx,al
	; wait
		jmp short $+2
		jmp short $+2

		mov	dx,04d8h
vs_reset_2:	in	al,dx
		test	al,80h
		jnz	vs_reset_2
		mov	dx,04dah
		mov	al,2ah
		out	dx,al
		sti

		pop	ds
		ret
vs_reset 	endp

pal_tbl		dw	00000h
		dw	000b0h
		dw	00b00h
		dw	00bb0h
		dw	0b000h
		dw	0b0b0h
		dw	0bb00h
		dw	0bbb0h
		dw	04440h
		dw	000f0h
		dw	00f00h
		dw	00ff0h
		dw	0f000h
		dw	0f0f0h
		dw	0ff00h
		dw	0fff0h

palet_init	proc	near
	; ﾚｲｱ0の16色
	; ﾊﾟﾚｯﾄ選択
		mov	dx,00448h
		mov	al,1
		out	dx,al
		inc	dx
		inc	dx
		mov	al,0
		out	dx,al
		sub	cl,cl
		mov	si,offset pal_tbl
pal_init_1:	mov	al,cl
		mov	dx,0fd90h
		out	dx,al
		lodsw
		call	palet_init_sub
		call	palet_init_sub
		call	palet_init_sub
		inc	cl
		cmp	cl,16
		jb	pal_init_1
		ret	
palet_init_sub:
		inc	dx
		inc	dx
		out	dx,al
		ror	ax,4
		ret
palet_init	endp

trap_chk	proc	near
	; 常駐チェックルーチン
		push	ds
		push	es

	; vsync割込ｱﾄﾞﾚｽの取り出し
		mov	ah,01h
		mov	dl,irq_code
		int	0aeh
		mov	cs:[vs_seg],ds
		cld
		mov	cx,7
		mov	si,offset chk_str
		mov	di,offset chk_str
	repe	cmpsb

		pop	es
		pop	ds
		ret
trap_chk	endp

main		proc	near
		cld

		mov	si,offset cmdline
		lodsb
		mov	ah,al
main_cmd:	cmp	ah,0
		je	main_init
		dec	ah
		lodsb
		cmp	al,'-'
		jne	main_cmd

		call	trap_chk
		jne	main_ret
	; 常駐解除
		call	vs_reset
	; ﾒﾓﾘ開放
		mov	es,[vs_seg]
		mov	ah,49h
		int	21h
	; GVRAMｸﾘｱ
		mov	ax,gvram0
		mov	es,ax
		mov	dx,0ff81h
		mov	al,0fh
		out	dx,al
		xor	ax,ax
		mov	cx,80*409/2
		mov	di,0
	rep	stosw
	; 全画面消去
		mov	ah,02h
		int	91h

		mov	al,0fh
		mov	dx,0fda0h
		out	dx,al
	; crtc 戻す
		mov	al,0dh
		mov	bx,0040h
		call	crtc_data_set
		mov	al,0Eh
		mov	bx,0360h
		call	crtc_data_set

		jmp short main_ret

main_init:
		call	trap_chk
		je	main_ret
	; ｶｰｿﾙ情報のdos 内部ワークを検索
		call	search
		jnz	main_ret
	; 文字を完全に消す
		call	clear_scrn1
	; パレット初期化
		call	palet_init
	; 標準DOSｺﾝｿｰﾙ停止
	; VSYNC割り込み開始
		call	vs_set
	; ｶｰｿﾙ表示,ｼｽﾃﾑ行ありに設定
		call	set_scrn
	; 環境変数領域開放
		mov	si,offset envseg
		mov	ax,cs:[si]
		mov	es,ax
		mov	ah,49h
		int	21h
	; 常駐終了
		mov	dx,offset start_init
		add	dx,15
		shr	dx,4
		mov	ax,3100h
		int	21h
	; ﾌﾟﾛｾｽ終了
main_ret:	mov	ax,4c00h
		int	21h

main		endp

	; 94/12/28 追加 start by boko.
clear_scrn1	proc	near
	; ﾚｲｱ1 側の画面を完全に消去する

	; ｶｰｿﾙ非表示
		mov	ax,0b01h
		int	91h
	; ｼｽﾃﾑ行の文字を保存
	; Kvram選択
		mov	dx,0ff99h
		xor	al,al
		out	dx,al
		push	ds
		mov	ax,cvram
		mov	ds,ax
		mov	si,max_x * 2 * 24
		mov	di,offset mode_save_1
		mov	cx,max_x
	rep	movsw		
		mov	si,max_x * 2 * 24 + 02000h
		mov	cx,max_x
	rep	movsw
		pop	ds
	; 画面モード取得
		mov	ah,01ch
		int	91h
	; ｼｽﾃﾑ行なしに設定
	;(oakﾓｰﾄﾞ表示域も消したい)
		and	al,10000111b
		mov	ah,01bh
		int	91h
	; 全画面消去
		mov	ah,02h
		int	91h
	; 300msec 待つ
		mov	cx,30000
		int	0fdh	
		ret
clear_scrn1	endp		

set_scrn	proc
	; ｶｰｿﾙ表示
		mov	ax,0b00h
		int	91h
	; 画面モード取得
		mov	ah,01ch
		int	91h
	; ｼｽﾃﾑ行ありに設定
		and	al,11000111b
		or	al,01000000b
		mov	ah,01bh
		int	91h
	; 保存したｼｽﾃﾑ行を復帰
		mov	dx,0ff99h
		xor	al,al
		out	dx,al
		push	es
		mov	ax,cvram
		mov	es,ax
		mov	di,max_x * 2 * 24
		mov	si,offset mode_save_1
		mov	cx,max_x
	rep	movsw		
		mov	si,max_x * 2 * 24 + 02000h
		mov	cx,max_x
	rep	movsw
		pop	es
	; crtc 変更
		mov	al,0dh
		mov	bx,0036h
		call	crtc_data_set
		mov	al,0Eh
		mov	bx,0368h
		call	crtc_data_set
	; 4ﾌﾟﾚｰﾝ全部表示
		mov	dx,0FF82h
		mov	al,001100111b
		out	dx,al
		ret

set_scrn	endp

search		proc	near

c_style_search:
	; カーソル表示
	; カーソル形状設定
	; 低速ブリンク･拡張
		call	curs_style_070f
	; 設定したパターン
	; (07h,0fh)を
	; io.sysの内部作業
	; 領域から検索する｡
	; 検索するのは
	; 0040:0000-0040:ffff
	; の範囲
		push	es
		mov	ax,00040h
		mov	es,ax
		mov	di,0
		mov	cx,0ffffh
	; dos ver.5.0/6.2の場合
dos5_loop:
		mov	ax,0070fh
		call	scan_word
		jnz	dos3
		mov	ax,di
		mov	cursor_s_ad,ax
		dec	ax
		mov	cursor_e_ad,ax
		inc	di
		cmp	byte ptr es:[di],0
		jne	dos5_loop
		call	check_style
		jc	dos5_loop
		jmp short c_flag_search
dos3:
		mov	di,0
	; ｽｷｬﾝするサイズ 
		mov	cx,0ffffh
	; dos ver. 3.1  の場合
	; 格納順がdos 5とは異なる
dos3_loop:
		mov	ax,00f07h
		call	scan_word
		jnz	error
		mov	ax,di
		mov	cursor_e_ad,ax
		dec	ax
		mov	cursor_s_ad,ax
		inc	di
		cmp	byte ptr es:[di],0
		jne	dos3_loop
		call	check_style
		jc	dos3_loop
c_flag_search:
		
error:
exit:
		pop	es
		ret
search		endp


scan_word	proc
	; 検索サブルーチン
	; in
	;    ax : 検索パターン
	; out
	;    z  : 発見
	;    di : 発見アドレス+1
	;    nz : 見つからない
scan_loop:
	repnz	scasb
		jne	not_found
		cmp	ah,es:[di]
		jne	scan_loop
not_found:
		ret
scan_word	endp

check_style	proc
		mov	cursor_f_ad,di
		dec	ax
		mov	cursor_a_ad,ax
	; 再びカーソルの
	; 形を変更する
		mov	ax,00900h
		mov	dx,00e0fh
		int	091h
	; あたりをつけた
	; アドレスの内容が
	; 設定した値に変更
	; されてる事を確認
		mov	bx,[cursor_s_ad]
		cmp	byte ptr es:[bx],0eh
		jne	curs_style_070f
		mov	bx,[cursor_e_ad]
		cmp	byte ptr es:[bx],0fh
		jne	curs_style_070f
	; カーソル非表示
		mov	ax,00b01h
		int	091h
	; あたりをつけた
	; アドレスの内容が
	; 設定した値に変更
	; されてる事を確認
		mov	bx,[cursor_f_ad]
		cmp	byte ptr es:[bx],01h
		jne	curs_style_070f
	; カーソル行桁の
	; 内部ワーク検索
		mov	ax,00406h
		call	scan_word
		mov	bx,di
		dec	bx
		mov	[cursor_p_ad],bx
	; カーソル行桁変更
		mov	ah,00dh
		mov	dx,00101h
		int	091h
	; あたりをつけた
	; アドレスの内容が
	; 設定した値に変更
	; されてる事を確認
		cmp	word ptr es:[bx],00101h
		jne	curs_style_070f
		ret

curs_style_070f:
	; カーソルを
	; 検索対象の
	; パターンにする
		push	bx
		push	cx
		push	di
		mov	ax,0095fh
		mov	dx,0070fh
	; 無関係のﾚｼﾞｽﾀは
	; dos内部のｽﾀｯｸ領域の
	; 誤検索を防止するため
	; ffffにする
		mov	bx,0ffffh
		mov	cx,bx
		mov	si,bx
		mov	di,bx
		int	091h
	; ｶｰｿﾙ表示
		mov	ax,00b00h
		int	091h
	; ｶｰｿﾙ位置設定
		mov	ah,00dh
		mov	dx,00406h
		int	091h

		pop	di
		pop	cx
		pop	bx
	; carry ﾌﾗｸﾞｾｯﾄ
		stc
		ret
check_style	endp

crtc_data_set	proc
	; in AL CRTC レジスタ番号
	;    BX そのレビジスタにセットする値
		push	ax
		mov	dx,CRTC_ADR_REG
		out	dx,al
		mov	dx,CRTC_DAT_REG
		mov	ax,bx
		out	dx,ax
		pop	ax
		ret
crtc_data_set	endp

mode_save_1	dw	max_x dup (?)
mode_save_2	dw	max_x dup (?)

code		ends
		end	entry
