;*************************************************************************
;	_vram_getblock
;*************************************************************************

		.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'


;*************************************************************************
;	VRAMの内容をバッファに転送する
;	_vram_getblock
;	         +8
;*************************************************************************

		align	4
		public	_vram_getblock
_vram_getblock	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	EBX,[EBP.yc]
		mov	EAX,[EBP.xc]
		shl	EAX,2			;EAX = xc * 4
_lp_top:
		mov	ECX,[EBP.xc]		;ECX = xc
		align	4
		rep movsd
		dec	EBX
		je	_lp_exit
		mov	ESI,[EBP.adrVram]
		add	ESI,[EBP.xbVram]
		mov	[EBP.adrVram],ESI
		mov	EDI,[EBP.buf]
		add	EDI,EAX
		mov	[EBP.buf],EDI
		jmp	_lp_top
_lp_exit:
		pop	DS
		pop	ES
		pop	ESI
		pop	EDI
		pop	ECX
		pop	EBX
		pop	EBP
		ret

_vram_getblock	endp


;*************************************************************************
;	バッファ内容をVRAMに転送する
;	_vram_putblock
;	         +8
;*************************************************************************

		align	4
		public	_vram_putblock
_vram_putblock	proc	near
		push	EBP
		mov	EBP,ESP
		push	EBX
		push	ECX
		push	EDI
		push	ESI
		push	ES

		mov	EBP,[EBP+8]		;EBP = para

		mov	EAX,[EBP.segVram]
		mov	ES,AX			;ES = segVram

		mov	ESI,[EBP.buf]		;ESI = buf
		mov	EDI,[EBP.adrVram]	;EDI = adrVram
		mov	EBX,[EBP.yc]
		mov	EAX,[EBP.xc]
		add	EAX,[EBP.xc]
		add	EAX,[EBP.xc]
		add	EAX,[EBP.xc]		;EAX = xc * 4
_lp_top2:
		mov	ECX,[EBP.xc]		;ECX = xc
		align	4
		rep movsd
		dec	EBX
		je	_lp_exit2
		mov	ESI,[EBP.buf]
		add	ESI,EAX
		mov	[EBP.buf],ESI
		mov	EDI,[EBP.adrVram]
		add	EDI,[EBP.xbVram]
		mov	[EBP.adrVram],EDI
		jmp	_lp_top2
_lp_exit2:
		pop	ES
		pop	ESI
		pop	EDI
		pop	ECX
		pop	EBX
		pop	EBP
		ret

_vram_putblock	endp

SCN		ends

		end

