/* 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 */
