;		v00 vram → buffer
;		表示モード16専用転送ルーチン
;		1993 2/10  Hiroshi TODA

	.386p

extrn	VSYNC_counter	:	dword

public	v00_digit_buf0
public	v00_digit_buf1
public	v00_digit_timing_flag0
public	v00_digit_timing_flag1
public	v00_digit_timing_flag2
public	v00_digit_wait
public	v00_digit_counter

;-------------------------------------------

DGROUP		group	v00_data

v00_data	segment dword public 'DATA' use32

v00_digit_buf0		dd	?
v00_digit_buf1		dd	?
v00_digit_timing_flag0	dd	?
v00_digit_timing_flag1	dd	?
v00_digit_timing_flag2	dd	?
v00_digit_wait		dd	?
v00_digit_counter	dd	?

v00_data	ends

;-------------------------------------------

cseg	segment	dword public use32 'CODE'
	assume	cs:cseg,ds:cseg

;int v00_trans_128_0()

	public	v00_trans_128_0
	db	'v00_trans_128_0',15
v00_trans_128_0	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	cmp	ds:v00_digit_timing_flag0,0
	jne	short #vd10
	mov	eax,ds:v00_digit_wait
	cmp	eax,VSYNC_counter
	ja	short #vd10
	sub	VSYNC_counter,eax
	inc	ds:v00_digit_timing_flag0
	mov	edi,ds:v00_digit_buf0	; buffer -> edi
	mov	ax,10ch
	mov	fs,ax
	mov	esi,32+1024*4*12
	xor	ecx,ecx
	mov	edx,96
#vd01:	mov	cl,64			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	add	esi,1024*4-256
	dec	edx
	jne	short #vd01
#vd10:	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_trans_128_0	endp

;int v00_trans_160_0()

	public	v00_trans_160_0
	db	'v00_trans_160_0',15
v00_trans_160_0	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	cmp	ds:v00_digit_timing_flag0,0
	jne	short #vd10
	mov	eax,ds:v00_digit_wait
	cmp	eax,VSYNC_counter
	ja	short #vd10
	sub	VSYNC_counter,eax
	inc	ds:v00_digit_timing_flag0
	mov	edi,ds:v00_digit_buf0	; buffer -> edi
	mov	ax,10ch
	mov	fs,ax
	mov	esi,0
	xor	ecx,ecx
	mov	edx,120
#vd01:	mov	cl,80			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	add	esi,1024*4-320
	dec	edx
	jne	short #vd01
#vd10:	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_trans_160_0	endp

;int v00_trans_192_0()

	public	v00_trans_192_0
	db	'v00_trans_192_0',15
v00_trans_192_0	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	cmp	ds:v00_digit_timing_flag0,0
	jne	short #vd10
	mov	eax,ds:v00_digit_wait
	cmp	eax,VSYNC_counter
	ja	short #vd10

	push	eax
	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	pop	eax
	je	short #vd10

	sub	VSYNC_counter,eax
	inc	ds:v00_digit_timing_flag0
	mov	edi,ds:v00_digit_buf0	; buffer -> edi
	mov	ax,10ch
	mov	fs,ax
	mov	esi,128+1024*2*48
	xor	ecx,ecx
	mov	edx,144
#vd01:	mov	cl,96			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	add	esi,1024*2-384
	dec	edx
	jne	short #vd01
#vd10:	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_trans_192_0	endp

;int v00_trans_256_0()

	public	v00_trans_256_0
	db	'v00_trans_256_0',15
v00_trans_256_0	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	cmp	ds:v00_digit_timing_flag0,0
	jne	short #vd10
	mov	eax,ds:v00_digit_wait
	cmp	eax,VSYNC_counter
	ja	short #vd10

	push	eax
	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	pop	eax
	je	short #vd10

	sub	VSYNC_counter,eax
	inc	ds:v00_digit_timing_flag0
	mov	edi,ds:v00_digit_buf0	; buffer -> edi
	mov	ax,10ch
	mov	fs,ax
	mov	esi,64+1024*2*24
	xor	ecx,ecx
	mov	edx,192
#vd01:	mov	cl,128			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	add	esi,1024*2-512
	dec	edx
	jne	short #vd01
#vd10:	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_trans_256_0	endp

;int v00_trans_320_0()

	public	v00_trans_320_0
	db	'v00_trans_320_0',15
v00_trans_320_0	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	cmp	ds:v00_digit_timing_flag0,0
	jne	short #vd10
	mov	eax,ds:v00_digit_wait
	cmp	eax,VSYNC_counter
	ja	short #vd10

	push	eax
	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	pop	eax
	je	short #vd10

	sub	VSYNC_counter,eax
	inc	ds:v00_digit_timing_flag0
	mov	edi,ds:v00_digit_buf0	; buffer -> edi
	mov	ax,10ch
	mov	fs,ax
	mov	esi,0
	xor	ecx,ecx
	mov	edx,240
#vd01:	mov	cl,160			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	add	esi,1024*2-640
	dec	edx
	jne	short #vd01
#vd10:	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_trans_320_0	endp

;int v00_trans_128_2()

	public	v00_trans_128_2
	db	'v00_trans_128_2',15
v00_trans_128_2	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	cmp	ds:v00_digit_timing_flag1,0
	jne	#vd05

	cmp	ds:v00_digit_timing_flag0,0
	jne	#vd10
	mov	eax,ds:v00_digit_wait
	cmp	eax,VSYNC_counter
	ja	#vd10
	sub	VSYNC_counter,eax
	inc	ds:v00_digit_timing_flag0
	mov	edi,ds:v00_digit_buf0	; buffer -> edi
	mov	ax,10ch
	mov	fs,ax
	mov	esi,32+1024*4*12
	xor	ecx,ecx
	mov	edx,96
#vd01:	mov	cl,64			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	add	esi,1024*4-256
	dec	edx
	jne	short #vd01
	jmp	#vd09

