;		ブロック転送 
;		PUT:BUFFER → VRAM
;		GET:VRAM → BUFFER
;		1991 1/13  Hiroshi TODA
;

	.386p

work	struc
			;para area
buffer	dd	?		; BUFFER アドレス
vram	dd	?		; VRAM アドレス
vseg	dd	?		; VRAM セグメント レジスタ
count	dd	?		; 転送 BYTE 数
			;work area
				; count = 4*count1 + count2
count1	dd	?		; countを4で割ったもの
count2	dd	?		; countを4で割った余り

work	ends

cseg	segment	dword public use32 'CODE'
	assume	cs:cseg,ds:cseg

;int PutBrock(char *work,int para[])
;char *work = 24BYTE以上
;int para[] = { 転送元アドレス, VRAMアドレス, VRAMセグメント, 転送BYTE数 }
;出力 = 常に0を返す

	public	putbrock
	db	'putbrock',8
putbrock proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx
	mov	esi,[ebp+8]		; esi = work のアドレス
	mov	edi,[ebp+12]		; edi = para のアドレス
	xor	ecx,ecx			; ecx = カウンター
putb01:	mov	eax,[edi][ecx*4]	; para から work に引数転送
	mov	[esi][ecx*4],eax
	inc	ecx
	cmp	ecx,4			; 引数の数は4つ
	jb	putb01
	mov	eax,[esi].count		; count1の設定
	shr	eax,2
	mov	[esi].count1,eax
	mov	eax,[esi].count		; count2の設定
	and	eax,03h
	mov	[esi].count2,eax
	push	es			; esをスタックに退避
	mov	eax,[esi].vseg		; es=VRAMセグメントレジスタ
	mov	es,ax
	mov	ecx,[esi].count1	; count set
	mov	edx,[esi].count2
	mov	edi,[esi].vram		; es:[edi]=vram
	mov	esi,[esi].buffer	; ds:[esi]=buffer
	cld				; ブロック転送
	rep	movsd			; dword転送
	mov	ecx,edx
	rep	movsb			; byte転送
	pop	es			; esを元に戻す
	xor	eax,eax			; 常に0を返す
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
putbrock endp

;int GetBrock(char *work,int para[])
;char *work = 24BYTE以上
;int para[] = { 転送先アドレス, VRAMアドレス, VRAMセグメント, 転送BYTE数 }
;出力 = 常に0を返す

	public	getbrock
	db	'getbrock',8
getbrock proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx
	mov	esi,[ebp+8]		; esi = work のアドレス
	mov	edi,[ebp+12]		; edi = para のアドレス
	xor	ecx,ecx			; ecx = カウンター
getb01:	mov	eax,[edi][ecx*4]	; para から work に引数転送
	mov	[esi][ecx*4],eax
	inc	ecx
	cmp	ecx,4			; 引数の数は4つ
	jb	getb01
	mov	eax,[esi].count		; count1の設定
	shr	eax,2
	mov	[esi].count1,eax
	mov	eax,[esi].count		; count2の設定
	and	eax,03h
	mov	[esi].count2,eax
	push	es			; esをスタックに退避
	mov	ax,ds			; es=ds(HCではこの作業は
	mov	es,ax			; なくてもよいが念のため)
	mov	eax,[esi].vseg		; fs=VRAMセグメントレジスタ
	mov	fs,ax
	mov	ecx,[esi].count1	; count set
	mov	edx,[esi].count2
	mov	edi,[esi].buffer	; es:[edi]=buffer
	mov	esi,[esi].vram		; fs:[esi]=vram
	cld				; ブロック転送
	rep	movs dword ptr [edi],fs:[esi]	; dword 転送
	mov	ecx,edx
	rep	movs byte ptr [edi],fs:[esi]	; byte 転送
	pop	es			; esを元に戻す
	xor	eax,eax			; 常に0を返す
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
getbrock endp

cseg	ends
	end
