/* DIVIDE_START=cons.s */
/**************************************************************
;
;	コンンソ−ル割り込み設定ル−チン
;
;	1991.01.01	Make by Ken
;
;**************************************************************/

/**************************************************************
;	各種値の設定
;**************************************************************/
#define CONBIOS	$0x29		/* 割り込むベクタ番号 */
#define STACK_SIZE (10*1024)	/* ロ−カルスタックサイズ */

/**************************************************************
;	外部参照関数の定義
;**************************************************************
extrn	CON_bios:near				; メインのコンソ−ル関数
*/


.lcomm nt_vet_off,4
.lcomm nt_vet_seg,2

.lcomm rl_vet_ral,4

.lcomm save_esp,4
.lcomm save_ss,2

.lcomm stack_flg,2

.lcomm new_esp,4
.lcomm new_ss,2

consol_path:	.asciz	"CON"
null_path:	.asciz	"NUL"

break_flg:	.byte	0

	.align	2
.lcomm local_stack,STACK_SIZE
.lcomm local_stack_btm,2

/***************************************************
;
;	割り込み処理ル−チン
;
;***************************************************/
CON_bios_entry:

	cmpw	$0,stack_flg
	jne	go_ret
	incw	stack_flg

	movl	%esp,save_esp
	movw	%ss,save_ss
	lss	new_esp,%esp
	pushal

	sti
	cld
	push	%ds
	pop	%es

	movl	%esp,%ebp
	push	%ebp
	call	_CON_bios
	addl	$4,%esp

	popal
	lss	save_esp,%esp
	decw	stack_flg
go_ret:	iretl



/**************************************************************
;
;	ファイルのリダイレクト処理
;
; al	=	ファイルのオ−プンモ−ド
; bx	=	ファイルパス番号
; edx	=	NEWデバイスネ−ム
;
;**************************************************************/
reopen:
	push	%ax
	movb	$0x3e,%ah
	int	$0x21
	pop	%ax
	movb	$0x3d,%ah
	int	$0x21
reo_ret:ret


/**************************************************************
;
;	コンソ−ル割り込みの設定及び標準入出力の設定
;
;
;void	CON_bios_set(void)
;
;**************************************************************/
	.globl	_CON_bios_set
_CON_bios_set:

	push	%ds
	push	%es
	push	%ebx
	push	%edx

	movw	%ds,new_ss
	leal	local_stack_btm,%ebx
	movl	%ebx,new_esp

	movw	$0x2502,%ax
	movb	CONBIOS,%cl
	int	$0x21
	movw	%es,nt_vet_seg
	movl	%ebx,nt_vet_off

	movw	$0x2503,%ax
	movb	CONBIOS,%cl
	int	$0x21
	movl	%ebx,rl_vet_ral

	movw	$0x2506,%ax
	movb	CONBIOS,%cl
	push	%ds
	movw	%cs,%dx
	movw	%dx,%ds
	leal	CON_bios_entry,%edx
	int	$0x21
	pop	%ds

	movb    $0,%al
	movw    $0,%bx
	leal    consol_path,%edx
	call    reopen
	movb    $1,%al
	movw    $1,%bx
	call    reopen
	movb    $1,%al
	movw    $2,%bx
	call    reopen

	movw	$0x3300,%ax
	int	$0x21
	movb	%dl,break_flg

	movw	$0x3301,%ax
	movb	$0,%dl
	int	$0x21

	pop	%edx
	pop	%ebx
	pop	%es
	pop	%ds
	ret


/**************************************************************
;
;	コンソ−ル割り込みを元に戻し標準入出力をNULにする
;
;void	CON_bios_ret(void)
;
;**************************************************************/
	.globl	_CON_bios_ret
_CON_bios_ret:

	push	%ds
	push	%ebx
	push	%edx

	movb	CONBIOS,%cl
	movl	rl_vet_ral,%ebx
	movl	nt_vet_off,%edx
	movw	nt_vet_seg,%ax
	push	%ds
	movw	%ax,%ds
	movw	$0x2507,%ax
	int	$0x21
	pop	%ds

	movb	$0,%al
	movw	$0,%bx
	leal	null_path,%edx
	call	reopen
	movb	$1,%al
	movw	$1,%bx
	call	reopen
	movb	$1,%al
	movw	$2,%bx
	call	reopen

	movw	$0x3301,%ax
	movb	break_flg,%dl
	int	$0x21

	pop	%edx
	pop	%ebx
	pop	%ds
	ret

