#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 <tifflib.h>
#include <egb.h>
#include <mos.h>
#include <snd.h>
//#include "video.h"
#include "ugoku.h"
#include "old_mov.h"
#include "mrcdef.h"

extern	int		mouseSwCheck() ;
extern	int		errorCheck( int ) ;

extern	char	*guiEgbPtr ;	/*	EGB のワークアドレス	*/
extern	char	*rbuf ;			/*	自家製のワークアドレス	*/
extern	char	*bbuf ;			/*	自家製のワークアドレス	*/

extern int	baseDialogId ;

int	frmDialogId[9] = -1 ;
int	frmNumNumId = -1 ;
int	frmMesId[37] = -1 ;
int	frmSizeNumId = -1 ;
int	frmNextBtnId[2] = -1 ;
int	frmJmpNumId = -1 ;
int	frmJmpBtnId = -1 ;
int	frmSaveBtnId = -1 ;
int	frmDspBtnId = -1 ;
int	frmWaitNumId = -1 ;
int	frmLoopNumId = -1 ;
int	frmTIconId = -1 ;
int	frmNumId[16] = -1 ;
int	frmBtnId[4] = -1 ;
int	frmCanBtnId = -1 ;

static FILE *fp;
static char movFileName[100] ;
static int rect[4] ;
static char fileName[10][16] ;
static int ch71Flag ;
static int totalFrame ;
static int prtFrame ;
static int prtFile ;
static int headPoint ;
static int jumpFrame = 0 ;
static int error ;
static int frameSize ;
static int frameWait ;
static int frameLoop ;
static int frameSnd[16] ;

static char tifPath[80] = '\0' ;

editFrame( namemov, fname, ch71 )
char *namemov ;
char fname[][16] ;
int ch71 ;
{
	extern int r_waku_del() ;

	char head[256];
	int i, j ;
//	int movframe, movx0, movy0, movx1, movy1, movwait ;
	int var, min, max, delta, ptColumn ;
//	int prt, len, page ;

sv01:
	for( i=0 ; i<80 ; i++ )
	{
		movFileName[i] = namemov[i] ;
		if( namemov[i] == '\0' )break ;
	}
	for( i=0 ; i<10 ; i++ )
	{
		for( j=0 ; j<16 ; j++ )
		{
			fileName[i][j] = fname[i][j] ;
			if( fileName[i][j] == '\0' )break ;
		}
	}
	ch71Flag = ch71 ;

	for( i=0 ; i<6 ; i++ ){ /* write protect の場合6回必要 */ 
		if( ( fp = fopen( namemov, "r+b" ) ) != NULL )goto sv0A;
	}
	return 2;
sv0A:
	fseek( fp, 0, SEEK_SET );
	if( fread( head, 256, 1, fp ) < 1 ){
		fclose( fp );
		return 58;
	}

		/* 表示パネル アタッチ */
	MMI_SendMessage( frmDialogId[0], MM_ATTACH, 1, baseDialogId ) ;

		/* 表示パネルへデータを転送 */
	if( ch71Flag )
		MMI_SendMessage( frmMesId[0], MM_SETMSG, 1, "サウンド  3" ) ;
	else
		MMI_SendMessage( frmMesId[0], MM_SETMSG, 1, "音  声" ) ;
	MMI_SendMessage( frmJmpNumId, MM_GETNUMBOX, 5,
					&var, &min, &max, &delta, &ptColumn ) ;
	MMI_SendMessage( frmJmpNumId, MM_SETNUMBOX, 5,
					var, min, 99999, delta, ptColumn ) ;
	for( i=0 ; i<4 ; i++ )
		MTL_setAtrObj( frmBtnId[i], (MS_EVMOSONL40 | MS_EVDRAGOUTL40) ) ;

	MMI_SendMessage( frmDialogId[0], MM_SHOW, 0 ) ;		/* 見せる */

	rect[0] = WORD( head + 32 ); rect[1] = WORD( head + 34 );	/* 座標 */
	rect[2] = WORD( head + 36 ); rect[3] = WORD( head + 38 );
	if( rect[0]==0 && rect[1]==0 && rect[2]==0 && rect[3]==0 )
	{
		rect[2] = 319;
		rect[3] = 239;
	}
	frame_graph_init0( rect[0],rect[1],rect[2],rect[3] ) ;
	prtFile = 256; prtFrame = -1; totalFrame = DWORD( head + 12 );
	error = editFrameJump( 1 ) ;
	EGB_displayPage(guiEgbPtr,0,3);
	r_waku_clear3( rect[2]-rect[0]+1, rect[3]-rect[1]+1, 1 ) ;

	if( error == NOERR )
	{
		SND_elevol_mute( 0x03 ) ;
		MMI_ExecSystem() ;		/* Dialog表示へ･･･イベントループ */
	}

	SND_elevol_mute( 0x00 ) ;
	if( error )
		errorCheck( error ) ;

	r_waku_del() ;
	EGB_displayPage(guiEgbPtr,0,1);
	MMI_SendMessage( frmDialogId[0], MM_ERASE, 0 ) ;
	MMI_SendMessage( frmDialogId[0], MM_DETACH, 0 ) ;

	fclose( fp ) ;
	return NOERR ;
}

