#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"
#include "mrcdef.h"

extern	char	*guiEgbPtr ;	/*	EGB のワークアドレス	*/

/* dsk */
int	baseDialogId = -1 ;
int	menubarId = -1 ;
int	menuId = -1 ;
int	mItemId[2] = -1 ;
int	SDKmenuId = -1 ;
int	SDKmItemId[3] = -1 ;
int	fileMenuId = -1 ;
int	fileMItemId[13] = -1 ;
int	quitIconId = -1 ;
int	wakuDialogId = -1 ;
int	wakuDialogId2 = -1 ;
/* dsk2 */
int	baseDialogId2 = -1 ;
int	base2BtnId[10] = -1 ;
int	baseDialogId3 = -1 ;
int	baseDialogId4 = -1 ;
int	base2MesId[30] = -1 ;
int	baseInputMesId[2] = -1 ;
/* abou */
int	alertId = -1 ;
int	messageId[3] = -1 ;
int	dspIconId = -1 ;
int	aboutOKBtnId = -1 ;
/* err */
int	errorId = -1 ;
int	errorOKBtnId = -1 ;
int	errorIconId = -1 ;
int	errormessage[2] = -1 ;

char *rbuf;		/* 汎用buffer */
char *bbuf;

char	movPath[80] ;
char	tifPath[80] ;
char	tifName[ F_MAX ][16] ;
int		tifTotal ;

/*
		基本ルーチン
*/

/* input mov file */
/*	initDataIRCDSK:fileMItemId[0]:MJ_MITEML40の呼び出し関数	*/
/*	initDataIRCDSK2:base2BtnId[0]:MJ_DBUTTONL40の呼び出し関数	*/
int	selectFunc0(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	char *ExtStr[] = { "*.MOV", NULL } ;
	char path[100] ;
	int i, ret, error ;

	/* メニューとボタンを使えないようにする */
	MTL_setAtrObj( baseDialogId, MS_DSPONLYL40 ) ;
	MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;

	error = 0 ;
	ret = fileSelector(movPath, ExtStr,
								 "ＭＯＶファイル", "設  定", "取  消");
	if(	ret )
		goto v10 ;
	else
	{
		/* name , kakuchou[拡張子(.***)] → fullname = name + kakuchou */
		error = file_kakuchousi_set( path, movPath, ".MOV" ) ;
		if( error == NOERR )
		{
			for( i=0 ; i<80 ; i++ )
				movPath[i] = path[i] ;
		}
	}

	if( error == NOERR )
	{
		MMI_SendMessage( baseInputMesId[0], MM_SETMSG, 1, movPath ) ;
		MMI_SendMessage( baseDialogId3, MM_SHOW, 0 ) ;	/* movfile名を見せる */
	}

v10:
	/* メニューとボタンを使えるように戻す */
	MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
	MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
	if( error )
		errorCheck( error ) ;
	return NOERR ;
}

/* tiff directory */
/*	initDataIRCDSK:fileMItemId[2]:MJ_MITEML40の呼び出し関数	*/
/*	initDataIRCDSK2:base2BtnId[1]:MJ_DBUTTONL40の呼び出し関数	*/
int	selectFunc1(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	extern int tifFirstFlg ;

	char *ExtStr[] = { "*.TIF", NULL } ;
	int ret, error ;

	/* メニューとボタンを使えないようにする */
	MTL_setAtrObj( baseDialogId, MS_DSPONLYL40 ) ;
	MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;

	error = 0 ;
	ret = directorySelector(tifPath, "dummy.tif", ExtStr,
								 "ディレクトリ", "指  定", "取  消");
	if(	ret )
		goto v10 ;

	if( error == NOERR )
	{
		char static name[100] ;
		int i ;

		tifFirstFlg = 0 ;	/* tiff editor リフレッシュ */

		for( i=0 ; i<80 ; i++ )
		{
			name[i] = tifPath[i] ;
			if( name[i] == '\0' )break ;
		}
		if( i>40 )	/* tifPathが長すぎたときの処理 */
		{
			name[i-40] = '･' ;
			name[i-39] = '･' ;
			name[i-38] = '･' ;
			name[i-37] = '･' ;
			name[i-36] = '･' ;
			MMI_SendMessage( baseInputMesId[1], MM_SETMSG, 1, name+i-40 ) ;
		}
		else
			MMI_SendMessage( baseInputMesId[1], MM_SETMSG, 1, tifPath ) ;
		MMI_SendMessage( baseDialogId4, MM_SHOW, 0 ) ;	/* TIFfile名を見せる */
	}

v10:
	/* メニューとボタンを使えるように戻す */
	MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
	MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;
	if( error )
		errorCheck( error ) ;
	return NOERR ;
}