#vd05:	cmp	ds:v00_digit_timing_flag2,0
	jne	short #vd10
	mov	eax,ds:v00_digit_wait
	cmp	eax,VSYNC_counter
	ja	short #vd10
	sub	VSYNC_counter,eax
	inc	ds:v00_digit_timing_flag2
	mov	edi,ds:v00_digit_buf1	; buffer -> edi
	mov	ax,10ch
	mov	fs,ax
	mov	esi,32+1024*4*12
	xor	ecx,ecx
	mov	edx,96
#vd06:	mov	cl,64			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	add	esi,1024*4-256
	dec	edx
	jne	short #vd06
	mov	ds:v00_digit_buf1,edi	; edi -> buffer

#vd09:	xor	ds:v00_digit_timing_flag1,1

#vd10:	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_trans_128_2	endp

;int v00_trans_160_2()

	public	v00_trans_160_2
	db	'v00_trans_160_2',15
v00_trans_160_2	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	cmp	ds:v00_digit_timing_flag1,0
	jne	#vd05

	cmp	ds:v00_digit_timing_flag0,0
	jne	#vd10
	mov	eax,ds:v00_digit_wait
	cmp	eax,VSYNC_counter
	ja	#vd10
	sub	VSYNC_counter,eax
	inc	ds:v00_digit_timing_flag0
	mov	edi,ds:v00_digit_buf0	; buffer -> edi
	mov	ax,10ch
	mov	fs,ax
	mov	esi,0
	xor	ecx,ecx
	mov	edx,120
#vd01:	mov	cl,80			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	add	esi,1024*4-320
	dec	edx
	jne	short #vd01
	jmp	#vd09

#vd05:	cmp	ds:v00_digit_timing_flag2,0
	jne	short #vd10
	mov	eax,ds:v00_digit_wait
	cmp	eax,VSYNC_counter
	ja	short #vd10
	sub	VSYNC_counter,eax
	inc	ds:v00_digit_timing_flag2
	mov	edi,ds:v00_digit_buf1	; buffer -> edi
	mov	ax,10ch
	mov	fs,ax
	mov	esi,0
	xor	ecx,ecx
	mov	edx,120
#vd06:	mov	cl,80			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	add	esi,1024*4-320
	dec	edx
	jne	short #vd06
	mov	ds:v00_digit_buf1,edi	; edi -> buffer

#vd09:	xor	ds:v00_digit_timing_flag1,1

#vd10:	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_trans_160_2	endp

;int v00_trans_192_2()

	public	v00_trans_192_2
	db	'v00_trans_192_2',15
v00_trans_192_2	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	cmp	ds:v00_digit_timing_flag1,0
	jne	#vd05

	cmp	ds:v00_digit_timing_flag0,0
	jne	#vd10
	mov	eax,ds:v00_digit_wait
	cmp	eax,VSYNC_counter
	ja	#vd10

	push	eax
	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	pop	eax
	je	#vd10

	sub	VSYNC_counter,eax
	inc	ds:v00_digit_timing_flag0
	mov	edi,ds:v00_digit_buf0	; buffer -> edi
	mov	ax,10ch
	mov	fs,ax
	mov	esi,128+1024*2*48
	xor	ecx,ecx
	mov	edx,144
#vd01:	mov	cl,96			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	add	esi,1024*2-384
	dec	edx
	jne	short #vd01
	jmp	#vd09

#vd05:	cmp	ds:v00_digit_timing_flag2,0
	jne	short #vd10
	mov	eax,ds:v00_digit_wait
	cmp	eax,VSYNC_counter
	ja	short #vd10

	push	eax
	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	pop	eax
	je	short #vd10

	sub	VSYNC_counter,eax
	inc	ds:v00_digit_timing_flag2
	mov	edi,ds:v00_digit_buf1	; buffer -> edi
	mov	ax,10ch
	mov	fs,ax
	mov	esi,128+1024*2*48
	xor	ecx,ecx
	mov	edx,144
#vd06:	mov	cl,96			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	add	esi,1024*2-384
	dec	edx
	jne	short #vd06
	mov	ds:v00_digit_buf1,edi	; edi -> buffer

#vd09:	xor	ds:v00_digit_timing_flag1,1

#vd10:	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_trans_192_2	endp

;int v00_trans_256_2()

	public	v00_trans_256_2
	db	'v00_trans_256_2',15
v00_trans_256_2	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	cmp	ds:v00_digit_timing_flag1,0
	jne	#vd05

	cmp	ds:v00_digit_timing_flag0,0
	jne	#vd10
	mov	eax,ds:v00_digit_wait
	cmp	eax,VSYNC_counter
	ja	#vd10

	push	eax
	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	pop	eax
	je	#vd10

	sub	VSYNC_counter,eax
	inc	ds:v00_digit_timing_flag0
	mov	edi,ds:v00_digit_buf0	; buffer -> edi
	mov	ax,10ch
	mov	fs,ax
	mov	esi,64+1024*2*24
	xor	ecx,ecx
	mov	edx,192
#vd01:	mov	cl,128			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	add	esi,1024*2-512
	dec	edx
	jne	short #vd01
	jmp	#vd09

#vd05:	cmp	ds:v00_digit_timing_flag2,0
	jne	short #vd10
	mov	eax,ds:v00_digit_wait
	cmp	eax,VSYNC_counter
	ja	short #vd10

	push	eax
	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	pop	eax
	je	short #vd10

	sub	VSYNC_counter,eax
	inc	ds:v00_digit_timing_flag2
	mov	edi,ds:v00_digit_buf1	; buffer -> edi
	mov	ax,10ch
	mov	fs,ax
	mov	esi,64+1024*2*24
	xor	ecx,ecx
	mov	edx,192
#vd06:	mov	cl,128			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	add	esi,1024*2-512
	dec	edx
	jne	short #vd06
	mov	ds:v00_digit_buf1,edi	; edi -> buffer

#vd09:	xor	ds:v00_digit_timing_flag1,1

#vd10:	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_trans_256_2	endp

;int v00_trans_320_2()

	public	v00_trans_320_2
	db	'v00_trans_320_2',15
