;		vram → buffer → v02
;		表示モード16専用転送ルーチン
;		1993 8/14  Hiroshi TODA

	.386p

extrn	VSYNC_counter	:	dword

public	v02_digit_timing_flag0
public	v02_digit_buf0
public	v02_digit_counter
public	v02_digit_wait
public	v02_digit_work
public	v02_digit_ytab
public	v02_digit_ctab

;-------------------------------------------

DGROUP		group	v02_data

v02_data	segment dword public 'DATA' use32

v02_digit_timing_flag0	dd	?
			dd	?
			dd	?
			dd	?
			dd	?
			dd	?
			dd	?
			dd	?
v02_digit_buf0		dd	?
			dd	?
			dd	?
			dd	?
			dd	?
			dd	?
			dd	?
			dd	?
v02_digit_counter	dd	?
v02_digit_wait		dd	?
v02_digit_work		dd	?
v02_digit_ytab		dd	?
v02_digit_ctab		dd	?

v02_digit_wk		dd	?

v02_data	ends

;-------------------------------------------

cseg	segment	dword public use32 'CODE'
	assume	cs:cseg,ds:cseg


;	diskに録画する関数


;int v02_trans_128_0()

	public	v02_trans_128_0
	db	'v02_trans_128_0',15
v02_trans_128_0	proc	near
	push	ebp
;	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	cld

	lea	ebx,ds:v02_digit_timing_flag0
	mov	ecx,ds:v02_digit_counter
	cmp	dword ptr [ecx*4][ebx],0
	jne	#vd10
	mov	eax,ds:v02_digit_wait
	cmp	eax,VSYNC_counter
	ja	#vd10
	sub	VSYNC_counter,eax

	inc	dword ptr [ecx*4][ebx]
	lea	ebx,ds:v02_digit_buf0
	mov	edi,[ecx*4][ebx]	; buf(圧縮画の入る所) -> edi
	inc	ecx
	cmp	ecx,8
	jb	short #vd00
	xor	ecx,ecx
#vd00:	mov	ds:v02_digit_counter,ecx

	push	edi

	mov	edi,ds:v02_digit_work	; work(原画の入る所) -> 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

	pop	edi

	mov	esi,ds:v02_digit_work	; work(原画ある所) -> esi
	mov	ebp,ds:v02_digit_ytab	; Ytable -> ebx
	xor	edx,edx
	mov	ecx,128*96/8
#vd04:	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	shl	ebx,16

	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	rol	ebx,16
	mov	eax,ebx
	stosd

	loop	#vd04

	mov	esi,ds:v02_digit_work	; work(原画ある所) -> esi
	mov	ebp,ds:v02_digit_ctab	; Ctable -> ebx
	mov	edx,96/2
#vd08:	mov	ecx,128/8
#vd09:	lodsd
	and	eax,0000ffffh
	mov	bl,ds:[eax][ebp]
	lodsd
	and	eax,0000ffffh
	mov	bh,ds:[eax][ebp]

	shl	ebx,16

	lodsd
	and	eax,0000ffffh
	mov	bl,ds:[eax][ebp]
	lodsd
	and	eax,0000ffffh
	mov	bh,ds:[eax][ebp]

	rol	ebx,16
	mov	eax,ebx
	stosd
	loop	#vd09

	add	esi,128*2
	dec	edx
	jne	short #vd08

#vd10:	pop	ebx
	pop	edi
	pop	esi
;	mov	esp,ebp
	pop	ebp
	ret
v02_trans_128_0	endp


;int v02_trans_160_0()

	public	v02_trans_160_0
	db	'v02_trans_160_0',15
v02_trans_160_0	proc	near
	push	ebp
;	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	cld

	lea	ebx,ds:v02_digit_timing_flag0
	mov	ecx,ds:v02_digit_counter
	cmp	dword ptr [ecx*4][ebx],0
	jne	#vd10
	mov	eax,ds:v02_digit_wait
	cmp	eax,VSYNC_counter
	ja	#vd10
	sub	VSYNC_counter,eax

	inc	dword ptr [ecx*4][ebx]
	lea	ebx,ds:v02_digit_buf0
	mov	edi,[ecx*4][ebx]	; buf(圧縮画の入る所) -> edi
	inc	ecx
	cmp	ecx,8
	jb	short #vd00
	xor	ecx,ecx
#vd00:	mov	ds:v02_digit_counter,ecx

	push	edi

	mov	edi,ds:v02_digit_work	; work(原画の入る所) -> 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

	pop	edi

	mov	esi,ds:v02_digit_work	; work(原画ある所) -> esi
	mov	ebp,ds:v02_digit_ytab	; Ytable -> ebx
	xor	edx,edx
	mov	ecx,160*120/8