/* tif edit */
/*	initDataIRCDSK:fileMItemId[3]:MJ_MITEML40の呼び出し関数	*/
/*	initDataIRCDSK2:base2BtnId[2]:MJ_DBUTTONL40の呼び出し関数	*/
int	selectFunc2(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	extern int tifFileEdit( char * ) ;

	/* メニューとボタンを使えないようにする */
	MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
	MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;

	MMI_SendMessage( baseDialogId2, MM_ERASE, 0 ) ;
	MMI_SendMessage( baseDialogId2, MM_DETACH, 0 ) ;

	tifFileEdit( tifPath ) ;

	MMI_SendMessage( baseDialogId2, MM_ATTACH, 1, baseDialogId ) ;
	MMI_SendMessage( baseDialogId2, MM_SHOW, 0 ) ; /* 見せる */

	/* メニューとボタンを使えるように戻す */
	MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
	MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;

	return NOERR ;
}

/* video in */
/*	initDataIRCDSK:fileMItemId[4]:MJ_MITEML40の呼び出し関数	*/
/*	initDataIRCDSK2:base2BtnId[3]:MJ_DBUTTONL40の呼び出し関数	*/
int	selectFunc3(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	extern int videoToTiff( char *, char b[][16] ) ;

	/* メニューとボタンを使えないようにする */
	MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
	MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;

	MMI_SendMessage( baseDialogId2, MM_ERASE, 0 ) ;
	MMI_SendMessage( baseDialogId2, MM_DETACH, 0 ) ;

	videoToTiff( tifPath, tifName ) ;

	MMI_SendMessage( baseDialogId2, MM_ATTACH, 1, baseDialogId ) ;
	MMI_SendMessage( baseDialogId2, MM_SHOW, 0 ) ; /* 見せる */

	/* メニューとボタンを使えるように戻す */
	MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
	MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;

	return NOERR ;
}

/* tiff check */
/*	initDataIRCDSK:fileMItemId[5]:MJ_MITEML40の呼び出し関数	*/
/*	initDataIRCDSK2:base2BtnId[4]:MJ_DBUTTONL40の呼び出し関数	*/
int	selectFunc4(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	extern int tiff_files_check( char *, int, char b[][16], int, int ) ;

	/* メニューとボタンを使えないようにする */
	MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
	MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;

	MMI_SendMessage( baseDialogId2, MM_ERASE, 0 ) ;
	MMI_SendMessage( baseDialogId2, MM_DETACH, 0 ) ;

	tiff_files_check( tifPath, tifTotal, tifName, 0, tifTotal-1 ) ;

	MMI_SendMessage( baseDialogId2, MM_ATTACH, 1, baseDialogId ) ;
	MMI_SendMessage( baseDialogId2, MM_SHOW, 0 ) ; /* 見せる */

	/* メニューとボタンを使えるように戻す */
	MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
	MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;

	return NOERR ;
}

