/* DIVIDE_START=dspstr.s */
/***************************************************************
;
;	16色VRAM文字表示下位ル−チン
;
;	1991.01.01	Make by Ken
;
;***************************************************************/

/**************************************************************
;	セレクタ値の定義
;**************************************************************/
#define VRAMSEL	$0x104
#define TBIOSEL	$0x110
#define FONTSEL	$0x138
/**************************************************************
;	SJIS漢字コ−ドテ−ブルのマスク値定義
;**************************************************************/
#define ISKAN1 1
#define ISKAN2 2

/**************************************************************
;	ANK文字のVRAMイメ−ジパタ−ンエリア
;**************************************************************/
.data
.align 2
.lcomm	ankfnt,16*256*4

/**************************************************************
;	カラ−コ−ドを含むVRAMイメ−ジテ−ブル
;**************************************************************/
.lcomm	fntcol,256*4

/**************************************************************
;	カラ−コ−ドの4ビット1ピクセルテ−ブル
;**************************************************************/
colptn:
.long	0x00000000,0x11111111,0x22222222,0x33333333
.long	0x44444444,0x55555555,0x66666666,0x77777777
.long	0x88888888,0x99999999,0xaaaaaaaa,0xbbbbbbbb
.long	0xcccccccc,0xdddddddd,0xeeeeeeee,0xffffffff