#vd04:	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	shl	ebx,16

	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	rol	ebx,16
	mov	eax,ebx
	stosd

	loop	#vd04

	mov	esi,ds:v02_digit_work	; work(原画ある所) -> esi
	mov	ebp,ds:v02_digit_ctab	; Ctable -> ebx
	mov	edx,120/2
#vd08:	mov	ecx,160/8
#vd09:	lodsd
	and	eax,0000ffffh
	mov	bl,ds:[eax][ebp]
	lodsd
	and	eax,0000ffffh
	mov	bh,ds:[eax][ebp]

	shl	ebx,16

	lodsd
	and	eax,0000ffffh
	mov	bl,ds:[eax][ebp]
	lodsd
	and	eax,0000ffffh
	mov	bh,ds:[eax][ebp]

	rol	ebx,16
	mov	eax,ebx
	stosd
	loop	#vd09

	add	esi,160*2
	dec	edx
	jne	short #vd08

#vd10:	pop	ebx
	pop	edi
	pop	esi
;	mov	esp,ebp
	pop	ebp
	ret
v02_trans_160_0	endp


;int v02_trans_192_0()

	public	v02_trans_192_0
	db	'v02_trans_192_0',15
v02_trans_192_0	proc	near
	push	ebp
;	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	cld

	lea	ebx,ds:v02_digit_timing_flag0
	mov	ecx,ds:v02_digit_counter
	cmp	dword ptr [ecx*4][ebx],0
	jne	#vd10
	mov	eax,ds:v02_digit_wait
	cmp	eax,VSYNC_counter
	ja	#vd10

	push	eax			; 1994 4/10 追加
	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	dword ptr [ecx*4][ebx]
	lea	ebx,ds:v02_digit_buf0
	mov	edi,[ecx*4][ebx]	; buf(圧縮画の入る所) -> edi
	inc	ecx
	cmp	ecx,8
	jb	short #vd00
	xor	ecx,ecx
#vd00:	mov	ds:v02_digit_counter,ecx

	push	edi

	mov	edi,ds:v02_digit_work	; work(原画の入る所) -> 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

	pop	edi

	mov	esi,ds:v02_digit_work	; work(原画ある所) -> esi
	mov	ebp,ds:v02_digit_ytab	; Ytable -> ebx
	xor	edx,edx
	mov	ecx,192*144/8
#vd04:	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	shl	ebx,16

	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	rol	ebx,16
	mov	eax,ebx
	stosd

	loop	#vd04

	mov	esi,ds:v02_digit_work	; work(原画ある所) -> esi
	mov	ebp,ds:v02_digit_ctab	; Ctable -> ebx
	mov	edx,144/2
#vd08:	mov	ecx,192/8
#vd09:	lodsd
	and	eax,0000ffffh
	mov	bl,ds:[eax][ebp]
	lodsd
	and	eax,0000ffffh
	mov	bh,ds:[eax][ebp]

	shl	ebx,16

	lodsd
	and	eax,0000ffffh
	mov	bl,ds:[eax][ebp]
	lodsd
	and	eax,0000ffffh
	mov	bh,ds:[eax][ebp]

	rol	ebx,16
	mov	eax,ebx
	stosd
	loop	#vd09

	add	esi,192*2
	dec	edx
	jne	short #vd08

#vd10:	pop	ebx
	pop	edi
	pop	esi
;	mov	esp,ebp
	pop	ebp
	ret
v02_trans_192_0	endp

;int v02_trans_256_0()

	public	v02_trans_256_0
	db	'v02_trans_256_0',15
v02_trans_256_0	proc	near
	push	ebp
;	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	cld

	lea	ebx,ds:v02_digit_timing_flag0
	mov	ecx,ds:v02_digit_counter
	cmp	dword ptr [ecx*4][ebx],0
	jne	#vd10
	mov	eax,ds:v02_digit_wait
	cmp	eax,VSYNC_counter
	ja	#vd10

	push	eax			; 1994 4/10 追加
	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	dword ptr [ecx*4][ebx]
	lea	ebx,ds:v02_digit_buf0
	mov	edi,[ecx*4][ebx]	; buf(圧縮画の入る所) -> edi
	inc	ecx
	cmp	ecx,8
	jb	short #vd00
	xor	ecx,ecx
#vd00:	mov	ds:v02_digit_counter,ecx

	push	edi

	mov	edi,ds:v02_digit_work	; work(原画の入る所) -> 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

	pop	edi

	mov	esi,ds:v02_digit_work	; work(原画ある所) -> esi
	mov	ebp,ds:v02_digit_ytab	; Ytable -> ebx
	xor	edx,edx
	mov	ecx,256*192/8