/* 新規 */
/*	initDataIRCDSK:fileMItemId[7]:MJ_MITEML40の呼び出し関数	*/
/*	initDataIRCDSK2:base2BtnId[5]:MJ_DBUTTONL40の呼び出し関数	*/
int	selectFunc5(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	extern int tifToMov( char *, char *, int, char [][16] ) ;

	/* メニューとボタンを使えないようにする */
	MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
	MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;

	MMI_SendMessage( baseDialogId2, MM_ERASE, 0 ) ;
	MMI_SendMessage( baseDialogId2, MM_DETACH, 0 ) ;

	tifToMov( movPath, tifPath, tifTotal, tifName ) ;

	MMI_SendMessage( baseDialogId2, MM_ATTACH, 1, baseDialogId ) ;
	MMI_SendMessage( baseDialogId2, MM_SHOW, 0 ) ; /* 見せる */

	/* メニューとボタンを使えるように戻す */
	MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
	MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;

	return NOERR ;
}

/* 追加 */
/*	initDataIRCDSK:fileMItemId[8]:MJ_MITEML40の呼び出し関数	*/
/*	initDataIRCDSK2:base2BtnId[6]:MJ_DBUTTONL40の呼び出し関数	*/
int	selectFunc6(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	extern int tifToMovAdd( char *, char *, int, char [][16] ) ;

	/* メニューとボタンを使えないようにする */
	MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
	MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;

	MMI_SendMessage( baseDialogId2, MM_ERASE, 0 ) ;
	MMI_SendMessage( baseDialogId2, MM_DETACH, 0 ) ;

	tifToMovAdd( movPath, tifPath, tifTotal, tifName ) ;

	MMI_SendMessage( baseDialogId2, MM_ATTACH, 1, baseDialogId ) ;
	MMI_SendMessage( baseDialogId2, MM_SHOW, 0 ) ; /* 見せる */

	/* メニューとボタンを使えるように戻す */
	MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
	MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;

	return NOERR ;
}

/*	initDataIRCDSK:fileMItemId[10]:MJ_MITEML40の呼び出し関数	*/
/*	initDataIRCDSK2:base2BtnId[7]:MJ_DBUTTONL40の呼び出し関数	*/
int	selectFunc7(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	extern int 	movEdit( char * ) ;

	int error ;

	/* メニューとボタンを使えないようにする */
	MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
	MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;

	MMI_SendMessage( baseDialogId2, MM_ERASE, 0 ) ;
	MMI_SendMessage( baseDialogId2, MM_DETACH, 0 ) ;

	error = movEdit( movPath ) ;

	MMI_SendMessage( baseDialogId2, MM_ATTACH, 1, baseDialogId ) ;
	MMI_SendMessage( baseDialogId2, MM_SHOW, 0 ) ; /* 見せる */

	/* メニューとボタンを使えるように戻す */
	MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
	MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;

	if( error )
	{
		errorCheck( error ) ;
	}

	return NOERR ;
}

/*	initDataIRCDSK:fileMItemId[12]:MJ_MITEML40の呼び出し関数	*/
/*	initDataIRCDSK2:base2BtnId[8]:MJ_DBUTTONL40の呼び出し関数	*/
int	selectFunc8(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	extern int 	movPlay( char * ) ;

	int error ;

	/* メニューとボタンを使えないようにする */
	MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
	MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;

	MMI_SendMessage( baseDialogId2, MM_ERASE, 0 ) ;
	MMI_SendMessage( baseDialogId2, MM_DETACH, 0 ) ;

	error = movPlay( movPath ) ;

	MMI_SendMessage( baseDialogId2, MM_ATTACH, 1, baseDialogId ) ;
	MMI_SendMessage( baseDialogId2, MM_SHOW, 0 ) ; /* 見せる */

	/* メニューとボタンを使えるように戻す */
	MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
	MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;

	if( error )
	{
		errorCheck( error ) ;
	}

	return NOERR ;
}


/*

		ここからは 汎用サブルーチン

*/