/*	initDataIRCFRM:frmNextBtnId[0]:MJ_DBUTTONL40の呼び出し関数	*/
/*	initDataIRCFRM:frmNextBtnId[1]:MJ_DBUTTONL40の呼び出し関数	*/
int	frmNextFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int i ;

	SND_pcm_play_stop( 71 );
	if( kobj == frmNextBtnId[0] )
	{
		WORD( bbuf+12 ) = frameWait ;
		WORD( bbuf+14 ) = frameLoop ;
		for( i=0 ; i<16 ; i++ )
			BYTE( bbuf+16 + i ) = frameSnd[i] ;
		fseek( fp, headPoint, SEEK_SET );
		fwrite( bbuf, 32, 1, fp );
		fseek( fp, prtFile, SEEK_SET );
	}

	if( prtFrame >= (totalFrame-1) )
	{
		prtFile = 256 ;
		prtFrame = -1 ;
		fseek( fp, 256, SEEK_SET );
	}
	error = editFrameJump( 1 ) ;
	if( error )
		MMI_SetHaltFlag( TRUE ) ;
	return NOERR ;
}

/*	initDataIRCFRM:frmJmpNumId:MJ_NUMBOXL40の呼び出し関数	*/
/*	initDataIRCFRM:frmJmpBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	frmJmpFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	if( kobj == frmJmpNumId )
	{
		int	var, min, max, delta, ptColumn ;

		MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
						&var, &min, &max, &delta, &ptColumn ) ;
		jumpFrame = var ;
	}
	else if( kobj == frmJmpBtnId )
	{
		prtFile = 256 ;
		prtFrame = -1 ;
		fseek( fp, 256, SEEK_SET );
		error = editFrameJump( jumpFrame + 1 ) ;
		if( error )
			MMI_SetHaltFlag( TRUE ) ;
	}
	return NOERR ;
}

/*	initDataIRCFRM:frmSaveBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	frmSaveFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	extern int fileSelector( char *, char **, char *, char *, char * );
	extern int file_kakuchousi_set( char *, char *, char * ) ;

	char *ExtStr[] = { "*.TIF", NULL } ;
	char path[100] ;
	int i, ret, error ;

	/* メニューとボタンを使えないようにする */
	MTL_setAtrObj( frmDialogId[0], MS_DSPONLYL40 ) ;

	error = 0 ;
	ret = fileSelector(tifPath, ExtStr,
								 "ＴＩＦＦセーブ", "実  行", "取  消");
	if(	ret )
		goto v10 ;
	else
	{
		/* name , kakuchou[拡張子(.***)] → fullname = name + kakuchou */
		error = file_kakuchousi_set( path, tifPath, ".TIF" ) ;
		if( error == NOERR )
		{
			for( i=0 ; i<80 ; i++ )
				tifPath[i] = path[i] ;
		}
	}

	if( error == NOERR )
	{
		error = saveTif( tifPath ) ;
	}

v10:
	/* メニューとボタンを使えるように戻す */
	MTL_resetAtrObj( frmDialogId[0], (~MS_DSPONLYL40) ) ;
	if( error )
		errorCheck( error ) ;
	return NOERR ;
}