#vd04:	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	shl	ebx,16

	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	rol	ebx,16
	mov	eax,ebx
	stosd

	loop	#vd04

	mov	esi,ds:v02_digit_work	; work(原画ある所) -> esi
	mov	ebp,ds:v02_digit_ctab	; Ctable -> ebx
	mov	edx,192/2
#vd08:	mov	ecx,256/8
#vd09:	lodsd
	and	eax,0000ffffh
	mov	bl,ds:[eax][ebp]
	lodsd
	and	eax,0000ffffh
	mov	bh,ds:[eax][ebp]

	shl	ebx,16

	lodsd
	and	eax,0000ffffh
	mov	bl,ds:[eax][ebp]
	lodsd
	and	eax,0000ffffh
	mov	bh,ds:[eax][ebp]

	rol	ebx,16
	mov	eax,ebx
	stosd
	loop	#vd09

	add	esi,256*2
	dec	edx
	jne	short #vd08

#vd10:	pop	ebx
	pop	edi
	pop	esi
;	mov	esp,ebp
	pop	ebp
	ret
v02_trans_256_0	endp

;int v02_trans_320_0()

	public	v02_trans_320_0
	db	'v02_trans_320_0',15
v02_trans_320_0	proc	near
	push	ebp
;	mov	ebp,esp
	push	esi
	push	edi
	push	ebx

	cld

	lea	ebx,ds:v02_digit_timing_flag0
	mov	ecx,ds:v02_digit_counter
	cmp	dword ptr [ecx*4][ebx],0
	jne	#vd10
	mov	eax,ds:v02_digit_wait
	cmp	eax,VSYNC_counter
	ja	#vd10

	push	eax			; 1994 4/10 追加
	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	dword ptr [ecx*4][ebx]
	lea	ebx,ds:v02_digit_buf0
	mov	edi,[ecx*4][ebx]	; buf(圧縮画の入る所) -> edi
	inc	ecx
	cmp	ecx,8
	jb	short #vd00
	xor	ecx,ecx
#vd00:	mov	ds:v02_digit_counter,ecx

	push	edi

	mov	edi,ds:v02_digit_work	; work(原画の入る所) -> 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

	pop	edi

	mov	esi,ds:v02_digit_work	; work(原画ある所) -> esi
	mov	ebp,ds:v02_digit_ytab	; Ytable -> ebx
	xor	edx,edx
	mov	ecx,320*240/8
#vd04:	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	shl	ebx,16

	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	rol	ebx,16
	mov	eax,ebx
	stosd

	loop	#vd04

	mov	esi,ds:v02_digit_work	; work(原画ある所) -> esi
	mov	ebp,ds:v02_digit_ctab	; Ctable -> ebx
	mov	edx,240/2
#vd08:	mov	ecx,320/8
#vd09:	lodsd
	and	eax,0000ffffh
	mov	bl,ds:[eax][ebp]
	lodsd
	and	eax,0000ffffh
	mov	bh,ds:[eax][ebp]

	shl	ebx,16

	lodsd
	and	eax,0000ffffh
	mov	bl,ds:[eax][ebp]
	lodsd
	and	eax,0000ffffh
	mov	bh,ds:[eax][ebp]

	rol	ebx,16
	mov	eax,ebx
	stosd
	loop	#vd09

	add	esi,320*2
	dec	edx
	jne	short #vd08

#vd10:	pop	ebx
	pop	edi
	pop	esi
;	mov	esp,ebp
	pop	ebp
	ret
v02_trans_320_0	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
Y_TABLE		equ	32
C_TABLE		equ	36
WK_AREA		equ	40