/* init */
initEtc()
{
	if( (rbuf = (char *)TL_malloc( 153600 )) == NULL )
	{
		return -1 ;
	}
	if( (bbuf = (char *)TL_malloc( 524288 )) == NULL )
	{
		TL_free( rbuf ) ;
		return -1 ;
	}
	movPath[0] = '\0' ;
	tifPath[0] = '\0' ;

	return NOERR ;
}

/* 制限つき枠くり抜き */

r_waku_clear1( xd, yd, zoom )
int xd, yd, zoom ;
{
	HYPER hyp ;
	int x0, y0, x1, y1 ;

		/* 続けて呼ばれてもいいように一端DETACHする */
	MMI_SendMessage( wakuDialogId, MM_DETACH, 0 ) ;
	MMI_SendMessage( wakuDialogId, MM_ATTACH, 1, baseDialogId ) ;

	MMI_SendMessage( wakuDialogId, MM_GETHYPER, 1, &hyp ) ;

//	x0 = 320 - xd * zoom / 2 ;			/* 枠抜き */
//	y0 = 240 - yd * zoom / 2 ;
//	x1 = 319 + xd * zoom / 2 ;
//	y1 = 239 + yd * zoom / 2 ;
	x0 = (640/zoom - xd) / 2 * zoom ;
	y0 = (480/zoom - yd) / 2 * zoom ;
	x1 = x0 + xd*zoom - 1 ;
	y1 = y0 + yd*zoom - 1 ;
	if( x0 < 0 )x0 = 0 ;
	if( y0 < 20 )y0 = 20 ;
	if( x1 > 639 )x1 = 639 ;
	if( y1 > 479 )y1 = 479 ;

	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 ) ;
	MTL_setAtrObj( wakuDialogId, MS_DSPONLYL40 ) ;
	MMI_SendMessage( wakuDialogId, MM_SHOW, 0 ) ;

	return NOERR ;
}

/* 制限なし枠くり抜き */

r_waku_clear2( xd, yd, zoom )
int xd, yd, zoom ;
{
	HYPER hyp ;
	int x0, y0, x1, y1 ;

		/* 続けて呼ばれてもいいように一端DETACHする */
	MMI_SendMessage( wakuDialogId, MM_DETACH, 0 ) ;
	MMI_SendMessage( wakuDialogId, MM_ATTACH, 1, baseDialogId ) ;

	MMI_SendMessage( wakuDialogId, MM_GETHYPER, 1, &hyp ) ;

//	x0 = 320 - xd * zoom / 2 ;			/* 枠抜き */
//	y0 = 240 - yd * zoom / 2 ;
//	x1 = 319 + xd * zoom / 2 ;
//	y1 = 239 + yd * zoom / 2 ;
	x0 = (640/zoom - xd) / 2 * zoom ;
	y0 = (480/zoom - yd) / 2 * zoom ;
	x1 = x0 + xd*zoom - 1 ;
	y1 = y0 + yd*zoom - 1 ;
	if( x0 < 0 )x0 = 0 ;
	if( y0 < 0 )y0 = 0 ;
	if( x1 > 639 )x1 = 639 ;
	if( y1 > 479 )y1 = 479 ;

	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 ) ;
	MTL_setAtrObj( wakuDialogId, MS_DSPONLYL40 ) ;
	MMI_SendMessage( wakuDialogId, MM_SHOW, 0 ) ;

	return NOERR ;
}

r_waku_del()
{
	MMI_SendMessage( wakuDialogId, MM_ERASE, 0 ) ;
	MMI_SendMessage( wakuDialogId, MM_DETACH, 0 ) ;
	return NOERR ;
}

/* パネル */

