;*************************************************************************
;	_vramroll
;*************************************************************************

		.386p
		assume	cs:SCN

para_s		STRUC
segVram		dd	?	;VRAM セグメント
adrVram		dd	?	;VRAM 書き込み開始アドレス	（破壊）
xbVram		dd	?	;VRAM 横バイト数
xc		dd	?	;Ｘカウント
yc		dd	?	;Ｙカウント
buf		dd	?	;作業バッファ
para_s		ends

SCN		segment	dword 'CODE'


;*************************************************************************
;	_vramroll
;	         +8
;*************************************************************************

		align	4
		public	_vramroll
_vramroll	proc	near
		push	EBP
		mov	EBP,ESP
		push	EBX
		push	ECX
		push	EDI
		push	ESI
		push	ES
		push	DS

		mov	EBP,[EBP+8]		;EBP = para

;		第１ライン
		mov	AX,DS
		mov	ES,AX			;ES = DS
		mov	EAX,[EBP.segVram]
		mov	DS,AX			;DS = segVram
		mov	ESI,[EBP.adrVram]	;ESI = adrVram
		mov	EDI,[EBP.buf]		;EDI = buf
		mov	ECX,[EBP.xc]		;ECX = xc
		align	4
		rep movsd

		mov	EBX,[EBP.yc];		;EBX = yc
		dec	EBX			;EBX = yc - 1

;		第２ライン以降
		mov	DS,AX
		mov	ES,AX			;DS = ES = segVram
		align	4
_lp:
		mov	EDI,[EBP.adrVram]
		mov	ESI,EDI
		add	ESI,[EBP.xbVram]
		mov	[EBP.adrVram],ESI
		mov	ECX,[EBP.xc]		;ECX = xc
		align	4
		rep movsd

		dec	EBX
		jne	_lp

;		最終ライン
		pop	DS
		mov	ESI,[EBP.buf]
		mov	EDI,[EBP.adrVram]
		mov	ECX,[EBP.xc]		;ECX = xc
		align	4
		rep movsd

		pop	ES
		pop	ESI
		pop	EDI
		pop	ECX
		pop	EBX
		pop	EBP
		ret

_vramroll	endp

SCN		ends

		end