/**************************************************************
;	アセンブラル−チンの終了
;**************************************************************/
/* DIVIDE_END */

/* 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 */

/* DIVIDE_START=egb_b2.s */
/*
	T-BIOS Graphics Library
		for GNU assembler
	            by Waku Factory
             90/03/20 Ver 1.0
	     90/10/11     1.2
*/
	.globl _EGB_getBlockColor
	.globl _EGB_putBlockColor
	.globl _EGB_getBlock
	.globl _EGB_putBlock
	.globl _EGB_getBlockZoom
	.globl _EGB_putBlockZoom


	.data
	.text
/****************************************
     EGB  block operation  2 / 3
 ****************************************/

/*
	EGB_getBlockColor( char *gwork, char *param ) 矩形領域読みだし(色指定)
*/
	.align 4
_EGB_getBlockColor:
	push  %edi
	push  %esi
	movl  16(%esp),%esi
	movb  $0x22,%ah
	movl  12(%esp),%edi
	push  $0x0110
	pop   %fs
	lcall %fs:(0x20)
	movsbl %ah,%eax
	pop   %esi
	pop   %edi
	ret

/*
	EGB_putBlockColor( char *gwork,int clip, char *param ) 矩形領域書き込み(色指定)
*/
	.align 4
_EGB_putBlockColor:
	push  %edi
	push  %esi
	movw  16(%esp),%al
	movl  20(%esp),%esi
	movb  $0x23,%ah
	movl  12(%esp),%edi
	push  $0x0110
	pop   %fs
	lcall %fs:(0x20)
	movsbl %ah,%eax
	pop   %esi
	pop   %edi
	ret

/*
	EGB_getBlock( char *gwork,char *param ) 矩形領域読みだし(フルカラー)
*/
	.align 4
_EGB_getBlock:
	push  %edi
	push  %esi
	movl  16(%esp),%esi
	movb  $0x24,%ah
	movl  12(%esp),%edi
	push  $0x0110
	pop   %fs
	lcall %fs:(0x20)
	movsbl %ah,%eax
	pop   %esi
	pop   %edi
	ret

/*
	EGB_putBlock( char *gwork, int clip, char *param ) 矩形領域書き込み(フルカラー)
*/
	.align 4
_EGB_putBlock:
	push  %edi
	push  %esi
	movb  16(%esp),%al
	movl  20(%esp),%esi
	movb  $0x25,%ah
	movl  12(%esp),%edi
	push  $0x0110
	pop   %fs
	lcall %fs:(0x20)
	movsbl %ah,%eax
	pop   %esi
	pop   %edi
	ret

/*
	EGB_getBlockZoom( char *gwork, char *param ) 矩形領域読みだし(ズーム付)
*/
	.align 4
_EGB_getBlockZoom:
	push  %edi
	push  %esi
	movl  16(%esp),%esi
	movb  $0x26,%ah
	movl  12(%esp),%edi
	push  $0x0110
	pop   %fs
	lcall %fs:(0x20)
	movsbl %ah,%eax
	pop   %esi
	pop   %edi
	ret

/*
	EGB_putBlockZoom( char *gwork,int clip, char *param ) 矩形領域書き込み(ズーム付)
*/
	.align 4
_EGB_putBlockZoom:
	push  %edi
	push  %esi
	movb  16(%esp),%al
	movl  20(%esp),%esi
	movb  $0x27,%ah
	movl  12(%esp),%edi
	push  $0x0110
	pop   %fs
	lcall %fs:(0x20)
	movsbl %ah,%eax
	pop   %esi
	pop   %edi
	ret
/* DIVIDE_END */

/* DIVIDE_START=vram.s */
/***************************************************************
;
;	16色VRAM文字表示下位ル−チン
;
;	1991.01.01	Make by 山先
;
;***************************************************************/

/**************************************************************
;	セレクタ値の定義
;**************************************************************/
#define VRAMSEL	$0x104