v00_trans_320_2	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	cmp	ds:v00_digit_timing_flag1,0
	jne	#vd05

	cmp	ds:v00_digit_timing_flag0,0
	jne	#vd10
	mov	eax,ds:v00_digit_wait
	cmp	eax,VSYNC_counter
	ja	#vd10

	push	eax
	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	pop	eax
	je	#vd10

	sub	VSYNC_counter,eax
	inc	ds:v00_digit_timing_flag0
	mov	edi,ds:v00_digit_buf0	; buffer -> edi
	mov	ax,10ch
	mov	fs,ax
	mov	esi,0
	xor	ecx,ecx
	mov	edx,240
#vd01:	mov	cl,160			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	add	esi,1024*2-640
	dec	edx
	jne	short #vd01
	jmp	#vd09

#vd05:	cmp	ds:v00_digit_timing_flag2,0
	jne	short #vd10
	mov	eax,ds:v00_digit_wait
	cmp	eax,VSYNC_counter
	ja	short #vd10

	push	eax
	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	pop	eax
	je	short #vd10

	sub	VSYNC_counter,eax
	inc	ds:v00_digit_timing_flag2
	mov	edi,ds:v00_digit_buf1	; buffer -> edi
	mov	ax,10ch
	mov	fs,ax
	mov	esi,0
	xor	ecx,ecx
	mov	edx,240
#vd06:	mov	cl,160			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	add	esi,1024*2-640
	dec	edx
	jne	short #vd06
	mov	ds:v00_digit_buf1,edi	; edi -> buffer

#vd09:	xor	ds:v00_digit_timing_flag1,1

#vd10:	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_trans_320_2	endp

;int v00_trans_128_3()

	public	v00_trans_128_3
	db	'v00_trans_128_3',15
v00_trans_128_3	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	cmp	ds:v00_digit_counter,0
	jle	short #vd10
	mov	eax,ds:v00_digit_wait
	cmp	eax,VSYNC_counter
	jg	short #vd10

	sub	VSYNC_counter,eax

	mov	edi,ds:v00_digit_buf1	; buffer -> edi
	mov	ax,10ch
	mov	fs,ax
	mov	esi,32+1024*4*12
	xor	ecx,ecx
	mov	edx,96
#vd01:	mov	cl,64			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	add	esi,1024*4-256
	dec	edx
	jne	short #vd01
	mov	ds:v00_digit_buf1,edi	; edi -> buffer
	dec	ds:v00_digit_counter
#vd10:	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_trans_128_3	endp

;int v00_trans_160_3()

	public	v00_trans_160_3
	db	'v00_trans_160_3',15
v00_trans_160_3	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	cmp	ds:v00_digit_counter,0
	jle	short #vd10
	mov	eax,ds:v00_digit_wait
	cmp	eax,VSYNC_counter
	jg	short #vd10

	sub	VSYNC_counter,eax

	mov	edi,ds:v00_digit_buf1	; buffer -> edi
	mov	ax,10ch
	mov	fs,ax
	mov	esi,0
	xor	ecx,ecx
	mov	edx,120
#vd01:	mov	cl,80			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	add	esi,1024*4-320
	dec	edx
	jne	short #vd01
	mov	ds:v00_digit_buf1,edi	; edi -> buffer
	dec	ds:v00_digit_counter
#vd10:	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_trans_160_3	endp

;int v00_trans_192_3()

	public	v00_trans_192_3
	db	'v00_trans_192_3',15
v00_trans_192_3	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	cmp	ds:v00_digit_counter,0
	jle	short #vd10
	mov	eax,ds:v00_digit_wait
	cmp	eax,VSYNC_counter
	jg	short #vd10

	push	eax
	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	pop	eax
	je	short #vd10

	sub	VSYNC_counter,eax

	mov	edi,ds:v00_digit_buf1	; buffer -> edi
	mov	ax,10ch
	mov	fs,ax
	mov	esi,128+1024*2*48
	xor	ecx,ecx
	mov	edx,144
#vd01:	mov	cl,96			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	add	esi,1024*2-384
	dec	edx
	jne	short #vd01
	mov	ds:v00_digit_buf1,edi	; edi -> buffer
	dec	ds:v00_digit_counter
#vd10:	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_trans_192_3	endp

;int v00_trans_256_3()

	public	v00_trans_256_3
	db	'v00_trans_256_3',15
v00_trans_256_3	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	cmp	ds:v00_digit_counter,0
	jle	short #vd10
	mov	eax,ds:v00_digit_wait
	cmp	eax,VSYNC_counter
	jg	short #vd10

	push	eax
	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	pop	eax
	je	short #vd10

	sub	VSYNC_counter,eax

	mov	edi,ds:v00_digit_buf1	; buffer -> edi
	mov	ax,10ch
	mov	fs,ax
	mov	esi,64+1024*2*24
	xor	ecx,ecx
	mov	edx,192
#vd01:	mov	cl,128			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	add	esi,1024*2-512
	dec	edx
	jne	short #vd01
	mov	ds:v00_digit_buf1,edi	; edi -> buffer
	dec	ds:v00_digit_counter
#vd10:	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_trans_256_3	endp

;int v00_trans_320_3()

	public	v00_trans_320_3
	db	'v00_trans_320_3',15
v00_trans_320_3	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	cmp	ds:v00_digit_counter,0
	jle	short #vd10
	mov	eax,ds:v00_digit_wait
	cmp	eax,VSYNC_counter
	jg	short #vd10

	push	eax
	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	pop	eax
	je	short #vd10

	sub	VSYNC_counter,eax

	mov	edi,ds:v00_digit_buf1	; buffer -> edi
	mov	ax,10ch
	mov	fs,ax
	mov	esi,0
	xor	ecx,ecx
	mov	edx,240
#vd01:	mov	cl,160			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	add	esi,1024*2-640
	dec	edx
	jne	short #vd01
	mov	ds:v00_digit_buf1,edi	; edi -> buffer
	dec	ds:v00_digit_counter
#vd10:	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_trans_320_3	endp




;	オンメモリに同時録画･録音する関数

;	引数用
SND_BUF		equ	 8
SND_COUNTER	equ	12
GRF_BUF		equ	16
GRF_COUNTER	equ	20
GRF_WAIT	equ	24
COUNTER_START	equ	28

