#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 <vtbios.h>
#include <egb.h>
#include <mos.h>
#include <snd.h>
#include "ugoku.h"

#define V02TYPE 10		/* V02関係の処理 */
#define MOVTYPE 11		/* MOV関係の処理 */

/* abou */
int	alertId = -1 ;
int	messageId[3] = -1 ;
int	dspIconId = -1 ;
int	aboutOKBtnId = -1 ;
/* dsk */
int	baseDialogId = -1 ;
int	menubarId = -1 ;
int	menuId = -1 ;
int	mItemId[3] = -1 ;
int	SDKmenuId = -1 ;
int	SDKmItemId[3] = -1 ;
int	fileMenuId = -1 ;
int	fileMItemId[2] = -1 ;
int	setMenuId = -1 ;
int	setMItemId[2] = -1 ;
int	quitIconId = -1 ;
int	namebarId = -1 ;
int	nameMesId = -1 ;
int	wakuDialogId = -1 ;
/* err */
int	errorId = -1 ;
int	errorOKBtnId = -1 ;
int	errorIconId = -1 ;
int	errormessage[2] = -1 ;
/* set */
int	setDialogId = -1 ;
int	setMesId[17] = -1 ;
int	setOKBtnId = -1 ;
int	setCanBtnId = -1 ;
int	setSubDialogId = -1 ;
int	waitNumId = -1 ;
int	setBtnId[9] = -1 ;

static int	playType = -1 ;			/*  mov or v02 				*/

static int	setFlag ;				/*	表示設定のフラグ		*/
static int	wait ;					/*	ウェイト設定用ワーク	*/
static int	scnMode ;				/*	画面モード設定用ワーク	*/
static int	zoom ;					/*	倍率設定用ワーク		*/
static int	playMode ;				/*	再生モード設定用ワーク	*/
static int	loop ;					/*	ループ再生のフラグ		*/

static char	path[80] ;
static char *namePoint ;

extern	char	*guiEgbPtr ;	/*	EGB のワークアドレス	*/

/*
		基本セット
*/

/*	設定するか、取り消すか？	*/
/*	initDataIMVSET:setOKBtnId:MJ_DBUTTONL40の呼び出し関数	*/
/*	initDataIMVSET:setCanBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	setOKchk(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	if( kobj == setOKBtnId )
		setFlag = TRUE ;
	else
		setFlag = FALSE ;
	MMI_SetHaltFlag( TRUE ) ;
	return NOERR ;
}

/*	ウェイト値を設定	*/
/*	initDataIMVSET:waitNumId:MJ_NUMBOXL40の呼び出し関数	*/
int	waitSet(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 ) ;
	wait = var ;
	return NOERR ;
}

