/*
	16 color VRAM charactor dsiplay
		1993.6.19  made by y.ouchi
				algorithm base on Oh FM (1991.3 by Ken)
*/

.data
.align 2
/** VRAM font pattern with color code **/
.lcomm	fntcol,1024

/** color code 4bit/pixel pattern **/
colptn:	.long	0x00000000,0x11111111,0x22222222,0x33333333
		.long	0x44444444,0x55555555,0x66666666,0x77777777
		.long	0x88888888,0x99999999,0xaaaaaaaa,0xbbbbbbbb
		.long	0xcccccccc,0xdddddddd,0xeeeeeeee,0xffffffff

/** 16 color VRAM charactor pattern (4bit/pixel) **/
fntptn:	.long	0x00000000,0xf0000000,0x0f000000,0xff000000	/* 00-03 */
		.long	0x00f00000,0xf0f00000,0x0ff00000,0xfff00000	/* 04-07 */
		.long	0x000f0000,0xf00f0000,0x0f0f0000,0xff0f0000	/* 08-0b */
		.long	0x00ff0000,0xf0ff0000,0x0fff0000,0xffff0000	/* 0c-0f */
		.long	0x0000f000,0xf000f000,0x0f00f000,0xff00f000	/* 10-13 */
		.long	0x00f0f000,0xf0f0f000,0x0ff0f000,0xfff0f000	/* 14-17 */
		.long	0x000ff000,0xf00ff000,0x0f0ff000,0xff0ff000	/* 18-1b */
		.long	0x00fff000,0xf0fff000,0x0ffff000,0xfffff000	/* 1c-1f */
		.long	0x00000f00,0xf0000f00,0x0f000f00,0xff000f00	/* 20-23 */
		.long	0x00f00f00,0xf0f00f00,0x0ff00f00,0xfff00f00	/* 24-27 */
		.long	0x000f0f00,0xf00f0f00,0x0f0f0f00,0xff0f0f00	/* 28-2b */
		.long	0x00ff0f00,0xf0ff0f00,0x0fff0f00,0xffff0f00	/* 2c-2f */
		.long	0x0000ff00,0xf000ff00,0x0f00ff00,0xff00ff00	/* 30-33 */
		.long	0x00f0ff00,0xf0f0ff00,0x0ff0ff00,0xfff0ff00	/* 34-37 */
		.long	0x000fff00,0xf00fff00,0x0f0fff00,0xff0fff00	/* 38-3b */
		.long	0x00ffff00,0xf0ffff00,0x0fffff00,0xffffff00	/* 3c-3f */
		.long	0x000000f0,0xf00000f0,0x0f0000f0,0xff0000f0	/* 40-43 */
		.long	0x00f000f0,0xf0f000f0,0x0ff000f0,0xfff000f0	/* 44-47 */
		.long	0x000f00f0,0xf00f00f0,0x0f0f00f0,0xff0f00f0	/* 48-4b */
		.long	0x00ff00f0,0xf0ff00f0,0x0fff00f0,0xffff00f0	/* 4c-4f */
		.long	0x0000f0f0,0xf000f0f0,0x0f00f0f0,0xff00f0f0	/* 50-53 */
		.long	0x00f0f0f0,0xf0f0f0f0,0x0ff0f0f0,0xfff0f0f0	/* 54-57 */
		.long	0x000ff0f0,0xf00ff0f0,0x0f0ff0f0,0xff0ff0f0	/* 58-5b */
		.long	0x00fff0f0,0xf0fff0f0,0x0ffff0f0,0xfffff0f0	/* 5c-5f */
		.long	0x00000ff0,0xf0000ff0,0x0f000ff0,0xff000ff0	/* 60-43 */
		.long	0x00f00ff0,0xf0f00ff0,0x0ff00ff0,0xfff00ff0	/* 64-47 */
		.long	0x000f0ff0,0xf00f0ff0,0x0f0f0ff0,0xff0f0ff0	/* 68-4b */
		.long	0x00ff0ff0,0xf0ff0ff0,0x0fff0ff0,0xffff0ff0	/* 6c-4f */
		.long	0x0000fff0,0xf000fff0,0x0f00fff0,0xff00fff0	/* 70-73 */
		.long	0x00f0fff0,0xf0f0fff0,0x0ff0fff0,0xfff0fff0	/* 74-77 */
		.long	0x000ffff0,0xf00ffff0,0x0f0ffff0,0xff0ffff0	/* 78-7b */
		.long	0x00fffff0,0xf0fffff0,0x0ffffff0,0xfffffff0	/* 7c-7f */
		.long	0x0000000f,0xf000000f,0x0f00000f,0xff00000f	/* 80-83 */
		.long	0x00f0000f,0xf0f0000f,0x0ff0000f,0xfff0000f	/* 84-87 */
		.long	0x000f000f,0xf00f000f,0x0f0f000f,0xff0f000f	/* 88-8b */
		.long	0x00ff000f,0xf0ff000f,0x0fff000f,0xffff000f	/* 8c-8f */
		.long	0x0000f00f,0xf000f00f,0x0f00f00f,0xff00f00f	/* 90-93 */
		.long	0x00f0f00f,0xf0f0f00f,0x0ff0f00f,0xfff0f00f	/* 94-97 */
		.long	0x000ff00f,0xf00ff00f,0x0f0ff00f,0xff0ff00f	/* 98-9b */
		.long	0x00fff00f,0xf0fff00f,0x0ffff00f,0xfffff00f	/* 9c-9f */
		.long	0x00000f0f,0xf0000f0f,0x0f000f0f,0xff000f0f	/* a0-a3 */
		.long	0x00f00f0f,0xf0f00f0f,0x0ff00f0f,0xfff00f0f	/* a4-a7 */
		.long	0x000f0f0f,0xf00f0f0f,0x0f0f0f0f,0xff0f0f0f	/* a8-ab */
		.long	0x00ff0f0f,0xf0ff0f0f,0x0fff0f0f,0xffff0f0f	/* ac-af */
		.long	0x0000ff0f,0xf000ff0f,0x0f00ff0f,0xff00ff0f	/* b0-b3 */
		.long	0x00f0ff0f,0xf0f0ff0f,0x0ff0ff0f,0xfff0ff0f	/* b4-b7 */
		.long	0x000fff0f,0xf00fff0f,0x0f0fff0f,0xff0fff0f	/* b8-bb */
		.long	0x00ffff0f,0xf0ffff0f,0x0fffff0f,0xffffff0f	/* bc-bf */
		.long	0x000000ff,0xf00000ff,0x0f0000ff,0xff0000ff	/* c0-c3 */
		.long	0x00f000ff,0xf0f000ff,0x0ff000ff,0xfff000ff	/* c4-c7 */
		.long	0x000f00ff,0xf00f00ff,0x0f0f00ff,0xff0f00ff	/* c8-cb */
		.long	0x00ff00ff,0xf0ff00ff,0x0fff00ff,0xffff00ff	/* cc-cf */
		.long	0x0000f0ff,0xf000f0ff,0x0f00f0ff,0xff00f0ff	/* d0-d3 */
		.long	0x00f0f0ff,0xf0f0f0ff,0x0ff0f0ff,0xfff0f0ff	/* d4-d7 */
		.long	0x000ff0ff,0xf00ff0ff,0x0f0ff0ff,0xff0ff0ff	/* d8-db */
		.long	0x00fff0ff,0xf0fff0ff,0x0ffff0ff,0xfffff0ff	/* dc-df */
		.long	0x00000fff,0xf0000fff,0x0f000fff,0xff000fff	/* e0-e3 */
		.long	0x00f00fff,0xf0f00fff,0x0ff00fff,0xfff00fff	/* e4-e7 */
		.long	0x000f0fff,0xf00f0fff,0x0f0f0fff,0xff0f0fff	/* e8-eb */
		.long	0x00ff0fff,0xf0ff0fff,0x0fff0fff,0xffff0fff	/* ec-ef */
		.long	0x0000ffff,0xf000ffff,0x0f00ffff,0xff00ffff	/* f0-f3 */
		.long	0x00f0ffff,0xf0f0ffff,0x0ff0ffff,0xfff0ffff	/* f4-f7 */
		.long	0x000fffff,0xf00fffff,0x0f0fffff,0xff0fffff	/* f8-fb */
		.long	0x00ffffff,0xf0ffffff,0x0fffffff,0xffffffff	/* fc-ff */