/**************************************************************
;
;	4角枠内のデータをロードする
;
;	VRAM → data
;
;【注意】sizeは8ドット単位でロードされるので充分に注意!
;
;void	_vram_load(addr,size,line,data)
;int	addr;		[ebp+8]		先頭VRAMアドレス
;int	size;		[ebp+12]	横のドット数
;int	line;		[ebp+16]	縦のドット数
;char	*data;		[ebp+20]	ロードするアドレス
;
;int	page;		[ebp-4]		VRAMペ−ジのワ−ク
;**************************************************************/
	.globl	__vram_load
__vram_load:
	push	%ebp
	movl	%esp,%ebp

	movl	8(%ebp),%eax		/* 先頭VRAMアドレス */
	andl	$0x40000,%eax
	push	%eax			/* page */

	push	%edi
	push	%esi
	push	%edx
	push	%ecx
	push	%ebx
	push	%es
	push	%ds
	push	%fs

	push	%ds
	pop	%fs

	movw	VRAMSEL,%ax
	movw	%ax,%ds			/* DS:ESI → ES:EDI */

	movl	20(%ebp),%edi		/* 保存するアドレス */

	movl	8(%ebp),%esi		/* 先頭VRAMアドレス */
	andl	$0x3ffff,%esi
	orl	-4(%ebp),%esi		/* page */

	movl	$1024,%ebx
	subl	12(%ebp),%ebx		/* 横のドット数 */
	shrl	$1,%ebx			/* 丸める */


	movl	12(%ebp),%eax		/* 横のドット数 */
	shrl	$3,%eax			/* 8ドットに丸める */
	movl	%eax,12(%ebp)		/* 横のドット数 */

	movl	16(%ebp),%edx		/* 縦のドット数 */
vr_lad:	movl	12(%ebp),%ecx		/* 繰り返しの数 */
	rep
	movsl
	addl	%ebx,%esi		/* 転送元(VRAM) */
	andl	$0x3ffff,%esi
	orl	-4(%ebp),%esi
	decl	%edx
	jne	vr_lad

	pop	%fs
	pop	%ds
	pop	%es
	pop	%ebx
	pop	%ecx
	pop	%edx
	pop	%esi
	pop	%edi

	pop	%eax

	pop	%ebp
	ret

/**************************************************************
;
;	4角枠内のデータをセーブする
;
;	data → VRAM
;
;【注意】sizeは8ドット単位でセーブされるので充分に注意!
;
;void	_vram_save(addr,size,line,data)
;int	addr;		[ebp+8]		先頭VRAMアドレス
;int	size;		[ebp+12]	横のドット数
;int	line;		[ebp+16]	縦のドット数
;char	*data;		[ebp+20]	ロードするアドレス
;
;int	page;		[ebp-4]		VRAMペ−ジのワ−ク
;**************************************************************/
	.globl	__vram_save
__vram_save:
	push	%ebp
	movl	%esp,%ebp

	movl	8(%ebp),%eax		/* 先頭VRAMアドレス */
	andl	$0x40000,%eax
	push	%eax			/* page */

	push	%edi
	push	%esi
	push	%edx
	push	%ecx
	push	%ebx
	push	%es
	push	%ds
	push	%fs

	push	%ds
	pop	%fs

	movw	VRAMSEL,%ax
	movw	%ax,%es			/* DS:ESI → ES:EDI */

	movl	20(%ebp),%esi		/* セーブするデータのアドレス */

	movl	8(%ebp),%edi		/* 先頭VRAMアドレス */
	andl	$0x3ffff,%edi
	orl	-4(%ebp),%edi		/* page */

	movl	$1024,%ebx
	subl	12(%ebp),%ebx		/* 横のドット数 */
	shrl	$1,%ebx			/* 丸める */


	movl	12(%ebp),%eax		/* 横のドット数 */
					/* 8ドット単位で転送するので */
	shrl	$3,%eax			/* 8ドットに丸める */
	movl	%eax,12(%ebp)		/* 横のドット数 */

	movl	16(%ebp),%edx		/* 縦のドット数 */
vr_sav:	movl	12(%ebp),%ecx		/* 繰り返しの数 */
	rep
	movsl
	addl	%ebx,%edi		/* 転送先(VRAM) */
	andl	$0x3ffff,%edi
	orl	-4(%ebp),%edi
	decl	%edx
	jne	vr_sav

	pop	%fs
	pop	%ds
	pop	%es
	pop	%ebx
	pop	%ecx
	pop	%edx
	pop	%esi
	pop	%edi

	pop	%eax

	pop	%ebp
	ret

/* DIVIDE_END */