saveTif( fullname )
char *fullname;
{
	FILE *fps;
	int size,i;
	int ax1, ay1, ax2, ay2, temp;
	char para[64] ;

struct	TIFF1{			/* 10Byte */
	int id, ifd1;
	short offset;
	} head1[] = { 0x2a4949, 8, 15 };
struct	TIFF2{		/* 192Byte */
	short tag, type;
	int length, data;
	} head2[] = 
		{	{ 0x0ff, 3, 1,     1 },
			{ 0x100, 3, 1,   320 },
			{ 0x101, 3, 1,   240 },
			{ 0x102, 3, 1,    16 },
			{ 0x103, 3, 1,     1 },
			{ 0x106, 3, 1,     1 },
			{ 0x10a, 3, 1,     1 },
			{ 0x111, 4, 1, 0x200 },
			{ 0x115, 3, 1,     1 },
			{ 0x116, 4, 1,  0xf0 },
			{ 0x117, 4, 1, 320*240*2 },
			{ 0x119, 3, 1, 32767 },
			{ 0x11a, 5, 1, 0x1f0 },
			{ 0x11b, 5, 1, 0x1f8 },
			{ 0x11c, 3, 1,     1 },
			{     0, 0, 0,     0 }
		};
char head3[294];		/* 294Byte */
int head4[] = { 0x4b, 2, 0x4b, 2 };	/* 16Byte */

	ax1 = 0; ay1 = 0; ax2 = 319; ay2 = 239;
	size = ( ax2 - ax1 + 1 )*( ay2 - ay1 + 1 )*2;
	DWORD( ((char *)head2)+0x14 ) = ax2 - ax1 + 1;
	DWORD( ((char *)head2)+0x20 ) = ay2 - ay1 + 1;
	DWORD( ((char *)head2)+128 ) = size;
	for( i=0 ; i<294 ; i++ )head3[i] = (char)0;
	for( i=0 ; i<6 ; i++ ){	   /* disk write protect の場合6回必要 */ 
		if( ( fps = fopen( fullname, "wb" ) ) != NULL )goto save1;
	}
	return 2;
save1:
	EGB_writePage(guiEgbPtr,1);
	DWORD( para + 0 ) = (unsigned int)rbuf ;
	WORD(  para + 4 ) = 0x14 ;
	WORD(  para + 6 ) = ax1 ;
	WORD(  para + 8 ) = ay1 ;
	WORD(  para + 10) = ax2 ;
	WORD(  para + 12) = ay2 ;
	EGB_getBlock( guiEgbPtr, para ) ;
	EGB_writePage(guiEgbPtr,0);

	fwrite( (char *)head1, 10, 1, fps );
	fwrite( (char *)head2, 192, 1, fps );
	fwrite( (char *)head3, 294, 1, fps );
	fwrite( (char *)head4, 16, 1, fps );
	fwrite( rbuf, size, 1, fps );
	temp = ferror( fps );
	fclose( fps );
	if( temp ){
		remove( fullname );		/* disk full */
		return 2;
	}
	return 0;
}

/*	initDataIRCFRM:frmDspBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	frmDspFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	extern int r_waku_del() ;
	extern int r_mov_graph_init( int,int,int,int,int ) ;
	extern int r_panel_make( int,int,int,int ) ;
	extern int r_waku_clear2( int, int,int ) ;
	extern int r_waku_clear3( int, int,int ) ;
	extern int r_panel_del() ;

	MTL_setAtrObj( frmDialogId[0], MS_DSPONLYL40 ) ;

	r_waku_del() ;
	r_mov_graph_init( 2, rect[0],rect[1],rect[2],rect[3] ) ;
	r_panel_make( 0, 0, 639, 479 ) ;
	r_waku_clear2( rect[2]-rect[0]+1, rect[3]-rect[1]+1, 2 ) ;

	while( 1 )
	{
		if( mouseSwCheck() )break ;
	}

	r_waku_del() ;
	r_panel_del() ;
	frame_graph_init0( rect[0],rect[1],rect[2],rect[3] ) ;
	r_waku_clear3( rect[2]-rect[0]+1, rect[3]-rect[1]+1, 1 ) ;

//	MMI_FlushEvnt() ;
	TL_setInvalidMosFlag() ;
	MTL_resetAtrObj( frmDialogId[0], (~MS_DSPONLYL40) ) ;
//	TL_resetInvalidMosFlag() ;

	return NOERR ;
}

/*	initDataIRCFRM:frmWaitNumId:MJ_NUMBOXL40の呼び出し関数	*/
int	frmWaitFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int	var, min, max, delta, ptColumn ;

	MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
					&var, &min, &max, &delta, &ptColumn ) ;
	frameWait = var ;

	return NOERR ;
}