r_panel_make( x0, y0, x1, y1 )
int x0, y0, x1, y1 ;
{
	HYPER hyp ;

		/* 続けて呼ばれてもいいように一端DETACHする */
	MMI_SendMessage( wakuDialogId2, MM_DETACH, 0 ) ;
	MMI_SendMessage( wakuDialogId2, MM_ATTACH, 1, baseDialogId ) ;

	MMI_SendMessage( wakuDialogId2, MM_GETHYPER, 1, &hyp ) ;

	hyp.fr.lupx = x0 ;
	hyp.fr.lupy = y0 ;
	hyp.fr.rdwx = x1 ;
	hyp.fr.rdwy = y1 ;

	MMI_SendMessage( wakuDialogId2, MM_SETHYPER, 1, &hyp ) ;
	MTL_setAtrObj( wakuDialogId2, MS_DSPONLYL40 ) ;
	MMI_SendMessage( wakuDialogId2, MM_SHOW, 0 ) ;

	return NOERR ;
}

r_panel_del()
{
	MMI_SendMessage( wakuDialogId2, MM_ERASE, 0 ) ;
	MMI_SendMessage( wakuDialogId2, MM_DETACH, 0 ) ;
	return NOERR ;
}

/* name , kakuchou[拡張子(.***)] → fullname = name + kakuchou */

file_kakuchousi_set( fullname, name, kakuchou )
char fullname[], name[], kakuchou[];
{
	int i;

	for( i=0 ; i<76 ; i++ ){
		fullname[i] = name[i];
		if( name[i] == '.' || name[i] == (char)0 )goto mov01;
	}
	return 55;		/* bad file name */
mov01:	if( i == 0 )return 55;
	if( name[i-1] == '\\' )return 55;
	DWORD( fullname + i ) = DWORD( kakuchou );
	fullname[i+4] = (char)0;
	return 0;
}

/*	ファイル選択	*/
int	fileSelector( path, ExtStr, title, exec, cncl )
char	*path ;
char	**ExtStr ;
char	*title ;
char	*exec ;
char	*cncl ;
{
	char pathName[100], name[20] ;
	int				 i, j, n ;
	unsigned int	MSlctCnt ;
	int		  Atr, ret, ret2 ;
	int    alertobj ;      /*   現在のALERTOBJを退避する変数　　  */

	ret2 = NOERR ;

	n = 0 ;
	for( i=0 ; i<79 ; i++ )
	{
		pathName[i] = path[i] ;
		if( path[i] == '\\' )
			n++ ;
		if( path[i] == '\0' )
			break ;
	}
	if( n <= 1 )
	{
		for( i=i ; i>=0 ; i-- )
		{
			if( path[i] == '\\' )
			{
				i++ ;
				pathName[i] = '\0' ;
				break ;
			}
		}
		for( j=0 ; j<13 ; j++ )
		{
			name[j] = path[i+j] ;
		}
	}
	else
	{
		for( i=i ; i>=0 ; i-- )
		{
			if( path[i] == '\\' )
			{
				pathName[i] = '\0' ;
				break ;
			}
		}
		for( j=0 ; j<13 ; j++ )
		{
			name[j] = path[i+1+j] ;
		}
	}

	ret = FDG_SetFileText( name ) ;
	ret = FDG_SetTitle( title, exec, cncl ) ;

	alertobj = MMI_GetAlertObj() ;  /*  現在のALERTOBJを退避  　  */
	MMI_SetAlertObj( FDG_GetMainID() ) ;
	ret = FDG_DspFileDlg(MMI_GetBaseObj(), FDG_FILEONLY | FDG_TEXT,
		 pathName, ExtStr,	&MSlctCnt) ;
	if( ret < 0 )	/* PATHが間違ってる場合はカレントディレクトリで */
	{
		name[0] = '\0' ;
		ret = FDG_SetFileText( name ) ;
		ret = FDG_DspFileDlg(MMI_GetBaseObj(), FDG_FILEONLY | FDG_TEXT,
			 NULL, ExtStr,	&MSlctCnt) ;
	}
	MMI_SetAlertObj( alertobj ) ;  /*  ALERTOBJを元に戻す    　   */

	if( (ret == 1) && (MSlctCnt > 0) )	/*	正しくファイル名を収得したか？	*/
	{
		FDG_GetPathName( path, &Atr, 0 ) ;
	}
	else
	{
		ret2 = 1 ;
	}
	ret = FDG_RecovCurDir() ;
	return ret2 ;
}