;int v02_snd_trans_128_4( 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=12000

	public	v02_snd_trans_128_4
	db	'v02_snd_trans_128_4',19
v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_snd_128
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_snd_trans_128_4	endp

;int v02_snd_trans_128_5( 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=9600

	public	v02_snd_trans_128_5
	db	'v02_snd_trans_128_5',19
v02_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	v02_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	v02_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	v02_snd_128
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_snd_trans_128_5	endp

;int v02_snd_trans_128_6( 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=8000

	public	v02_snd_trans_128_6
	db	'v02_snd_trans_128_6',19
v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_snd_128
	jmp	short #vd110
#vd111:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

	jmp	#vd000

#vd_E:	call	v02_snd_128
	inc	dword ptr [ebp].COUNTER_START
#vd_Ea:	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_snd_trans_128_6	endp

;int v02_snd_trans_128_7( 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=6857

	public	v02_snd_trans_128_7
	db	'v02_snd_trans_128_7',19
v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_snd_128
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_snd_trans_128_7	endp


;
;	↓vram(128*96) trans
;

DIV128_1	equ	2
DIV128_2	equ	2

v02_snd_128	proc	near
	push	eax
	push	ecx
	push	edi
	or	ebx,ebx
	jne	#vd01

	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].WK_AREA
	mov	esi,32+1024*4*12
	mov	ecx,64/DIV128_1			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	mov	ds:v02_digit_wk,edi
	dec	dword ptr [ebp].GRF_COUNTER
	inc	ebx
	jmp	#vd10

#vd01:	cmp	ebx,96*DIV128_1
	je	short #vd03
	ja	#vd05
	mov	edi,ds:v02_digit_wk
	mov	ecx,64/DIV128_1			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	mov	ds:v02_digit_wk,edi
	inc	ebx
	test	ebx,DIV128_1-1
	jne	#vd10
	add	esi,1024*4-256
#vd02:	jmp	#vd10

#vd03:	push	ebp
	push	ebx
	mov	edi,[ebp].GRF_BUF
	mov	esi,[ebp].WK_AREA
	mov	ebp,[ebp].Y_TABLE
	xor	edx,edx
	mov	ecx,16/DIV128_2
#vd04:	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	shl	ebx,16

	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	rol	ebx,16
	mov	eax,ebx
	stosd
	loop	#vd04

	pop	ebx
	pop	ebp
	mov	[ebp].GRF_BUF,edi
	inc	ebx
	jmp	#vd10

#vd05:	cmp	ebx,96*DIV128_1+96*DIV128_2
	je	short #vd07
	ja	short #vd08
	push	ebp
	push	ebx
	mov	edi,[ebp].GRF_BUF
	mov	ebp,[ebp].Y_TABLE
	xor	edx,edx
	mov	ecx,16/DIV128_2
#vd06:	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	shl	ebx,16

	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	rol	ebx,16
	mov	eax,ebx
	stosd
	loop	#vd06

	pop	ebx
	pop	ebp
	mov	[ebp].GRF_BUF,edi
	inc	ebx
	jmp	#vd10

#vd07:	mov	esi,[ebp].WK_AREA
#vd08:	push	ebp
	push	ebx
	mov	edi,[ebp].GRF_BUF
	mov	ebp,[ebp].C_TABLE
	mov	edx,0000ffffh
	mov	ecx,16/DIV128_2

#vd09:	lodsd
	and	eax,0000ffffh
	mov	bl,ds:[eax][ebp]
	lodsd
	and	eax,0000ffffh
	mov	bh,ds:[eax][ebp]

	shl	ebx,16

	lodsd
	and	eax,0000ffffh
	mov	bl,ds:[eax][ebp]
	lodsd
	and	eax,0000ffffh
	mov	bh,ds:[eax][ebp]

	rol	ebx,16
	mov	eax,ebx
	stosd
	loop	#vd09

	pop	ebx
	pop	ebp
	mov	[ebp].GRF_BUF,edi
	inc	ebx
	test	ebx,DIV128_2-1
	jne	short #vd0A
	add	esi,128*2
#vd0A:	cmp	ebx,96*DIV128_1+96*DIV128_2+48*DIV128_2
	jne	short #vd10
	xor	ebx,ebx

#vd10:	pop	edi
	pop	ecx
	pop	eax
	ret
v02_snd_128	endp

;
;	↑vram(128*96) trans
;

;	v02用ルーチン
;int v02_trans_128_9600( 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=9600

	public	v02_trans_128_9600
	db	'v02_trans_128_9600',18
v02_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	v02_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	v02_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	v02_snd_128
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_trans_128_9600	endp

;	v02用ルーチン
;int v02_trans_128_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	v02_trans_128_19200
	db	'v02_trans_128_19200',19
v02_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	v02_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	v02_snd_128
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_trans_128_19200	endp




;int v02_snd_trans_160_4( 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=12000

	public	v02_snd_trans_160_4
	db	'v02_snd_trans_160_4',19
v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_snd_160
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_snd_trans_160_4	endp

;int v02_snd_trans_160_5( 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=9600

	public	v02_snd_trans_160_5
	db	'v02_snd_trans_160_5',19
v02_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	v02_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	v02_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	v02_snd_160
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_snd_trans_160_5	endp

;int v02_snd_trans_160_6( 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=8000

	public	v02_snd_trans_160_6
	db	'v02_snd_trans_160_6',19
v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_snd_160
	jmp	short #vd110
#vd111:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

	jmp	#vd000

#vd_E:	call	v02_snd_160
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_snd_trans_160_6	endp

;int v02_snd_trans_160_7( 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=6857

	public	v02_snd_trans_160_7
	db	'v02_snd_trans_160_7',19
v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_snd_160
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_snd_trans_160_7	endp

;
;	↓vram(160*120) trans
;

DIV160_1	equ	2
DIV160_2	equ	2

v02_snd_160	proc	near
	push	eax
	push	ecx
	push	edi
	or	ebx,ebx
	jne	#vd01

	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].WK_AREA
	mov	esi,0
	mov	ecx,80/DIV160_1			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	mov	ds:v02_digit_wk,edi
	dec	dword ptr [ebp].GRF_COUNTER
	inc	ebx
	jmp	#vd10

#vd01:	cmp	ebx,120*DIV160_1
	je	short #vd03
	ja	#vd05
	mov	edi,ds:v02_digit_wk
	mov	ecx,80/DIV160_1			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	mov	ds:v02_digit_wk,edi
	inc	ebx
	test	ebx,DIV160_1-1
	jne	#vd10
	add	esi,1024*4-320
#vd02:	jmp	#vd10

#vd03:	push	ebp
	push	ebx
	mov	edi,[ebp].GRF_BUF
	mov	esi,[ebp].WK_AREA
	mov	ebp,[ebp].Y_TABLE
	xor	edx,edx
	mov	ecx,20/DIV160_2
#vd04:	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	shl	ebx,16

	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	rol	ebx,16
	mov	eax,ebx
	stosd
	loop	#vd04

	pop	ebx
	pop	ebp
	mov	[ebp].GRF_BUF,edi
	inc	ebx
	jmp	#vd10

#vd05:	cmp	ebx,120*DIV160_1+120*DIV160_2
	je	short #vd07
	ja	short #vd08
	push	ebp
	push	ebx
	mov	edi,[ebp].GRF_BUF
	mov	ebp,[ebp].Y_TABLE
	xor	edx,edx
	mov	ecx,20/DIV160_2
#vd06:	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	shl	ebx,16

	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	rol	ebx,16
	mov	eax,ebx
	stosd
	loop	#vd06

	pop	ebx
	pop	ebp
	mov	[ebp].GRF_BUF,edi
	inc	ebx
	jmp	#vd10

#vd07:	mov	esi,[ebp].WK_AREA
#vd08:	push	ebp
	push	ebx
	mov	edi,[ebp].GRF_BUF
	mov	ebp,[ebp].C_TABLE
	mov	edx,0000ffffh
	mov	ecx,20/DIV160_2

#vd09:	lodsd
	and	eax,0000ffffh
	mov	bl,ds:[eax][ebp]
	lodsd
	and	eax,0000ffffh
	mov	bh,ds:[eax][ebp]

	shl	ebx,16

	lodsd
	and	eax,0000ffffh
	mov	bl,ds:[eax][ebp]
	lodsd
	and	eax,0000ffffh
	mov	bh,ds:[eax][ebp]

	rol	ebx,16
	mov	eax,ebx
	stosd
	loop	#vd09

	pop	ebx
	pop	ebp
	mov	[ebp].GRF_BUF,edi
	inc	ebx
	test	ebx,DIV160_2-1
	jne	short #vd0A
	add	esi,160*2
#vd0A:	cmp	ebx,120*DIV160_1+120*DIV160_2+60*DIV160_2
	jne	short #vd10
	xor	ebx,ebx

#vd10:	pop	edi
	pop	ecx
	pop	eax
	ret
v02_snd_160	endp

;
;	↑vram(160*120) trans
;



;	v02用ルーチン
;int v02_trans_160_9600( 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=9600

	public	v02_trans_160_9600
	db	'v02_trans_160_9600',18
v02_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	v02_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	v02_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	v02_snd_160
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_trans_160_9600	endp

;	v02用ルーチン
;int v02_trans_160_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	v02_trans_160_19200
	db	'v02_trans_160_19200',19
v02_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	v02_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	v02_snd_160
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_trans_160_19200	endp




;int v02_snd_trans_192_4( 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=12000

	public	v02_snd_trans_192_4
	db	'v02_snd_trans_192_4',19
v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_snd_192
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_snd_trans_192_4	endp

;int v02_snd_trans_192_5( 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=9200

	public	v02_snd_trans_192_5
	db	'v02_snd_trans_192_5',19
v02_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	v02_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	v02_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	v02_snd_192
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_snd_trans_192_5	endp

;int v02_snd_trans_192_6( 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=8000

	public	v02_snd_trans_192_6
	db	'v02_snd_trans_192_6',19
v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_snd_192
	jmp	short #vd110
#vd111:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

	jmp	#vd000

#vd_E:	call	v02_snd_192
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_snd_trans_192_6	endp

;int v02_snd_trans_192_7( 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=6857

	public	v02_snd_trans_192_7
	db	'v02_snd_trans_192_7',19
v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_snd_192
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_snd_trans_192_7	endp

;
;	↓vram(192*144) trans
;

DIV192_1	equ	2
DIV192_2	equ	2

v02_snd_192	proc	near
	push	eax
	push	ecx
	push	edi
	or	ebx,ebx
	jne	#vd01

	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].WK_AREA
	mov	esi,128+1024*2*48
	mov	ecx,96/DIV192_1			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	mov	ds:v02_digit_wk,edi
	dec	dword ptr [ebp].GRF_COUNTER
	inc	ebx
	jmp	#vd10

#vd01:	cmp	ebx,144*DIV192_1
	je	short #vd03
	ja	#vd05
	mov	edi,ds:v02_digit_wk
	mov	ecx,96/DIV192_1			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	mov	ds:v02_digit_wk,edi
	inc	ebx
	test	ebx,DIV192_1-1
	jne	#vd10
	add	esi,1024*2-384
#vd02:	jmp	#vd10

#vd03:	push	ebp
	push	ebx
	mov	edi,[ebp].GRF_BUF
	mov	esi,[ebp].WK_AREA
	mov	ebp,[ebp].Y_TABLE
	xor	edx,edx
	mov	ecx,24/DIV192_2
#vd04:	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	shl	ebx,16

	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	rol	ebx,16
	mov	eax,ebx
	stosd
	loop	#vd04

	pop	ebx
	pop	ebp
	mov	[ebp].GRF_BUF,edi
	inc	ebx
	jmp	#vd10

#vd05:	cmp	ebx,144*DIV192_1+144*DIV192_2
	je	short #vd07
	ja	short #vd08
	push	ebp
	push	ebx
	mov	edi,[ebp].GRF_BUF
	mov	ebp,[ebp].Y_TABLE
	xor	edx,edx
	mov	ecx,24/DIV192_2
#vd06:	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	shl	ebx,16

	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	rol	ebx,16
	mov	eax,ebx
	stosd
	loop	#vd06

	pop	ebx
	pop	ebp
	mov	[ebp].GRF_BUF,edi
	inc	ebx
	jmp	#vd10

#vd07:	mov	esi,[ebp].WK_AREA
#vd08:	push	ebp
	push	ebx
	mov	edi,[ebp].GRF_BUF
	mov	ebp,[ebp].C_TABLE
	mov	edx,0000ffffh
	mov	ecx,24/DIV192_2

#vd09:	lodsd
	and	eax,0000ffffh
	mov	bl,ds:[eax][ebp]
	lodsd
	and	eax,0000ffffh
	mov	bh,ds:[eax][ebp]

	shl	ebx,16

	lodsd
	and	eax,0000ffffh
	mov	bl,ds:[eax][ebp]
	lodsd
	and	eax,0000ffffh
	mov	bh,ds:[eax][ebp]

	rol	ebx,16
	mov	eax,ebx
	stosd
	loop	#vd09

	pop	ebx
	pop	ebp
	mov	[ebp].GRF_BUF,edi
	inc	ebx
	test	ebx,DIV192_2-1
	jne	short #vd0A
	add	esi,192*2
#vd0A:	cmp	ebx,144*DIV192_1+144*DIV192_2+72*DIV192_2
	jne	short #vd10
	xor	ebx,ebx

#vd10:	pop	edi
	pop	ecx
	pop	eax
	ret
v02_snd_192	endp

;
;	↑vram(192*144) trans
;

;	v02用ルーチン
;int v02_trans_192_9600( 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=9600

	public	v02_trans_192_9600
	db	'v02_trans_192_9600',18
v02_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	v02_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	v02_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	v02_snd_192
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_trans_192_9600	endp

;	v02用ルーチン
;int v02_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	v02_trans_192_19200
	db	'v02_trans_192_19200',19
v02_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	v02_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	v02_snd_192
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_trans_192_19200	endp


;int v02_snd_trans_256_4( 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=12000

	public	v02_snd_trans_256_4
	db	'v02_snd_trans_256_4',19
v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_snd_256
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_snd_trans_256_4	endp

;int v02_snd_trans_256_5( 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=9200

	public	v02_snd_trans_256_5
	db	'v02_snd_trans_256_5',19
v02_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	v02_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	v02_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	v02_snd_256
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_snd_trans_256_5	endp

;int v02_snd_trans_256_6( 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=8000

	public	v02_snd_trans_256_6
	db	'v02_snd_trans_256_6',19
v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_snd_256
	jmp	short #vd110
#vd111:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

	jmp	#vd000

#vd_E:	call	v02_snd_256
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_snd_trans_256_6	endp

;int v02_snd_trans_256_7( 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=6857

	public	v02_snd_trans_256_7
	db	'v02_snd_trans_256_7',19
v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_snd_256
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_snd_trans_256_7	endp

;
;	↓vram(256*192) trans
;

DIV256_1	equ	2
DIV256_2	equ	2

v02_snd_256	proc	near
	push	eax
	push	ecx
	push	edi
	or	ebx,ebx
	jne	#vd01

	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].WK_AREA
	mov	esi,64+1024*2*24
	mov	ecx,128/DIV256_1			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	mov	ds:v02_digit_wk,edi
	dec	dword ptr [ebp].GRF_COUNTER
	inc	ebx
	jmp	#vd10

#vd01:	cmp	ebx,192*DIV256_1
	je	short #vd03
	ja	#vd05
	mov	edi,ds:v02_digit_wk
	mov	ecx,128/DIV256_1			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	mov	ds:v02_digit_wk,edi
	inc	ebx
	test	ebx,DIV256_1-1
	jne	#vd10
	add	esi,1024*2-512
#vd02:	jmp	#vd10

#vd03:	push	ebp
	push	ebx
	mov	edi,[ebp].GRF_BUF
	mov	esi,[ebp].WK_AREA
	mov	ebp,[ebp].Y_TABLE
	xor	edx,edx
	mov	ecx,32/DIV256_2
#vd04:	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	shl	ebx,16

	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	rol	ebx,16
	mov	eax,ebx
	stosd
	loop	#vd04

	pop	ebx
	pop	ebp
	mov	[ebp].GRF_BUF,edi
	inc	ebx
	jmp	#vd10

#vd05:	cmp	ebx,192*DIV256_1+192*DIV256_2
	je	short #vd07
	ja	short #vd08
	push	ebp
	push	ebx
	mov	edi,[ebp].GRF_BUF
	mov	ebp,[ebp].Y_TABLE
	xor	edx,edx
	mov	ecx,32/DIV256_2
#vd06:	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	shl	ebx,16

	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	rol	ebx,16
	mov	eax,ebx
	stosd
	loop	#vd06

	pop	ebx
	pop	ebp
	mov	[ebp].GRF_BUF,edi
	inc	ebx
	jmp	#vd10

#vd07:	mov	esi,[ebp].WK_AREA
#vd08:	push	ebp
	push	ebx
	mov	edi,[ebp].GRF_BUF
	mov	ebp,[ebp].C_TABLE
	mov	edx,0000ffffh
	mov	ecx,32/DIV256_2

#vd09:	lodsd
	and	eax,0000ffffh
	mov	bl,ds:[eax][ebp]
	lodsd
	and	eax,0000ffffh
	mov	bh,ds:[eax][ebp]

	shl	ebx,16

	lodsd
	and	eax,0000ffffh
	mov	bl,ds:[eax][ebp]
	lodsd
	and	eax,0000ffffh
	mov	bh,ds:[eax][ebp]

	rol	ebx,16
	mov	eax,ebx
	stosd
	loop	#vd09

	pop	ebx
	pop	ebp
	mov	[ebp].GRF_BUF,edi
	inc	ebx
	test	ebx,DIV256_2-1
	jne	short #vd0A
	add	esi,256*2
#vd0A:	cmp	ebx,192*DIV256_1+192*DIV256_2+96*DIV256_2
	jne	short #vd10
	xor	ebx,ebx

#vd10:	pop	edi
	pop	ecx
	pop	eax
	ret
v02_snd_256	endp

;
;	↑vram(256*192) trans
;

;	v02用ルーチン
;int v02_trans_256_9600( 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=9600

	public	v02_trans_256_9600
	db	'v02_trans_256_9600',18
v02_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	v02_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	v02_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	v02_snd_256
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_trans_256_9600	endp

;	v02用ルーチン
;int v02_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	v02_trans_256_19200
	db	'v02_trans_256_19200',19
v02_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	v02_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	v02_snd_256
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_trans_256_19200	endp




;int v02_snd_trans_320_4( 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=12000

	public	v02_snd_trans_320_4
	db	'v02_snd_trans_320_4',19
v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_snd_320
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_snd_trans_320_4	endp

;int v02_snd_trans_320_5( 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=9200

	public	v02_snd_trans_320_5
	db	'v02_snd_trans_320_5',19
v02_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	v02_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	v02_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	v02_snd_320
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_snd_trans_320_5	endp

;int v02_snd_trans_320_6( 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=8000

	public	v02_snd_trans_320_6
	db	'v02_snd_trans_320_6',19
v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_snd_320
	jmp	short #vd110
#vd111:	mov	edx,04e7h
	in	al,dx
	inc	dword ptr [ebp].COUNTER_START

	jmp	#vd000

#vd_E:	call	v02_snd_320
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_snd_trans_320_6	endp

;int v02_snd_trans_320_7( 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=6857

	public	v02_snd_trans_320_7
	db	'v02_snd_trans_320_7',19
v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_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	v02_snd_320
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_snd_trans_320_7	endp

;
;	↓vram(320*240) trans
;

DIV320_1	equ	2
DIV320_2	equ	2

v02_snd_320	proc	near
	push	eax
	push	ecx
	push	edi
	or	ebx,ebx
	jne	#vd01

	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].WK_AREA
	mov	esi,0
	mov	ecx,160/DIV320_1			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	mov	ds:v02_digit_wk,edi
	dec	dword ptr [ebp].GRF_COUNTER
	inc	ebx
	jmp	#vd10

#vd01:	cmp	ebx,240*DIV320_1
	je	short #vd03
	ja	#vd05
	mov	edi,ds:v02_digit_wk
	mov	ecx,160/DIV320_1			; vram 転送
	rep	movs dword ptr [edi],fs:[esi]
	mov	ds:v02_digit_wk,edi
	inc	ebx
	test	ebx,DIV320_1-1
	jne	#vd10
	add	esi,1024*2-640
#vd02:	jmp	#vd10

#vd03:	push	ebp
	push	ebx
	mov	edi,[ebp].GRF_BUF
	mov	esi,[ebp].WK_AREA
	mov	ebp,[ebp].Y_TABLE
	xor	edx,edx
	mov	ecx,40/DIV320_2
#vd04:	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	shl	ebx,16

	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	rol	ebx,16
	mov	eax,ebx
	stosd
	loop	#vd04

	pop	ebx
	pop	ebp
	mov	[ebp].GRF_BUF,edi
	inc	ebx
	jmp	#vd10

#vd05:	cmp	ebx,240*DIV320_1+240*DIV320_2
	je	short #vd07
	ja	short #vd08
	push	ebp
	push	ebx
	mov	edi,[ebp].GRF_BUF
	mov	ebp,[ebp].Y_TABLE
	xor	edx,edx
	mov	ecx,40/DIV320_2
#vd06:	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	shl	ebx,16

	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bl,ds:[edx][ebp].32768
	lodsd
	mov	dx,ax
	shr	eax,16
	mov	dl,ds:[edx][ebp]
	mov	dh,ds:[eax][ebp]
	mov	bh,ds:[edx][ebp].32768

	rol	ebx,16
	mov	eax,ebx
	stosd
	loop	#vd06

	pop	ebx
	pop	ebp
	mov	[ebp].GRF_BUF,edi
	inc	ebx
	jmp	#vd10

#vd07:	mov	esi,[ebp].WK_AREA
#vd08:	push	ebp
	push	ebx
	mov	edi,[ebp].GRF_BUF
	mov	ebp,[ebp].C_TABLE
	mov	edx,0000ffffh
	mov	ecx,40/DIV320_2

#vd09:	lodsd
	and	eax,0000ffffh
	mov	bl,ds:[eax][ebp]
	lodsd
	and	eax,0000ffffh
	mov	bh,ds:[eax][ebp]

	shl	ebx,16

	lodsd
	and	eax,0000ffffh
	mov	bl,ds:[eax][ebp]
	lodsd
	and	eax,0000ffffh
	mov	bh,ds:[eax][ebp]

	rol	ebx,16
	mov	eax,ebx
	stosd
	loop	#vd09

	pop	ebx
	pop	ebp
	mov	[ebp].GRF_BUF,edi
	inc	ebx
	test	ebx,DIV320_2-1
	jne	short #vd0A
	add	esi,320*2
#vd0A:	cmp	ebx,240*DIV320_1+240*DIV320_2+120*DIV320_2
	jne	short #vd10
	xor	ebx,ebx

#vd10:	pop	edi
	pop	ecx
	pop	eax
	ret
v02_snd_320	endp

;
;	↑vram(256*192) trans
;

;	v02用ルーチン
;int v02_trans_320_9600( 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=9600

	public	v02_trans_320_9600
	db	'v02_trans_320_9600',18
v02_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	v02_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	v02_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	v02_snd_320
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_trans_320_9600	endp

;	v02用ルーチン
;int v02_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	v02_trans_320_19200
	db	'v02_trans_320_19200',19
v02_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	v02_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	v02_snd_320
	inc	dword ptr [ebp].COUNTER_START
	cmp	dword ptr [ebp].GRF_COUNTER,0
	jg	#vd_E
#vd_E1:	call	v02_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
v02_trans_320_19200	endp


cseg	ends
	end