/**************************************************************
;	16色VRAMビットイメ−ジテ−ブル
;	1ビット8ピクセル→4ビット8ピクセルへ変換
;**************************************************************/
fntptn:
.long	0x00000000,0xf0000000,0x0f000000,0xff000000
.long	0x00f00000,0xf0f00000,0x0ff00000,0xfff00000
.long	0x000f0000,0xf00f0000,0x0f0f0000,0xff0f0000
.long	0x00ff0000,0xf0ff0000,0x0fff0000,0xffff0000
.long	0x0000f000,0xf000f000,0x0f00f000,0xff00f000
.long	0x00f0f000,0xf0f0f000,0x0ff0f000,0xfff0f000
.long	0x000ff000,0xf00ff000,0x0f0ff000,0xff0ff000
.long	0x00fff000,0xf0fff000,0x0ffff000,0xfffff000
.long	0x00000f00,0xf0000f00,0x0f000f00,0xff000f00
.long	0x00f00f00,0xf0f00f00,0x0ff00f00,0xfff00f00
.long	0x000f0f00,0xf00f0f00,0x0f0f0f00,0xff0f0f00
.long	0x00ff0f00,0xf0ff0f00,0x0fff0f00,0xffff0f00
.long	0x0000ff00,0xf000ff00,0x0f00ff00,0xff00ff00
.long	0x00f0ff00,0xf0f0ff00,0x0ff0ff00,0xfff0ff00
.long	0x000fff00,0xf00fff00,0x0f0fff00,0xff0fff00
.long	0x00ffff00,0xf0ffff00,0x0fffff00,0xffffff00
.long	0x000000f0,0xf00000f0,0x0f0000f0,0xff0000f0
.long	0x00f000f0,0xf0f000f0,0x0ff000f0,0xfff000f0
.long	0x000f00f0,0xf00f00f0,0x0f0f00f0,0xff0f00f0
.long	0x00ff00f0,0xf0ff00f0,0x0fff00f0,0xffff00f0
.long	0x0000f0f0,0xf000f0f0,0x0f00f0f0,0xff00f0f0
.long	0x00f0f0f0,0xf0f0f0f0,0x0ff0f0f0,0xfff0f0f0
.long	0x000ff0f0,0xf00ff0f0,0x0f0ff0f0,0xff0ff0f0
.long	0x00fff0f0,0xf0fff0f0,0x0ffff0f0,0xfffff0f0
.long	0x00000ff0,0xf0000ff0,0x0f000ff0,0xff000ff0
.long	0x00f00ff0,0xf0f00ff0,0x0ff00ff0,0xfff00ff0
.long	0x000f0ff0,0xf00f0ff0,0x0f0f0ff0,0xff0f0ff0
.long	0x00ff0ff0,0xf0ff0ff0,0x0fff0ff0,0xffff0ff0
.long	0x0000fff0,0xf000fff0,0x0f00fff0,0xff00fff0
.long	0x00f0fff0,0xf0f0fff0,0x0ff0fff0,0xfff0fff0
.long	0x000ffff0,0xf00ffff0,0x0f0ffff0,0xff0ffff0
.long	0x00fffff0,0xf0fffff0,0x0ffffff0,0xfffffff0
.long	0x0000000f,0xf000000f,0x0f00000f,0xff00000f
.long	0x00f0000f,0xf0f0000f,0x0ff0000f,0xfff0000f
.long	0x000f000f,0xf00f000f,0x0f0f000f,0xff0f000f
.long	0x00ff000f,0xf0ff000f,0x0fff000f,0xffff000f
.long	0x0000f00f,0xf000f00f,0x0f00f00f,0xff00f00f
.long	0x00f0f00f,0xf0f0f00f,0x0ff0f00f,0xfff0f00f
.long	0x000ff00f,0xf00ff00f,0x0f0ff00f,0xff0ff00f
.long	0x00fff00f,0xf0fff00f,0x0ffff00f,0xfffff00f
.long	0x00000f0f,0xf0000f0f,0x0f000f0f,0xff000f0f
.long	0x00f00f0f,0xf0f00f0f,0x0ff00f0f,0xfff00f0f
.long	0x000f0f0f,0xf00f0f0f,0x0f0f0f0f,0xff0f0f0f
.long	0x00ff0f0f,0xf0ff0f0f,0x0fff0f0f,0xffff0f0f
.long	0x0000ff0f,0xf000ff0f,0x0f00ff0f,0xff00ff0f
.long	0x00f0ff0f,0xf0f0ff0f,0x0ff0ff0f,0xfff0ff0f
.long	0x000fff0f,0xf00fff0f,0x0f0fff0f,0xff0fff0f
.long	0x00ffff0f,0xf0ffff0f,0x0fffff0f,0xffffff0f
.long	0x000000ff,0xf00000ff,0x0f0000ff,0xff0000ff
.long	0x00f000ff,0xf0f000ff,0x0ff000ff,0xfff000ff
.long	0x000f00ff,0xf00f00ff,0x0f0f00ff,0xff0f00ff
.long	0x00ff00ff,0xf0ff00ff,0x0fff00ff,0xffff00ff
.long	0x0000f0ff,0xf000f0ff,0x0f00f0ff,0xff00f0ff
.long	0x00f0f0ff,0xf0f0f0ff,0x0ff0f0ff,0xfff0f0ff
.long	0x000ff0ff,0xf00ff0ff,0x0f0ff0ff,0xff0ff0ff
.long	0x00fff0ff,0xf0fff0ff,0x0ffff0ff,0xfffff0ff
.long	0x00000fff,0xf0000fff,0x0f000fff,0xff000fff
.long	0x00f00fff,0xf0f00fff,0x0ff00fff,0xfff00fff
.long	0x000f0fff,0xf00f0fff,0x0f0f0fff,0xff0f0fff
.long	0x00ff0fff,0xf0ff0fff,0x0fff0fff,0xffff0fff
.long	0x0000ffff,0xf000ffff,0x0f00ffff,0xff00ffff
.long	0x00f0ffff,0xf0f0ffff,0x0ff0ffff,0xfff0ffff
.long	0x000fffff,0xf00fffff,0x0f0fffff,0xff0fffff
.long	0x00ffffff,0xf0ffffff,0x0fffffff,0xffffffff

/**************************************************************
;	SJIS漢字コ−ドチェックテ−ブル
;	bit0	SJIS第1コ−ド
;	bit1	SJIS第2コ−ド
;**************************************************************/
	.globl	_kantbl
/*
;		0 1 2 3 4 5 6 7 8 9 A B C D E F
*/
_kantbl:
	.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.byte	2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
	.byte	2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
	.byte	2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
	.byte	2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0
	.byte	2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
	.byte	3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
	.byte	2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
	.byte	2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
	.byte	2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
	.byte	2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
	.byte	3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
	.byte 	3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0


/**************************************************************
;
;	文字色及び背景色テ−ブルとANK文字イメ−ジの初期化
;
;void	ctblset(chrcol,bakcol);
;int	chrcol;		[ebp+8] 	文字色(0-15)
;int	bakcol;		[ebp+12]	背景色(0-15)
;**************************************************************/
.text
	.globl	_ctblset