/* ディレクトリ選択 */
int	directorySelector( path, dummy, ExtStr, title, exec, cncl )
char	*path ;
char	*dummy ;
char	**ExtStr ;
char	*title ;
char	*exec ;
char	*cncl ;
{
	char pathName[100], name[20] ;
	int				 i, j, n ;
	unsigned int	MSlctCnt ;
	int		  Atr, ret, ret2 ;
	int    alertobj ;      /*   現在のALERTOBJを退避する変数　　  */

	ret2 = NOERR ;

	n = 0 ;
	for( i=0 ; i<79 ; i++ )
	{
		pathName[i] = path[i] ;
		if( path[i] == '\\' )
			n++ ;
		if( path[i] == '\0' )
			break ;
	}
	if( n <= 1 )
	{
		for( i=i ; i>=0 ; i-- )
		{
			if( path[i] == '\\' )
			{
				i++ ;
				pathName[i] = '\0' ;
				break ;
			}
		}
		for( j=0 ; j<13 ; j++ )
		{
			name[j] = path[i+j] ;
		}
	}
	else
	{
		for( i=i ; i>=0 ; i-- )
		{
			if( path[i] == '\\' )
			{
				pathName[i] = '\0' ;
				break ;
			}
		}
		for( j=0 ; j<13 ; j++ )
		{
			name[j] = path[i+1+j] ;
		}
	}

	ret = FDG_SetFileText( dummy ) ;
	ret = FDG_SetTitle( title, exec, cncl ) ;

	alertobj = MMI_GetAlertObj() ;  /*  現在のALERTOBJを退避  　  */
	MMI_SetAlertObj( FDG_GetMainID() ) ;
	ret = FDG_DspFileDlg(MMI_GetBaseObj(), FDG_FILEONLY | FDG_TEXT,
		 pathName, ExtStr,	&MSlctCnt) ;
	if( ret < 0 )	/* PATHが間違ってる場合はカレントディレクトリで */
	{
		name[0] = '\0' ;
		ret = FDG_SetFileText( name ) ;
		ret = FDG_DspFileDlg(MMI_GetBaseObj(), FDG_FILEONLY | FDG_TEXT,
			 NULL, ExtStr,	&MSlctCnt) ;
	}
	MMI_SetAlertObj( alertobj ) ;  /*  ALERTOBJを元に戻す    　   */

	if( (ret == 1) && (MSlctCnt > 0) )	/*	正しくファイル名を収得したか？	*/
	{
		FDG_GetPathName( path, &Atr, 0 ) ;

		n = 0 ;
		for( i=0 ; i<79 ; i++ )
		{
			if( path[i] == '\\' )
				n++ ;
			if( path[i] == '\0' )
				break ;
		}
		if( n > 0 )
		{
			for( i=i ; i>=0 ; i-- )
			{
				if( path[i] == '\\' )
				{
					i++ ;
					path[i] = '\0' ;
					break ;
				}
			}
		}
		else
		{
			path[0] = '\0' ;
			ret2 = 1 ;
		}
	}
	else
	{
		ret2 = 1 ;
	}
	ret = FDG_RecovCurDir() ;
	return ret2 ;
}

/* マウスボタンチェック */

mouseSwCheck()
{
	int sw ;

	int x, y ;

	MOS_rdpos( &sw, &x, &y ) ;

	return sw ;
}