.text
/*
	charactor color & back color table set
		void	ctblset(chrcol,backcol);
		int		chrcol : charactor color(0-15)
		int		backcol: back color(0-15)
*/
	.align	4
.globl	_ctblset
_ctblset:
	pushl	%ebp
	movl	%esp,%ebp

	pushl	%esi
	pushl	%edi

	movzbl	8(%ebp),%eax
	andl	$0x0000000f,%eax
	shll	$2,%eax
	movl	colptn(%eax),%eax
	movl	%eax,8(%ebp)

	movzbl	12(%ebp),%eax
	andl	$0x0000000f,%eax
	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

	popl	%edi
	popl	%esi
	popl	%ebp
	ret

/*
	sjis KANJI charactor write to VRAM from color font table
		void	cwrt_kan(ch,addr);
		int		ch  : sjis charactor code
		int		addr: VRAM address
*/
	.align	4
.globl	_cwrt_kan
_cwrt_kan:
	pushl	%ebp
	movl	%esp,%ebp

	pushl	%fs
	pushl	%gs
	pushl	%es
	pushl	%ds
	pushl	%esi
	pushl	%edi
	pushl	%edx
	pushl	%ebx

	movw	$0x104,%ax
	movw	%ax,%es
	movw	$0x110,%ax
	movw	%ax,%fs
	movw	%ds,%ax
	movw	%ax,%gs

	movl	8(%ebp),%ebx
	movb	$0x02,%ah
	lcall	%fs:0xa0

	movw	$0x100,%ax
	movw	$0x1010,%dx
	lcall	%fs:0xa0

	movl	%ss:12(%ebp),%edi
	movl	$fntcol,%ebx

	movl	$16,%ecx