/*	画面モードを設定（ラジオボタン）	*/
/*	initDataIMVSET:setBtnId[0]:MJ_TICONL40の呼び出し関数	*/
/*	initDataIMVSET:setBtnId[1]:MJ_TICONL40の呼び出し関数	*/
int	screenSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	if( kobj == setBtnId[0] )
	{
		MTL_setFlagObj( setBtnId[0], MS_UNSELECT ) ;
		MTL_resetFlagObj( setBtnId[1], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
		MMI_SendMessage( setBtnId[1], MM_SHOW, 0 ) ;
		scnMode = 0 ;			/*	ハイスキャン	*/
	}
	else
	{
		MTL_resetFlagObj( setBtnId[0], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
		MTL_setFlagObj( setBtnId[1], MS_UNSELECT ) ;
		MMI_SendMessage( setBtnId[0], MM_SHOW, 0 ) ;
		scnMode = 1 ;			/*	ロースキャン	*/
	}
	return NOERR ;
}

/*	再生領域を設定（ラジオボタン）	*/
/*	initDataIMVSET:setBtnId[2]:MJ_TICONL40の呼び出し関数	*/
/*	initDataIMVSET:setBtnId[3]:MJ_TICONL40の呼び出し関数	*/
int	playSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	if( kobj == setBtnId[2] )
	{
		MTL_setFlagObj( setBtnId[2], MS_UNSELECT ) ;
		MTL_resetFlagObj( setBtnId[3], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
		MMI_SendMessage( setBtnId[3], MM_SHOW, 0 ) ;
		playMode = 0 ;			/*	メモリ再生	*/
	}
	else
	{
		MTL_resetFlagObj( setBtnId[2], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
		MTL_setFlagObj( setBtnId[3], MS_UNSELECT ) ;
		MMI_SendMessage( setBtnId[2], MM_SHOW, 0 ) ;
		playMode = 1 ;			/*	ディスク再生	*/
	}
	return NOERR ;
}

/*	拡大率を設定（ラジオボタン）	*/
/*	initDataIMVSET:setBtnId[4]:MJ_TICONL40の呼び出し関数	*/
/*	initDataIMVSET:setBtnId[5]:MJ_TICONL40の呼び出し関数	*/
/*	initDataIMVSET:setBtnId[6]:MJ_TICONL40の呼び出し関数	*/
/*	initDataIMVSET:setBtnId[7]:MJ_TICONL40の呼び出し関数	*/
int	zoomSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	if( kobj == setBtnId[4] )
	{
		MTL_setFlagObj( setBtnId[4], MS_UNSELECT ) ;
		MTL_resetFlagObj( setBtnId[zoom+4], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
		MMI_SendMessage( setBtnId[zoom+4], MM_SHOW, 0 ) ;
		zoom = 0 ;			/*	0.5倍	*/
	}
	else
	if( kobj == setBtnId[5] )
	{
		MTL_setFlagObj( setBtnId[5], MS_UNSELECT ) ;
		MTL_resetFlagObj( setBtnId[zoom+4], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
		MMI_SendMessage( setBtnId[zoom+4], MM_SHOW, 0 ) ;
		zoom = 1 ;			/*	１倍	*/
	}
	else
	if( kobj == setBtnId[6] )
	{
		MTL_setFlagObj( setBtnId[6], MS_UNSELECT ) ;
		MTL_resetFlagObj( setBtnId[zoom+4], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
		MMI_SendMessage( setBtnId[zoom+4], MM_SHOW, 0 ) ;
		zoom = 2 ;			/*	1.5倍	*/
	}
	else
	{
		MTL_setFlagObj( setBtnId[7], MS_UNSELECT ) ;
		MTL_resetFlagObj( setBtnId[zoom+4], (~(MS_UNSELECT | MS_TOGGLE)) ) ;
		MMI_SendMessage( setBtnId[zoom+4], MM_SHOW, 0 ) ;
		zoom = 3 ;			/*	２倍	*/
	}
	return NOERR ;
}

/*	ファイル選択	*/

	/* MOV */
static int	movframe ;		/* 各種動画データ情報 */
static int	movx0 ;
static int	movy0 ;
static int	movx1 ;
static int	movy1 ;
static int	movwait ;

static int	movWait = 0 ;					/*	ウェイト設定用ワーク	*/
static int	movScnMode = 0 ;				/*	画面モード設定用ワーク	*/
static int	movZoom = 1 ;					/*	倍率設定用ワーク		*/
static int	movPlayMode = 0 ;				/*	再生モード設定用ワーク	*/
static int	movLoop = 1 ;					/*	ループ再生のフラグ		*/

	/* V02 */
static int	v02frame ;		/* 各種動画データ情報 */
static int	v02x ;
static int	v02y ;
static int	v02wait ;

static int	v02Wait = 0 ;					/*	ウェイト設定用ワーク	*/
static int	v02ScnMode = 0 ;				/*	画面モード設定用ワーク	*/
static int	v02Zoom = 1 ;					/*	倍率設定用ワーク		*/
static int	v02PlayMode = 1 ;				/*	再生モード設定用ワーク	*/
static int	v02Loop = 0 ;					/*	ループ再生のフラグ		*/

int	selectFunc0(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	char			*ExtStr[] = { "*.MOV", "*.V02", NULL } ;
	unsigned int	MSlctCnt ;
	int				Atr, ret ;
	int    alertobj ;      /*   現在のALERTOBJを退避する変数　　  */

	/* メニューとボタンを使えないようにする */
//	MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
	MTL_setAtrObj( baseDialogId, MS_DSPONLYL40 ) ;
	MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;

	alertobj = MMI_GetAlertObj() ;  /*  現在のALERTOBJを退避  　  */
	MMI_SetAlertObj( FDG_GetMainID() ) ;
	ret = FDG_DspFileDlg(MMI_GetBaseObj(), FDG_FILEONLY,
											 NULL, ExtStr, &MSlctCnt) ;
	MMI_SetAlertObj( alertobj ) ;  /*  ALERTOBJを元に戻す    　   */

	if( ret && MSlctCnt > 0 )	/*	正しくファイル名を収得したか？	*/
	{
		FDG_GetPathName( path, &Atr, 0 ) ;
		playType = -1 ;

		if( get_file_kakucho( path ) == DWORD( ".V02   " ) )
		{
			p_waku_del() ; /* 枠を閉める */

/* 情報を読んで最初のフレームを表示(1993 9に新しくライブラリに追加した機能) */
/*																		*/
/*   ここでは,pathに書かれたv02ファイルの各種の情報を読み取って,その    */
/*   最初のフレームをvramのページ０に表示させている｡ guiライブラリ以外  */
/*   で使用する場合は,最後の2つの引数をmalloc,freeとすればよい｡         */

			ret
			 = v02_wide_head_read_and_dsp( path, 
			   &v02frame, &v02x, &v02y, &v02wait, 1, TL_malloc, TL_free );

			if( ret == NOERR )
			{
				p_v02_graph_init( v02Zoom+1, v02x, v02y ) ;
									/* 倍率にあわせて画面設定 */
				MG_mosDisp( 0 ) ;

				p_waku_clear1( v02x, v02y, v02Zoom+1 ) ;
				EGB_displayPage(guiEgbPtr,0,3);

				MG_mosDisp( 1 ) ;
				playType = V02TYPE ;
			}
			else
			{
				playType = -1 ;
			}
			namePointSet() ;	/* display file name */
			MMI_SendMessage( namebarId, MM_SHOW, 0 ) ;

		}

		if( get_file_kakucho( path ) == DWORD( ".MOV   " ) )
		{
			p_waku_del() ; /* 枠を閉める */

/* 情報を読んで最初のフレームを表示(1993 9に新しくライブラリに追加した機能) */
/*																		*/
/*   ここでは,pathに書かれたmovファイルの各種の情報を読み取って,その    */
/*   最初のフレームをvramのページ０に表示させている｡ guiライブラリ以外  */
/*   で使用する場合は,最後の2つの引数をmalloc,freeとすればよい｡         */

			ret
			 = mov_head_read_and_dsp( path, &movframe, &movx0, &movy0,
			   &movx1, &movy1, &movwait, 1, TL_malloc, TL_free );

			if( ret == NOERR )
			{
				p_mov_graph_init( movZoom+1, movx0,movy0,movx1,movy1 ) ;
									/* 倍率にあわせて画面設定 */

				MG_mosDisp( 0 ) ;

				p_waku_clear1( movx1-movx0+1, movy1-movy0+1, movZoom+1 ) ;
				EGB_displayPage(guiEgbPtr,0,3);

				MG_mosDisp( 1 ) ;
				playType = MOVTYPE ;
			}
			else
			{
				playType = -1 ;
			}
			namePointSet() ;	/* display file name */
			MMI_SendMessage( namebarId, MM_SHOW, 0 ) ;
		}
	}

	/* メニューとボタンを使えるように戻す */
//	MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
	MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
	MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;

	if( ret )errorCheck( ret ) ;

	return NOERR ;
}

/* return DWORD( ".拡張子" ) */

get_file_kakucho( name )
char name[];
{
	int i, j, f ;
	char kaku[4] ;

	for( i=0 ; i<4 ; i++ )kaku[i] = (char)0;
	f = 0 ;
	for( j=0 ; j<80 ; j++ ){
		if( name[j] == '.' )f = 1 ;
		if( name[j] == '\0' )break ;
	}
	if( f == 0 )return 0;		/* 拡張子なし */
	if( j > 79 )j = 79 ;
	for( i=j ; i>0 ; i-- )	/* 日本語の混乱を避けるため終わりからスキャン */
	{
		if( name[i] == '.' )goto mov01;
	}
	return 0;		/* 拡張子なし */
mov01:	if( i == 0 )return 0;
	for( j=0 ; j<4 ; j++ ){
		if( name[i] == '\0' )break ;
		kaku[j] = name[i];
		i++;
		if( (int)kaku[j] >= 0x61 && (int)kaku[j] <= 0x7a )
		    kaku[j] = (char)( (int)kaku[j] & 0xdf ); /* 大文字化 */
	}
	return DWORD( kaku );
}

namePointSet()
{
	char s ;
	int i ;

	namePoint = path ;
	for( i=0 ; i<80 ; i++ )
	{
		s = path[i] ;
		if( (s == '\\') || (s == ':') )namePoint = path + i + 1 ;
		if( s == '\0' )break ;
	}
	MMI_SendMessage( nameMesId, MM_SETMSG, 1, namePoint ) ;
	return NOERR ;
}

/*	mov条件設定ダイアログ表示	*/

int	setFunc0(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int i ;

	wait = movWait ;
	scnMode = movScnMode ;
	zoom =  movZoom ;
	playMode = movPlayMode ;
	loop = movLoop ;
	int    alertobj ;      /*   現在のALERTOBJを退避する変数　　  */

	/* メニューとボタンを使えないようにする */
//	MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
	MTL_setAtrObj( baseDialogId, MS_DSPONLYL40 ) ;
	MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;

	alertobj = MMI_GetAlertObj() ;  /*  現在のALERTOBJを退避  　  */
	MMI_SetAlertObj( setDialogId ) ;
	MMI_SendMessage( setDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;

	MMI_SendMessage( setMesId[0], MM_SETMSG, 1, "ＭＯＶ再生条件の設定" ) ;

	MMI_SendMessage( waitNumId, MM_SETNUMBOX, 5, wait, -6, 99, 1, 0 ) ;
					/*	var, min, max, delta, ptColumn ウエイト初期設定 */
	for( i=0 ; i<8 ; i++ )	/* ボタンクリアー */
		MTL_resetFlagObj( setBtnId[i], (~(MS_UNSELECT | MS_TOGGLE)) ) ;

	if( VTBIOS_getStatus() >= 0 )
	{
		MTL_setFlagObj( setBtnId[scnMode], (MS_UNSELECT | MS_TOGGLE) ) ;
	}
	else
	{
		MTL_resetAtrObj( setMesId[1], (~MS_DSPONLYL40) ) ;	/* clear */
		MTL_resetAtrObj( setMesId[2], (~MS_DSPONLYL40) ) ;
		MTL_resetAtrObj( setMesId[3], (~MS_DSPONLYL40) ) ;
		MTL_resetAtrObj( setBtnId[0], (~MS_DSPONLYL40) ) ;
		MTL_resetAtrObj( setBtnId[1], (~MS_DSPONLYL40) ) ;

		MTL_setAtrObj( setMesId[1], MS_INACTIVEL40 ) ;		/* 選択不可 */
		MTL_setAtrObj( setMesId[2], MS_INACTIVEL40 ) ;
		MTL_setAtrObj( setMesId[3], MS_INACTIVEL40 ) ;
		MTL_setAtrObj( setBtnId[0], MS_INACTIVEL40 ) ;
		MTL_setAtrObj( setBtnId[1], MS_INACTIVEL40 ) ;
	}

	MTL_setFlagObj( setBtnId[playMode+2], (MS_UNSELECT | MS_TOGGLE) ) ;
	MTL_setFlagObj( setBtnId[zoom+4], (MS_UNSELECT | MS_TOGGLE) ) ;

	if( loop == 1 )	MTL_setFlagObj( setBtnId[8], MS_TOGGLE ) ;
	else			MTL_resetFlagObj( setBtnId[8], (~MS_TOGGLE) ) ;

	MMI_SendMessage( setDialogId, MM_SHOW, 0 ) ;		/* 見せる */

	MMI_ExecSystem() ;		/* Dialog表示へ･･･イベントループ */

	MMI_SendMessage( setDialogId, MM_ERASE, 0 ) ;
	MMI_SendMessage( setDialogId, MM_DETACH, 0 ) ;
	MMI_SetAlertObj( alertobj ) ;  /*  ALERTOBJを元に戻す    　   */

	if( setFlag == TRUE )
	{
		loop = (MTL_checkFlagObj( setBtnId[8], MS_TOGGLE )==MS_TOGGLE) ? 1:0 ;

		movWait = wait ;
		movScnMode = scnMode;
		movPlayMode = playMode ;
		movLoop = loop ;

		if( (playType == MOVTYPE) && (zoom != movZoom) )
		{
			movZoom = zoom ;

			p_waku_del() ; /* 枠を閉める */

			p_mov_graph_init( movZoom+1, movx0,movy0,movx1,movy1 ) ;
									/* 倍率にあわせて画面設定 */

			MG_mosDisp( 0 ) ;
			p_waku_clear1( movx1-movx0+1, movy1-movy0+1, movZoom+1 ) ;
			MG_mosDisp( 1 ) ;
		}
		else
			movZoom = zoom ;
	}
	/* メニューとボタンを使えるように戻す */
//	MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
	MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
	MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;

	return NOERR ;
}

/*	v02条件設定ダイアログ表示	*/

int	setFunc1(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int i ;

	wait = v02Wait ;
	scnMode = v02ScnMode ;
	zoom =  v02Zoom ;
	playMode = v02PlayMode ;
	loop = v02Loop ;
	int    alertobj ;      /*   現在のALERTOBJを退避する変数　　  */

	/* メニューとボタンを使えないようにする */
//	MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
	MTL_setAtrObj( baseDialogId, MS_DSPONLYL40 ) ;
	MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;

	alertobj = MMI_GetAlertObj() ;  /*  現在のALERTOBJを退避  　  */
	MMI_SetAlertObj( setDialogId ) ;
	MMI_SendMessage( setDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;

	MMI_SendMessage( setMesId[0], MM_SETMSG, 1, "ＶＯ２再生条件の設定" ) ;

	MMI_SendMessage( waitNumId, MM_SETNUMBOX, 5, wait, -6, 99, 1, 0 ) ;
					/*	var, min, max, delta, ptColumn ウエイト初期設定 */
	for( i=0 ; i<8 ; i++ )	/* ボタンクリアー */
		MTL_resetFlagObj( setBtnId[i], (~(MS_UNSELECT | MS_TOGGLE)) ) ;

	if( VTBIOS_getStatus() >= 0 )
	{
		MTL_setFlagObj( setBtnId[scnMode], (MS_UNSELECT | MS_TOGGLE) ) ;
	}
	else
	{
		MTL_resetAtrObj( setMesId[1], (~MS_DSPONLYL40) ) ;	/* clear */
		MTL_resetAtrObj( setMesId[2], (~MS_DSPONLYL40) ) ;
		MTL_resetAtrObj( setMesId[3], (~MS_DSPONLYL40) ) ;
		MTL_resetAtrObj( setBtnId[0], (~MS_DSPONLYL40) ) ;
		MTL_resetAtrObj( setBtnId[1], (~MS_DSPONLYL40) ) ;

		MTL_setAtrObj( setMesId[1], MS_INACTIVEL40 ) ;		/* 選択不可 */
		MTL_setAtrObj( setMesId[2], MS_INACTIVEL40 ) ;
		MTL_setAtrObj( setMesId[3], MS_INACTIVEL40 ) ;
		MTL_setAtrObj( setBtnId[0], MS_INACTIVEL40 ) ;
		MTL_setAtrObj( setBtnId[1], MS_INACTIVEL40 ) ;
	}

	MTL_setFlagObj( setBtnId[playMode+2], (MS_UNSELECT | MS_TOGGLE) ) ;
	MTL_setFlagObj( setBtnId[zoom+4], (MS_UNSELECT | MS_TOGGLE) ) ;

	if( loop == 1 )	MTL_setFlagObj( setBtnId[8], MS_TOGGLE ) ;
	else			MTL_resetFlagObj( setBtnId[8], (~MS_TOGGLE) ) ;

	MMI_SendMessage( setDialogId, MM_SHOW, 0 ) ;		/* 見せる */

	MMI_ExecSystem() ;		/* Dialog表示へ･･･イベントループ */

	MMI_SendMessage( setDialogId, MM_ERASE, 0 ) ;
	MMI_SendMessage( setDialogId, MM_DETACH, 0 ) ;
	MMI_SetAlertObj( alertobj ) ;  /*  ALERTOBJを元に戻す    　   */

	if( setFlag == TRUE )
	{
		loop = (MTL_checkFlagObj( setBtnId[8], MS_TOGGLE )==MS_TOGGLE) ? 1:0 ;

		v02Wait = wait ;
		v02ScnMode = scnMode;
		v02PlayMode = playMode ;
		v02Loop = loop ;

		if( (playType == V02TYPE) && (zoom != v02Zoom) )
		{
			v02Zoom = zoom ;

			p_waku_del() ; /* 枠を閉める */

			p_v02_graph_init( v02Zoom+1, v02x, v02y ) ;
								/* 倍率にあわせて画面設定 */
			MG_mosDisp( 0 ) ;
			p_waku_clear1( v02x, v02y, v02Zoom+1 ) ;
			MG_mosDisp( 1 ) ;
		}
		else
			v02Zoom = zoom ;
	}

	/* メニューとボタンを使えるように戻す */
//	MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
	MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
	MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;

	return NOERR ;
}

/* 	再生		*/
int	selectFunc1()
{
	int ret, temp ;

	ret = 0 ;

	/* メニューとボタンを使えないようにする */
//	MTL_setAtrObj( menubarId, MS_DSPONLYL40 ) ;
	MTL_setAtrObj( baseDialogId, MS_DSPONLYL40 ) ;
	MTL_setAtrObj( SDKmItemId[2], MS_INACTIVEL40 ) ;

	if( playType == V02TYPE )
	{
		temp = 0 ;
		MMI_SendMessage( menubarId, MM_ERASE, 0 ) ;
//		p_waku_clear2( v02x, v02y, v02Zoom+1 ) ;
		temp = 1 ;

		if( VTBIOS_getStatus() >= 0 && v02ScnMode )
		{
			VTBIOS_videoON() ;
			EGB_displayPage(guiEgbPtr,0,0);
			setPalette( guiEgbPtr ) ;
			p_v02_graph_init( v02Zoom+1, v02x, v02y ) ;
			EGB_displayPage(guiEgbPtr,0,3);
		}

		MG_mosDisp( 0 ) ;
		if( v02PlayMode )
			ret = p_v02_disk_play( path, v02Wait, v02Loop, 1 ) ;
		else
			ret = p_v02_memory_play( path, v02Wait, v02Loop, 1 ) ;
		MG_mosDisp( 1 ) ;

		if( VTBIOS_getStatus() == 1 )
		{
			VTBIOS_videoOFF() ;
			EGB_displayPage(guiEgbPtr,0,0);
			EGB_resolution(guiEgbPtr,1,10);		/* モード10 */
			EGB_resolution(guiEgbPtr,0,3);		/* モード3 */
			setPalette( guiEgbPtr ) ;
			p_v02_graph_init( v02Zoom+1, v02x, v02y ) ;
			EGB_displayPage(guiEgbPtr,0,3);
		}

		if( temp )
		{
			p_waku_clear1( v02x, v02y, v02Zoom+1 ) ;
			MMI_SendMessage( menubarId, MM_SHOW, 0 ) ;
		}
	}

	if( playType == MOVTYPE )
	{
		temp = 0 ;
		MMI_SendMessage( menubarId, MM_ERASE, 0 ) ;
//		p_waku_clear2( movx1-movx0+1, movy1-movy0+1, movZoom+1 ) ;
		temp = 1 ;

		if( VTBIOS_getStatus() >= 0 && movScnMode )
		{
			VTBIOS_videoON() ;
			EGB_displayPage(guiEgbPtr,0,0);
			setPalette( guiEgbPtr ) ;
			p_mov_graph_init( movZoom+1, movx0,movy0,movx1,movy1 ) ;
			EGB_displayPage(guiEgbPtr,0,3);
		}

		MG_mosDisp( 0 ) ;
		if( movPlayMode )
			ret = p_mov_disk_play( path, movWait, movLoop, 0 ) ;
		else
			ret = p_mov_memory_play( path, movWait, movLoop, 0 ) ;
		MG_mosDisp( 1 ) ;

		if( VTBIOS_getStatus() == 1 )
		{
			VTBIOS_videoOFF() ;
			EGB_displayPage(guiEgbPtr,0,0);
			EGB_resolution(guiEgbPtr,1,10);		/* モード10 */
			EGB_resolution(guiEgbPtr,0,3);		/* モード3 */
			setPalette( guiEgbPtr ) ;
			p_mov_graph_init( movZoom+1, movx0,movy0,movx1,movy1 ) ;
			EGB_displayPage(guiEgbPtr,0,3);
		}

		if( temp )
		{
			MMI_SendMessage( menubarId, MM_SHOW, 0 ) ;
			p_waku_clear1( movx1-movx0+1, movy1-movy0+1, movZoom+1 ) ;
		}
	}

ply01:
	MMI_FlushEvnt() ;

	/* マウスが押されていれば次のイベントを無視 */
	if( mouseSwCheck() )TL_setInvalidMosFlag() ;

	if( ret )errorCheck( ret ) ;

	/* メニューとボタンを使えるように戻す */
//	MTL_resetAtrObj( menubarId, (~MS_DSPONLYL40) ) ;
	MTL_resetAtrObj( baseDialogId, (~MS_DSPONLYL40) ) ;
	MTL_resetAtrObj( SDKmItemId[2], (~MS_INACTIVEL40) ) ;

	return NOERR ;
}

/* マウスボタンチェック */

mouseSwCheck()
{
	int sw ;

	int x, y ;

	MOS_rdpos( &sw, &x, &y ) ;
	return sw ;
}

/* 制限つき枠くり抜き */

p_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 = (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 0 ;
}

/* 制限なし枠くり抜き */

p_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 = (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 0 ;
}

p_waku_del()
{
	MMI_SendMessage( wakuDialogId, MM_ERASE, 0 ) ;
	MMI_SendMessage( wakuDialogId, MM_DETACH, 0 ) ;
	return NOERR ;
}

/*
		動くざんす用各種ルーチン
*/

/****** V02 *****/

/*  v02 play  */

static v02StopFlg = 0 ;		/* 終わり方を記憶するフラグ(強制終了なら1) */

	/* chek func */
int p_v02_play_check()
{
	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;
	v02StopFlg = 1 ;
	return -1;
}

	/* disk play */
p_v02_disk_play( name, wait, rep, page )
char *name;
int wait, rep, page ;
{
	int xd, yd, size, frame, wt, error;
	char *buffer;

	p_v02_play_set() ;

	v02_wide_head_read_and_dsp( name, &frame,&xd,&yd,&wt, 0,
													 TL_malloc, TL_free );
	EGB_displayPage(guiEgbPtr,0,3);

	v02StopFlg = 0 ;
	error = V02_wide_disk_play_init( name, p_v02_play_check, &frame,
					&xd, &yd, &size );
	if( error )
		goto vd11;
	if( (buffer = (char *)TL_malloc( size )) == NULL )
	{
		error = 7;
		goto vd11;			/* out of memory */
	}

		/* mute */
	int s ;					/* こうするとpcmだけをonにできる */
	SND_get_elevol_mute( &s ) ;
	SND_elevol_mute( s | 0x01 ) ;

	SND_fm_timer_b_set( 0, 0 ) ;

vd02:
	error = V02_wide_disk_play( buffer, name, 2, wait );
	if( (error == NOERR) && rep && 	(v02StopFlg == 0) )
	{
		p_v02_play_check() ;
		if( v02StopFlg == 0 )goto vd02 ;
	}

	SND_fm_timer_b_start() ;

vd10:	TL_free( buffer );
vd11:	SND_pcm_sound_delete( -1 );

	p_v02_play_end() ;

	return error;
}

	/* memory play */
p_v02_memory_play( name, wait, rep, page )
char *name;
int wait, rep ;
{
	int xd, yd, size, frame, wt, error;
	char *buffer;

	p_v02_play_set() ;

	v02_wide_head_read_and_dsp( name, &frame,&xd,&yd,&wt, 0,
													 TL_malloc, TL_free );
	EGB_displayPage(guiEgbPtr,0,3);

	v02StopFlg = 0 ;
	error = V02_wide_memory_play_init( name, p_v02_play_check, &frame,
					&xd, &yd, &size );
	if( error )
		goto vd11;
	if( (buffer = (char *)TL_malloc( size )) == NULL )
	{
		error = 7;
		goto vd11;			/* out of memory */
	}

		/* mute */
	int s ;					/* こうするとpcmだけをonにできる */
	SND_get_elevol_mute( &s ) ;
	SND_elevol_mute( s | 0x01 ) ;

	SND_fm_timer_b_set( 0, 0 ) ;

vd02:	/* ↓on memoryのリピートをスムーズにした関数(1993 9追加) */
	error = V02_wide_memory_play_repeat( buffer, name, 2, wait, -rep );
	if( (error == NOERR) && rep && 	(v02StopFlg == 0) )goto vd02 ;

	SND_fm_timer_b_start() ;

vd10:	TL_free( buffer );
vd11:	SND_pcm_sound_delete( -1 );

	p_v02_play_end() ;

	return error;
}

static p_v02_play_set()
{
	int x[4], y[4] ;

	p_mov_graph_init_sub( v02Zoom+1, 0,0,v02x-1,v02y-1, x, y ) ;

	p_play_set_sub() ;

	p_waku_clear2( v02x, v02y, v02Zoom+1 ) ;

	EGB_displayPage(guiEgbPtr,0,0);

	EGB_resolution(guiEgbPtr,0,10);
	EGB_resolution(guiEgbPtr,1,10);

	EGB_writePage(guiEgbPtr,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);

	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]);

	return NOERR ;
}

static p_v02_play_end()
{
	int x[4], y[4] ;
	WINCTRL *pctrl ;
	WINCLIP *pwclp ;

	p_mov_graph_init_sub( v02Zoom+1, 0,0,v02x-1,v02y-1, x, y ) ;

	EGB_displayPage(guiEgbPtr,0,0);
	EGB_resolution(guiEgbPtr,0,3);

	EGB_writePage(guiEgbPtr,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_displayPage(guiEgbPtr,1,2);

	EGB_writePage(guiEgbPtr,0);			/* 画面1設定 */

	MMI_GetControl( &pctrl ) ;
	pwclp = WIN_getClipMemory( &pctrl->bound, NULL ) ;
	MMI_SendMessage( MMI_GetBaseObj(), MM_UPDATE, 1, pwclp ) ;
	WIN_freeClipMemory( pwclp ) ;
	setPalette( guiEgbPtr ) ;

	p_play_end_sub() ;

	return NOERR ;
}


	/* 倍率にあわせて画面設定 */
/* 注意 : GUIライブラリの都合でpage1の画面を設定し,最後にpage0に切り換えてる */

p_v02_graph_init( md, xd, yd )
int md, xd,yd;
{
	int x[4], y[4] ;

	if( (md < 1) || (md > 4) )
		return 100;
	p_mov_graph_init_sub( md, 0,0,xd-1,yd-1, x, y ) ;

	EGB_displayPage(guiEgbPtr,0,1);
	EGB_writePage(guiEgbPtr,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);
	EGB_displayPage(guiEgbPtr,0,3);

	return 0;
}

/****** MOV *****/

/*  playv  */

	/* chek func */

int p_mov_play_check()
{
	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;
}

/* on memory type */

p_mov_memory_play( name, wait, rep, page )
char *name;
int wait, rep;
{
	char *work ;
	int frame,x0,y0,x1,y1,wt,wsize;
	int error;

	p_mov_play_set( name ) ;
	mov_head_read_and_dsp( name, &frame, &x0, &y0,
	   &x1, &y1, &wt, 0, TL_malloc, TL_free );
	EGB_displayPage(guiEgbPtr,0,3);

	error
	 = mov_memory_play_init( name, p_mov_play_check,&frame,&x0,&y0,&x1,&y1,
	 &wsize );
	if( error )goto vd10;

	if( (work = (char *)TL_malloc( wsize+153600 )) == NULL ){
		error = 7;
		goto vd10;			/* out of memory */
	}

		/* mute */
	int s ;
	SND_get_elevol_mute( &s ) ;
	SND_elevol_mute( s | 0x03 ) ;

	error = mov_memory_play_repeat( work, work+153600, name, 2, wait, -rep);

	SND_elevol_mute( s ) ;

	TL_free( work );

vd10:
	p_mov_play_end() ;
	return error;
}

/* disk read type */

p_mov_disk_play( name, wait, rep, page )
char *name;
int wait, rep;
{
	char *work ;
	int frame,x0,y0,x1,y1,wt,wsize;
	int error;

	p_mov_play_set( name ) ;
	mov_head_read_and_dsp( name, &frame, &x0, &y0,
	   &x1, &y1, &wt, 0, TL_malloc, TL_free );
	EGB_displayPage(guiEgbPtr,0,3);

	error
	 = mov_disk_play_init( name, p_mov_play_check,&frame,&x0,&y0,&x1,&y1,
	  &wsize );
	if( error )goto vd10;

	if( (work = (char *)TL_malloc( wsize+153600 )) == NULL ){
		error = 7;
		goto vd10;			/* out of memory */
	}

		/* mute */
	int s ;
	SND_get_elevol_mute( &s ) ;
	SND_elevol_mute( s | 0x03 ) ;

	error = mov_disk_play_repeat( work, work+153600, name, 2, wait, -rep);

	SND_elevol_mute( s ) ;

	TL_free( work );

vd10:
	p_mov_play_end() ;
	return error;
}

p_mov_play_set( char *name )
{
	int x[4], y[4] ;

	p_mov_graph_init_sub( movZoom+1, movx0,movy0,movx1,movy1, x, y ) ;

	p_play_set_sub() ;

	p_waku_clear2( movx1-movx0+1, movy1-movy0+1, movZoom+1 ) ;

	EGB_displayPage(guiEgbPtr,0,0);

	EGB_resolution(guiEgbPtr,0,10);
	EGB_resolution(guiEgbPtr,1,10);

	EGB_writePage(guiEgbPtr,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);

	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]);

	return NOERR ;
}

p_mov_play_end()
{
	int x[4], y[4] ;
	WINCTRL *pctrl ;
	WINCLIP *pwclp ;

	p_mov_graph_init_sub( movZoom+1, movx0,movy0,movx1,movy1, x, y ) ;

	EGB_displayPage(guiEgbPtr,0,0);
	EGB_resolution(guiEgbPtr,0,3);

	EGB_writePage(guiEgbPtr,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_displayPage(guiEgbPtr,1,2);

	EGB_writePage(guiEgbPtr,0);			/* 画面1設定 */

	MMI_GetControl( &pctrl ) ;
	pwclp = WIN_getClipMemory( &pctrl->bound, NULL ) ;
	MMI_SendMessage( MMI_GetBaseObj(), MM_UPDATE, 1, pwclp ) ;
	WIN_freeClipMemory( pwclp ) ;
	setPalette( guiEgbPtr ) ;

	p_play_end_sub() ;

	return NOERR ;
}

static p_play_set_sub()
{
	int i ;
	char para[64] ;

	DWORD( para + 0 ) = 1 ;
	DWORD( para + 4 ) = 6 ;

	for( i=12 ; i>=0 ; i-- )
	{
		BYTE( para + 8 ) = i*16 ;
		BYTE( para + 9 ) = i*16 ;
		BYTE( para + 10 ) = i*16 ;
		BYTE( para + 11 ) = 0 ;
		EGB_palette( guiEgbPtr, 1, para );
	}

	return NOERR ;
}

static p_play_end_sub()
{
	int i ;
	char para[64] ;

	DWORD( para + 0 ) = 1 ;
	DWORD( para + 4 ) = 6 ;

	for( i=0 ; i<=12 ; i++ )
	{
		BYTE( para + 8 ) = i*16 ;
		BYTE( para + 9 ) = i*16 ;
		BYTE( para + 10 ) = i*16 ;
		BYTE( para + 11 ) = 0 ;
		EGB_palette( guiEgbPtr, 1, para );

		if( i == 0 )
			EGB_displayPage(guiEgbPtr,0,3);
	}

	return NOERR ;
}

	/* 倍率にあわせて画面設定 */
/* 注意 : GUIライブラリの都合でpage0の画面を設定し,最後にpage1に切り換えてる */

p_mov_graph_init( zoom, x0,y0,x1,y1 )
int zoom, x0,y0,x1,y1;
{
	int x[4], y[4] ;

	p_mov_graph_init_sub( zoom, x0, y0, x1, y1, x, y ) ;

	EGB_displayPage(guiEgbPtr,0,1);
	EGB_writePage(guiEgbPtr,1);		/* 画面0設定 */

	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); 	/* 画面1設定 */
	EGB_displayPage(guiEgbPtr,0,3);

	return NOERR ;
}

static p_mov_graph_init_sub
(
	int zoom, int x0, int y0, int x1, int y1, int *x, int *y
)
{
	int xd, yd ;

	xd = x1-x0+1 ;
	yd = y1-y0+1 ;

	if( 640/zoom >= xd )
	{
		x[0] = ( 640/zoom - xd )/2 ;
		x[1] = x0 ;
		x[2] = zoom ;
		x[3] = xd ;
	}
	else
	{
		x[0] = 0 ;
		x[1] = x0 - ( 640/zoom - xd )/2 ;
		x[2] = zoom ;
		x[3] = 640/zoom ;
	}

	if( 480/zoom >= yd )
	{
		y[0] = ( 480/zoom - yd )/2 ;
		y[1] = y0 ;
		y[2] = zoom ;
		y[3] = yd ;
	}
	else
	{
		y[0] = 0 ;
		y[1] = y0 - ( 480/zoom - yd )/2 ;
		y[2] = zoom ;
		y[3] = 480/zoom ;
	}

	return NOERR ;
}

/*
		バッチ用
*/

int p_for_bach( ac, av )
char ac,*av[];
{
	int ret ;
	int i, j, k, p ;
	int zoom, mode, scn, loop, pset ;

	path[0] = '\0' ;
	zoom = -1 ; mode = -1 ; loop = -1 ; scn = -1 ; pset = 0 ;
	if( ac >= 2 )
	{
	    for( j=1 ; j<ac ; j++ )
	    {
			if( BYTE( av[j] ) == '-' )
			{
			    p = 0;
			    for( i= 0 ; i<4 ; i++ )
			    {
					k = BYTE( av[j] + i );
					if( k >= 0x61 && k <= 0x7a )k = k & 0xdf;
					p = p + ( k << (8*i) );
					if( k == 0 )break;
			    }
			    if( p == DWORD( "-V1" ) )
			    {
			    	zoom = 0;
			    	scn = 0 ;
			    }
			    if( p == DWORD( "-V2" ) )
			    {
			    	zoom = 1;
			    	scn = 0 ;
			    }
			    if( p == DWORD( "-V3" ) )
			    {
			    	zoom = 2;
			    	scn = 0 ;
			    }
			    if( p == DWORD( "-V4" ) )
			    {
			    	zoom = 3;
			    	scn = 0 ;
			    }
			    if( p == DWORD( "-V11   " ) )
			    {
			    	zoom = 0;
			    	scn = 1 ;
			    }
			    if( p == DWORD( "-V12   " ) || p == DWORD( "-V17   " ) )
			    {
			    	zoom = 1;
			    	scn = 1 ;
			    }
			    if( p == DWORD( "-V13   " ) )
			    {
			    	zoom = 2;
			    	scn = 1 ;
			    }
			    if( p == DWORD( "-V14   " ) || p == DWORD( "-V18   " ) )
			    {
			    	zoom = 3;
			    	scn = 1 ;
			    }
			    if( p == WORD( "-M " ) )mode = 0;
			    if( p == WORD( "-D " ) )mode = 1;
			    if( p == WORD( "-V " ) )scn = 1;
			    if( p == WORD( "-R " ) )loop = 1;
			}
	   else {
			    for( i=0 ; i<80 ; i++ )
			    {
					path[i] = ( char )( BYTE( av[j] + i ) );
					if( path[i] == 0 )break;
					pset = 1 ;
			    }
			}
	    }

		if( zoom >= 0 )
		{
			movZoom = zoom ;
			v02Zoom = zoom ;
		}
		if( scn >= 0 )
		{
			movScnMode = scn ;
			v02ScnMode = scn ;
		}
		if( mode >= 0 )
		{
			movPlayMode = mode ;
			v02PlayMode = mode ;
		}
		if( loop >= 0 )
		{
			movLoop = loop ;
			v02Loop = loop ;
		}

		if( pset )
		{
			if( get_file_kakucho( path ) == DWORD( ".V02   " ) )
			{

/* 情報を読んで最初のフレームを表示(1993 9に新しくライブラリに追加した機能 */
			  ret
			   = v02_wide_head_read_and_dsp( path, 
			     &v02frame, &v02x, &v02y, &v02wait, 1, TL_malloc, TL_free );

			  if( ret == NOERR )
			  {
				namePointSet() ;	/* display file name */

				p_v02_graph_init( v02Zoom+1, v02x, v02y ) ;
									/* 倍率にあわせて画面設定 */

				p_waku_clear1( v02x, v02y, v02Zoom+1 ) ;
				EGB_displayPage(guiEgbPtr,0,3);

			    playType = V02TYPE ;
				selectFunc1() ;			/* 再生 */

			  }
			}

			if( get_file_kakucho( path ) == DWORD( ".MOV   " ) )
			{

/* 情報を読んで最初のフレームを表示(1993 9に新しくライブラリに追加した機能 */
			  ret
			   = mov_head_read_and_dsp( path, &movframe, &movx0, &movy0,
			   &movx1, &movy1, &movwait, 1, TL_malloc, TL_free );

			  if( ret == NOERR )
			  {
				namePointSet() ;	/* display file name */

			    p_mov_graph_init( movZoom+1, movx0,movy0,movx1,movy1 ) ;
									/* 倍率にあわせて画面設定 */

				p_waku_clear1( movx1-movx0+1, movy1-movy0+1, movZoom+1 ) ;
				EGB_displayPage(guiEgbPtr,0,3);

			    playType = MOVTYPE ;
				selectFunc1() ;			/* 再生 */

			  }
			}
			mouseDsp( 80 ) ;	/* mouseが透けないように */

			if( ret )
				errorCheck( ret ) ;

		}

	}

	return 0 ;
}


/*
		汎用ルーチン
*/

/*	パレット設定 (パレットが設定されてなければ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()
{
	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_SetHaltFlag( TRUE ) ;
	return NOERR ;
}

/*	終了可能なら終了する処理	*/
int	quitFunc2()
{
	if( MTL_checkAtrObj( baseDialogId, MS_DSPONLYL40 ) == 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_SetHaltFlag( TRUE ) ;
		return NOERR ;
	}
	return ILLEGAL_FUNCTION ;
}

/* 起こされた時のセット */

int wakeSet()
{
	p_waku_del() ;
/*
	WINCTRL *pctrl ;
	WINCLIP *pwclp ;

	MMI_GetControl( &pctrl ) ;
	pwclp = WIN_getClipMemory( &pctrl->bound, NULL ) ;
	MMI_SendMessage( MMI_GetBaseObj(), MM_UPDATE, 1, pwclp ) ;
	WIN_freeClipMemory( pwclp ) ;
	setPalette( guiEgbPtr ) ;

	EGB_writePage(guiEgbPtr,1);
	EGB_color(guiEgbPtr,1,0x8000);
	EGB_clearScreen(guiEgbPtr);
	EGB_writePage(guiEgbPtr,0);
*/
	return NOERR ;
}

/* スリープの前のセット */

int sleepSet()
{
//	p_waku_del() ;
	return NOERR ;
}

/*	あばうと表示	*/
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 ) ;

	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 ) ;

	return NOERR ;
}