.align 2
_ctblset:
	push	%ebp
	movl	%esp,%ebp

	push	%esi
	push	%edi
	push	%fs

	movzbl	8(%ebp),%eax
	andb	$0x0f,%al
	movl	colptn(,%eax,4),%eax
	movl	%eax,8(%ebp)

	movzbl	12(%ebp),%eax
	andb	$0x0f,%al
	movl	colptn(,%eax,4),%eax
	movl	%eax,12(%ebp)

	movl	$256,%ecx
	movl	$fntptn,%esi
	movl	$fntcol,%edi
ctblp:	lodsl
	movl	%eax,%edx
	notl	%edx
	andl	8(%ebp),%eax
	andl	12(%ebp),%edx
	orl	%edx,%eax
	stosl
	loop	ctblp

	movw	FONTSEL,%ax
	movw	%ax,%fs
	movl	$0x3d800,%esi
	movl	$ankfnt,%edi

	movl	$16*256,%ecx
aktb1:	movzbl	%fs:(%esi),%eax
	incl	%esi
	movl	fntcol(,%eax,4),%eax
	stosl
	loop	aktb1

	pop	%fs
	pop	%edi
	pop	%esi
	pop	%ebp
	ret

/**************************************************************
;
;	ANK色付文字イメ−ジをVRAMに転送する
;
;【注意】フォント展開時にVRAMの範囲をこえてはならない!
;
;void	cwrt_ank(ch,addr)
;char	ch;		[ebp+8]		ANK文字コ−ド(0-256)
;int	addr;		[ebp+12]	VRAMアドレス(0-0x3DFFC)
;**************************************************************/
	.globl	_cwrt_ank
.align 2
_cwrt_ank:
	push	%ebp
	movl	%esp,%ebp

	push	%es
	push	%esi
	push	%edi

	movw	VRAMSEL,%ax
	movw	%ax,%es

	movzbl	8(%ebp),%esi
	shll	$6,%esi
	addl	$ankfnt,%esi

	movl	12(%ebp),%edi
	movl	$512-4,%ecx

	movsl
	addl	%ecx,%edi
	movsl
	addl	%ecx,%edi
	movsl
	addl	%ecx,%edi
	movsl
	addl	%ecx,%edi
	movsl
	addl	%ecx,%edi
	movsl
	addl	%ecx,%edi
	movsl
	addl	%ecx,%edi
	movsl
	addl	%ecx,%edi
	movsl
	addl	%ecx,%edi
	movsl
	addl	%ecx,%edi
	movsl
	addl	%ecx,%edi
	movsl
	addl	%ecx,%edi
	movsl
	addl	%ecx,%edi
	movsl
	addl	%ecx,%edi
	movsl
	addl	%ecx,%edi
	movsl
	addl	%ecx,%edi

	pop	%edi
	pop	%esi
	pop	%es

	pop	%ebp
	ret

/**************************************************************
;
;	SJIS漢字を色付イメ−ジテ−ブルに展開してVRAMに転送する
;
;【注意】フォント展開時にVRAMの範囲をこえてはならない!
;
;void	cwrt_kan(ch,addr)
;short	ch;		[ebp+8]		SJIS漢字コ−ド
;int	addr;		[ebp+12]	VRAMアドレス(0-0x3DFF9)
;**************************************************************/
	.globl	_cwrt_kan
.align 2
_cwrt_kan:
	push	%ebp
	movl	%esp,%ebp

	push	%fs
	push	%gs
	push	%es
	push	%ds
	push	%esi
	push	%edi
	push	%edx
	push	%ebx

	movw	VRAMSEL,%ax
	movw	%ax,%es
	movw	TBIOSEL,%ax
	movw	%ax,%fs
	movw	%ds,%ax
	movw	%ax,%gs

	movzwl	8(%ebp),%ebx
	shlb	$1,%bh
	cmpb	$0x80,%bl
	adcw	$0x1f61,%bx
	addb	$0x7f,%bl
	jc	wt_kn1
	addb	$0xa2,%bl