playCheck()
{
	int sw;

/*	注意:sw 押されているとbit off 押されてないとbit on 	*/

	SND_joy_in_1( 0xff, &sw );		/* end check */
	sw = (sw ^ 0xff) & 0x30;
	if( sw == 0 )return 0;
c01:	SND_joy_in_1( 0xff, &sw );
	sw = (sw ^ 0xff) & 0x30;
	if( sw & 0x10 ){
		while( sw == 0x30 ){
			SND_joy_in_1( 0xff, &sw );
			sw = (sw ^ 0xff) & 0x30;
		}
		if( sw == 0x20 )goto c02;
		while( sw ){
			SND_joy_in_1( 0xff, &sw );
			sw = (sw ^ 0xff) & 0x30;
			if( sw == 0x30 )break;
		}
		return 1;
	}
c02:	if( sw )goto c01;
	return -1;
}

/*	パレット設定 (パレットが設定されてなければgreen系に固定)	*/
int	setPalette( char *ework )
{
	char	para[16*8+4] ;
	int		ptr, colnum ;

	void 	set1Pal( int col, int b, int r, int g )
	{
		DWORD(para + ptr) = col ;
		BYTE(para + ptr + 4) = b * 16 ;
		BYTE(para + ptr + 5) = r * 16 ;
		BYTE(para + ptr + 6) = g * 16 ;
		BYTE(para + ptr + 7) = 0 ;
		ptr += 8 ;
	}

//	EGB_getTmenuPalette( para ) ;
//	colnum = DWORD(para) ;

	colnum = 0 ;		/* 強制的に色設定にしてしまう 1993 12 */

	if( colnum == 6 )	ptr = 52 ;
	else				ptr = 4 ;
	if( colnum != 16 )
	{
		set1Pal( 2, 4, 12, 6 ) ;
		set1Pal( 3, 5, 5, 5 ) ;		// 		set1Pal( 3, 10, 15, 12 ) ;
		set1Pal( 4, 9, 9, 9 ) ;
		set1Pal( 5, 7, 0, 12 ) ;
		set1Pal( 10, 0, 13, 0 ) ;
		set1Pal( 11, 10, 0, 0 ) ;
		set1Pal( 12, 0, 0, 15 ) ;
		set1Pal( 13, 15, 0, 15 ) ;
		set1Pal( 14, 0, 15, 13 ) ;
		if( colnum != 6 )
		{		/* メニュー色(green系) */
			set1Pal( 1, 4, 4, 8 ) ;
			set1Pal( 6, 12, 12, 12 ) ;
			set1Pal( 7, 7, 7, 7 ) ;
			set1Pal( 8, 2, 2, 2 ) ;
			set1Pal( 9, 8, 10, 12 ) ;	/* file selector */
			set1Pal( 15, 15, 15, 15 ) ;
		}
		DWORD(para + 0) = 15 ;
	}
	else
		DWORD(para + 0) = colnum ;
	EGB_palette( ework, 1, para ) ;

	return NOERR ;
}

/*	２画面合成のためのマウス表示関数	*/
int	mouseDsp( int num )
{
	SetMouse16( num, 0xf, 0x8 ) ;	/* マウスカーソルが透けないように */
	return	NOERR ;
}

/*	終了処理	*/
int	quitFunc()
{
	extern int tifListMenuId0 ;		/* tiflistリストobj0 */
	extern int tifListMenuId1 ;		/* tiflistリストobj1 */
	extern int tifFirstFlg ;		/* tiflist初期化時に0にするべき値 */

	EGB_displayPage( guiEgbPtr, 0, 0 );
	EGB_resolution(guiEgbPtr,1,10);		/* モード10 */
	EGB_resolution(guiEgbPtr,0,3);		/* モード3 */

	EGB_writePage(guiEgbPtr,1);
	EGB_color(guiEgbPtr,1,0x8000);
	EGB_clearScreen(guiEgbPtr);
	EGB_writePage(guiEgbPtr,0);

	MMI_SendMessage(tifListMenuId0, MM_SETMAXROWCOLUM, 2, 0, 0) ;
	MMI_SendMessage(tifListMenuId1, MM_SETMAXROWCOLUM, 2, 0, 0) ;
	tifFirstFlg = 0 ;

	if( rbuf != NULL )
	{
		TL_free( rbuf ) ;
	}
	if( bbuf != NULL )
	{
		TL_free( bbuf ) ;
	}
	MMI_SetHaltFlag( TRUE ) ;
	return NOERR ;
}

