/*
			V02 RECORD
			for	GUI
			Hiroshi TODA
			1993 9 3

*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <file_dlg.h>
#include <egb.h>
#include <mos.h>
#include <snd.h>
#include "ugoku.h"

extern char *guiEgbPtr;			/* EGB work */
extern int mouse( int );

/*
	v02 direct save
*/

extern void v02_trans_128_0();
extern void v02_trans_160_0();
extern void v02_trans_192_0();
extern void v02_trans_256_0();
extern void v02_trans_320_0();

extern void v02_snd_trans_128_4( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_snd_trans_128_5( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_snd_trans_128_6( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_snd_trans_128_7( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;

extern void v02_snd_trans_160_4( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_snd_trans_160_5( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_snd_trans_160_6( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_snd_trans_160_7( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;

extern void v02_snd_trans_192_4( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_snd_trans_192_5( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_snd_trans_192_6( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_snd_trans_192_7( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;

extern void v02_snd_trans_256_4( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_snd_trans_256_5( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_snd_trans_256_6( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_snd_trans_256_7( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;

extern void v02_snd_trans_320_4( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_snd_trans_320_5( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_snd_trans_320_6( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_snd_trans_320_7( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;

extern void v02_trans_128_9600( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_trans_128_19200( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_trans_160_9600( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_trans_160_19200( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_trans_192_9600( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_trans_192_19200( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_trans_256_9600( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_trans_256_19200( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_trans_320_9600( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;
extern void v02_trans_320_19200( char *, int, char *, int, int, int,
					 char *, char *, char * ) ;

extern int v02_digit_timing_flag0[];	/* flag */
extern char *v02_digit_buf0[];	/* 圧縮データ転送先 */
extern int v02_digit_counter;		/* conter */
extern int v02_digit_wait;		/* wait */
extern char *v02_digit_work ;	/* VRAMデータ一時保存領域 */
extern char *v02_digit_ytab ;	/* Ytable */
extern char *v02_digit_ctab ;	/* Ctable */

v02_digit_save_0( name, frame, md, wt, ytab, ctab, v02tab )
char *name ;
int frame, md, wt ;
char *ytab, *ctab, *v02tab ;
{
	FILE *fp;
	int v02xd = 128, v02yd = 96;
	int i, j, n, f, size, skip, total, bind ;
	char head[256], bind_head[32] ;
	char *buf, *b[8];		/* buffer */

	switch( md ){
		case 1: v02xd = 128; v02yd = 96;
			break;
		case 2: v02xd = 160; v02yd = 120;
			break;
		case 3: v02xd = 192; v02yd = 144;
			break;
		case 4: v02xd = 256; v02yd = 192;
			break;
		case 5: v02xd = 320; v02yd = 240;
			break;
		default: return 58 ;
	}
	if(
	 ( buf = (char *)TL_malloc( (16+v02xd*v02yd*2*3/8)*8 + v02xd*v02yd*2 ) )
	 == NULL
	)return 7;
	if( ( fp = fopen( name, "wb" ) ) == NULL ){
		TL_free( buf );
		return 2;
	}

	for( i= 0 ; i<8 ; i++ )
	{
		b[i] = buf + (16+v02xd*v02yd*2*3/8)*i ;
		v02_digit_buf0[i] = b[i] + 16 ;
		v02_digit_timing_flag0[i] = 0;

		WORD( b[i] + 0 ) = 1 ;
		WORD( b[i] + 2 ) = 0x2104 ;
		DWORD( b[i] + 4 ) = 8 + v02xd*v02yd*2*3/8 ;
		DWORD( b[i] + 8 ) = 1 ;
		BYTE( b[i] + 12 ) = 0 ;
		BYTE( b[i] + 13 ) = 0xff ;
		WORD( b[i] + 14 ) = v02xd*v02yd*2*3/8 ;
	}

	v02_digit_counter = 0 ;

	v02_digit_wait = wt;
	v02_digit_work = buf + (16+v02xd*v02yd*2*3/8)*8 ;
	v02_digit_ytab = ytab;
	v02_digit_ctab = ctab;

	for( i=0 ; i<64 ; i++ )DWORD( head + i*4 ) = 0;
	DWORD( head ) = 0x32304456;		/* ID = VD02 */
	DWORD( head + 4 ) = 0 ;			/* total length */
	DWORD( head + 8 ) = 0 ;			/* total frame */
	DWORD( head + 12 ) = 6;		/* dataの種類番号(bit/ピクセル) */
	DWORD( head + 16 ) = v02xd;		/* 横 */
	DWORD( head + 20 ) = v02yd;		/* 縦 */
	DWORD( head + 24 ) = wt;		/* wait */
	DWORD( head + 28 ) = 8;			/* バインダ内こま数 */
	DWORD( head + 32 ) = 8000*6/wt;		/* sound samp. freq */
	DWORD( head + 36 ) = 6400;		/* バインダ内snd data Byte数 */
	if( fwrite( head, 256, 1, fp ) < 1 ){	/* ヘッダー */
		fclose(fp);
		TL_free( buf );
		return 2;			/* 2 = error num. */
	}
	if( fwrite( v02tab, 32768+512, 1, fp ) < 1 ){	/* v02 table */
		fclose(fp);
		TL_free( buf );
		return 2;			/* 2 = error num. */
	}

	switch( md ){
		case 1: EGB_displayPage(guiEgbPtr,0,1);
			EGB_resolution(guiEgbPtr,0,16);
			EGB_writePage(guiEgbPtr,0);
			EGB_displayStart(guiEgbPtr,2,8,1);
			EGB_digitize(guiEgbPtr,1);
			size = v02xd*v02yd*2*3/8 + 16 ;	/* frame size */
			skip = 32 + 6400 ;
			mouse(1);

			SND_fm_timer_b_set( 0, 0 ) ;
			VSYNC_init();
			VSYNC_setEvent( v02_trans_128_0 );

			f = 0 ;
			for( i=0; i<frame; i += 8 )
			{
			    fseek( fp, skip, SEEK_CUR );

			    if( frame - i >= 8 )
				n = 8 ;
			    else
				n = frame - i ;

			    for( j=0; j<n; j++ )
			    {
				while( v02_digit_timing_flag0[j] == 0 );
				if( fwrite( b[j], size, 1, fp ) < 1 )
				    break;
				v02_digit_timing_flag0[j] = 0;
				f++ ;
			    }
			}

			VSYNC_end();
			SND_fm_timer_b_start() ;
			break;

		case 2: EGB_displayPage(guiEgbPtr,0,1);
			EGB_resolution(guiEgbPtr,0,16);
			EGB_writePage(guiEgbPtr,0);
			EGB_displayStart(guiEgbPtr,2,8,1);
			EGB_digitize(guiEgbPtr,1);
			size = v02xd*v02yd*2*3/8 + 16 ;	/* frame size */
			skip = 32 + 6400 ;
			mouse(1);

			SND_fm_timer_b_set( 0, 0 ) ;
			VSYNC_init();
			VSYNC_setEvent( v02_trans_160_0 );

			f = 0 ;
			for( i=0; i<frame; i += 8 )
			{
			    fseek( fp, skip, SEEK_CUR );

			    if( frame - i >= 8 )
				n = 8 ;
			    else
				n = frame - i ;

			    for( j=0; j<n; j++ )
			    {
				while( v02_digit_timing_flag0[j] == 0 );
				if( fwrite( b[j], size, 1, fp ) < 1 )
				    break;
				v02_digit_timing_flag0[j] = 0;
				f++ ;
			    }
			}

			VSYNC_end();
			SND_fm_timer_b_start() ;
			break;

		case 3: EGB_displayPage(guiEgbPtr,0,1);
			EGB_resolution(guiEgbPtr,0,16);
			EGB_writePage(guiEgbPtr,0);
			EGB_displayStart(guiEgbPtr,2,4,1);
			EGB_digitize(guiEgbPtr,1);
			size = v02xd*v02yd*2*3/8 + 16 ;	/* frame size */
			skip = 32 + 6400 ;
			mouse(1);

			SND_fm_timer_b_set( 0, 0 ) ;
			VSYNC_init();
			VSYNC_setEvent( v02_trans_192_0 );

			f = 0 ;
			for( i=0; i<frame; i += 8 )
			{
			    fseek( fp, skip, SEEK_CUR );

			    if( frame - i >= 8 )
				n = 8 ;
			    else
				n = frame - i ;

			    for( j=0; j<n; j++ )
			    {
				while( v02_digit_timing_flag0[j] == 0 );
				if( fwrite( b[j], size, 1, fp ) < 1 )
				    break;
				v02_digit_timing_flag0[j] = 0;
				f++ ;
			    }
			}

			VSYNC_end();
			SND_fm_timer_b_start() ;
			break;

		case 4: EGB_displayPage(guiEgbPtr,0,1);
			EGB_resolution(guiEgbPtr,0,16);
			EGB_writePage(guiEgbPtr,0);
			EGB_displayStart(guiEgbPtr,2,4,1);
			EGB_digitize(guiEgbPtr,1);
			size = v02xd*v02yd*2*3/8 + 16 ;	/* frame size */
			skip = 32 + 6400 ;
			mouse(1);

			SND_fm_timer_b_set( 0, 0 ) ;
			VSYNC_init();
			VSYNC_setEvent( v02_trans_256_0 );

			f = 0 ;
			for( i=0; i<frame; i += 8 )
			{
			    fseek( fp, skip, SEEK_CUR );

			    if( frame - i >= 8 )
				n = 8 ;
			    else
				n = frame - i ;

			    for( j=0; j<n; j++ )
			    {
				while( v02_digit_timing_flag0[j] == 0 );
				if( fwrite( b[j], size, 1, fp ) < 1 )
				    break;
				v02_digit_timing_flag0[j] = 0;
				f++ ;
			    }
			}

			VSYNC_end();
			SND_fm_timer_b_start() ;
			break;

		case 5: EGB_displayPage(guiEgbPtr,0,1);
			EGB_resolution(guiEgbPtr,0,16);
			EGB_writePage(guiEgbPtr,0);
			EGB_displayStart(guiEgbPtr,2,4,1);
			EGB_digitize(guiEgbPtr,1);
			size = v02xd*v02yd*2*3/8 + 16 ;	/* frame size */
			skip = 32 + 6400 ;
			mouse(1);

			SND_fm_timer_b_set( 0, 0 ) ;
			VSYNC_init();
			VSYNC_setEvent( v02_trans_320_0 );

			f = 0 ;
			for( i=0; i<frame; i += 8 )
			{
			    fseek( fp, skip, SEEK_CUR );

			    if( frame - i >= 8 )
				n = 8 ;
			    else
				n = frame - i ;

			    for( j=0; j<n; j++ )
			    {
				while( v02_digit_timing_flag0[j] == 0 );
				if( fwrite( b[j], size, 1, fp ) < 1 )
				    break;
				v02_digit_timing_flag0[j] = 0;
				f++ ;
			    }
			}

			VSYNC_end();
			SND_fm_timer_b_start() ;
			break;
	}	

			/* mute */
	int s ;
	SND_get_elevol_mute( &s ) ;
	SND_elevol_mute( s & 0xfffffff3 ) ;

	EGB_digitize(guiEgbPtr,0);
	EGB_displayPage(guiEgbPtr,0,0);

	EGB_color( guiEgbPtr, 1, 0 ) ;
	EGB_clearScreen( guiEgbPtr ) ;			/*	画面をきれいにしよう */

	fseek( fp, 0, SEEK_SET );
	fseek( fp, 256+32768+512, SEEK_CUR );

	for( i=0 ; i<6400 ; i += 4 )
		DWORD( buf + i ) = 0x80808080 ;
	bind = 0 ;
	for( i=0 ; i<f ; i += 8 )
	{
		if( f - i >= 8 )
			n = 8 ;
		else
			n = f - i ;

		for( j=0 ; j<8 ; j++ )DWORD( bind_head + j*4 ) = 0;
		DWORD( bind_head ) = bind;
		DWORD( bind_head + 4 ) = 6400 + (16 + v02xd*v02yd*2*3/8)*n ;
		if( fwrite( bind_head, 32, 1, fp ) < 1 )
		{
			fclose(fp);
			TL_free( buf );
			return 2;			/* 2 = error num. */
		}
		if( fwrite( buf, 6400, 1, fp ) < 1 )
		{
			fclose(fp);
			TL_free( buf );
			return 2;			/* 2 = error num. */
		}
		if( n < 8 )
			break ;
		fseek( fp, (16 + v02xd*v02yd*2*3/8)*8, SEEK_CUR );
		bind++ ;
	}

		/* total data size 修正 */

	total = 32768 + 512 ;
	if( f%8 )
		total = total + (f/8 + 1)*(32+6400) ;
	else
		total = total + f/8*(32+6400) ;
	total = total + f*(v02xd*v02yd*2*3/8 + 16) ;

	fseek( fp, 0, SEEK_SET );
	DWORD( head + 4 ) = total ;		/* total length */
	DWORD( head + 8 ) = f;			/* total frame	 */
	if( fwrite( head, 256, 1, fp ) < 1 ){	/* ヘッダー */
		fclose(fp);
		TL_free( buf );
		return 2;			/* 2 = error num. */
	}

	fclose(fp);
	TL_free( buf );
	if( f < frame )return 2;
	else return 0;
}

/* サンプリングレート 9600 19200 サポート版(fq=0:9600 fq=1:19200) */

v02_digit_save_0_2( name, frame, md, fq, wt, ytab, ctab, v02tab )
char *name ;
int frame, md, fq, wt ;
char *ytab, *ctab, *v02tab ;
{
	FILE *fp;
	int v02xd = 128, v02yd = 96;
	int i, j, n, f, freq, size, skip, total, bind ;
	char head[256], bind_head[32] ;
	char *buf, *b[8];		/* buffer */

	switch( fq ){
		case 0: freq = 9600 ;
			break;
		case 1: freq = 19200 ;
			break;
		default: return 58 ;
	}
	switch( md ){
		case 1: v02xd = 128; v02yd = 96;
			break;
		case 2: v02xd = 160; v02yd = 120;
			break;
		case 3: v02xd = 192; v02yd = 144;
			break;
		case 4: v02xd = 256; v02yd = 192;
			break;
		case 5: v02xd = 320; v02yd = 240;
			break;
		default: return 58 ;
	}
	if(
	 ( buf = (char *)TL_malloc( (16+v02xd*v02yd*2*3/8)*8 + v02xd*v02yd*2 ) )
	 == NULL
	)return 7;
	if( ( fp = fopen( name, "wb" ) ) == NULL ){
		TL_free( buf );
		return 2;
	}

	for( i= 0 ; i<8 ; i++ )
	{
		b[i] = buf + (16+v02xd*v02yd*2*3/8)*i ;
		v02_digit_buf0[i] = b[i] + 16 ;
		v02_digit_timing_flag0[i] = 0;

		WORD( b[i] + 0 ) = 1 ;
		WORD( b[i] + 2 ) = 0x2104 ;
		DWORD( b[i] + 4 ) = 8 + v02xd*v02yd*2*3/8 ;
		DWORD( b[i] + 8 ) = 1 ;
		BYTE( b[i] + 12 ) = 0 ;
		BYTE( b[i] + 13 ) = 0xff ;
		WORD( b[i] + 14 ) = v02xd*v02yd*2*3/8 ;
	}

	v02_digit_counter = 0 ;

	v02_digit_wait = wt;
	v02_digit_work = buf + (16+v02xd*v02yd*2*3/8)*8 ;
	v02_digit_ytab = ytab;
	v02_digit_ctab = ctab;

	for( i=0 ; i<64 ; i++ )DWORD( head + i*4 ) = 0;
	DWORD( head ) = 0x32304456;		/* ID = VD02 */
	DWORD( head + 4 ) = 0 ;			/* total length */
	DWORD( head + 8 ) = 0 ;			/* total frame */
	DWORD( head + 12 ) = 7;		/* dataの種類番号(mvbType) */
	DWORD( head + 16 ) = v02xd;		/* 横 */
	DWORD( head + 20 ) = v02yd;		/* 縦 */
	DWORD( head + 24 ) = wt;		/* wait */
	DWORD( head + 28 ) = 8;			/* バインダ内こま数 */
	DWORD( head + 32 ) = freq;		/* sound samp. freq */
	DWORD( head + 36 ) = wt*freq/60*8;		/* バインダ内snd data Byte数 */
	if( fwrite( head, 256, 1, fp ) < 1 ){	/* ヘッダー */
		fclose(fp);
		TL_free( buf );
		return 2;			/* 2 = error num. */
	}
	if( fwrite( v02tab, 32768+512, 1, fp ) < 1 ){	/* v02 table */
		fclose(fp);
		TL_free( buf );
		return 2;			/* 2 = error num. */
	}

	switch( md ){
		case 1: EGB_displayPage(guiEgbPtr,0,1);
			EGB_resolution(guiEgbPtr,0,16);
			EGB_writePage(guiEgbPtr,0);
			EGB_displayStart(guiEgbPtr,2,8,1);
			EGB_digitize(guiEgbPtr,1);
			size = v02xd*v02yd*2*3/8 + 16 ;	/* frame size */
			skip = 32 + wt*freq/60*8 ;
			mouse(1);

			SND_fm_timer_b_set( 0, 0 ) ;
			VSYNC_init();
			VSYNC_setEvent( v02_trans_128_0 );

			f = 0 ;
			for( i=0; i<frame; i += 8 )
			{
			    fseek( fp, skip, SEEK_CUR );

			    if( frame - i >= 8 )
				n = 8 ;
			    else
				n = frame - i ;

			    for( j=0; j<n; j++ )
			    {
				while( v02_digit_timing_flag0[j] == 0 );
				if( fwrite( b[j], size, 1, fp ) < 1 )
				    break;
				v02_digit_timing_flag0[j] = 0;
				f++ ;
			    }
			}

			VSYNC_end();
			SND_fm_timer_b_start() ;
			break;

		case 2: EGB_displayPage(guiEgbPtr,0,1);
			EGB_resolution(guiEgbPtr,0,16);
			EGB_writePage(guiEgbPtr,0);
			EGB_displayStart(guiEgbPtr,2,8,1);
			EGB_digitize(guiEgbPtr,1);
			size = v02xd*v02yd*2*3/8 + 16 ;	/* frame size */
			skip = 32 + wt*freq/60*8 ;
			mouse(1);

			SND_fm_timer_b_set( 0, 0 ) ;
			VSYNC_init();
			VSYNC_setEvent( v02_trans_160_0 );

			f = 0 ;
			for( i=0; i<frame; i += 8 )
			{
			    fseek( fp, skip, SEEK_CUR );

			    if( frame - i >= 8 )
				n = 8 ;
			    else
				n = frame - i ;

			    for( j=0; j<n; j++ )
			    {
				while( v02_digit_timing_flag0[j] == 0 );
				if( fwrite( b[j], size, 1, fp ) < 1 )
				    break;
				v02_digit_timing_flag0[j] = 0;
				f++ ;
			    }
			}

			VSYNC_end();
			SND_fm_timer_b_start() ;
			break;

		case 3: EGB_displayPage(guiEgbPtr,0,1);
			EGB_resolution(guiEgbPtr,0,16);
			EGB_writePage(guiEgbPtr,0);
			EGB_displayStart(guiEgbPtr,2,4,1);
			EGB_digitize(guiEgbPtr,1);
			size = v02xd*v02yd*2*3/8 + 16 ;	/* frame size */
			skip = 32 + wt*freq/60*8 ;
			mouse(1);

			SND_fm_timer_b_set( 0, 0 ) ;
			VSYNC_init();
			VSYNC_setEvent( v02_trans_192_0 );

			f = 0 ;
			for( i=0; i<frame; i += 8 )
			{
			    fseek( fp, skip, SEEK_CUR );

			    if( frame - i >= 8 )
				n = 8 ;
			    else
				n = frame - i ;

			    for( j=0; j<n; j++ )
			    {
				while( v02_digit_timing_flag0[j] == 0 );
				if( fwrite( b[j], size, 1, fp ) < 1 )
				    break;
				v02_digit_timing_flag0[j] = 0;
				f++ ;
			    }
			}

			VSYNC_end();
			SND_fm_timer_b_start() ;
			break;

		case 4: EGB_displayPage(guiEgbPtr,0,1);
			EGB_resolution(guiEgbPtr,0,16);
			EGB_writePage(guiEgbPtr,0);
			EGB_displayStart(guiEgbPtr,2,4,1);
			EGB_digitize(guiEgbPtr,1);
			size = v02xd*v02yd*2*3/8 + 16 ;	/* frame size */
			skip = 32 + wt*freq/60*8 ;
			mouse(1);

			SND_fm_timer_b_set( 0, 0 ) ;
			VSYNC_init();
			VSYNC_setEvent( v02_trans_256_0 );

			f = 0 ;
			for( i=0; i<frame; i += 8 )
			{
			    fseek( fp, skip, SEEK_CUR );

			    if( frame - i >= 8 )
				n = 8 ;
			    else
				n = frame - i ;

			    for( j=0; j<n; j++ )
			    {
				while( v02_digit_timing_flag0[j] == 0 );
				if( fwrite( b[j], size, 1, fp ) < 1 )
				    break;
				v02_digit_timing_flag0[j] = 0;
				f++ ;
			    }
			}

			VSYNC_end();
			SND_fm_timer_b_start() ;
			break;

		case 5: EGB_displayPage(guiEgbPtr,0,1);
			EGB_resolution(guiEgbPtr,0,16);
			EGB_writePage(guiEgbPtr,0);
			EGB_displayStart(guiEgbPtr,2,4,1);
			EGB_digitize(guiEgbPtr,1);
			size = v02xd*v02yd*2*3/8 + 16 ;	/* frame size */
			skip = 32 + wt*freq/60*8 ;
			mouse(1);

			SND_fm_timer_b_set( 0, 0 ) ;
			VSYNC_init();
			VSYNC_setEvent( v02_trans_320_0 );

			f = 0 ;
			for( i=0; i<frame; i += 8 )
			{
			    fseek( fp, skip, SEEK_CUR );

			    if( frame - i >= 8 )
				n = 8 ;
			    else
				n = frame - i ;

			    for( j=0; j<n; j++ )
			    {
				while( v02_digit_timing_flag0[j] == 0 );
				if( fwrite( b[j], size, 1, fp ) < 1 )
				    break;
				v02_digit_timing_flag0[j] = 0;
				f++ ;
			    }
			}

			VSYNC_end();
			SND_fm_timer_b_start() ;
			break;
	}

			/* mute */
	int s ;
	SND_get_elevol_mute( &s ) ;
	SND_elevol_mute( s & 0xfffffff3 ) ;

	EGB_digitize(guiEgbPtr,0);
	EGB_displayPage(guiEgbPtr,0,0);

	EGB_color( guiEgbPtr, 1, 0 ) ;
	EGB_clearScreen( guiEgbPtr ) ;			/*	画面をきれいにしよう */

	fseek( fp, 0, SEEK_SET );
	fseek( fp, 256+32768+512, SEEK_CUR );

	for( i=0 ; i<(wt*freq/60*8) ; i += 4 )
		DWORD( buf + i ) = 0x80808080 ;
	bind = 0 ;
	for( i=0 ; i<f ; i += 8 )
	{
		if( f - i >= 8 )
			n = 8 ;
		else
			n = f - i ;

		for( j=0 ; j<8 ; j++ )DWORD( bind_head + j*4 ) = 0;
		DWORD( bind_head ) = bind;
		DWORD( bind_head + 4 ) = wt*freq/60*8 + (16 + v02xd*v02yd*2*3/8)*n ;
		if( fwrite( bind_head, 32, 1, fp ) < 1 )
		{
			fclose(fp);
			TL_free( buf );
			return 2;			/* 2 = error num. */
		}
		if( fwrite( buf, wt*freq/60*8, 1, fp ) < 1 )
		{
			fclose(fp);
			TL_free( buf );
			return 2;			/* 2 = error num. */
		}
		if( n < 8 )
			break ;
		fseek( fp, (16 + v02xd*v02yd*2*3/8)*8, SEEK_CUR );
		bind++ ;
	}

		/* total data size 修正 */

	total = 32768 + 512 ;
	if( f%8 )
		total = total + (f/8 + 1)*(32+wt*freq/60*8) ;
	else
		total = total + f/8*(32+wt*freq/60*8) ;
	total = total + f*(v02xd*v02yd*2*3/8 + 16) ;

	fseek( fp, 0, SEEK_SET );
	DWORD( head + 4 ) = total ;		/* total length */
	DWORD( head + 8 ) = f;			/* total frame	 */
	if( fwrite( head, 256, 1, fp ) < 1 ){	/* ヘッダー */
		fclose(fp);
		TL_free( buf );
		return 2;			/* 2 = error num. */
	}

	fclose(fp);
	TL_free( buf );
	if( f < frame )return 2;
	else return 0;
}

v02_snd_save_0( name )
char *name ;
{
	FILE *fp;
	int i, count, f, wt, freq, total, bf, bsnd, stotal, sndp, bsize;
	char head[256], bind_head[32] ;
	char *buf ;				/* buffer */

	if( ( fp = fopen( name, "rb" ) ) == NULL ){
		return 1;
	}
	if( fread( head, 256, 1, fp ) < 1 ){	/* ヘッダー */
		fclose(fp);
		return 1;
	}
	fclose(fp);

	total = DWORD( head + 4 ) ;		/* total length */
	f = DWORD( head + 8 );			/* total frame	 */
	wt = DWORD( head + 24 );		/* wait */
	if( wt == 0 )
		wt = 6 ;
	bf = DWORD( head + 28 );		/* バインダ内こま数 */
	if( bf == 0 )
		bf = 8 ;
	freq = DWORD( head + 32 );		/* sound samp. freq */
	if( freq == 0 )
		freq = 8000*6/wt ;
	bsnd = DWORD( head + 36 );		/* バインダ内snd data Byte数 */
	if( bsnd == 0 )
		bsnd = 6400 ;

	stotal = freq * f * wt / 60 ;

	if( ( buf = (char *)TL_malloc( stotal + bsnd ) ) == NULL )
	{
		return 7;
	}
	for( i=0 ; i<bsnd-4 ; i += 4 )
		DWORD( buf + stotal + i ) = 0x80808080 ;
	/* 1バインダのクッションが必要 */

	EGB_displayPage(guiEgbPtr,0,1);
	EGB_resolution(guiEgbPtr,0,16);
	EGB_writePage(guiEgbPtr,0);
	EGB_displayStart(guiEgbPtr,2,4,1);
	EGB_digitize(guiEgbPtr,1);

	mouse(1);

	interrupt_disable() ;
	SND_pcm_rec( freq, buf, stotal, 0 );
	interrupt_enable() ;

			/* mute */
	int s ;
	SND_get_elevol_mute( &s ) ;
	SND_elevol_mute( s & 0xfffffff3 ) ;

	EGB_digitize(guiEgbPtr,0);
	EGB_displayPage(guiEgbPtr,0,0);

	EGB_color( guiEgbPtr, 1, 0 ) ;
	EGB_clearScreen( guiEgbPtr ) ;			/*	画面をきれいにしよう */

	if( ( fp = fopen( name, "r+b" ) ) == NULL ){
		return 2;
	}

	count = 256+32768+512 ;
	if( count >= total + 256 )
	{
		TL_free( buf );
		fclose(fp);
		return 58;
	}

	sndp = 0 ;
	for( i=0; i<f; i += bf )
	{
		fseek( fp, count, SEEK_SET );
		if( fread( bind_head, 32, 1, fp ) < 1 )
		{
			fclose(fp);
			TL_free( buf );
			return 1;
		}
		count = count + 32 ;
		if( count > total + 256 )
			break ;

		bsize = DWORD( bind_head + 4 ) ;
		if( bsize <= bsnd )
			break ;

		if( sndp+bsnd < stotal )
		{
			fseek( fp, count, SEEK_SET );
			if( fwrite( buf+sndp, bsnd, 1, fp ) < 1 )
			{
				fclose(fp);
				TL_free( buf );
				return 2;
			}
			sndp = sndp + bsnd ;
		}
		else
		{
			fseek( fp, count, SEEK_SET );
			if( fwrite( buf+sndp, stotal-sndp, 1, fp ) < 1 )
			{
				fclose(fp);
				TL_free( buf );
				return 2;
			}
			break ;
		}

		count = count + bsize ;
		if( count > total + 256 )
			break ;
	}

	fclose(fp);
	TL_free( buf );
	return 0;
}

v02_digit_snd_save( name, frame, md, wt, ytab, ctab, v02tab )
char *name;
int frame, md, wt;
char *ytab, *ctab, *v02tab ;
{
	FILE *fp;
	int freq ;
	int v02xd = 128, v02yd = 96;
	int i, j, size, error;
	char head[256], bind_head[32], data_top[16] ;
	char *buf, *snd, *wk ;		/* buffer */

	error = 0;
	switch( wt ){
		case 4: freq = 12000 ;
			break;
		case 5: freq = 9600 ;
			break;
		case 6: freq = 8000 ;
			break;
		case 7: freq = 6857 ;
			break;
		default: return 58 ;
	}
	switch( md ){
		case 1: v02xd = 128; v02yd = 96;
			break;
		case 2: v02xd = 160; v02yd = 120;
			break;
		case 3: v02xd = 192; v02yd = 144;
			break;
		case 4: v02xd = 256; v02yd = 192;
			break;
		case 5: v02xd = 320; v02yd = 240;
			break;
		default: return 58 ;
	}
	size = v02xd*v02yd*2;		/* frame size */
	if( ( buf = (char *)TL_malloc( size*frame*3/8 + size ) ) == NULL )
	{
		error = 7;
		goto vd11;
	}
	wk = buf + size*frame*3/8 ;
	if( ( snd = (char *)TL_malloc( frame*800 + 20000 ) ) == NULL )
	{
		error = 7;
		goto vd10;
	}
	for( i=0 ; i<20000-100 ; i += 4 )
		DWORD( snd + frame*800 + i ) = 0x80808080 ;
	/* 1バインダ(v00タイプなら6400,mvbなら15360のクッションが必要 */
	/* ここでは余裕をみて20K取っている */

	switch( md ){
		case 1: EGB_displayPage(guiEgbPtr,0,1);
			EGB_resolution(guiEgbPtr,0,16);
			EGB_writePage(guiEgbPtr,0);
			EGB_displayStart(guiEgbPtr,2,8,1);
			EGB_digitize(guiEgbPtr,1);
			mouse(1);

//			SND_fm_timer_b_set( 0, 0 ) ;

			switch( wt ){
				case 4: v02_snd_trans_128_4( snd, frame*800,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
					break;
				case 5: v02_snd_trans_128_5( snd, frame*800,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
					break;
				case 6: v02_snd_trans_128_6( snd, frame*800,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
					break;
				case 7: v02_snd_trans_128_7( snd, frame*800,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
					break;
			}

//			SND_fm_timer_b_start() ;
			break;

		case 2: EGB_displayPage(guiEgbPtr,0,1);
			EGB_resolution(guiEgbPtr,0,16);
			EGB_writePage(guiEgbPtr,0);
			EGB_displayStart(guiEgbPtr,2,8,1);
			EGB_digitize(guiEgbPtr,1);
			mouse(1);

//			SND_fm_timer_b_set( 0, 0 ) ;

			switch( wt ){
				case 4: v02_snd_trans_160_4( snd, frame*800,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
					break;
				case 5: v02_snd_trans_160_5( snd, frame*800,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
					break;
				case 6: v02_snd_trans_160_6( snd, frame*800,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
					break;
				case 7: v02_snd_trans_160_7( snd, frame*800,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
					break;
			}

//			SND_fm_timer_b_start() ;
			break;

		case 3: EGB_displayPage(guiEgbPtr,0,1);
			EGB_resolution(guiEgbPtr,0,16);
			EGB_writePage(guiEgbPtr,0);
			EGB_displayStart(guiEgbPtr,2,4,1);
			EGB_digitize(guiEgbPtr,1);
			mouse(1);

//			SND_fm_timer_b_set( 0, 0 ) ;

			switch( wt ){
				case 4: v02_snd_trans_192_4( snd, frame*800,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
					break;
				case 5: v02_snd_trans_192_5( snd, frame*800,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
					break;
				case 6: v02_snd_trans_192_6( snd, frame*800,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
					break;
				case 7: v02_snd_trans_192_7( snd, frame*800,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
					break;
			}

//			SND_fm_timer_b_start() ;
			break;

		case 4: EGB_displayPage(guiEgbPtr,0,1);
			EGB_resolution(guiEgbPtr,0,16);
			EGB_writePage(guiEgbPtr,0);
			EGB_displayStart(guiEgbPtr,2,4,1);
			EGB_digitize(guiEgbPtr,1);
			mouse(1);

//			SND_fm_timer_b_set( 0, 0 ) ;

			switch( wt ){
				case 4: v02_snd_trans_256_4( snd, frame*800,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
					break;
				case 5: v02_snd_trans_256_5( snd, frame*800,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
					break;
				case 6: v02_snd_trans_256_6( snd, frame*800,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
					break;
				case 7: v02_snd_trans_256_7( snd, frame*800,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
					break;
			}

//			SND_fm_timer_b_start() ;
			break;

		case 5: EGB_displayPage(guiEgbPtr,0,1);
			EGB_resolution(guiEgbPtr,0,16);
			EGB_writePage(guiEgbPtr,0);
			EGB_displayStart(guiEgbPtr,2,4,1);
			EGB_digitize(guiEgbPtr,1);
			mouse(1);

//			SND_fm_timer_b_set( 0, 0 ) ;

			switch( wt ){
				case 4: v02_snd_trans_320_4( snd, frame*800,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
					break;
				case 5: v02_snd_trans_320_5( snd, frame*800,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
					break;
				case 6: v02_snd_trans_320_6( snd, frame*800,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
					break;
				case 7: v02_snd_trans_320_7( snd, frame*800,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
					break;
			}

//			SND_fm_timer_b_start() ;
			break;
	}
			/* mute */
	int s ;
	SND_get_elevol_mute( &s ) ;
	SND_elevol_mute( s & 0xfffffff3 ) ;

	EGB_digitize(guiEgbPtr,0);
	EGB_displayPage(guiEgbPtr,0,0);

	EGB_color( guiEgbPtr, 1, 0 ) ;
	EGB_clearScreen( guiEgbPtr ) ;			/*	画面をきれいにしよう */

	for( i=0 ; i<frame*800 ; i++ )
	{
		if( BYTE( snd+i ) == 0 )
			BYTE( snd+i ) = 1 ;
		if( BYTE( snd+i ) == 255 )
			BYTE( snd+i ) = 254 ;

		if( BYTE( snd+i ) < 128 )
			BYTE( snd+i ) = 128 - BYTE( snd+i ) ;
	}

vd06:	if( ( fp = fopen( name, "wb" ) ) == NULL ){
		error = 2;
		TL_free( snd );
		goto vd10;
	}

	int total, sndp, dtp, bind, fcount, n ;
	total = 0 ; sndp = 0 ; dtp = 0 ; bind = 0 ; fcount = 0 ;

	for( i=0 ; i<64 ; i++ )DWORD( head + i*4 ) = 0;
	DWORD( head ) = 0x32304456;		/* ID = VD02 */
	DWORD( head + 4 ) = 0 ;			/* total length */
	DWORD( head + 8 ) = 0 ;			/* total frame */
	DWORD( head + 12 ) = 6;		/* dataの種類番号(bit/ピクセル) */
	DWORD( head + 16 ) = v02xd;		/* 横 */
	DWORD( head + 20 ) = v02yd;		/* 縦 */
	DWORD( head + 24 ) = wt;		/* wait */
	DWORD( head + 28 ) = 8;			/* バインダ内こま数 */
	DWORD( head + 32 ) = 8000*6/wt;		/* sound samp. freq */
	DWORD( head + 36 ) = 6400;		/* バインダ内snd data Byte数 */
	if( fwrite( head, 256, 1, fp ) < 1 ){	/* ヘッダー */
		error = 2;
		goto vd08;
	}

	if( fwrite( v02tab, 32768+512, 1, fp ) < 1 ){	/* v02 table */
		error = 2;
		goto vd08;
	}
	total = total + 32768+512 ;

	WORD( data_top + 0 ) = 1 ;
	WORD( data_top + 2 ) = 0x2104 ;
	DWORD( data_top + 4 ) = 8 + v02xd*v02yd*2*3/8 ;
	DWORD( data_top + 8 ) = 1 ;
	BYTE( data_top + 12 ) = 0 ;
	BYTE( data_top + 13 ) = 0xff ;
	WORD( data_top + 14 ) = v02xd*v02yd*2*3/8 ;

	for( i=0 ; i<frame ; i += 8 )
	{
		if( frame - i >= 8 )
			n = 8 ;
		else
			n = frame - i ;

		for( j=0 ; j<8 ; j++ )DWORD( bind_head + j*4 ) = 0;
		DWORD( bind_head ) = bind;
		DWORD( bind_head + 4 ) = 6400 + (16 + v02xd*v02yd*2*3/8)*n ;
		if( fwrite( bind_head, 32, 1, fp ) < 1 )
		{
			error = 2;
			goto vd08;
		}

		if( fwrite( snd + sndp, 6400, 1, fp ) < 1 )
		{
			error = 2;
			goto vd08;
		}
		sndp += 6400 ;

		for( j=0 ; j<n ; j++ )
		{
			if( fwrite( data_top, 16, 1, fp ) < 1 )
			{
				error = 2;
				goto vd08;
			}

			if( fwrite(buf+dtp, v02xd*v02yd*2*3/8, 1, fp) < 1 )
			{
				error = 2;
				goto vd08;
			}
			dtp += v02xd*v02yd*2*3/8 ;
		}
		total = total + 32 + 6400 + (16 + v02xd*v02yd*2*3/8)*n ;
		bind++ ;
		fcount += n ;
	}

vd08:	fseek( fp, 0, SEEK_SET ) ;
	DWORD( head + 4 ) = total ;		 /* total length */
	DWORD( head + 8 ) = fcount ;		/* total frame	 */
	if( fwrite( head, 256, 1, fp ) < 1 ){	/* ヘッダー */
		error = 2;
	}
	TL_free( snd );
vd09:	fclose(fp);
vd10:	TL_free( buf );
vd11:	

	return error;
}

/* サンプリングレート 9600 19200 サポート版(fq=0:9600 fq=1:19200) */

v02_digit_snd_save2( name, frame, md, fq, wt, ytab, ctab, v02tab )
char *name;
int frame, md, fq, wt;
char *ytab, *ctab, *v02tab ;
{
	FILE *fp;
	int freq ;
	int v02xd = 128, v02yd = 96;
	int i, j, size, error;
	char head[256], bind_head[32], data_top[16] ;
	char *buf, *snd, *wk ;		/* buffer */

	error = 0;
	switch( fq ){
		case 0: freq = 9600 ;
			break;
		case 1: freq = 19200 ;
			break;
		default: return 58 ;
	}
	switch( md ){
		case 1: v02xd = 128; v02yd = 96;
			break;
		case 2: v02xd = 160; v02yd = 120;
			break;
		case 3: v02xd = 192; v02yd = 144;
			break;
		case 4: v02xd = 256; v02yd = 192;
			break;
		case 5: v02xd = 320; v02yd = 240;
			break;
		default: return 58 ;
	}
	size = v02xd*v02yd*2;		/* frame size */
	if( ( buf = (char *)TL_malloc( size*frame*3/8 + size ) ) == NULL )
	{
		error = 7;
		goto vd11;
	}
	wk = buf + size*frame*3/8 ;
	if( ( snd = (char *)TL_malloc( frame*wt*freq/60 + 20000 ) ) == NULL )
	{
		error = 7;
		goto vd10;
	}
	for( i=0 ; i<20000-100 ; i += 4 )
		DWORD( snd + frame*wt*freq/60 + i ) = 0x80808080 ;
	/* 1バインダ(v00タイプなら6400,mvbなら15360)のクッションが必要 */
	/* ここでは余裕をみて20K取っている */

	switch( md ){
		case 1: EGB_displayPage(guiEgbPtr,0,1);
			EGB_resolution(guiEgbPtr,0,16);
			EGB_writePage(guiEgbPtr,0);
			EGB_displayStart(guiEgbPtr,2,8,1);
			EGB_digitize(guiEgbPtr,1);
			mouse(1);

			switch( freq ){
			case 9600:
				v02_trans_128_9600( snd, frame*wt*freq/60,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
				break ;
			case 19200:
				v02_trans_128_19200( snd, frame*wt*freq/60,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
				break ;
			}
			break;

		case 2: EGB_displayPage(guiEgbPtr,0,1);
			EGB_resolution(guiEgbPtr,0,16);
			EGB_writePage(guiEgbPtr,0);
			EGB_displayStart(guiEgbPtr,2,8,1);
			EGB_digitize(guiEgbPtr,1);
			mouse(1);

			switch( freq ){
			case 9600:
				v02_trans_160_9600( snd, frame*wt*freq/60,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
				break ;
			case 19200:
				v02_trans_160_19200( snd, frame*wt*freq/60,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
				break ;
			}
			break;

		case 3: EGB_displayPage(guiEgbPtr,0,1);
			EGB_resolution(guiEgbPtr,0,16);
			EGB_writePage(guiEgbPtr,0);
			EGB_displayStart(guiEgbPtr,2,4,1);
			EGB_digitize(guiEgbPtr,1);
			mouse(1);

			switch( freq ){
			case 9600:
				v02_trans_192_9600( snd, frame*wt*freq/60,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
				break ;
			case 19200:
				v02_trans_192_19200( snd, frame*wt*freq/60,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
				break ;
			}
			break;

		case 4: EGB_displayPage(guiEgbPtr,0,1);
			EGB_resolution(guiEgbPtr,0,16);
			EGB_writePage(guiEgbPtr,0);
			EGB_displayStart(guiEgbPtr,2,4,1);
			EGB_digitize(guiEgbPtr,1);
			mouse(1);

			switch( freq ){
			case 9600:
				v02_trans_256_9600( snd, frame*wt*freq/60,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
				break ;
			case 19200:
				v02_trans_256_19200( snd, frame*wt*freq/60,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
				break ;
			}
			break;

		case 5: EGB_displayPage(guiEgbPtr,0,1);
			EGB_resolution(guiEgbPtr,0,16);
			EGB_writePage(guiEgbPtr,0);
			EGB_displayStart(guiEgbPtr,2,4,1);
			EGB_digitize(guiEgbPtr,1);
			mouse(1);

			switch( freq ){
			case 9600:
				v02_trans_320_9600( snd, frame*wt*freq/60,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
				break ;
			case 19200:
				v02_trans_320_19200( snd, frame*wt*freq/60,
					buf, frame, wt*320, wt*320 - 320/2,
					ytab, ctab, wk ) ;
				break ;
			}
			break;
	}
			/* mute */
	int s ;
	SND_get_elevol_mute( &s ) ;
	SND_elevol_mute( s & 0xfffffff3 ) ;

	EGB_digitize(guiEgbPtr,0);
	EGB_displayPage(guiEgbPtr,0,0);

	EGB_color( guiEgbPtr, 1, 0 ) ;
	EGB_clearScreen( guiEgbPtr ) ;			/*	画面をきれいにしよう */

	for( i=0 ; i<(frame*wt*freq/60) ; i++ )
	{
		if( BYTE( snd+i ) == 0 )
			BYTE( snd+i ) = 1 ;
		if( BYTE( snd+i ) == 255 )
			BYTE( snd+i ) = 254 ;

		if( BYTE( snd+i ) < 128 )
			BYTE( snd+i ) = 128 - BYTE( snd+i ) ;
	}

vd06:	if( ( fp = fopen( name, "wb" ) ) == NULL ){
		error = 2;
		TL_free( snd );
		goto vd10;
	}

	int total, sndp, dtp, bind, fcount, n ;
	total = 0 ; sndp = 0 ; dtp = 0 ; bind = 0 ; fcount = 0 ;

	for( i=0 ; i<64 ; i++ )DWORD( head + i*4 ) = 0;
	DWORD( head ) = 0x32304456;		/* ID = VD02 */
	DWORD( head + 4 ) = 0 ;			/* total length */
	DWORD( head + 8 ) = 0 ;			/* total frame */
	DWORD( head + 12 ) = 7;		/* dataの種類番号(mvbType) */
	DWORD( head + 16 ) = v02xd;		/* 横 */
	DWORD( head + 20 ) = v02yd;		/* 縦 */
	DWORD( head + 24 ) = wt;		/* wait */
	DWORD( head + 28 ) = 8;			/* バインダ内こま数 */
	DWORD( head + 32 ) = freq;		/* sound samp. freq */
	DWORD( head + 36 ) = wt*freq/60*8;		/* バインダ内snd data Byte数 */
	if( fwrite( head, 256, 1, fp ) < 1 ){	/* ヘッダー */
		error = 2;
		goto vd08;
	}

	if( fwrite( v02tab, 32768+512, 1, fp ) < 1 ){	/* v02 table */
		error = 2;
		goto vd08;
	}
	total = total + 32768+512 ;

	WORD( data_top + 0 ) = 1 ;
	WORD( data_top + 2 ) = 0x2104 ;
	DWORD( data_top + 4 ) = 8 + v02xd*v02yd*2*3/8 ;
	DWORD( data_top + 8 ) = 1 ;
	BYTE( data_top + 12 ) = 0 ;
	BYTE( data_top + 13 ) = 0xff ;
	WORD( data_top + 14 ) = v02xd*v02yd*2*3/8 ;

	for( i=0 ; i<frame ; i += 8 )
	{
		if( frame - i >= 8 )
			n = 8 ;
		else
			n = frame - i ;

		for( j=0 ; j<8 ; j++ )DWORD( bind_head + j*4 ) = 0;
		DWORD( bind_head ) = bind;
		DWORD( bind_head + 4 ) = wt*freq/60*8 + (16 + v02xd*v02yd*2*3/8)*n ;
		if( fwrite( bind_head, 32, 1, fp ) < 1 )
		{
			error = 2;
			goto vd08;
		}

		if( fwrite( snd + sndp, wt*freq/60*8, 1, fp ) < 1 )
		{
			error = 2;
			goto vd08;
		}
		sndp += (wt*freq/60*8) ;

		for( j=0 ; j<n ; j++ )
		{
			if( fwrite( data_top, 16, 1, fp ) < 1 )
			{
				error = 2;
				goto vd08;
			}

			if( fwrite(buf+dtp, v02xd*v02yd*2*3/8, 1, fp) < 1 )
			{
				error = 2;
				goto vd08;
			}
			dtp += v02xd*v02yd*2*3/8 ;
		}
		total = total + 32 + (wt*freq/60*8) + (16 + v02xd*v02yd*2*3/8)*n ;
		bind++ ;
		fcount += n ;
	}

vd08:	fseek( fp, 0, SEEK_SET ) ;
	DWORD( head + 4 ) = total ;		 /* total length */
	DWORD( head + 8 ) = fcount ;		/* total frame	 */
	if( fwrite( head, 256, 1, fp ) < 1 ){	/* ヘッダー */
		error = 2;
	}
	TL_free( snd );
vd09:	fclose(fp);
vd10:	TL_free( buf );
vd11:	

	return error;
}