/*	initDataIRCFRM:frmLoopNumId:MJ_NUMBOXL40の呼び出し関数	*/
/*	initDataIRCFRM:frmTIconId:MJ_TICONL40の呼び出し関数	*/
int	frmLoopFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int	var, min, max, delta, ptColumn ;

	if( kobj == frmLoopNumId )
	{
		MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
						&var, &min, &max, &delta, &ptColumn ) ;
		frameLoop = var ;
		MTL_resetFlagObj( frmTIconId, (~MS_TOGGLE) ) ;
		MMI_SendMessage( frmTIconId, MM_SHOW, 0 ) ;
	}
	else if( kobj == frmTIconId )
	{

		if( MTL_checkFlagObj( kobj, MS_TOGGLE )==MS_TOGGLE )
			frameLoop = 256*256-1 ;
		else
			frameLoop = 0 ;
		MMI_SendMessage( frmLoopNumId, MM_GETNUMBOX, 5,
						&var, &min, &max, &delta, &ptColumn ) ;
		MMI_SendMessage( frmLoopNumId, MM_SETNUMBOX, 5,
						0, min, max, delta, ptColumn ) ;
		MMI_SendMessage( frmLoopNumId, MM_SHOW, 0 ) ;
	}

	return NOERR ;
}

/*	initDataIRCFRM:frmNumId[0〜15]:MJ_NUMBOXL40の呼び出し関数	*/
int	frmNumFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int	var, min, max, delta, ptColumn ;
	int i ;

	for( i=0 ; i<16 ; i++ )
		if( kobj == frmNumId[i] )break ;

	MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
					&var, &min, &max, &delta, &ptColumn ) ;
	frameSnd[i] = var ;

	return NOERR ;
}

/*	initDataIRCFRM:frmBtnId[0〜3]:MJ_DBUTTONL40の呼び出し関数	*/
int	frmSndFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int i ;

	for( i=0 ; i<4 ; i++ )
		if( kobj == frmBtnId[i] )break ;

	if( ( i==3 ) && ( ch71Flag==0 ) )
	{
		if( (trigger & MS_EVMOSOFFL40) && (frameSnd[i*4]) )
		{
			FILE *fps ;
			int j, k, n, size ;
			char head[32], path[100], *bp, t ;

			if( (frameSnd[i*4+1] < 0) || (frameSnd[i*4+1] >= 8) )return NOERR ;

			MTL_setAtrObj( frmDialogId[0], MS_DSPONLYL40 ) ;
			n = 0 ;
			for( j=0 ; j<80 ; j++ )
			{
				path[j] = movFileName[j] ;
				if( path[j] == '\\' )n++ ;
				if( path[j] == '\0' )break ;
			}
			if( n > 0 )
			{
				for( j=j ; j>=0 ; j-- )
				{
					if( path[j] == '\\' )
					{
						j++ ;
						break ;
					}
				}
			}
			else
			{
				j = 0 ;
			}
			for( k=0 ; k<8 ; k++ )
			{
				t = fileName[ frameSnd[i*4+1] ][k] ;
				path[j] = t ;
				if( (t == '.') || (t =='\0') )break ;
				j++ ;
			}
			path[j++] = '.';
			path[j++] = 'S';
			path[j++] = 'N';
			path[j++] = 'D';
			path[j++] = '\0';

			if( ( fps = fopen( path, "rb" ) ) == NULL )
			{
				errorCheck(1);
				goto sv10 ;
			}
			if( fread( head, 32, 1, fps ) < 1 )
			{
				fclose( fps );
				errorCheck(1);
				goto sv10 ;
			}
			size = DWORD( head+12 );
			if( (bp = (char *)TL_malloc( size+32 )) == NULL )
			{
				errorCheck(7) ;
				goto sv10 ;
			}
			for( j=0 ; j<32 ; j++ )bp[j] = head[j] ;
			if( fread( bp+32, size, 1, fps ) < 1 )
			{
				fclose( fps );
				TL_free( bp ) ;
				errorCheck(1) ;
				goto sv10 ;
			}
			fclose( fps );
			SND_pcm_play_stop( 71 );
			SND_pcm_play( 71, frameSnd[i*4+2], frameSnd[i*4+3], bp );
			while( SND_pcm_status(71) )
			{
				if( mouseSwCheck() )break ;
			}
			SND_pcm_play_stop( 71 );
			TL_free( bp ) ;
		sv10:
			MTL_resetAtrObj( frmDialogId[0], (~MS_DSPONLYL40) ) ;
		}
	}
	else
	{
		SND_key_off( frameSnd[i*4+1] );
		if( (trigger & MS_EVMOSONL40) && (frameSnd[i*4]) )
			SND_key_on( frameSnd[i*4+1], frameSnd[i*4+2], frameSnd[i*4+3] );
	}

	return NOERR ;
}