wt_kn1:	andb	$0x7f,%bh

	movw	$0x100,%ax
	movw	$0x1010,%dx
	lcall	%fs:0xa0


	movl	%ss:12(%ebp),%edi
	movl	$fntcol,%ebx

	xorl	%edx,%edx
	xorl	%ecx,%ecx


	lodsw
	movb	%al,%cl
	movb	%ah,%dl
	movl	%gs:(%ebx,%ecx,4),%eax
	stosl
	movl	%gs:(%ebx,%edx,4),%eax
	stosl
	addl	$512-4*2,%edi
	lodsw
	movb	%al,%cl
	movb	%ah,%dl
	movl	%gs:(%ebx,%ecx,4),%eax
	stosl
	movl	%gs:(%ebx,%edx,4),%eax
	stosl
	addl	$512-4*2,%edi
	lodsw
	movb	%al,%cl
	movb	%ah,%dl
	movl	%gs:(%ebx,%ecx,4),%eax
	stosl
	movl	%gs:(%ebx,%edx,4),%eax
	stosl
	addl	$512-4*2,%edi
	lodsw
	movb	%al,%cl
	movb	%ah,%dl
	movl	%gs:(%ebx,%ecx,4),%eax
	stosl
	movl	%gs:(%ebx,%edx,4),%eax
	stosl
	addl	$512-4*2,%edi
	lodsw
	movb	%al,%cl
	movb	%ah,%dl
	movl	%gs:(%ebx,%ecx,4),%eax
	stosl
	movl	%gs:(%ebx,%edx,4),%eax
	stosl
	addl	$512-4*2,%edi
	lodsw
	movb	%al,%cl
	movb	%ah,%dl
	movl	%gs:(%ebx,%ecx,4),%eax
	stosl
	movl	%gs:(%ebx,%edx,4),%eax
	stosl
	addl	$512-4*2,%edi
	lodsw
	movb	%al,%cl
	movb	%ah,%dl
	movl	%gs:(%ebx,%ecx,4),%eax
	stosl
	movl	%gs:(%ebx,%edx,4),%eax
	stosl
	addl	$512-4*2,%edi
	lodsw
	movb	%al,%cl
	movb	%ah,%dl
	movl	%gs:(%ebx,%ecx,4),%eax
	stosl
	movl	%gs:(%ebx,%edx,4),%eax
	stosl
	addl	$512-4*2,%edi
	lodsw
	movb	%al,%cl
	movb	%ah,%dl
	movl	%gs:(%ebx,%ecx,4),%eax
	stosl
	movl	%gs:(%ebx,%edx,4),%eax
	stosl
	addl	$512-4*2,%edi
	lodsw
	movb	%al,%cl
	movb	%ah,%dl
	movl	%gs:(%ebx,%ecx,4),%eax
	stosl
	movl	%gs:(%ebx,%edx,4),%eax
	stosl
	addl	$512-4*2,%edi
	lodsw
	movb	%al,%cl
	movb	%ah,%dl
	movl	%gs:(%ebx,%ecx,4),%eax
	stosl
	movl	%gs:(%ebx,%edx,4),%eax
	stosl
	addl	$512-4*2,%edi
	lodsw
	movb	%al,%cl
	movb	%ah,%dl
	movl	%gs:(%ebx,%ecx,4),%eax
	stosl
	movl	%gs:(%ebx,%edx,4),%eax
	stosl
	addl	$512-4*2,%edi
	lodsw
	movb	%al,%cl
	movb	%ah,%dl
	movl	%gs:(%ebx,%ecx,4),%eax
	stosl
	movl	%gs:(%ebx,%edx,4),%eax
	stosl
	addl	$512-4*2,%edi
	lodsw
	movb	%al,%cl
	movb	%ah,%dl
	movl	%gs:(%ebx,%ecx,4),%eax
	stosl
	movl	%gs:(%ebx,%edx,4),%eax
	stosl
	addl	$512-4*2,%edi
	lodsw
	movb	%al,%cl
	movb	%ah,%dl
	movl	%gs:(%ebx,%ecx,4),%eax
	stosl
	movl	%gs:(%ebx,%edx,4),%eax
	stosl
	addl	$512-4*2,%edi
	lodsw
	movb	%al,%cl
	movb	%ah,%dl
	movl	%gs:(%ebx,%ecx,4),%eax
	stosl
	movl	%gs:(%ebx,%edx,4),%eax
	stosl
	addl	$512-4*2,%edi

	pop	%ebx
	pop	%edx
	pop	%edi
	pop	%esi
	pop	%ds
	pop	%es
	pop	%gs
	pop	%fs

	pop	%ebp
	ret