wt_kn1:	movw	%ds:(%esi),%ax
	xorl	%edx,%edx
	movb	%al,%dl
	movl	%gs:(%ebx,%edx,4),%edx
	movl	%edx,%es:(%edi)
	xorl	%edx,%edx
	movb	%ah,%dl
	movl	%gs:(%ebx,%edx,4),%edx
	movl	%edx,%es:4(%edi)
	addl	$2,%esi
	addl	$512,%edi
	decl	%ecx
	jne		wt_kn1

	popl	%ebx
	popl	%edx
	popl	%edi
	popl	%esi
	popl	%ds
	popl	%es
	popl	%gs
	popl	%fs
	popl	%ebp
	ret

/*
	ank charactor write to VRAM from color font table
		void	cwrt_ank(ch,addr);
		int		ch  : ank charactor code
		int		addr: VRAM address
*/
	.align	4
.globl	_cwrt_ank
_cwrt_ank:
	pushl	%ebp
	movl	%esp,%ebp

	pushl	%fs
	pushl	%gs
	pushl	%es
	pushl	%ds
	pushl	%esi
	pushl	%edi
	pushl	%edx
	pushl	%ebx

	movw	$0x104,%ax
	movw	%ax,%es
	movw	$0x110,%ax
	movw	%ax,%fs
	movw	%ds,%ax
	movw	%ax,%gs

	movl	8(%ebp),%ebx

	movw	$0x000,%ax
	movw	$0x0810,%dx
	lcall	%fs:0xa0

	movl	%ss:12(%ebp),%edi
	movl	$fntcol,%ebx

	movl	$16,%ecx

wt_ak1:	movb	%ds:(%esi),%al
	xorl	%edx,%edx
	movb	%al,%dl
	movl	%gs:(%ebx,%edx,4),%edx
	movl	%edx,%es:(%edi)
	incl	%esi
	addl	$512,%edi
	decl	%ecx
	jne		wt_ak1

	popl	%ebx
	popl	%edx
	popl	%edi
	popl	%esi
	popl	%ds
	popl	%es
	popl	%gs
	popl	%fs
	popl	%ebp
	ret