/*	終了可能なら終了する処理	*/
int	quitFunc2()
{
	/* baseDialogId , menubarId が MS_DSPONLYL40 なら何かの作業中で終了不可 */

	if( (MTL_checkAtrObj( baseDialogId, MS_DSPONLYL40 ) == 0)
		&& (MTL_checkAtrObj( menubarId, MS_DSPONLYL40 ) == 0) )
	{
		extern int tifListMenuId0 ;		/* tiflistリストobj0 */
		extern int tifListMenuId1 ;		/* tiflistリストobj1 */
		extern int tifFirstFlg ;		/* tiflist初期化時に0にするべき値 */

		EGB_displayPage( guiEgbPtr, 0, 0 );
		EGB_resolution(guiEgbPtr,1,10);		/* モード10 */
		EGB_resolution(guiEgbPtr,0,3);		/* モード3 */

		EGB_writePage(guiEgbPtr,1);
		EGB_color(guiEgbPtr,1,0x8000);
		EGB_clearScreen(guiEgbPtr);
		EGB_writePage(guiEgbPtr,0);

		MMI_SendMessage(tifListMenuId0, MM_SETMAXROWCOLUM, 2, 0, 0) ;
		MMI_SendMessage(tifListMenuId1, MM_SETMAXROWCOLUM, 2, 0, 0) ;
		tifFirstFlg = 0 ;

		if( rbuf != NULL )
		{
			TL_free( rbuf ) ;
		}
		if( bbuf != NULL )
		{
			TL_free( bbuf ) ;
		}
		MMI_SetHaltFlag( TRUE ) ;
		return NOERR ;
	}
	return ILLEGAL_FUNCTION ;
}

/*	あばうと表示	*/
int	aboutFunc()
{
	MMI_SendMessage( alertId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
	MMI_SendMessage( alertId, MM_SHOW, 0 ) ;
	return NOERR ;
}

/*	あばうと表示確認	*/
int	aboutOKFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	MMI_SendMessage( alertId, MM_ERASE, 0 ) ;
	MMI_SendMessage( alertId, MM_DETACH, 0 ) ;
	return NOERR ;
}

/* error 表示ルーチン */
int errorCheck(number)
int number;
{
	MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
		 "エラーが発生しました｡" ) ;
	if( number == 4 )
		MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
		 "データが見つかりません｡" ) ;
	if( number == 7 )
		MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
		 "メモリが足りません。" ) ;
	if( number == 52 )
		MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
		 "ファイル名が重複しています｡" ) ;
	if( number == 54 )
		MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
		 "フレームオーバーです｡" ) ;
	if( number == 55 )
		MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
		 "ファイル名が正しくありません｡" ) ;
	if( number == 58 )
		MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
		 "データ形式が正しくありません｡" ) ;
	if( number == 1 )
		MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
		 "ロードできませんでした｡" ) ;
	if( number == 2 )
		MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
		 "セーブできませんでした｡" ) ;
	if( number == 1000 )
		MMI_SendMessage( errormessage[0], MM_SETMSG, 1,
		 "データの形式がそろってません｡" ) ;

	MMI_SendMessage( errorId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
	MMI_SendMessage( errorId, MM_SHOW, 0 ) ;

	MMI_ExecSystem() ;		/* Dialog表示へ･･･イベントループ */

	return NOERR;
}

/*	エラー表示確認	*/
int	errorOKFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	MMI_SendMessage( errorId, MM_ERASE, 0 ) ;
	MMI_SendMessage( errorId, MM_DETACH, 0 ) ;

	MMI_SetHaltFlag( TRUE ) ;

	return NOERR ;
}