/**************************************************************
;
;	上方向に4角枠内を縦16ドットソフトスクロ−ルさせる
;
;【注意】sizeは8ドット単位で転送されるので充分に注意!
;
;void	vram_scrool(addr,size,line,bakcol)
;char	*addr;		[ebp+8]		先頭VRAMアドレス
;int	size;		[ebp+12]	横のドット数
;int	line;		[ebp+16]	縦のドット数
;int	bakcol;		[ebp+20]	クリア範囲の文字色
;
;int	page;		[ebp-4]		VRAMペ−ジのワ−ク
;**************************************************************/
	.globl	_vram_scrool
.align 2
_vram_scrool:
	push	%ebp
	movl	%esp,%ebp

	movl	8(%ebp),%eax
	andl	$0x40000,%eax
	push	%eax

	push	%edi
	push	%esi
	push	%edx
	push	%ecx
	push	%ebx
	push	%es
	push	%ds
	push	%fs

	push	%ds
	pop	%fs

	movzbl	20(%ebp),%eax
	movl	colptn(,%eax,4),%eax
	movl	%eax,20(%ebp)

	movw	VRAMSEL,%ax
	movw	%ax,%es
	movw	%ax,%ds

	movl	8(%ebp),%edi
	movl	%edi,%esi
	addl	$512*16,%esi
	andl	$0x3ffff,%esi
	orl	-4(%ebp),%esi

	movl	$1024,%ebx
	subl	12(%ebp),%ebx
	shrl	$1,%ebx


	movl	12(%ebp),%eax
	shrl	$3,%eax
	movl	%eax,12(%ebp)

	movl	16(%ebp),%edx
vr_lp:	movl	12(%ebp),%ecx
	rep
	movsl
	addl	%ebx,%esi
	andl	$0x3ffff,%esi
	orl	-4(%ebp),%esi
	addl	%ebx,%edi
	andl	$0x3ffff,%edi
	orl	-4(%ebp),%edi
	decl	%edx
	jne	vr_lp

	movl	20(%ebp),%eax
	movl	$16,%edx
vr_cr:	movl	12(%ebp),%ecx
	rep
	stosl
	addl	%ebx,%edi
	andl	$0x3ffff,%edi
	orl	-4(%ebp),%edi
	decl	%edx
	jne	vr_cr

	pop	%fs
	pop	%ds
	pop	%es
	pop	%ebx
	pop	%ecx
	pop	%edx
	pop	%esi
	pop	%edi

	pop	%eax

	pop	%ebp
	ret

/**************************************************************
;
;	下方向に4角枠内を縦16ドットソフトスクロ−ルさせる
;
;【注意】sizeは8ドット単位で転送されるので充分に注意!
;
;void	vram_bk_scr(addr,size,line,bakcol)
;char	*addr;		[ebp+8]		先頭VRAMアドレス
;int	size;		[ebp+12]	横のドット数
;int	line;		[ebp+16]	縦のドット数
;int	bakcol;		[ebp+20]	クリア範囲の文字色
;
;int	page;		[ebp-4]		VRAMペ−ジのワ−ク
;**************************************************************/
	.globl	_vram_bk_scr
_vram_bk_scr:
	push	%ebp
	movl	%esp,%ebp

	movl	8(%ebp),%eax
	andl	$0x40000,%eax
	push	%eax

	push	%edi
	push	%esi
	push	%edx
	push	%ecx
	push	%ebx
	push	%es
	push	%ds
	push	%fs

	push	%ds
	pop	%fs

	movzbl	20(%ebp),%eax
	movl	colptn(,%eax,4),%eax
	movl	%eax,20(%ebp)

	movw	VRAMSEL,%ax
	movw	%ax,%es
	movw	%ax,%ds

	movl	8(%ebp),%esi
	movl	%edi,%edi
	addl	$512*16,%edi
	andl	$0x3ffff,%edi
	orl	-4(%ebp),%edi

	movl	$1024,%ebx
	addl	12(%ebp),%ebx
	shrl	$1,%ebx


	movl	12(%ebp),%eax
	shrl	$3,%eax
	movl	%eax,12(%ebp)

	movl	16(%ebp),%edx