;int v00_snd_trans_128_4( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=12000

	public	v00_snd_trans_128_4
	db	'v00_snd_trans_128_4',19
v00_snd_trans_128_4	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_128
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_128
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd020:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd021
	call	v00_snd_128
	jmp	short #vd020
#vd021:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd030:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd031
	call	v00_snd_128
	jmp	short #vd030
#vd031:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd040:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd041
	call	v00_snd_128
	jmp	short #vd040
#vd041:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd050:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd051
	call	v00_snd_128
	jmp	short #vd050
#vd051:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd060:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd061
	call	v00_snd_128
	jmp	short #vd060
#vd061:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd070:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd071
	call	v00_snd_128
	jmp	short #vd070
#vd071:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

	jmp	#vd000

#vd_E:	call	v00_snd_128
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_128
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_snd_trans_128_4	endp

;int v00_snd_trans_128_5( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=9600

	public	v00_snd_trans_128_5
	db	'v00_snd_trans_128_5',19
v00_snd_trans_128_5	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_128
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_128
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

	jmp	#vd000

#vd_E:	call	v00_snd_128
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_128
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_snd_trans_128_5	endp

;int v00_snd_trans_128_6( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=8000

	public	v00_snd_trans_128_6
	db	'v00_snd_trans_128_6',19
v00_snd_trans_128_6	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_128
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_128
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd020:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd021
	call	v00_snd_128
	jmp	short #vd020
#vd021:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd030:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd031
	call	v00_snd_128
	jmp	short #vd030
#vd031:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd040:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd041
	call	v00_snd_128
	jmp	short #vd040
#vd041:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd050:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd051
	call	v00_snd_128
	jmp	short #vd050
#vd051:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd060:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd061
	call	v00_snd_128
	jmp	short #vd060
#vd061:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd070:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd071
	call	v00_snd_128
	jmp	short #vd070
#vd071:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd080:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd081
	call	v00_snd_128
	jmp	short #vd080
#vd081:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd090:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd091
	call	v00_snd_128
	jmp	short #vd090
#vd091:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd100:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd101
	call	v00_snd_128
	jmp	short #vd100
#vd101:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd110:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd111
	call	v00_snd_128
	jmp	short #vd110
#vd111:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

	jmp	#vd000

#vd_E:	call	v00_snd_128
	inc	dword ptr [ebp].COUNTER_START
#vd_Ea:	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_128
	inc	dword ptr [ebp].COUNTER_START
#vd_Eb:	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_snd_trans_128_6	endp

;int v00_snd_trans_128_7( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=6857

	public	v00_snd_trans_128_7
	db	'v00_snd_trans_128_7',19
v00_snd_trans_128_7	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_128
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_128
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd020:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd021
	call	v00_snd_128
	jmp	short #vd020
#vd021:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd030:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd031
	call	v00_snd_128
	jmp	short #vd030
#vd031:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd040:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd041
	call	v00_snd_128
	jmp	short #vd040
#vd041:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd050:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd051
	call	v00_snd_128
	jmp	short #vd050
#vd051:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd060:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd061
	call	v00_snd_128
	jmp	short #vd060
#vd061:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd070:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd071
	call	v00_snd_128
	jmp	short #vd070
#vd071:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd080:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd081
	call	v00_snd_128
	jmp	short #vd080
#vd081:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd090:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd091
	call	v00_snd_128
	jmp	short #vd090
#vd091:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd100:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd101
	call	v00_snd_128
	jmp	short #vd100
#vd101:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd110:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd111
	call	v00_snd_128
	jmp	short #vd110
#vd111:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd120:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd121
	call	v00_snd_128
	jmp	short #vd120
#vd121:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd130:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd131
	call	v00_snd_128
	jmp	short #vd130
#vd131:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

	jmp	#vd000

#vd_E:	call	v00_snd_128
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_128
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_snd_trans_128_7	endp


;
;	↓vram(128*96) trans
;

DIV128		equ	2

v00_snd_128	proc	near
	push	eax
	push	ecx
	push	edi
	or	ebx,ebx
	jne	#vd02

	cmp	dword ptr [ebp].GRF_COUNTER,0
	jle	#vd10
	mov	eax,[ebp].GRF_WAIT
	cmp	eax,[ebp].COUNTER_START
	jg	#vd10

	push	eax
	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	pop	eax
	je	#vd10

	sub	[ebp].COUNTER_START,eax

	mov	edi,[ebp].GRF_BUF
	mov	esi,32+1024*4*12
	mov	ebx,96*DIV128
	mov	ecx,64/DIV128			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]

	dec	ebx
	mov	[ebp].GRF_BUF,edi
	dec	dword ptr [ebp].GRF_COUNTER
	jmp	short #vd10

#vd02:	mov	edi,[ebp].GRF_BUF
	mov	ecx,64/DIV128			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]

	dec	ebx
	test	ebx,DIV128-1
	jne	short #vd04
	add	esi,1024*4-256
#vd04:	mov	[ebp].GRF_BUF,edi

#vd10:	pop	edi
	pop	ecx
	pop	eax
	ret
v00_snd_128	endp

;
;	↑vram(128*96) trans
;


;	mvb用ルーチン
;int mvb_trans_128_9600( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=9600

	public	mvb_trans_128_9600
	db	'mvb_trans_128_9600',18
mvb_trans_128_9600	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_128
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_128
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

	jmp	#vd000

#vd_E:	call	v00_snd_128
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_128
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
mvb_trans_128_9600	endp

;	mvb用ルーチン
;int mvb_trans_128_19200( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=19200

	public	mvb_trans_128_19200
	db	'mvb_trans_128_19200',19
mvb_trans_128_19200	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_128
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	jne	#vd000

#vd_E:	call	v00_snd_128
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_128
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
mvb_trans_128_19200	endp


;int v00_snd_trans_160_4( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=12000

	public	v00_snd_trans_160_4
	db	'v00_snd_trans_160_4',19
v00_snd_trans_160_4	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_160
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_160
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd020:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd021
	call	v00_snd_160
	jmp	short #vd020
#vd021:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd030:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd031
	call	v00_snd_160
	jmp	short #vd030
#vd031:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd040:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd041
	call	v00_snd_160
	jmp	short #vd040
#vd041:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd050:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd051
	call	v00_snd_160
	jmp	short #vd050
#vd051:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd060:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd061
	call	v00_snd_160
	jmp	short #vd060
#vd061:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd070:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd071
	call	v00_snd_160
	jmp	short #vd070
#vd071:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

	jmp	#vd000

#vd_E:	call	v00_snd_160
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_160
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_snd_trans_160_4	endp

;int v00_snd_trans_160_5( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=9600

	public	v00_snd_trans_160_5
	db	'v00_snd_trans_160_5',19
v00_snd_trans_160_5	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_160
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_160
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

	jmp	#vd000

#vd_E:	call	v00_snd_160
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_160
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_snd_trans_160_5	endp

;int v00_snd_trans_160_6( char *snd_buf, int snd_counter,
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=8000

	public	v00_snd_trans_160_6
	db	'v00_snd_trans_160_6',19
v00_snd_trans_160_6	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_160
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_160
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd020:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd021
	call	v00_snd_160
	jmp	short #vd020
#vd021:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd030:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd031
	call	v00_snd_160
	jmp	short #vd030
#vd031:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd040:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd041
	call	v00_snd_160
	jmp	short #vd040
#vd041:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd050:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd051
	call	v00_snd_160
	jmp	short #vd050
#vd051:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd060:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd061
	call	v00_snd_160
	jmp	short #vd060
#vd061:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd070:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd071
	call	v00_snd_160
	jmp	short #vd070
#vd071:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd080:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd081
	call	v00_snd_160
	jmp	short #vd080
#vd081:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd090:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd091
	call	v00_snd_160
	jmp	short #vd090
#vd091:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd100:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd101
	call	v00_snd_160
	jmp	short #vd100
#vd101:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd110:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd111
	call	v00_snd_160
	jmp	short #vd110
#vd111:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

	jmp	#vd000

#vd_E:	call	v00_snd_160
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_160
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti					;interrupt enable

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_snd_trans_160_6	endp

;int v00_snd_trans_160_7( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=6857

	public	v00_snd_trans_160_7
	db	'v00_snd_trans_160_7',19
v00_snd_trans_160_7	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_160
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_160
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd020:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd021
	call	v00_snd_160
	jmp	short #vd020
#vd021:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd030:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd031
	call	v00_snd_160
	jmp	short #vd030
#vd031:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd040:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd041
	call	v00_snd_160
	jmp	short #vd040
#vd041:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd050:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd051
	call	v00_snd_160
	jmp	short #vd050
#vd051:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd060:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd061
	call	v00_snd_160
	jmp	short #vd060
#vd061:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd070:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd071
	call	v00_snd_160
	jmp	short #vd070
#vd071:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd080:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd081
	call	v00_snd_160
	jmp	short #vd080
#vd081:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd090:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd091
	call	v00_snd_160
	jmp	short #vd090
#vd091:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd100:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd101
	call	v00_snd_160
	jmp	short #vd100
#vd101:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd110:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd111
	call	v00_snd_160
	jmp	short #vd110
#vd111:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd120:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd121
	call	v00_snd_160
	jmp	short #vd120
#vd121:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd130:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd131
	call	v00_snd_160
	jmp	short #vd130
#vd131:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

	jmp	#vd000

#vd_E:	call	v00_snd_160
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_160
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_snd_trans_160_7	endp

;
;	↓vram(160*120) trans
;

DIV160		equ	2

v00_snd_160	proc	near
	push	eax
	push	ecx
	push	edi
	or	ebx,ebx
	jne	#vd02

	cmp	dword ptr [ebp].GRF_COUNTER,0
	jle	#vd10
	mov	eax,[ebp].GRF_WAIT
	cmp	eax,[ebp].COUNTER_START
	jg	#vd10

	push	eax
	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	pop	eax
	je	#vd10

	sub	[ebp].COUNTER_START,eax

	mov	edi,[ebp].GRF_BUF
	mov	esi,0
	mov	ebx,120*DIV160
	mov	ecx,80/DIV160			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]

	dec	ebx
	mov	[ebp].GRF_BUF,edi
	dec	dword ptr [ebp].GRF_COUNTER
	jmp	short #vd10

#vd02:	mov	edi,[ebp].GRF_BUF
	mov	ecx,80/DIV160			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]

	dec	ebx
	test	ebx,DIV160-1
	jne	#vd04
	add	esi,1024*4-320
#vd04:	mov	[ebp].GRF_BUF,edi

#vd10:	pop	edi
	pop	ecx
	pop	eax
	ret
v00_snd_160	endp

;
;	↑vram(160*120) trans
;


;	mvb用ルーチン
;int mvb_trans_160_9600( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=9600

	public	mvb_trans_160_9600
	db	'mvb_trans_160_9600',18
mvb_trans_160_9600	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_160
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_160
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

	jmp	#vd000

#vd_E:	call	v00_snd_160
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_160
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
mvb_trans_160_9600	endp

;	mvb用ルーチン
;int mvb_trans_160_19200( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=19200

	public	mvb_trans_160_19200
	db	'mvb_trans_160_19200',19
mvb_trans_160_19200	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_160
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	jne	#vd000

#vd_E:	call	v00_snd_160
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_160
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
mvb_trans_160_19200	endp


;int v00_snd_trans_192_4( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=12000

	public	v00_snd_trans_192_4
	db	'v00_snd_trans_192_4',19
v00_snd_trans_192_4	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_192
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_192
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd020:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd021
	call	v00_snd_192
	jmp	short #vd020
#vd021:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd030:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd031
	call	v00_snd_192
	jmp	short #vd030
#vd031:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd040:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd041
	call	v00_snd_192
	jmp	short #vd040
#vd041:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd050:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd051
	call	v00_snd_192
	jmp	short #vd050
#vd051:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd060:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd061
	call	v00_snd_192
	jmp	short #vd060
#vd061:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd070:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd071
	call	v00_snd_192
	jmp	short #vd070
#vd071:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

	jmp	#vd000

#vd_E:	call	v00_snd_192
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_192
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_snd_trans_192_4	endp

;int v00_snd_trans_192_5( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=9200

	public	v00_snd_trans_192_5
	db	'v00_snd_trans_192_5',19
v00_snd_trans_192_5	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_192
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_192
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

	jmp	#vd000

#vd_E:	call	v00_snd_192
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_192
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_snd_trans_192_5	endp

;int v00_snd_trans_192_6( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=8000

	public	v00_snd_trans_192_6
	db	'v00_snd_trans_192_6',19
v00_snd_trans_192_6	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_192
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_192
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd020:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd021
	call	v00_snd_192
	jmp	short #vd020
#vd021:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd030:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd031
	call	v00_snd_192
	jmp	short #vd030
#vd031:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd040:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd041
	call	v00_snd_192
	jmp	short #vd040
#vd041:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd050:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd051
	call	v00_snd_192
	jmp	short #vd050
#vd051:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd060:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd061
	call	v00_snd_192
	jmp	short #vd060
#vd061:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd070:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd071
	call	v00_snd_192
	jmp	short #vd070
#vd071:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd080:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd081
	call	v00_snd_192
	jmp	short #vd080
#vd081:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd090:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd091
	call	v00_snd_192
	jmp	short #vd090
#vd091:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd100:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd101
	call	v00_snd_192
	jmp	short #vd100
#vd101:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd110:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd111
	call	v00_snd_192
	jmp	short #vd110
#vd111:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

	jmp	#vd000

#vd_E:	call	v00_snd_192
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_192
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_snd_trans_192_6	endp

;int v00_snd_trans_192_7( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=6857

	public	v00_snd_trans_192_7
	db	'v00_snd_trans_192_7',19
v00_snd_trans_192_7	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_192
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_192
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd020:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd021
	call	v00_snd_192
	jmp	short #vd020
#vd021:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd030:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd031
	call	v00_snd_192
	jmp	short #vd030
#vd031:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd040:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd041
	call	v00_snd_192
	jmp	short #vd040
#vd041:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd050:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd051
	call	v00_snd_192
	jmp	short #vd050
#vd051:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd060:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd061
	call	v00_snd_192
	jmp	short #vd060
#vd061:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd070:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd071
	call	v00_snd_192
	jmp	short #vd070
#vd071:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd080:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd081
	call	v00_snd_192
	jmp	short #vd080
#vd081:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd090:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd091
	call	v00_snd_192
	jmp	short #vd090
#vd091:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd100:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd101
	call	v00_snd_192
	jmp	short #vd100
#vd101:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd110:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd111
	call	v00_snd_192
	jmp	short #vd110
#vd111:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd120:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd121
	call	v00_snd_192
	jmp	short #vd120
#vd121:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd130:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd131
	call	v00_snd_192
	jmp	short #vd130
#vd131:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

	jmp	#vd000

#vd_E:	call	v00_snd_192
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_192
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_snd_trans_192_7	endp

;
;	↓vram(192*144) trans
;

DIV192		equ	2

v00_snd_192	proc	near
	push	eax
	push	ecx
	push	edi
	or	ebx,ebx
	jne	#vd02

	cmp	dword ptr [ebp].GRF_COUNTER,0
	jle	#vd10
	mov	eax,[ebp].GRF_WAIT
	cmp	eax,[ebp].COUNTER_START
	jg	#vd10

	push	eax
	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	pop	eax
	je	#vd10

	sub	[ebp].COUNTER_START,eax

	mov	edi,[ebp].GRF_BUF
	mov	esi,128+1024*2*48
	mov	ebx,144*DIV192
	mov	ecx,96/DIV192			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]

	dec	ebx
	mov	[ebp].GRF_BUF,edi
	dec	dword ptr [ebp].GRF_COUNTER
	jmp	short #vd10

#vd02:	mov	edi,[ebp].GRF_BUF
	mov	ecx,96/DIV192			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]

	dec	ebx
	test	ebx,DIV192-1
	jne	#vd04
	add	esi,1024*2-384
#vd04:	mov	[ebp].GRF_BUF,edi

#vd10:	pop	edi
	pop	ecx
	pop	eax
	ret
v00_snd_192	endp

;
;	↑vram(192*144) trans
;


;	mvb用ルーチン
;int mvb_trans_192_9600( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=9600

	public	mvb_trans_192_9600
	db	'mvb_trans_192_9600',18
mvb_trans_192_9600	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_192
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_192
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

	jmp	#vd000

#vd_E:	call	v00_snd_192
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_192
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
mvb_trans_192_9600	endp

;	mvb用ルーチン
;int mvb_trans_192_19200( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			  char *table1, char *table2, char *work
;			)
;snd sampling freq=19200

	public	mvb_trans_192_19200
	db	'mvb_trans_192_19200',19
mvb_trans_192_19200	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_192
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	jne	#vd000

#vd_E:	call	v00_snd_192
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_192
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
mvb_trans_192_19200	endp


;int v00_snd_trans_256_4( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=12000

	public	v00_snd_trans_256_4
	db	'v00_snd_trans_256_4',19
v00_snd_trans_256_4	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_256
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_256
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd020:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd021
	call	v00_snd_256
	jmp	short #vd020
#vd021:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd030:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd031
	call	v00_snd_256
	jmp	short #vd030
#vd031:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd040:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd041
	call	v00_snd_256
	jmp	short #vd040
#vd041:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd050:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd051
	call	v00_snd_256
	jmp	short #vd050
#vd051:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd060:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd061
	call	v00_snd_256
	jmp	short #vd060
#vd061:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd070:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd071
	call	v00_snd_256
	jmp	short #vd070
#vd071:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

	jmp	#vd000

#vd_E:	call	v00_snd_256
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_256
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_snd_trans_256_4	endp

;int v00_snd_trans_256_5( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=9200

	public	v00_snd_trans_256_5
	db	'v00_snd_trans_256_5',19
v00_snd_trans_256_5	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_256
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_256
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

	jmp	#vd000

#vd_E:	call	v00_snd_256
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_256
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_snd_trans_256_5	endp

;int v00_snd_trans_256_6( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=8000

	public	v00_snd_trans_256_6
	db	'v00_snd_trans_256_6',19
v00_snd_trans_256_6	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_256
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_256
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd020:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd021
	call	v00_snd_256
	jmp	short #vd020
#vd021:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd030:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd031
	call	v00_snd_256
	jmp	short #vd030
#vd031:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd040:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd041
	call	v00_snd_256
	jmp	short #vd040
#vd041:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd050:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd051
	call	v00_snd_256
	jmp	short #vd050
#vd051:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd060:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd061
	call	v00_snd_256
	jmp	short #vd060
#vd061:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd070:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd071
	call	v00_snd_256
	jmp	short #vd070
#vd071:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd080:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd081
	call	v00_snd_256
	jmp	short #vd080
#vd081:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd090:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd091
	call	v00_snd_256
	jmp	short #vd090
#vd091:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd100:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd101
	call	v00_snd_256
	jmp	short #vd100
#vd101:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd110:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd111
	call	v00_snd_256
	jmp	short #vd110
#vd111:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

	jmp	#vd000

#vd_E:	call	v00_snd_256
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_256
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_snd_trans_256_6	endp

;int v00_snd_trans_256_7( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=6857

	public	v00_snd_trans_256_7
	db	'v00_snd_trans_256_7',19
v00_snd_trans_256_7	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_256
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_256
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd020:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd021
	call	v00_snd_256
	jmp	short #vd020
#vd021:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd030:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd031
	call	v00_snd_256
	jmp	short #vd030
#vd031:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd040:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd041
	call	v00_snd_256
	jmp	short #vd040
#vd041:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd050:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd051
	call	v00_snd_256
	jmp	short #vd050
#vd051:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd060:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd061
	call	v00_snd_256
	jmp	short #vd060
#vd061:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd070:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd071
	call	v00_snd_256
	jmp	short #vd070
#vd071:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd080:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd081
	call	v00_snd_256
	jmp	short #vd080
#vd081:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd090:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd091
	call	v00_snd_256
	jmp	short #vd090
#vd091:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd100:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd101
	call	v00_snd_256
	jmp	short #vd100
#vd101:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd110:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd111
	call	v00_snd_256
	jmp	short #vd110
#vd111:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd120:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd121
	call	v00_snd_256
	jmp	short #vd120
#vd121:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd130:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd131
	call	v00_snd_256
	jmp	short #vd130
#vd131:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

	jmp	#vd000

#vd_E:	call	v00_snd_256
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_256
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_snd_trans_256_7	endp

;
;	↓vram(256*1912) trans
;

DIV256		equ	2

v00_snd_256	proc	near
	push	eax
	push	ecx
	push	edi
	or	ebx,ebx
	jne	#vd02

	cmp	dword ptr [ebp].GRF_COUNTER,0
	jle	#vd10
	mov	eax,[ebp].GRF_WAIT
	cmp	eax,[ebp].COUNTER_START
	jg	#vd10

	push	eax
	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	pop	eax
	je	#vd10

	sub	[ebp].COUNTER_START,eax

	mov	edi,[ebp].GRF_BUF
	mov	esi,64+1024*2*24
	mov	ebx,192*DIV256
	mov	ecx,128/DIV256			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]

	dec	ebx
	mov	[ebp].GRF_BUF,edi
	dec	dword ptr [ebp].GRF_COUNTER
	jmp	short #vd10

#vd02:	mov	edi,[ebp].GRF_BUF
	mov	ecx,128/DIV256			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]

	dec	ebx
	test	ebx,DIV256-1
	jne	#vd04
	add	esi,1024*2-512
#vd04:	mov	[ebp].GRF_BUF,edi

#vd10:	pop	edi
	pop	ecx
	pop	eax
	ret
v00_snd_256	endp

;
;	↑vram(256*192) trans
;


;	mvb用ルーチン
;int mvb_trans_256_9600( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=9600

	public	mvb_trans_256_9600
	db	'mvb_trans_256_9600',18
mvb_trans_256_9600	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_256
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_256
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

	jmp	#vd000

#vd_E:	call	v00_snd_256
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_256
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
mvb_trans_256_9600	endp

;	mvb用ルーチン
;int mvb_trans_256_19200( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			  char *table1, char *table2, char *work
;			)
;snd sampling freq=19200

	public	mvb_trans_256_19200
	db	'mvb_trans_256_19200',19
mvb_trans_256_19200	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_256
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	jne	#vd000

#vd_E:	call	v00_snd_256
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_256
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
mvb_trans_256_19200	endp



;int v00_snd_trans_320_4( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=12000

	public	v00_snd_trans_320_4
	db	'v00_snd_trans_320_4',19
v00_snd_trans_320_4	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_320
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_320
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd020:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd021
	call	v00_snd_320
	jmp	short #vd020
#vd021:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd030:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd031
	call	v00_snd_320
	jmp	short #vd030
#vd031:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd040:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd041
	call	v00_snd_320
	jmp	short #vd040
#vd041:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd050:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd051
	call	v00_snd_320
	jmp	short #vd050
#vd051:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd060:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd061
	call	v00_snd_320
	jmp	short #vd060
#vd061:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd070:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd071
	call	v00_snd_320
	jmp	short #vd070
#vd071:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

	jmp	#vd000

#vd_E:	call	v00_snd_320
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_320
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_snd_trans_320_4	endp

;int v00_snd_trans_320_5( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=9200

	public	v00_snd_trans_320_5
	db	'v00_snd_trans_320_5',19
v00_snd_trans_320_5	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_320
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_320
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

	jmp	#vd000

#vd_E:	call	v00_snd_320
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_320
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_snd_trans_320_5	endp

;int v00_snd_trans_320_6( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=8000

	public	v00_snd_trans_320_6
	db	'v00_snd_trans_320_6',19
v00_snd_trans_320_6	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_320
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_320
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd020:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd021
	call	v00_snd_320
	jmp	short #vd020
#vd021:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd030:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd031
	call	v00_snd_320
	jmp	short #vd030
#vd031:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd040:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd041
	call	v00_snd_320
	jmp	short #vd040
#vd041:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd050:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd051
	call	v00_snd_320
	jmp	short #vd050
#vd051:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd060:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd061
	call	v00_snd_320
	jmp	short #vd060
#vd061:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd070:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd071
	call	v00_snd_320
	jmp	short #vd070
#vd071:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd080:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd081
	call	v00_snd_320
	jmp	short #vd080
#vd081:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd090:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd091
	call	v00_snd_320
	jmp	short #vd090
#vd091:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd100:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd101
	call	v00_snd_320
	jmp	short #vd100
#vd101:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd110:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd111
	call	v00_snd_320
	jmp	short #vd110
#vd111:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

	jmp	#vd000

#vd_E:	call	v00_snd_320
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_320
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_snd_trans_320_6	endp

;int v00_snd_trans_320_7( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=6857

	public	v00_snd_trans_320_7
	db	'v00_snd_trans_320_7',19
v00_snd_trans_320_7	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_320
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_320
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd020:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd021
	call	v00_snd_320
	jmp	short #vd020
#vd021:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd030:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd031
	call	v00_snd_320
	jmp	short #vd030
#vd031:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd040:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd041
	call	v00_snd_320
	jmp	short #vd040
#vd041:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd050:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd051
	call	v00_snd_320
	jmp	short #vd050
#vd051:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd060:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd061
	call	v00_snd_320
	jmp	short #vd060
#vd061:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd070:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd071
	call	v00_snd_320
	jmp	short #vd070
#vd071:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd080:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd081
	call	v00_snd_320
	jmp	short #vd080
#vd081:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd090:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd091
	call	v00_snd_320
	jmp	short #vd090
#vd091:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd100:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd101
	call	v00_snd_320
	jmp	short #vd100
#vd101:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

#vd110:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd111
	call	v00_snd_320
	jmp	short #vd110
#vd111:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

#vd120:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd121
	call	v00_snd_320
	jmp	short #vd120
#vd121:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd130:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd131
	call	v00_snd_320
	jmp	short #vd130
#vd131:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

	jmp	#vd000

#vd_E:	call	v00_snd_320
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_320
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
v00_snd_trans_320_7	endp

;
;	↓vram(320*240) trans
;

DIV320		equ	2

v00_snd_320	proc	near
	push	eax
	push	ecx
	push	edi
	or	ebx,ebx
	jne	#vd02

	cmp	dword ptr [ebp].GRF_COUNTER,0
	jle	#vd10
	mov	eax,[ebp].GRF_WAIT
	cmp	eax,[ebp].COUNTER_START
	jg	#vd10

	push	eax
	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	pop	eax
	je	#vd10

	sub	[ebp].COUNTER_START,eax

	mov	edi,[ebp].GRF_BUF
	mov	esi,0
	mov	ebx,240*DIV320
	mov	ecx,160/DIV320			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]

	dec	ebx
	mov	[ebp].GRF_BUF,edi
	dec	dword ptr [ebp].GRF_COUNTER
	jmp	short #vd10

#vd02:	mov	edi,[ebp].GRF_BUF
	mov	ecx,160/DIV320			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]

	dec	ebx
	test	ebx,DIV320-1
	jne	#vd04
	add	esi,1024*2-640
#vd04:	mov	[ebp].GRF_BUF,edi

#vd10:	pop	edi
	pop	ecx
	pop	eax
	ret
v00_snd_320	endp

;
;	↑vram(320*192) trans
;


;	mvb用ルーチン
;int mvb_trans_320_9600( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			)
;snd sampling freq=9600

	public	mvb_trans_320_9600
	db	'mvb_trans_320_9600',18
mvb_trans_320_9600	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	push	eax		; work

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_320
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	mov	[esp],eax
	inc	dword ptr [ebp].COUNTER_START

#vd010:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd011
	call	v00_snd_320
	jmp	short #vd010
#vd011:	mov	edx,04e7h
	in	al,dx
	add	eax,[esp]
	shr	eax,1
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	je	#vd_E

	jmp	#vd000

#vd_E:	call	v00_snd_320
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_320
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	pop	eax		; work
	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
mvb_trans_320_9600	endp

;	mvb用ルーチン
;int mvb_trans_320_19200( char *snd_buf, int snd_counter 
;			  char *grf_buf, int grf_counter, int grf_wait
;			  int count_start, 
;			  char *table1, char *table2, char *work
;			)
;snd sampling freq=19200

	public	mvb_trans_320_19200
	db	'mvb_trans_320_19200',19
mvb_trans_320_19200	proc	near
	push	ebp
	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	cli					;Int disable
	cld

#vdwt0:	mov	al,30		; フィールドが1から0に変わる瞬間まで待つ
	mov	edx,0440h	; この瞬間からタイミングを考慮して
	out	dx,al		; 総合的にstart_countを決める必要がある
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	je	#vdwt0
#vdwt1:	mov	al,30
	mov	edx,0440h
	out	dx,al
	mov	edx,0442h
	in	ax,dx
	test	eax,0800h
	jne	#vdwt1

	mov	edi,[ebp].SND_BUF
	mov	ecx,[ebp].SND_COUNTER
	cmp	ecx,0
	je	#vd_E

	mov	ax,10ch
	mov	fs,ax
	xor	eax,eax
	xor	ebx,ebx

#vd000:	mov	edx,04e8h
	in	al,dx
	test	al,1
	jne	short #vd001
	call	v00_snd_320
	jmp	short #vd000
#vd001:	mov	edx,04e7h
	in	al,dx
	stosb
	inc	dword ptr [ebp].COUNTER_START
	dec	ecx
	jne	#vd000

#vd_E:	call	v00_snd_320
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v00_snd_320
	inc	dword ptr [ebp].COUNTER_START
	or	ebx,ebx
	jne	#vd_E1

	sti

	xor	eax,eax
	pop	ebx
	pop	edi
	pop	esi
	mov	esp,ebp
	pop	ebp
	ret
mvb_trans_320_19200	endp








cseg	ends
	end