/*	initDataIRCFRM:frmCanBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	frmOkFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	MMI_SetHaltFlag( TRUE ) ;
	return NOERR ;
}

/* jumpの数だけframeを進める */
editFrameJump( jump )
int jump ;
{
	char para[128] ;
	int i ;
	int	var, min, max, delta, ptColumn ;

		/* mov data display */
	DWORD( para+0 ) = (unsigned int)bbuf;
	DWORD( para+4 ) = (unsigned int)bbuf+0x40000;
	DWORD( para+8 ) = 3;		/* bit0:VRAMページ(0or1)
								   bit1:move_box参照VRAMページ(0or1) */
	DWORD( para+12) = 0;
	for( i=0 ; i<jump ; i++ )
	{
		if( prtFrame >= (totalFrame-1) )break;
		if( fread( bbuf, 32, 1, fp ) < 1 ){
			return 58;
		}
		headPoint = prtFile; prtFile += 32; frameSize = DWORD( bbuf + 4 );
		if( (unsigned int)frameSize > 500000 ){
			return 58;
		}
		if( fread( bbuf+32, frameSize, 1, fp ) < 1 ){
			return 58;
		}
		prtFile += frameSize;
		move32( para );
		prtFrame++;
	}
	frameSize = DWORD( bbuf+4 ) ;
	frameWait = WORD( bbuf+12 ) ;
	frameLoop = WORD( bbuf+14 ) ;
	if( frameLoop == 0xffff )frameLoop = -1 ;
	for( i=0 ; i<16 ; i++ )
		frameSnd[i] = BYTE( bbuf+16 + i ) ;

	MMI_SendMessage( frmNumNumId, MM_GETNUMBOX, 5,
					&var, &min, &max, &delta, &ptColumn ) ;
	MMI_SendMessage( frmNumNumId, MM_SETNUMBOX, 5,
					prtFrame, min, prtFrame, delta, ptColumn ) ;
	MMI_SendMessage( frmNumNumId, MM_SHOW, 0 ) ;

	MMI_SendMessage( frmSizeNumId, MM_GETNUMBOX, 5,
					&var, &min, &max, &delta, &ptColumn ) ;
	MMI_SendMessage( frmSizeNumId, MM_SETNUMBOX, 5,
					frameSize, min, frameSize, delta, ptColumn ) ;
	MMI_SendMessage( frmSizeNumId, MM_SHOW, 0 ) ;

	MMI_SendMessage( frmWaitNumId, MM_GETNUMBOX, 5,
					&var, &min, &max, &delta, &ptColumn ) ;
	MMI_SendMessage( frmWaitNumId, MM_SETNUMBOX, 5,
					frameWait, min, max, delta, ptColumn ) ;
	MMI_SendMessage( frmWaitNumId, MM_SHOW, 0 ) ;

	MMI_SendMessage( frmLoopNumId, MM_GETNUMBOX, 5,
					&var, &min, &max, &delta, &ptColumn ) ;
	MMI_SendMessage( frmLoopNumId, MM_SETNUMBOX, 5,
					frameLoop, min, max, delta, ptColumn ) ;
	MMI_SendMessage( frmLoopNumId, MM_SHOW, 0 ) ;

	if( frameLoop == -1 )
		MTL_setFlagObj( frmTIconId, MS_TOGGLE ) ;
	else
		MTL_resetFlagObj( frmTIconId, (~MS_TOGGLE) ) ;
	MMI_SendMessage( frmTIconId, MM_SHOW, 0 ) ;

	for( i=0 ; i<16 ; i++ )
	{
		MMI_SendMessage( frmNumId[i], MM_GETNUMBOX, 5,
						&var, &min, &max, &delta, &ptColumn ) ;
		MMI_SendMessage( frmNumId[i], MM_SETNUMBOX, 5,
						frameSnd[i], min, max, delta, ptColumn ) ;
		MMI_SendMessage( frmNumId[i], MM_SHOW, 0 ) ;
	}
	return NOERR ;
}