br_lp:	movl	12(%ebp),%ecx
	rep
	movsl
	subl	%ebx,%esi
	andl	$0x3ffff,%esi
	orl	-4(%ebp),%esi
	subl	%ebx,%edi
	andl	$0x3ffff,%edi
	orl	-4(%ebp),%edi
	decl	%edx
	jne	br_lp

	movl	20(%ebp),%eax
	movl	$16,%edx
br_cr:	movl	12(%ebp),%ecx
	rep
	stosl
	subl	%ebx,%edi
	andl	$0x3ffff,%edi
	orl	-4(%ebp),%edi
	decl	%edx
	jne	br_cr

	pop	%fs
	pop	%ds
	pop	%es
	pop	%ebx
	pop	%ecx
	pop	%edx
	pop	%esi
	pop	%edi

	pop	%eax

	pop	%ebp
	ret

/**************************************************************
;
;	4角枠内を指定色でクリアする
;
;【注意】sizeは8ドット単位でクリアされるので充分に注意!
;
;void	vram_cls(addr,size,line,bakcol)
;char	*addr;		[ebp+8]		先頭VRAMアドレス
;int	size;		[ebp+12]	横のドット数
;int	line;		[ebp+16]	縦のドット数
;int	bakcol;		[ebp+20]	背景色
;
;int	page;		[ebp-4]		VRAMペ−ジのワ−ク
;**************************************************************/
	.globl	_vram_cls
_vram_cls:
	push	%ebp
	movl	%esp,%ebp

	movl	8(%ebp),%eax
	andl	$0x40000,%eax
	push	%eax

	push	%edi
	push	%edx
	push	%ecx
	push	%ebx
	push	%es

	movzbl	20(%ebp),%eax
	movl	colptn(,%eax,4),%eax
	movl	%eax,20(%ebp)

	movw	VRAMSEL,%ax
	movw	%ax,%es
	movl	8(%ebp),%edi

	movl	$1024,%ebx
	subl	12(%ebp),%ebx
	shrl	$1,%ebx


	movl	12(%ebp),%eax
	shrl	$3,%eax
	movl	%eax,12(%ebp)

	movl	20(%ebp),%eax
	movl	16(%ebp),%edx
vr_clp:	movl	12(%ebp),%ecx
	rep
	stosl
	addl	%ebx,%edi
	andl	$0x3ffff,%edi
	orl	-4(%ebp),%edi
	decl	%edx
	jne	vr_clp

	pop	%es
	pop	%ebx
	pop	%ecx
	pop	%edx
	pop	%edi

	pop	%eax

	pop	%ebp
	ret

/**************************************************************
;
;	任意のCRTCレジスタに任意のワ−ド値を設定する
;
;void	vram_offset(reg,ofs)
;int	reg;		[ebp+8]		CRTCレジスタNo.
;int	ofs;		[ebp+12]	設定値
;**************************************************************/
	.globl	_vram_offset
_vram_offset:
	push	%ebp
	movl	%esp,%ebp
	push	%edx

	movb	8(%ebp),%al
	movw	$0x440,%dx
	outb	%al,%dx
	movl	12(%ebp),%eax
	movw	$0x442,%dx
	outw	%ax,%dx

	pop	%edx
	pop	%ebp
	ret

/**************************************************************
;
;	ANK文字をイメ−ジ展開してVRAMに転送する
;
;【注意】フォント展開時にVRAMの範囲をこえてはならない!
;
;void	wrt_ank(ch,addr,chrcol,bakcol)
;char	ch;		[ebp+8]		ANK文字コ−ド(0-256)
;int	addr;		[ebp+12]	VRAMアドレス(0-0x3DFFC)
;int	chrcol;		[ebp+16]	文字色
;int	bakcol;		[ebp+20]	背景色
;**************************************************************/
	.globl	_wrt_ank
_wrt_ank:
	push	%ebp
	movl	%esp,%ebp

	push	%fs
	push	%es
	push	%esi
	push	%edi
	push	%edx
	push	%ebx

	movzbl	16(%ebp),%eax
	movl	colptn(,%eax,4),%eax
	movl	%eax,16(%ebp)

	movzbl	20(%ebp),%eax
	movl	colptn(,%eax,4),%eax
	movl	%eax,20(%ebp)

	movw	VRAMSEL,%ax
	movw	%ax,%es
	movw	FONTSEL,%ax
	movw	%ax,%fs

	movzbl	8(%ebp),%esi
	shll	$4,%esi
	addl	$0x3d800,%esi

	movl	12(%ebp),%edi
	movl	$16,%ecx

cwtak1:	movzbl	%fs:(%esi),%eax
	incl	%esi
	movl	fntptn(,%eax,4),%eax
	movl	%eax,%edx
	notl	%edx
	andl	16(%ebp),%eax
	andl	20(%ebp),%edx
	orl	%edx,%eax
	movl	%eax,%es:(%edi)
	addl	$512,%edi
	loop	cwtak1

	pop	%ebx
	pop	%edx
	pop	%edi
	pop	%esi
	pop	%es
	pop	%fs

	pop	%ebp
	ret

/**************************************************************
;
;	SJIS漢字をイメ−ジ展開してVRAMに転送する
;
;【注意】フォント展開時にVRAMの範囲をこえてはならない!
;
;void	wrt_kan(ch,addr,chrcol,bakcol)
;short	ch;		[ebp+8]		SJIS漢字コ−ド
;int	addr;		[ebp+12]	VRAMアドレス(0-0x3DFF9)
;int	chrcol;		[ebp+16]	文字色
;int	bakcol;		[ebp+20]	背景色
;**************************************************************/
	.globl	_wrt_kan
_wrt_kan:
	push	%ebp
	mov	%esp,%ebp

	push	%fs
	push	%gs
	push	%es
	push	%ds
	push	%esi
	push	%edi
	push	%edx
	push	%ebx

	movzbl	16(%ebp),%eax
	movl	colptn(,%eax,4),%eax
	movl	%eax,16(%ebp)

	movzbl	20(%ebp),%eax
	movl	colptn(,%eax,4),%eax
	movl	%eax,20(%ebp)

	movw	VRAMSEL,%ax
	movw	%ax,%es
	movw	FONTSEL,%ax
	movw	%ax,%fs

	movzwl	8(%ebp),%ebx
	shlb	$1,%bh
	cmpb	$0x80,%bl
	adcw	$0x1f61,%bx
	addb	$0x7f,%bl
	jc	cwtkn1
	addb	$0xa2,%bl
cwtkn1:	andb	$0x7f,%bh

	movw	$0x100,%ax
	movw	$0x1010,%dx
	push	%ds
	lcall	%fs:0xa0

	push	%ds
	pop	%gs
	pop	%ds

	movl	12(%ebp),%edi
	movl	$16,%ecx

cwtkn2:	movzbl	%gs:(%esi),%eax
	incl	%esi
	movl	fntptn(,%eax,4),%eax
	movl	%eax,%edx
	notl	%edx
	andl	16(%ebp),%eax
	andl	20(%ebp),%edx
	orl	%edx,%eax
	movl	%eax,%es:(%edi)

	movzbl	%gs:(%esi),%eax
	incl	%esi
	movl	fntptn(,%eax,4),%eax
	movl	%eax,%edx
	notl	%edx
	andl	16(%ebp),%eax
	andl	20(%ebp),%edx
	orl	%edx,%eax
	movl	%eax,%es:4(%edi)

	addl	$512,%edi
	loop	cwtkn2

	pop	%ebx
	pop	%edx
	pop	%edi
	pop	%esi
	pop	%ds
	pop	%es
	pop	%gs
	pop	%fs

	pop	%ebp
	ret

/**************************************************************
;
;	安易なカ−ソルを表示させる
;
;【注意】VRAMの範囲をこえてはならない!
;
;void	wrt_cur(addr,line)
;int	addr;		[esp+4]		VRAMアドレス(0-0x3DFFC)
;int	line;		[esp+8]		縦ライン数
;**************************************************************/
	.globl	_wrt_cur
_wrt_cur:

	movl	4(%esp),%eax
	movl	8(%esp),%ecx

	orl	%ecx,%ecx
	je	wtcule		/* ｶｰｿﾙｻｲｽﾞが０の時はｶｰｿﾙを表示しない */

	push	%fs
	push	%bx

	movw	VRAMSEL,%bx
	movw	%bx,%fs

wtculp:	notl	%fs:(%eax)
	addl	$512,%eax
	loop	wtculp

	pop	%bx
	pop	%fs
wtcule:	ret


/* DIVIDE_END */