frame_graph_init0( x0,y0,x1,y1 )
int x0,y0,x1,y1;
{
	int xd, yd ;
	int x[4], y[4] ;

	xd = x1-x0+1 ;
	yd = y1-y0+1 ;

	x[0] = 312 ;
	x[1] = x0 - ( 320 - xd )/2 ;
	x[2] = 1 ;
	x[3] = 320 ;
	y[0] = 28 ;
	y[1] = y0 - ( 240 - yd )/2 ;
	y[2] = 1 ;
	y[3] = 240 ;

	EGB_displayPage(guiEgbPtr,0,1);
	EGB_writePage(guiEgbPtr,1);		/* 画面1設定 */

	EGB_displayStart(guiEgbPtr,3,0,0);
	EGB_displayStart(guiEgbPtr,2,1,1);
	EGB_displayStart(guiEgbPtr,2,x[2],y[2]);
	EGB_displayStart(guiEgbPtr,0,x[0],y[0]);
	EGB_displayStart(guiEgbPtr,1,x[1],y[1]);
	EGB_displayStart(guiEgbPtr,3,x[3],y[3]);

	EGB_writePage(guiEgbPtr,0); 	/* 画面0設定 */
	EGB_displayPage(guiEgbPtr,0,3);

	return NOERR ;
}

/* edit用枠くり抜き */

r_waku_clear3( xd, yd, zoom )
int xd, yd, zoom ;
{
	extern int wakuDialogId ;

	HYPER hyp ;
	int x0, y0, x1, y1, yd2 ;

	MTL_setAtrObj( wakuDialogId, MS_INVISIBLEL40 ) ;
	MMI_SendMessage( wakuDialogId, MM_GETHYPER, 1, &hyp ) ;

	yd2 = (yd & 1) ^ 1 ;	/* ずれ補正のため(原因不明のずれあり) */
	x0 = ( 320 - xd )/2 + 312 ;
	y0 = ( 240 - yd )/2 + 28 - yd2 ;
	if( x0 < 312 )x0 = 312 ;
	if( y0 < 28 )y0 = 28 ;
	x1 = x0 + xd - 1 ;
	y1 = y0 + yd - 1 ;
	if( x1 > 312+319 )x1 = 312+319 ;
	if( y1 > 28+239 )y1 = 28+239 ;

	hyp.fr.lupx = x0 ;
	hyp.fr.lupy = y0 ;
	hyp.fr.rdwx = x1 ;
	hyp.fr.rdwy = y1 ;
	hyp.clr.fr = 0 ;
	hyp.clr.back = 0 ;
	hyp.clr.ch = 0 ;
	hyp.atrm = 0 ;

	MMI_SendMessage( wakuDialogId, MM_SETHYPER, 1, &hyp ) ;

	MMI_SendMessage( wakuDialogId, MM_DETACH, 0 ) ;
	MMI_SendMessage( wakuDialogId, MM_ATTACH, 1, frmDialogId[1] ) ;

	MTL_setAtrObj( wakuDialogId, MS_DSPONLYL40 ) ;
	MMI_SendMessage( wakuDialogId, MM_SHOW, 0 ) ;

	return NOERR ;
}

