/*
	SAVE & LOAD
*/
#include "ot_header.h"
#include "ot_newton.h"
#include "ot_sub.h"
//#include "ot_sea.h"

#include "endefine.h"
#include "enmain.h"
//#include "enchkcrs.h"
#include "enrecord.h"

#include "dai_anim_data.h"

#include "kn_def.h"
#include "kn_main.h"
#include "kn_dynamic.h"
#include "kn_font.h"
#include "kn_message.h"
#include "kn_mask.h"
#include "kn_gword.h"
#include "kn_cfgsave.h"
#include "kn_cfgsound.h"
#include "kn_config.h"
#include "kn_stage.h"

/*******************************************************
	FUNCTION
*******************************************************/
Gfx 		*makeMainGlistCfgSave( Gfx *gp );
static void	changeGameModeCfgSave( void );
static int	changeGameModeCfgSave_SelMode( void );
static int	changeGameModeCfgSave_Copy( void );
static int	changeGameModeCfgSave_SelData( void );
static int	changeGameModeCfgSave_Machine( void );
static int	changeGameModeCfgSave_Machine1p2p( void );
static int	changeGameModeCfgSave_Record( void );
static int	changeGameModeCfgSave_EraseOk( void );
static int	changeGameModeCfgSave_RecordOk( void );
static int	changeGameModeCfgSave_MachineOk( void );
static int	changeGameModeCfgSave_EraseWait( void );
static int	changeGameModeCfgSave_RecordWait( void );
static int	changeGameModeCfgSave_MachineWait( void );
static int	changeGameModeCfgSave_SelEraseData( void );
static int	changeGameModeCfgSave_SelGhost( void );
static void	changeGameModeCfgSaveError( void );
static Gfx	*makeCfgSaveGlist( Gfx *gp );
static void initPfsError( int pfs_error );
static void initPfsMessage( int pfs_message );
static Gfx	*makePfsErrorGlist( Gfx *gp );
static Gfx	*makeErrorMessageGlist( Gfx *gp, int id );
extern Gfx	*makeGhostMenuGlist( Gfx *gp, int sx, int sy, knGhostInfo *ip );

static void		initMainGlistCfgSave2Next( void );

extern Gfx	*clearZBuffer( Gfx *gp );
/*******************************************************
	VARIABLE
*******************************************************/
/* --- 外部参照 --- */
/* Display List */
extern Gfx 		dlInitMachineModel[];
extern Gfx		dlCfgSaveSetMachineView0[], dlCfgSaveSetMachineView1[]; 
extern Gfx		dlCfgSaveSetMachineView2[], dlCfgSaveSetMachineView3[]; 
extern Gfx 		dlConfigBG[];
extern Gfx 		dlCfgSaveBlack[]; 
#if LOCALE!=CHINA
extern Gfx 		dlCfgSaveBlack_Ghost[];
#endif
extern Gfx 		dlInitCfgSave_DecalRGBA[];
extern Gfx 		dlN64_Normal[], dlPack_Normal[];
extern Gfx 		dlInitArrow[];
extern Gfx 		dlLoadArrowL[], dlDispArrowL[];
extern Gfx 		dlLoadArrowR[], dlDispArrowR[];
extern Gfx 		dlCassetteWaku[];
extern Gfx 		dlCaution3[];
/* Texture */
extern ushort	texSelect1p_CfgSave[];

extern uchar	texJfSinNotNote[];
extern uchar	texJfSinTukurenai[];
#if (SW_KN_LANGUAGE == KN_JP || SW_KN_LANGUAGE == KN_ZH)
extern uchar	texJfNoNote[], texJfNoSpace[];
#if (SW_KN_LANGUAGE!=KN_ZH)
extern uchar	texJfShindo1_10[], texJfShindo2_10[];
#endif
extern uchar	texJfSinNukanai[];
#elif (SW_KN_LANGUAGE == KN_US)
extern uchar	texEfPackNotRead16[], texEfNewRank1_16[];
extern uchar	texEfSetCPack1_16[];
extern uchar	texEfNoNote[], texEfNoSpace[];
#elif (SW_KN_LANGUAGE == KN_EU)
extern uchar	texEfPackNotRead16[], texEfNewRank1_16[];
extern uchar	texEfSetCPack1_16[];
extern uchar	texEfNoNote[], texEfNoSpace[];
extern uchar	texGePackNotRead16[], texGeNewRank1_16[];
extern uchar	texGeSetCPack1_16[];
extern uchar	texGeNoNote[], texGeNoSpace[];
#endif
/* コントローラー */
extern sKnPad	mKnPad[];
/* サウンドデータ */
extern int	cfgSoundMyData[CFGSOUND_MAX_NUM_MEMBER];


/* --- 内部 --- */
/* セーブモード*/
static int cfgSaveMode = CFGSAVE_SAVE_MODE_COPY;
/* セーブメディア */
static int cfgSaveDirection = CFGSAVE_DIR_CAS;
/* セーブデータの種類 */
static int cfgSaveData = CFGSAVE_DATA_MACHINE;
/* セーブマシンの番号 */
static int cfgSaveMachineNum = 0;
/* マシンの並び順 */
static const int	machineNumConvTable[MAX_NUM_MACHINE_SEL] = {
	MACHINE_NUM_0, MACHINE_NUM_1, MACHINE_NUM_2, MACHINE_NUM_3
};
static int pfsRWMachineFlag[MAX_NUM_MACHINE_SEL] = {
	PFS_RW_MACHINE0, PFS_RW_MACHINE1, PFS_RW_MACHINE2, PFS_RW_MACHINE3,
};

/* OK or CANCEL */
static int cfgSaveOK = CFGSAVE_CANCEL;
/* Pfs Error */
static int pfsErrorReq = 0;
static int seqPfsError = PFS_ERROR_SEQ_NOP;
static int sxWinPfsError, syWinPfsError;
static int countPfsError, kindPfsError;
/* Pfs Message */
static int pfsMessageReq = 0;
static int pfsActOk = 0;
static int seqPfsMessage = PFS_ERROR_SEQ_NOP;

/* カーソル点滅 */
static int		curPat = 0;
static int		curCount = 0;
static uint		curColor;
/* カーソル点滅 */
static int		cur2Pat = 0;
static int		cur2Count = 0;
static uint		cur2ColorR, cur2ColorG;
/* マシン回転用カウンタ */
static int		cfgSaveMachineRotCount = MACHINE_CAMERA_INIT_ANGLE;
/* */
static ushort	perspNorm;
/* メッセージ番号 */
#if (SW_KN_LANGUAGE == KN_JP || SW_KN_LANGUAGE == KN_ZH)
static sDispGMesg	mDispGMesgCfgSaveMode[] = {
	{   0, GMESG_COPY12 },
	{   8, GMESG_ERASE12 },
	{   0, GMESG_END12 }
};
#elif (SW_KN_LANGUAGE == KN_US)
static sDispGMesg	mDispGMesgCfgSaveMode[] = {
	{   0, GMESG_COPY12 },
	{   -3, GMESG_ERASE12 },
	{   4, GMESG_END12 }
};
static int	dxCfgSaveMode[] = {
	1, -3, 5
};
#elif (SW_KN_LANGUAGE == KN_EU)
static sDispGMesg	mDispGMesgCfgSaveMode[] = {
	{   0, GMESG_COPY12 },
	{   -3, GMESG_ERASE12 },
	{   4, GMESG_END12 }
};
static int	dxCfgSaveMode[] = {
	1, -3, 5
};
static sDispGMesg	mDispGMesgCfgSaveMode_Ge[] = {
	{   -8, GMESG_COPY12 },
	{   -7, GMESG_ERASE12 },
	{   4, GMESG_END12 }
};
static int	dxCfgSaveMode_Ge[] = {
	-7, -7, 5
};
#endif

/* エラーメッセージ */
static int dispErrorCount = 0;

/* １Ｐ,２Ｐどちらにロードするか？ */
static int	playerNumLoadMachine = 0;

/* 窓表示 */
static int		dispWin = 0;
static int		countWin = 0;
static int		seqWin = 0;
static int		sxWin, syWin, wdWin, htWin;
static int		dispWinMenu = 0;

static int		flagMotorWarning = 0;

static int		cfgSaveEraseData = CFGSAVE_ERASEDATA_RECORD;
static int		cfgSaveGhostMenu = CFGSAVE_GHOSTMENU_1;


static knGhostInfo	ghostInfo[MAX_NUM_GHOSTSAVE];

static int fGhostMenuCursor[CFGSAVE_GHOSTMENU_MAX_NUM] = {
	0, 0, 1
};

static int		fGhostError = 0;

/*******************************************************
	DEFINE
*******************************************************/
/* カーソル点滅時間 */
#define CFGSAVE_MCUR_FLASH_COUNT		4

#if (SW_KN_LANGUAGE == KN_JP || SW_KN_LANGUAGE == KN_ZH)

#define DX_SAVELOAD18	87
#define DX_CASSETTE8	59
#define DX_CPACK8		175
#define DY_CASSETTE8	76
#define SX_2WAKU1		58
#define SX_2WAKU2		156
#define WD_2WAKU		90
#define SX_MACHINE12	83
#define SX_TIMESCORE12	161
#define SX_FOR1P12		83
#define SX_FOR2P12		180
#define SX_OK12			93
#define SX_CANCEL12		189

#define SX_RECORD12		90
#define SX_GHOST12		177

#elif (SW_KN_LANGUAGE == KN_US)

#define DX_SAVELOAD18	58
#define DX_CASSETTE8	59
#define DX_CPACK8		153
#define DY_CASSETTE8	75
#define SX_2WAKU1		48
#define SX_2WAKU2		156
#define WD_2WAKU		100
#define SX_MACHINE12	60
#define SX_TIMESCORE12	162
#define SX_FOR1P12		76
#define SX_FOR2P12		184
#define SX_OK12			68
#define SX_CANCEL12		179

#elif (SW_KN_LANGUAGE == KN_EU)

#define DX_SAVELOAD18	58
#define DX_CASSETTE8	59
#define DX_CPACK8		153
#define DY_CASSETTE8	75
#define SX_2WAKU1		48
#define SX_2WAKU2		156
#define WD_2WAKU		100
#define SX_MACHINE12	60
#define SX_TIMESCORE12	162
#define SX_FOR1P12		76
#define SX_FOR2P12		184
#define SX_OK12			68
#define SX_CANCEL12		179

#define DX_SAVELOAD18_GE	44
#define DX_CPACK8_GE		165
#define SX_MACHINE12_GE		64
#define SX_TIMESCORE12_GE	158
#define SX_FOR1P12_GE		80
#define SX_FOR2P12_GE		188
#define SX_OK12_GE			64
#define SX_CANCEL12_GE		171

#endif

/* パック抜きエラー */
#define KN_PFS_ERROR_NOPLUG	100
/* ====================================================================== */
/*
	SAVE&LOAD ムーブ
*/
void moveMainCfgSave( void )
{
	register int	i;
	register float		eye_x, eye_z;
	Mtxf		mtxf_scale, mtxf_trans, mtxf_model;
	Mtx		mtx_scale, mtx_trans;

	/* マシンカーソルの色決定 */
	if( curPat == 0 ) curColor = (uint)( 255.0f * (float)curCount / (float)CFGSAVE_MCUR_FLASH_COUNT );
	else curColor = (uint)( 255.0f * ((float)CFGSAVE_MCUR_FLASH_COUNT - (float)curCount)
								/ (float)CFGSAVE_MCUR_FLASH_COUNT );
	curCount ++;
	if( curCount >= CFGSAVE_MCUR_FLASH_COUNT ) {
		curCount  = 0;
		curPat ^= 1;
	}
	/* カセット用枠 */
	switch( cur2Pat ) {
		case 0:
			cur2ColorR = (uint)( 255.0f * (float)cur2Count/ 2.0f );
			cur2ColorG = 0;
			break;
		case 1:
			cur2ColorR = 255;
			cur2ColorG = (uint)( 255.0f * (float)cur2Count / 2.0f );
			break;
		case 2:
			cur2ColorR = 255;
			cur2ColorG = (uint)(255.0f * (float)(2-cur2Count) / 2.0f );
			break;
		case 3:
			cur2ColorR = (uint)(255.0f * (float)(2-cur2Count) / 2.0f );
			cur2ColorG = 0;
			break;
	}
	cur2Count ++;
	if( cur2Count >= 2 ) {
		cur2Count  = 0;
		cur2Pat ++;
		if( cur2Pat == 4 ) cur2Pat = 0;
	}

	/* マシンの行列 計算 */
	if( gameModeSeq == GM_SEQ_CFGSAVE_MACHINE || gameModeSeq == GM_SEQ_CFGSAVE_MACHINE_OK
		|| gameModeSeq == GM_SEQ_CFGSAVE_MACHINE_WAIT || gameModeSeq == GM_SEQ_CFGSAVE_MACHINE_1P2P ) {
		make_SCRmatrix( &(pKnDynamic->mtxMachineProj), &perspNorm,
						33.0f, 1.0f, 16.0f, 1024.0f, 0.0f, 0.0f ) ;
		make_ROTSmatrix( &(mtx_scale),
					0.0f, 0.0f, 1.0f,
					0.0f, 1.0f, 0.0f,
					0.0f, 0.0f, 0.0f, 0.07f ) ;
		for( i = 0 ; i < MAX_NUM_MACHINE_SEL ; i ++ ) {
			if( i == cfgSaveMachineNum ) {
				eye_x = 500.0f * COSF( (cfgSaveMachineRotCount % SIN_RANGE) );
				eye_z = 500.0f * SINF( (cfgSaveMachineRotCount % SIN_RANGE) );
			}
			else {
				eye_x = 500.0f * COSF( MACHINE_CAMERA_INIT_ANGLE );
				eye_z = 500.0f * SINF( MACHINE_CAMERA_INIT_ANGLE );
			}
			make_LOOKmatrix( &mtx_trans, &mtxf_trans,
							eye_x, 500.0f, eye_z,						 
							0.0f, 0.0f, 0.0f,
					 		0.0f, 1.0f, 0.0f );
			mtx2mtxf( &(mtx_scale), &(mtxf_scale) );
			mult_mtxf( &(mtxf_trans), &(mtxf_scale), &mtxf_model );
			mtxf2mtx( &(mtxf_model), &(pKnDynamic->mtxMachineModel[i]) );
		}
		cfgSaveMachineRotCount += 24;
		if( cfgSaveMachineRotCount >= SIN_RANGE ) cfgSaveMachineRotCount -= SIN_RANGE;
	}
}

/* ====================================================================== */
/*
	SAVE&LOAD メイン
*/
Gfx *makeMainGlistCfgSave( Gfx *gp )
{
	if( gameModeChangeFlag ) {
		gameModeChangeFlag = 0;
		if( game_mode == GM_CFGSAVE ) {
			gp = clearAllFBuffer( gp );
			return( gp );
		}
	}

	/* ディスプレイリストの作成 */
	player_index = 0;
	gp = makeCfgSaveGlist( gp );
	/* メモリーパック警告表示 */
	if( pfsErrorReq ) {
		initPfsError( pfsErrorReq );
		pfsErrorReq = 0;
	}
	gp = makePfsErrorGlist( gp );

	/* ゲームモードの変更 */
	if( game_mode == GM_CFGSAVE ) {
		if( seqPfsError == PFS_ERROR_SEQ_NOP ) changeGameModeCfgSave();
		else changeGameModeCfgSaveError();
	}
	else {
		if ( mMask.flag == MASK_FLAG_END ) {
			initMainGlistConfig();
		}		
	}
	
	return( gp );
}

/* ====================================================================== */
/*
	ゲームモードの変更
*/
/* 通常状態 */
static void changeGameModeCfgSave( void )
{
	register int	i, se_flag;

	switch( gameModeSeq ) {
		case GM_SEQ_CFGSAVE_SEL_MODE:
			se_flag = changeGameModeCfgSave_SelMode();
			break;
		case GM_SEQ_CFGSAVE_COPY:
		case GM_SEQ_CFGSAVE_ERASE:
			se_flag = changeGameModeCfgSave_Copy();
			break;
		case GM_SEQ_CFGSAVE_SEL_DATA:
			se_flag = changeGameModeCfgSave_SelData();
			break;
		case GM_SEQ_CFGSAVE_MACHINE:
			se_flag = changeGameModeCfgSave_Machine();
			break;
		case GM_SEQ_CFGSAVE_MACHINE_1P2P:
			se_flag = changeGameModeCfgSave_Machine1p2p();
			break;
		case GM_SEQ_CFGSAVE_ERASE_OK:
			se_flag = changeGameModeCfgSave_EraseOk();
			break;
		case GM_SEQ_CFGSAVE_RECORD_OK:
			se_flag = changeGameModeCfgSave_RecordOk();
			break;
		case GM_SEQ_CFGSAVE_MACHINE_OK:
			se_flag = changeGameModeCfgSave_MachineOk();
			break;
		case GM_SEQ_CFGSAVE_MACHINE_WAIT:
			se_flag = changeGameModeCfgSave_MachineWait();
			break;
		case GM_SEQ_CFGSAVE_RECORD_WAIT:
			se_flag = changeGameModeCfgSave_RecordWait();
			break;
		case GM_SEQ_CFGSAVE_ERASE_WAIT:
			se_flag = changeGameModeCfgSave_EraseWait();
			break;
		case GM_SEQ_CFGSAVE_SEL_ERASEDATA:
			se_flag = changeGameModeCfgSave_SelEraseData();
			break;
		case GM_SEQ_CFGSAVE_SEL_GHOST:
			se_flag = changeGameModeCfgSave_SelGhost();
			break;
	}

	#if SOUND_SW
	if( se_flag == 1 ) Na_SystemSound( NA_SYS_DECIDE, 0 );
	else if( se_flag == 2 ) Na_SystemSound( NA_SYS_CANCEL, 0 );
	else if( se_flag == 3 ) Na_SystemSound( NA_SYS_CURMOVE, 0 );
	else if( se_flag == 4 ) Na_SystemSound( NA_SYS_CURMOVE, 0 );
	else if( se_flag == 5 ) Na_SystemSound( NA_SYS_DECIDE2, 0 );
	#endif
}

/* ====================================================================== */
/* モードセレクト */
static int	changeGameModeCfgSave_SelMode( void )
{
	register int	se_flag;

	se_flag = 0;
	if( !flagMotorWarning ) {

		/* 決定ボタン */
		if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_ANY ) {
			if( cfgSaveMode == CFGSAVE_SAVE_MODE_COPY ) {
				gameModeSeq = GM_SEQ_CFGSAVE_COPY;
				cfgSaveDirection = CFGSAVE_DIR_CAS;
			}
			else if( cfgSaveMode == CFGSAVE_SAVE_MODE_ERASE ) {
				gameModeSeq = GM_SEQ_CFGSAVE_ERASE;
				cfgSaveDirection = CFGSAVE_DIR_CAS;
			}
			else {
#if LOCALE==CHINA
			   initMainGlistCfgSave2Next();
#else
				if( PfsCheck() == PFS_ERROR_MOTOR ) initMainGlistCfgSave2Next();
				else {
					flagMotorWarning = 1;
					initPfsMessage( PFS_MESSAGE_KIND_MOTOR );
				}
#endif
			}
			se_flag = 1;
		}
		/* キャンセルボタン */
		else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_CANCEL ) {
			se_flag = 2;
			cfgSaveMode = CFGSAVE_SAVE_MODE_END;
#if LOCALE==CHINA
			   initMainGlistCfgSave2Next();
#else

			if( PfsCheck() == PFS_ERROR_MOTOR ) initMainGlistCfgSave2Next();
			else {
				flagMotorWarning = 1;
				initPfsMessage( PFS_MESSAGE_KIND_MOTOR );
			}
#endif
		}
		/* 左ボタン */
		else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_LEFT ) {
			se_flag = 3;
			cfgSaveMode --;
			if( cfgSaveMode < 0 ) cfgSaveMode = CFGSAVE_SAVE_MODE_MAX_NUM - 1;
		}
		/* 右ボタン */
		else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_RIGHT ) {
			se_flag = 4;
			cfgSaveMode ++;
			if( cfgSaveMode >= CFGSAVE_SAVE_MODE_MAX_NUM ) cfgSaveMode = 0;
		}

	}
	else {		/* 振動パック用メッセージ表示中 */
		/* 決定ボタン */
		if( mKnPad[KN_PAD_1P].pad.trig & ( BUTTON_ARG_ANY | B_BUTTON ) ) {
			if( PfsCheck() == PFS_ERROR_MOTOR ) se_flag = 1;
			initMainGlistCfgSave2Next();
		}
	}

	return( se_flag );
}

/* コピー＆消去 */
static int	changeGameModeCfgSave_Copy( void )
{
	register int	se_flag;

	se_flag = 0;
	/* 決定ボタン */
	if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_ANY ) {
		se_flag = 1;
		if( gameModeSeq == GM_SEQ_CFGSAVE_COPY ) {		/* コピーモード */
			/* パックのチェック */
			if( cfgSaveDirection == CFGSAVE_DIR_CAS ) {
				pfsErrorReq = PfsFindData();
				fGhostError = 0;
			}
			else {
				pfsErrorReq = PfsFindData();
				fGhostError = 0;
				if( pfsErrorReq == PFS_ERROR_NODATA ) {
					pfsErrorReq = PfsChkFree();
					fGhostError = 0;
				}
			}
			if( pfsErrorReq	== 0 ) {
				gameModeSeq = GM_SEQ_CFGSAVE_SEL_DATA;
				cfgSaveData = CFGSAVE_DATA_MACHINE;
			}
		}
		else {											/* 消去モード */
			#if 0
			if( cfgSaveDirection == CFGSAVE_DIR_PACK ) {
				pfsErrorReq = PfsFindData();
				fGhostError = 0;
			}
			if( pfsErrorReq	== 0 ) {
				if( cfgSaveDirection == CFGSAVE_DIR_PACK ) {
					gameModeSeq = GM_SEQ_CFGSAVE_SEL_ERASEDATA;
					cfgSaveEraseData = CFGSAVE_ERASEDATA_RECORD;
				}
				else {
					gameModeSeq = GM_SEQ_CFGSAVE_ERASE_OK;
					cfgSaveOK = CFGSAVE_CANCEL;
					#if SOUND_SW
					Na_Sys2Sound( NA_SYS2_CONFIRM );
					#endif	/* SOUND_SW */
				}
			}
			#else
			if( cfgSaveDirection == CFGSAVE_DIR_PACK ) {
				gameModeSeq = GM_SEQ_CFGSAVE_SEL_ERASEDATA;
				cfgSaveEraseData = CFGSAVE_ERASEDATA_RECORD;
			}
			else {
				gameModeSeq = GM_SEQ_CFGSAVE_ERASE_OK;
				cfgSaveOK = CFGSAVE_CANCEL;
				#if SOUND_SW
				Na_Sys2Sound( NA_SYS2_CONFIRM );
				#endif	/* SOUND_SW */
			}
			#endif
		}
	}
	/* キャンセルボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_CANCEL ) {
		se_flag = 2;
		gameModeSeq = GM_SEQ_CFGSAVE_SEL_MODE;
		cfgSaveDirection = CFGSAVE_DIR_CAS;
	}
	/* 左ボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_LEFT ) {
		se_flag = 3;
		cfgSaveDirection --;
		if( cfgSaveDirection < 0 ) cfgSaveDirection = CFGSAVE_DIR_MAX_NUM - 1;
	}
	/* 右ボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_RIGHT ) {
		se_flag = 4;
		cfgSaveDirection ++;
		if( cfgSaveDirection >= CFGSAVE_DIR_MAX_NUM ) cfgSaveDirection = 0;
	}

	return( se_flag );
}

/* データセレクト */
static int	changeGameModeCfgSave_SelData( void )
{
	register int	se_flag;

	se_flag = 0;
	/* 決定ボタン */
	if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_ANY ) {
		se_flag = 1;
		if( cfgSaveData == CFGSAVE_DATA_MACHINE ) {
			gameModeSeq = GM_SEQ_CFGSAVE_MACHINE;
			cfgSaveMachineNum = 0;
			cfgSaveMachineRotCount = MACHINE_CAMERA_INIT_ANGLE;
		}
		else {
			gameModeSeq = GM_SEQ_CFGSAVE_RECORD_OK;
			cfgSaveOK = CFGSAVE_CANCEL;
			if( cfgSaveDirection == CFGSAVE_DIR_CAS ) initPfsMessage( PFS_MESSAGE_KIND_NEW_RANK );
			#if SOUND_SW
			Na_Sys2Sound( NA_SYS2_CONFIRM );
			#endif
		}
	}
	/* キャンセルボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_CANCEL ) {
		se_flag = 2;
		gameModeSeq = GM_SEQ_CFGSAVE_COPY;
	}
	/* 左ボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_LEFT ) {
		se_flag = 3;
		cfgSaveData --;
		if( cfgSaveData < 0 ) cfgSaveData = CFGSAVE_DATA_MAX_NUM - 1;
	}
	/* 右ボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_RIGHT ) {
		se_flag = 4;
		cfgSaveData ++;
		if( cfgSaveData >= CFGSAVE_DATA_MAX_NUM  ) cfgSaveData = 0;
	}

	return( se_flag );
}

/* データセレクト */
static int	changeGameModeCfgSave_Machine( void )
{
	register int	se_flag;

	se_flag = 0;
	/* 決定ボタン */
	if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_ANY ) {
		se_flag = 1;
#if 0	/* 振動パックバージョンより変更 */
		gameModeSeq = GM_SEQ_CFGSAVE_MACHINE_OK;
		cfgSaveOK = CFGSAVE_CANCEL;
		#if SOUND_SW
		Na_Sys2Sound( NA_SYS2_CONFIRM );
		#endif
#elif (SW_KN_LANGUAGE == KN_US || SW_KN_LANGUAGE == KN_JP || SW_KN_LANGUAGE == KN_ZH)
	if( cfgSaveDirection == CFGSAVE_DIR_CAS ) {
		gameModeSeq = GM_SEQ_CFGSAVE_MACHINE_1P2P;
		playerNumLoadMachine = 0;
		dispWin = 0;
		countWin = 0;
		seqWin = 0;
	}
	else {
		gameModeSeq = GM_SEQ_CFGSAVE_MACHINE_OK;
		cfgSaveOK = CFGSAVE_CANCEL;
		#if SOUND_SW
		Na_Sys2Sound( NA_SYS2_CONFIRM );
		#endif
	}
#elif (SW_KN_LANGUAGE == KN_EU)
	if( cfgSaveDirection == CFGSAVE_DIR_CAS ) {
		gameModeSeq = GM_SEQ_CFGSAVE_MACHINE_1P2P;
		playerNumLoadMachine = 0;
		dispWin = 0;
		countWin = 0;
		seqWin = 0;
	}
	else {
		gameModeSeq = GM_SEQ_CFGSAVE_MACHINE_OK;
		cfgSaveOK = CFGSAVE_CANCEL;
		#if SOUND_SW
		Na_Sys2Sound( NA_SYS2_CONFIRM );
		#endif
	}
#endif
	}
	/* キャンセルボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_CANCEL ) {
		se_flag = 2;
		gameModeSeq = GM_SEQ_CFGSAVE_SEL_DATA;
	}
	/* 左ボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_LEFT ) {
		se_flag = 3;
		cfgSaveMachineRotCount = MACHINE_CAMERA_INIT_ANGLE;
		cfgSaveMachineNum --;
		if( cfgSaveMachineNum < 0 ) cfgSaveMachineNum = MAX_NUM_MACHINE_SEL - 1;
	}
	/* 右ボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_RIGHT ) {
		se_flag = 4;
		cfgSaveMachineRotCount = MACHINE_CAMERA_INIT_ANGLE;
		cfgSaveMachineNum ++;
		if( cfgSaveMachineNum >= MAX_NUM_MACHINE_SEL ) cfgSaveMachineNum = 0;
	}

	return( se_flag );
}

/* データセレクト */
static int	changeGameModeCfgSave_Machine1p2p( void )
{
	register int	se_flag;
	register float	rate,rate2;

	se_flag = 0;

	switch( seqWin ) {
		case 0:
			dispWin = 1;
			countWin ++;
			rate = (float)(CFGSAVE_OPEN_WIN_COUNT - countWin) / (float)CFGSAVE_OPEN_WIN_COUNT;
			rate2 = (float)countWin / (float)CFGSAVE_OPEN_WIN_COUNT;
			sxWin = SX_CFGSAVE_WIN + (int)((float)(WD_CFGSAVE_WIN >> 1) * rate);
			syWin = SY_CFGSAVE_WIN + (int)((float)(HT_CFGSAVE_WIN >> 1) * rate);
			wdWin = (int)((float)WD_CFGSAVE_WIN * rate2);
			htWin = (int)((float)HT_CFGSAVE_WIN * rate2);
			
			if( countWin >= CFGSAVE_OPEN_WIN_COUNT ) {
				seqWin = 1;
				dispWinMenu = 1;
			}
			break;
		case 1:
			/* 決定ボタン */
			if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_ANY ) {
				se_flag = 1;
				gameModeSeq = GM_SEQ_CFGSAVE_MACHINE_OK;
				cfgSaveOK = CFGSAVE_CANCEL;
				#if SOUND_SW
				Na_Sys2Sound( NA_SYS2_CONFIRM );
				#endif
			}
			/* キャンセルボタン */
			else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_CANCEL ) {
				se_flag = 2;
				seqWin = 2;
				countWin = 0;
				dispWinMenu = 0;
			}
			/* 左ボタン */
			else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_LEFT ) {
				se_flag = 3;
				playerNumLoadMachine ^= 1;
			}
			/* 右ボタン */
			else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_RIGHT ) {
				se_flag = 4;
				playerNumLoadMachine ^= 1;
			}
			break;
		case 2:
			dispWin = 1;
			countWin ++;
			rate2 = (float)(CFGSAVE_OPEN_WIN_COUNT - countWin) / (float)CFGSAVE_OPEN_WIN_COUNT;
			rate = (float)countWin / (float)CFGSAVE_OPEN_WIN_COUNT;
			sxWin = SX_CFGSAVE_WIN + (int)((float)(WD_CFGSAVE_WIN >> 1) * rate);
			syWin = SY_CFGSAVE_WIN + (int)((float)(HT_CFGSAVE_WIN >> 1) * rate);
			wdWin = (int)((float)WD_CFGSAVE_WIN * rate2);
			htWin = (int)((float)HT_CFGSAVE_WIN * rate2);
			
			if( countWin >= CFGSAVE_OPEN_WIN_COUNT ) {
				seqWin = 0;
				gameModeSeq = GM_SEQ_CFGSAVE_MACHINE;
			}
			break;
	}

	return( se_flag );
}

/*  */
static int	changeGameModeCfgSave_EraseOk( void )
{
	register int	se_flag, plug_flag;
	

	se_flag = 0;
	if( cfgSaveDirection == CFGSAVE_DIR_PACK && cfgSaveEraseData == CFGSAVE_ERASEDATA_GHOST ) {
		plug_flag = PfsIsPlug();
		if( plug_flag == 0 ) {
			pfsErrorReq = KN_PFS_ERROR_NOPLUG;
			gameModeSeq = GM_SEQ_CFGSAVE_SEL_MODE;
			return( 0 );
		}
	}
	/* 決定ボタン */
	if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_ANY ) {
		se_flag = 1;
		if( cfgSaveOK == CFGSAVE_OK ) {
			se_flag = 5;
			gameModeSeq = GM_SEQ_CFGSAVE_ERASE_WAIT;
			initPfsMessage( PFS_MESSAGE_KIND_ERASE );
		}
		else {
			if( cfgSaveDirection == CFGSAVE_DIR_CAS ) gameModeSeq = GM_SEQ_CFGSAVE_ERASE;
			else {
				if( cfgSaveEraseData == CFGSAVE_ERASEDATA_RECORD ) gameModeSeq = GM_SEQ_CFGSAVE_SEL_ERASEDATA;
				else gameModeSeq = GM_SEQ_CFGSAVE_SEL_GHOST;
			}
		}
	}
	/* キャンセルボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_CANCEL ) {
		se_flag = 2;
		if( cfgSaveDirection == CFGSAVE_DIR_CAS ) gameModeSeq = GM_SEQ_CFGSAVE_ERASE;
		else {
			if( cfgSaveEraseData == CFGSAVE_ERASEDATA_RECORD ) gameModeSeq = GM_SEQ_CFGSAVE_SEL_ERASEDATA;
			else gameModeSeq = GM_SEQ_CFGSAVE_SEL_GHOST;
		}
	}
	/* 左ボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_LEFT ) {
		se_flag = 3;
		cfgSaveOK --;
		if( cfgSaveOK < 0 ) cfgSaveOK = CFGSAVE_OK_MAX_NUM - 1;
	}
	/* 右ボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_RIGHT ) {
		se_flag = 4;
		cfgSaveOK ++;
		if( cfgSaveOK >= CFGSAVE_OK_MAX_NUM ) cfgSaveOK = 0;
	}

	return( se_flag );
}

/* データセレクト */
static int	changeGameModeCfgSave_RecordOk( void )
{
	register int	se_flag;

	se_flag = 0;
	/* 決定ボタン */
	pfsActOk = 0;
	if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_ANY ) {
		se_flag = 1;
		seqPfsMessage = PFS_ERROR_SEQ_NOP;
		if( cfgSaveOK == CFGSAVE_OK ) {
			se_flag = 5;
			gameModeSeq = GM_SEQ_CFGSAVE_RECORD_WAIT;
			initPfsMessage( PFS_MESSAGE_KIND_COPY );
		}
		else gameModeSeq = GM_SEQ_CFGSAVE_COPY;
	}
	/* キャンセルボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_CANCEL ) {
		se_flag = 2;
		gameModeSeq = GM_SEQ_CFGSAVE_SEL_DATA;
		seqPfsMessage = PFS_ERROR_SEQ_NOP;
	}
	/* 左ボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_LEFT ) {
		se_flag = 3;
		cfgSaveOK --;
		if( cfgSaveOK < 0 ) cfgSaveOK = CFGSAVE_OK_MAX_NUM - 1;
	}
	/* 右ボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_RIGHT ) {
		se_flag = 4;
		cfgSaveOK ++;
		if( cfgSaveOK >= CFGSAVE_OK_MAX_NUM ) cfgSaveOK = 0;
	}

	return( se_flag );
}

/* データセレクト */
static int	changeGameModeCfgSave_MachineOk( void )
{
	register int	se_flag;

	se_flag = 0;
	/* 決定ボタン */
	if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_ANY ) {
		se_flag = 1;
		if( cfgSaveOK == CFGSAVE_OK ) {
			se_flag = 5;
			gameModeSeq = GM_SEQ_CFGSAVE_MACHINE_WAIT;
			initPfsMessage( PFS_MESSAGE_KIND_COPY );
		}
		else {
			gameModeSeq = GM_SEQ_CFGSAVE_MACHINE;
			dispWin = 0;
			dispWinMenu = 0;
			seqWin = 0;
		}
	}
	/* キャンセルボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_CANCEL ) {
		se_flag = 2;
		gameModeSeq = GM_SEQ_CFGSAVE_MACHINE;
		dispWin = 0;
		dispWinMenu = 0;
		seqWin = 0;
	}
	/* 左ボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_LEFT ) {
		se_flag = 3;
		cfgSaveOK --;
		if( cfgSaveOK < 0 ) cfgSaveOK = CFGSAVE_OK_MAX_NUM - 1;
	}
	/* 右ボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_RIGHT ) {
		se_flag = 4;
		cfgSaveOK ++;
		if( cfgSaveOK >= CFGSAVE_OK_MAX_NUM ) cfgSaveOK = 0;
	}

	return( se_flag );
}

//#if (SW_KN_LANGUAGE != KN_EU)	/* 振動パックバージョンより変更 */
#if 0
#define PFS_RW_MACHINE_2P_FLAG 0
#endif

static int	changeGameModeCfgSave_MachineWait( void )
{
	register int	se_flag, pfs_read_flag;

	se_flag = 0;
	if( pfsActOk == 0 ) return ( 0 );

	pfsActOk = 0;
	seqPfsMessage = PFS_ERROR_SEQ_NOP;
	if( cfgSaveDirection == CFGSAVE_DIR_CAS ) {
		pfs_read_flag = pfsRWMachineFlag[machineNumConvTable[cfgSaveMachineNum]];
		if( playerNumLoadMachine ) pfs_read_flag += PFS_RW_MACHINE_2P_FLAG;
		pfsErrorReq = PfsReadData( pfs_read_flag );
		fGhostError = 0;
		if( pfsErrorReq == 0 ) {
			gameModeSeq = GM_SEQ_CFGSAVE_SEL_MODE;
			pfsMessageReq = PFS_MESSAGE_KIND_COPY;
			se_flag = 1;
		}
		else gameModeSeq = GM_SEQ_CFGSAVE_MACHINE;
		dispWin = 0;
		dispWinMenu = 0;
		seqWin = 0;
	}
	else {
		pfsErrorReq = PfsWriteData( pfsRWMachineFlag[machineNumConvTable[cfgSaveMachineNum]] );
		fGhostError = 0;
		if( pfsErrorReq == 0 ) {
			gameModeSeq = GM_SEQ_CFGSAVE_SEL_MODE;
			pfsMessageReq = PFS_MESSAGE_KIND_COPY;
			se_flag = 1;
		}
		else gameModeSeq = GM_SEQ_CFGSAVE_MACHINE;
	}

	#if SOUND_SW
	if( se_flag ) Na_Sys2Sound( NA_SYS2_COPY );
	#endif

	return( 0 );
}

static int	changeGameModeCfgSave_RecordWait( void )
{
	register int	se_flag;

	se_flag = 0;
	if( pfsActOk == 0 ) return ( 0 );

	pfsActOk = 0;
	seqPfsMessage = PFS_ERROR_SEQ_NOP;

			
	if( cfgSaveDirection == CFGSAVE_DIR_CAS ) {
		pfsErrorReq = PfsReadData( PFS_RW_RECORD );
		fGhostError = 0;
//		osSyncPrintf( "Read pfsErrorReq = %d\n", pfsErrorReq );
	}
	else {
		pfsErrorReq = PfsWriteData( PFS_RW_RECORD );
		fGhostError = 0;
//		osSyncPrintf( "Write pfsErrorReq = %d\n", pfsErrorReq );
	}
	if( pfsErrorReq == 0 ) {
		gameModeSeq = GM_SEQ_CFGSAVE_COPY;
		se_flag = 1;
	}
	else gameModeSeq = GM_SEQ_CFGSAVE_SEL_DATA;
	

	#if SOUND_SW
	if( se_flag ) Na_Sys2Sound( NA_SYS2_COPY );
	#endif

	return( 0 );
}

static int	changeGameModeCfgSave_EraseWait( void )
{
	register int	se_flag;
	register char	sound_mode;

	se_flag = 0;
	if( pfsActOk == 0 ) return ( 0 );

	pfsActOk = 0;
	seqPfsMessage = PFS_ERROR_SEQ_NOP;
			
	if( cfgSaveDirection == CFGSAVE_DIR_CAS ) {
		/* カセットのクリア */
		EepClear();
		se_flag = 1;
		gameModeSeq = GM_SEQ_CFGSAVE_SEL_MODE;

		/* サウンドバックアップデータ */
		sound_mode = (gameClearFlag & 0xc0);
		if( sound_mode & GAME_CLEAR_FLAG_MONO ) {
			cfgSoundMyData[CFGSOUND_MEMBER_SELECT_SOUND] = CFGSOUND_MONO;
			#if SOUND_SW
			Nas_SetAudioMode_Silent(3);
			#endif
		}
		else if( sound_mode & GAME_CLEAR_FLAG_HEAD ) {
			cfgSoundMyData[CFGSOUND_MEMBER_SELECT_SOUND] = CFGSOUND_HEAD;
			#if SOUND_SW
			Nas_SetAudioMode_Silent(1);
			#endif
		}
		else {
			cfgSoundMyData[CFGSOUND_MEMBER_SELECT_SOUND] = CFGSOUND_STEREO;
			#if SOUND_SW
			Nas_SetAudioMode_Silent(0);
			#endif
		}
		if( gameClearFlag & GAME_CLEAR_FLAG_BGM_OFF ) {
			cfgSoundMyData[CFGSOUND_MEMBER_BGM_SW] = CFGSOUND_BGM_OFF;
			#if SOUND_SW
			Nas_RaceBgmOff();
			#endif
		}
		else {
			cfgSoundMyData[CFGSOUND_MEMBER_BGM_SW] = CFGSOUND_BGM_ON;
			#if SOUND_SW
			Nas_RaceBgmOn();
			#endif
		}
	}
	else {
		/* メモリーパックのクリア */
		if( cfgSaveEraseData == CFGSAVE_ERASEDATA_RECORD ) {
			/* 記録 */
			pfsErrorReq = PfsDeleteData();
			fGhostError = 0;
			if( pfsErrorReq == 0 ) se_flag = 1;
			gameModeSeq = GM_SEQ_CFGSAVE_SEL_MODE;
		}
		else {
			/* ゴースト */
			switch( cfgSaveGhostMenu ) {
				case CFGSAVE_GHOSTMENU_1:
					pfsErrorReq = PfsDeleteGhostData( 0 );
					fGhostError = 1;
					break;
				case CFGSAVE_GHOSTMENU_2:
					pfsErrorReq = PfsDeleteGhostData( 1 );
					fGhostError = 1;
					break;
				case CFGSAVE_GHOSTMENU_ALL:
					pfsErrorReq = PfsDeleteGhostData( 2 );
					fGhostError = 1;
					break;
				#ifndef ROM_FLAG
				default:
					osSyncPrintf( "Unknown cfgSaveGhostMenu\n" );
					break;
				#endif
			}
			if( pfsErrorReq == 0 ) se_flag = 1;
			gameModeSeq = GM_SEQ_CFGSAVE_SEL_MODE;
		}
	}
	
	#if SOUND_SW
	if( se_flag ) Na_Sys2Sound( NA_SYS2_ERASE );
	#endif
	return( 0 );
}

/* 何を消すか選ぶ */
static int	changeGameModeCfgSave_SelEraseData( void )
{
	register int			i, se_flag;
	register Ghost_info		*ptr;
	register knGhostInfo	*ip;

	se_flag = 0;

	/* 決定ボタン */
	if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_ANY ) {
		se_flag = 1;
		if( cfgSaveEraseData == CFGSAVE_ERASEDATA_RECORD ) {
			/* 記録を消す */
			pfsErrorReq = PfsFindData();
			fGhostError = 0;
			if( pfsErrorReq	== 0 ) {
				gameModeSeq = GM_SEQ_CFGSAVE_ERASE_OK;
				cfgSaveOK = CFGSAVE_CANCEL;
				#if SOUND_SW
				Na_Sys2Sound( NA_SYS2_CONFIRM );
				#endif	/* SOUND_SW */
			}
		}
		else {
			/* ゴーストを消す */
			pfsErrorReq = PfsReadGhostInfo();
			fGhostError = 1;
			if( pfsErrorReq	== 0 ) {
				for( i = 0, ptr = &(ghost_info_rec.i.info[0]), ip = &ghostInfo[0]
						 ; i < MAX_NUM_GHOSTSAVE ; i ++, ptr ++, ip ++ ) {
					ip->fExist = ptr->fdata_exist;
					ip->nCourse= ptr->ncourse;
					ip->level = ptr->level;
					if( ip->fExist ) fGhostMenuCursor[i] = 1;
					else fGhostMenuCursor[i] = 0;
					#ifndef ROM_FLAG
					osSyncPrintf( "Ghost Info No. %d-------------------------\n", i );
					osSyncPrintf( "sum_data = %XH\n", ptr->sum_data );
					osSyncPrintf( "fdata_exist = %d\n", ptr->fdata_exist );
					osSyncPrintf( "ncourse = %d\n", ptr->ncourse );
					osSyncPrintf( "level = %d\n", ptr->level );
					osSyncPrintf( "ctime = %d\n", ptr->ctime );
					#endif
				}
				gameModeSeq = GM_SEQ_CFGSAVE_SEL_GHOST;
				cfgSaveGhostMenu = CFGSAVE_GHOSTMENU_1;
				while( !fGhostMenuCursor[cfgSaveGhostMenu] ) cfgSaveGhostMenu ++;
			}
		}
	}
	/* キャンセルボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_CANCEL ) {
		se_flag = 2;
		gameModeSeq = GM_SEQ_CFGSAVE_ERASE;
	}
	/* 左ボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_LEFT ) {
		se_flag = 3;
		cfgSaveEraseData --;
		if( cfgSaveEraseData < 0 ) cfgSaveEraseData = CFGSAVE_ERASEDATA_MAX_NUM - 1;
	}
	/* 右ボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_RIGHT ) {
		se_flag = 4;
		cfgSaveEraseData ++;
		if( cfgSaveEraseData >= CFGSAVE_ERASEDATA_MAX_NUM  ) cfgSaveEraseData = 0;
	}
	
	return( se_flag );
}

/* 消すゴーストの選択 */
static int	changeGameModeCfgSave_SelGhost( void )
{
	register int			se_flag, next, plug_flag;
	register knGhostInfo	*ip;

	se_flag = 0;

	plug_flag = PfsIsPlug();
	if( plug_flag == 0 ) {
		pfsErrorReq = KN_PFS_ERROR_NOPLUG;
		gameModeSeq = GM_SEQ_CFGSAVE_SEL_MODE;
		return( 0 );
	}
	
	/* 決定ボタン */
	if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_ANY ) {
		se_flag = 1;
		/* ゴーストを消す */
		next = 0;
		switch( cfgSaveGhostMenu ) {
			case CFGSAVE_GHOSTMENU_1:
			case CFGSAVE_GHOSTMENU_2:
				if( cfgSaveGhostMenu == CFGSAVE_GHOSTMENU_1 ) ip = &ghostInfo[0];
				else ip = &ghostInfo[1];
				if( ip->fExist ) next = 1;
				break;
			case CFGSAVE_GHOSTMENU_ALL:
				next = 1;
				break;
		}
		if( next ) {
			gameModeSeq = GM_SEQ_CFGSAVE_ERASE_OK;
			cfgSaveOK = CFGSAVE_CANCEL;
			#if SOUND_SW
			Na_Sys2Sound( NA_SYS2_CONFIRM );
			#endif	/* SOUND_SW */
		}
	}
	/* キャンセルボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_CANCEL ) {
		se_flag = 2;
		gameModeSeq = GM_SEQ_CFGSAVE_SEL_ERASEDATA;
	}
	/* UPボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_UP ) {
		se_flag = 3;
		cfgSaveGhostMenu --;
		if( cfgSaveGhostMenu < 0 ) cfgSaveGhostMenu = CFGSAVE_GHOSTMENU_MAX_NUM - 1;
		while( !fGhostMenuCursor[cfgSaveGhostMenu] ) {
			cfgSaveGhostMenu --;
			if( cfgSaveGhostMenu < 0 ) cfgSaveGhostMenu = CFGSAVE_GHOSTMENU_MAX_NUM - 1;
		}
	}
	/* DOWNボタン */
	else if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_DOWN ) {
		se_flag = 4;
		cfgSaveGhostMenu ++;
		if( cfgSaveGhostMenu >= CFGSAVE_GHOSTMENU_MAX_NUM ) cfgSaveGhostMenu = 0;
		while( !fGhostMenuCursor[cfgSaveGhostMenu] ) {
			cfgSaveGhostMenu ++;
			if( cfgSaveGhostMenu >= CFGSAVE_GHOSTMENU_MAX_NUM ) cfgSaveGhostMenu = 0;
		}
	}
	
	return( se_flag );
}
/* ====================================================================== */
/* エラー表示中 */
static void changeGameModeCfgSaveError( void )
{
	switch( seqPfsError ) {
		case PFS_ERROR_SEQ_APPR:
			if( countPfsError >= PFS_ERROR_WIN_APPR_COUNT ) {
				seqPfsError = PFS_ERROR_SEQ_WAIT;
				countPfsError = 0;
			}
			break;
		case PFS_ERROR_SEQ_WAIT:
			countPfsError ++;
			if( countPfsError >= 10 ) {
				seqPfsError   = PFS_ERROR_SEQ_KEY_WAIT;
				countPfsError = 0;
			}
			break;
		case PFS_ERROR_SEQ_KEY_WAIT:
//			if( mKnPad[KN_PAD_1P].pad.trig & BUTTON_ARG_ANY ) {
#if 1	/* for Debug */
			dispErrorCount ++;
#endif
			if( dispErrorCount > 90 ) {
				seqPfsError   = PFS_ERROR_SEQ_NOP;
				countPfsError = 0;
				dispErrorCount = 0;
			}
			break;
		}
}


/* ====================================================================== */
/*
	SAVE & LOAD
*/
static Gfx	*makeCfgSaveGlist( Gfx *gp )
{
	register int 	i, dx_save_load, ok_win_sy, gmesg_num, dx, ht, sx, sx2, dx2;
	register uint 	waku_sx, font_flag_1p, font_flag_2p;
	register uint 	font_flag, font_flag2;
			 char 	disp_sel_data, disp_machine_win, disp_ok_win, disp_arrow;
			 char	disp_erase_data, disp_ghost_data;
	register char 	flash_ok;
	register sDispGMesg		*disp_p;
	register knGhostInfo	*ip;

	/* 表示の判定 */
	disp_sel_data = 0;		/* MACHINE or RECORD */
	disp_machine_win = 0;		/* MACHINE WINDOW */
	disp_ok_win = 1;		/* OK WINDOW */
	disp_arrow = 0;		/* ARROW MARK */
	disp_erase_data = 0;		/* Select Erase Data */
	disp_ghost_data = 0;
	
	if( gameModeSeq != GM_SEQ_CFGSAVE_SEL_MODE ) disp_arrow = 1;
	flash_ok = 0;
	switch( gameModeSeq ) {
		case GM_SEQ_CFGSAVE_SEL_MODE:
			break;
		case GM_SEQ_CFGSAVE_ERASE:
			break;
		case GM_SEQ_CFGSAVE_SEL_DATA:
			disp_sel_data = 1;
			break;
		case GM_SEQ_CFGSAVE_MACHINE:
		case GM_SEQ_CFGSAVE_MACHINE_1P2P:
			disp_sel_data = 1;
			disp_machine_win = 1;
			break;
		case GM_SEQ_CFGSAVE_RECORD_OK:
		case GM_SEQ_CFGSAVE_RECORD_WAIT:
			disp_sel_data = 1;
			flash_ok = 1;
			break;
		case GM_SEQ_CFGSAVE_MACHINE_OK:
		case GM_SEQ_CFGSAVE_MACHINE_WAIT:
			disp_sel_data = 1;
			disp_machine_win = 1;
			flash_ok = 1;
			break;
		case GM_SEQ_CFGSAVE_ERASE_OK:
		case GM_SEQ_CFGSAVE_ERASE_WAIT:
			flash_ok = 1;
			if( cfgSaveDirection == CFGSAVE_DIR_PACK ) {
				disp_erase_data = 1;
				if( cfgSaveEraseData == CFGSAVE_ERASEDATA_GHOST ) disp_ghost_data = 1;
			}
			break;
		case GM_SEQ_CFGSAVE_SEL_ERASEDATA:
			disp_erase_data = 1;
			break;
		case GM_SEQ_CFGSAVE_SEL_GHOST:
			disp_erase_data = 1;
			disp_ghost_data = 1;
			break;
	}

	/* --- ＢＧ --- */
	gSPMatrix( gp++, &(rspKnDynamic.mtxFontProj),
			   G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH );
	gSPMatrix( gp++, &automatic.e_MT,
			   G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH );
	gSPDisplayList( gp++, dlConfigBG );

	/* --- 黒四角 --- */
	/* ゴースト選択用 */
	if( disp_ghost_data ) {
#if LOCALE!=CHINA
		gSPDisplayList( gp++, dlCfgSaveBlack_Ghost );
#endif
	}

	/* --- 枠 --- */
	gSPDisplayList( gp++, dlInitWaku );
	for( i = 0 ; i < CFGSAVE_SAVE_MODE_MAX_NUM ; i ++ ) {
		gp = makeWakuGlist( gp, WAKU_KIND_256x32, DISPLAY_X1 + 20 + 89 * i, DISPLAY_Y1 + 28, 86, 16 );
	}
	gp = makeWakuGlist( gp, WAKU_KIND_256x32, DISPLAY_X1 +  20, DISPLAY_Y1 + 48, 264, 40 );
	if( disp_sel_data || disp_erase_data ) {
		gp = makeWakuGlist( gp, WAKU_KIND_256x32,
				    DISPLAY_X1 + SX_2WAKU1, DISPLAY_Y1 + 92, WD_2WAKU, 16 );
		gp = makeWakuGlist( gp, WAKU_KIND_256x32,
				    DISPLAY_X1 + SX_2WAKU2, DISPLAY_Y1 + 92, WD_2WAKU, 16 );
	}
	if( disp_machine_win ) {	/* マシン選択用 */
		gp = makeWakuGlist( gp, WAKU_KIND_256x32, DISPLAY_X1 + 20, DISPLAY_Y1 + 112, 264, 50 );
	}
	if( disp_ghost_data ) {		/* ゴースト選択用 */
		for( i = 0 ; i < 3 ; i ++ ) {
			gp = makeWakuGlist( gp, WAKU_KIND_256x32, DISPLAY_X1 + 35, DISPLAY_Y1 + 112 + 17 * i, 234, 16 );
		}
	}
	if( disp_ok_win ) {
		if( disp_ok_win == 1 ) ok_win_sy = DISPLAY_Y1 + 166;
		else if( disp_ok_win == 2 ) ok_win_sy = DISPLAY_Y1 + 92;
		else ok_win_sy = DISPLAY_Y1 + 101;
		gp = makeWakuGlist( gp, WAKU_KIND_256x32, DISPLAY_X1 + SX_2WAKU1, ok_win_sy, WD_2WAKU, 16 );
		gp = makeWakuGlist( gp, WAKU_KIND_256x32, DISPLAY_X1 + SX_2WAKU2, ok_win_sy, WD_2WAKU, 16 );
	}

	/* --- 黒四角 --- */
	if( disp_machine_win ) {
		gSPDisplayList( gp++, dlCfgSaveBlack );
	}

	/* ジェット表示 */
	if( disp_machine_win ) {
		gp = clearZBuffer( gp );
		gDPPipeSync( gp++ );
		gDPSetColorImage( gp++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WD, OS_K0_TO_PHYSICAL( fbuffer_t[triple_index] ) );
	    gSPPerspNormalize( gp++, perspNorm );
	    gSPMatrix( gp++, &rspKnDynamic.mtxMachineProj,
	    		G_MTX_PROJECTION | G_MTX_LOAD | G_MTX_NOPUSH );
		gSPDisplayList( gp++, dlInitMachineModel );

		gSPDisplayList( gp++, dlCfgSaveSetMachineView0 );
	    gSPMatrix( gp++, &rspKnDynamic.mtxMachineModel[0],
				G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH );
		gp = makeKnJetGlist( gp, MACHINE_NUM_0,BASEPOSE_AN,0, &pKnDynamic->mtxMachine[0][0] );

		gSPDisplayList( gp++, dlCfgSaveSetMachineView1 );
	    gSPMatrix( gp++, &rspKnDynamic.mtxMachineModel[1],
				G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH );
		gp = makeKnJetGlist( gp, MACHINE_NUM_1,BASEPOSE_AN,0, &pKnDynamic->mtxMachine[1][0] );

		gSPDisplayList( gp++, dlCfgSaveSetMachineView2 );
	    gSPMatrix( gp++, &rspKnDynamic.mtxMachineModel[2],
				G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH );
		gp = makeKnJetGlist( gp, MACHINE_NUM_2,BASEPOSE_AN,0, &pKnDynamic->mtxMachine[2][0] );

		gSPDisplayList( gp++, dlCfgSaveSetMachineView3 );
	    gSPMatrix( gp++, &rspKnDynamic.mtxMachineModel[3],
			G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH );
		gp = makeKnJetGlist( gp, MACHINE_NUM_3,BASEPOSE_AN,0, &pKnDynamic->mtxMachine[3][0] );
	}
	
	/* --- テクスチャ --- */
	gSPDisplayList( gp++, dlInitCfgSave_DecalRGBA );
	gSPDisplayList( gp++, dlN64_Normal );
	gSPDisplayList( gp++, dlPack_Normal );
	/* --- 矢印表示 --- */
	if( disp_arrow ) {
		gSPDisplayList( gp++, dlInitArrow );
		if( cfgSaveMode == CFGSAVE_SAVE_MODE_COPY ) {
			if( cfgSaveDirection == CFGSAVE_DIR_CAS ) {
				/* カセットへ */
				gSPDisplayList( gp++, dlLoadArrowL );
			}
			else {
				/* パックへ */
				gSPDisplayList( gp++, dlLoadArrowR );
			}
			gDPSetPrimColor( gp++, 0, 0, curColor, 255, curColor, 255 );
			gSPDisplayList( gp++, dlDispArrowL );
			gSPDisplayList( gp++, dlDispArrowR );
		}
		else {
			/* カセットへ */
			if( gameModeSeq != GM_SEQ_CFGSAVE_SEL_MODE ) {
				if( cfgSaveDirection == CFGSAVE_DIR_CAS ) {
					gDPSetPrimColor( gp++, 0, 0, curColor, 255, curColor, 255 );
				}
				else {
					gDPSetPrimColor( gp++, 0, 0,
									 FONT_COLOR_TURN_OFF,
									 FONT_COLOR_TURN_OFF,
									 FONT_COLOR_TURN_OFF,
									 255 );
				}
			}
			gSPDisplayList( gp++, dlLoadArrowL );
			gSPDisplayList( gp++, dlDispArrowL );
			/* パックへ */
			if( gameModeSeq != GM_SEQ_CFGSAVE_SEL_MODE ) {
				if( cfgSaveDirection == CFGSAVE_DIR_PACK
					&& gameModeSeq != GM_SEQ_CFGSAVE_SEL_MODE ) {
					gDPSetPrimColor( gp++, 0, 0, curColor, 255, curColor, 255 );
				}
				else {
					gDPSetPrimColor( gp++, 0, 0, 64, 64, 64, 255 );
				}
			}
			gSPDisplayList( gp++, dlLoadArrowR );
			gSPDisplayList( gp++, dlDispArrowR );
		}
	}
	/* --- 枠表示 --- */
	if( gameModeSeq != GM_SEQ_CFGSAVE_SEL_MODE ) {
		gSPDisplayList( gp++, dlCassetteWaku );
		gDPSetPrimColor( gp++, 0, 0, cur2ColorR, cur2ColorG, 0, 255 );
		if( cfgSaveDirection == CFGSAVE_DIR_CAS ) waku_sx = 24;
		else waku_sx = 248;
		gSPTextureRectangle( gp++,
			(DISPLAY_X1 + waku_sx ) << 2, (DISPLAY_Y1 + 52) << 2,
			(DISPLAY_X1 + waku_sx + 32) << 2, (DISPLAY_Y1 + 52 + 32) << 2,
		G_TX_RENDERTILE,
		0, 0,
		1 << 10, 1 << 10 );
	}
	
	if( disp_machine_win ) {
		gDPSetPrimColor( gp++, 0, 0, curColor, 255, curColor, 255 );
		gDPLoadTextureTile( gp++, texSelect1p_CfgSave, G_IM_FMT_IA, G_IM_SIZ_8b,
		63, 40,
		0, 0,
		62, 39,
		0,
		G_TX_CLAMP, G_TX_CLAMP,
		G_TX_NOMASK, G_TX_NOMASK,
		G_TX_NOLOD, G_TX_NOLOD );
		gSPTextureRectangle( gp++,
			(DISPLAY_X1 + 23 + 65 * cfgSaveMachineNum) << 2,
			(DISPLAY_Y1 + 117) << 2,
			(DISPLAY_X1 + 23 + 65 * cfgSaveMachineNum + 63) << 2,
			(DISPLAY_Y1 + 117 + 40) << 2,
			G_TX_RENDERTILE,
			0, 0,
			1 << 10, 1 << 10 );
	}

	/* --- 文字表示 --- */
#if (SW_KN_LANGUAGE == KN_EU)
	if( euLanguage == EL_ENGLISH ) dx_save_load = DX_SAVELOAD18;
	else dx_save_load = DX_SAVELOAD18_GE;
#else
	dx_save_load = DX_SAVELOAD18;
#endif
	gp = makeInitStrGlist( gp, FONT_FLAG_NORMAL, 255, 255, 255, 255, 255, 255,
			       255, 255, 255, 255, 255, 255 );
	gp = makeGameMessageGlist( gp, GMESG_KIND_18, GMESG_SAVELOAD18,
			   DISPLAY_X1 + dx_save_load, DISPLAY_Y1 + 2, 0, 0 );
	gp = makeGameMessageGlist( gp, GMESG_KIND_10, GMESG_A10,
			   DISPLAY_X1 + 79, DISPLAY_Y1 + 186, 0, 0 );
	gp = makeGameMessageGlist( gp, GMESG_KIND_10, GMESG_B10,
			   DISPLAY_X1 + 161, DISPLAY_Y1 + 186, 0, 0 );
	gmesg_num = mDispGMesgCfgSaveMode[cfgSaveMode].gmesgNum;
#if (SW_KN_LANGUAGE == KN_JP || SW_KN_LANGUAGE == KN_ZH)
	if( cfgSaveMode == 1 ) dx = 8;
	else  dx = 0;
	dx2 = DX_CPACK8;
#elif (SW_KN_LANGUAGE == KN_US)
	dx = dxCfgSaveMode[cfgSaveMode];
	dx2 = DX_CPACK8;
#elif (SW_KN_LANGUAGE == KN_EU)
	if( euLanguage == EL_ENGLISH ) {
		dx = dxCfgSaveMode[cfgSaveMode];
		dx2 = DX_CPACK8;
	}
	else {
		dx = dxCfgSaveMode_Ge[cfgSaveMode];
		dx2 = DX_CPACK8_GE;
	}
#endif
	gp = makeGameMessageGlist( gp, GMESG_KIND_12, gmesg_num,
						   DISPLAY_X1 + 131 + dx, DISPLAY_Y1 + 62, 0, 0 );
	gp = makeGameMessageGlist( gp, GMESG_KIND_8, GMESG_CASSETTE8,
							   DISPLAY_X1 + DX_CASSETTE8, DISPLAY_Y1 + DY_CASSETTE8, 0, 0 );
	gp = makeGameMessageGlist( gp, GMESG_KIND_8, GMESG_CPACK8,
							   DISPLAY_X1 + dx2, DISPLAY_Y1 + DY_CASSETTE8, 0, 0 );

#if (SW_KN_LANGUAGE == KN_EU)
	if( euLanguage == EL_ENGLISH ) disp_p = &mDispGMesgCfgSaveMode[0];
	else disp_p = &mDispGMesgCfgSaveMode_Ge[0];
#else
	disp_p = &mDispGMesgCfgSaveMode[0];
#endif
	for( i = 0 ; i < CFGSAVE_SAVE_MODE_MAX_NUM ; i ++, disp_p ++ ) {
		if( i == cfgSaveMode ) font_flag = FONT_FLAG_FLASH_3;
		else font_flag = FONT_FLAG_NORMAL;
		gp = makeInitStrGlist( gp, font_flag,
							   255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 );
		gp = makeGameMessageGlist( gp, GMESG_KIND_12, disp_p->gmesgNum,
							   DISPLAY_X1 + 20 + 25 + 89 * i + disp_p->dx, DISPLAY_Y1 + 31, 0, 0 );
	}

	/* データセレクト */
	if( disp_sel_data ) {
		if( cfgSaveData == CFGSAVE_DATA_MACHINE ) {
			font_flag = FONT_FLAG_FLASH_3;
			font_flag2 = FONT_FLAG_NORMAL;
		}
		else {
			font_flag = FONT_FLAG_NORMAL;
			font_flag2 = FONT_FLAG_FLASH_3;
		}
#if (SW_KN_LANGUAGE == KN_EU)
		if( euLanguage == EL_ENGLISH ) {
			sx = SX_MACHINE12; sx2 = SX_TIMESCORE12;
		}
		else {
			sx = SX_MACHINE12_GE; sx2 = SX_TIMESCORE12_GE;
		}
#else
		sx = SX_MACHINE12; sx2 = SX_TIMESCORE12;
#endif
		gp = makeInitStrGlist( gp, font_flag, 255, 255, 255, 255, 255, 255,
						   255, 255, 255, 255, 255, 255 );
		gp = makeGameMessageGlist( gp, GMESG_KIND_12, GMESG_MACHINE12,
							   DISPLAY_X1 + sx, DISPLAY_Y1 + 95, 0, 0 );
		gp = makeInitStrGlist( gp, font_flag2, 255, 255, 255, 255, 255, 255,
						   255, 255, 255, 255, 255, 255 );
		gp = makeGameMessageGlist( gp, GMESG_KIND_12, GMESG_TIMESCORE12,
							   DISPLAY_X1 + sx2, DISPLAY_Y1 + 95, 0, 0 );
	}
	/* 消去データセレクト */
	if( disp_erase_data ) {
		if( cfgSaveEraseData == CFGSAVE_ERASEDATA_RECORD ) {
			font_flag = FONT_FLAG_FLASH_3;
			font_flag2 = FONT_FLAG_NORMAL;
		}
		else {
			font_flag = FONT_FLAG_NORMAL;
			font_flag2 = FONT_FLAG_FLASH_3;
		}
		sx = SX_RECORD12; sx2 = SX_GHOST12;
		gp = makeInitStrGlist( gp, font_flag, 255, 255, 255, 255, 255, 255,
						   255, 255, 255, 255, 255, 255 );
		gp = makeGameMessageGlist( gp, GMESG_KIND_12, GMESG_KIROKU12,
							   DISPLAY_X1 + sx, DISPLAY_Y1 + 95, 0, 0 );
		gp = makeInitStrGlist( gp, font_flag2, 255, 255, 255, 255, 255, 255,
						   255, 255, 255, 255, 255, 255 );
		gp = makeGameMessageGlist( gp, GMESG_KIND_12, GMESG_GHOST12,
							   DISPLAY_X1 + sx2, DISPLAY_Y1 + 95, 0, 0 );
	}
	/* ゴースト選択用 */
	if( disp_ghost_data ) {
		for( i = 0, ip = &ghostInfo[0] ; i < MAX_NUM_GHOSTSAVE ; i ++, ip ++ ) {
			if( ip->fExist ) {
				if( cfgSaveGhostMenu == i ) font_flag = FONT_FLAG_FLASH_3;
				else font_flag = FONT_FLAG_NORMAL;
			}
			else font_flag = FONT_FLAG_COLOR;
			gp = makeInitStrGlist( gp, font_flag,
							   FONT_COLOR_TURN_OFF, FONT_COLOR_TURN_OFF, FONT_COLOR_TURN_OFF,
							   255, 255, 255, 255, 255, 255, 255, 255, 255 );
			gp = makeGhostMenuGlist( gp, DISPLAY_X1 + 45 + 5, DISPLAY_Y1 + 112 + 17 * i + 3, ip );
		}
		if( cfgSaveGhostMenu == CFGSAVE_GHOSTMENU_ALL ) font_flag = FONT_FLAG_FLASH_3;
		else font_flag = FONT_FLAG_NORMAL;
		gp = makeInitStrGlist( gp, font_flag, 255, 255, 255, 255, 255, 255,
						   255, 255, 255, 255, 255, 255 );
		gp = makeGameMessageGlist( gp, GMESG_KIND_12, GMESG_SUBETE12,
							   DISPLAY_X1 + 45 + 5, DISPLAY_Y1 + 112 + 17 * 2 + 3, 0, 0 );
	}
	/* OK or CANCEL */
	if( disp_ok_win ) {
		if( flash_ok ) {
			if( cfgSaveOK == CFGSAVE_OK ) {
				font_flag = FONT_FLAG_FLASH_3;
				font_flag2 = FONT_FLAG_NORMAL;
			}
			else {
				font_flag = FONT_FLAG_NORMAL;
				font_flag2 = FONT_FLAG_FLASH_3;
			}
		}
		else {
			font_flag = font_flag2 = FONT_FLAG_COLOR;
		}
#if (SW_KN_LANGUAGE == KN_EU)
		if( euLanguage == EL_ENGLISH ) {
			sx = SX_OK12; sx2 = SX_CANCEL12;
		}
		else {
			sx = SX_OK12_GE; sx2 = SX_CANCEL12_GE;
		}
#else
		sx = SX_OK12; sx2 = SX_CANCEL12;
#endif
		gp = makeInitStrGlist( gp, font_flag,
							   FONT_COLOR_TURN_OFF, FONT_COLOR_TURN_OFF, FONT_COLOR_TURN_OFF,
							   255, 255, 255, 255, 255, 255, 255, 255, 255 );
		gp = makeGameMessageGlist( gp, GMESG_KIND_12, GMESG_OK12,
							   DISPLAY_X1 + sx, ok_win_sy + 3, 0, 0 );
		gp = makeInitStrGlist( gp, font_flag2,
							   FONT_COLOR_TURN_OFF, FONT_COLOR_TURN_OFF, FONT_COLOR_TURN_OFF,
							   255, 255, 255, 255, 255, 255, 255, 255, 255 );
		gp = makeGameMessageGlist( gp, GMESG_KIND_12, GMESG_CANCEL12,
							   DISPLAY_X1 + sx2, ok_win_sy + 3, 0, 0 );
	}

	
//	#if (SW_KN_LANGUAGE == KN_US || SW_KN_LANGUAGE == KN_EU) /* 振動パック対応バージョンより変更 */
	if( dispWin ) {
		gp = makeInitRectangleGlist( gp, 0, 0, 0, 255 );
		gp = makeRectangleGlist( gp, (uint)sxWin, (uint)syWin,
							 (uint)(sxWin + wdWin), (uint)(syWin + htWin) );
	}
	if( dispWinMenu ) {
		gSPDisplayList( gp++, dlInitWaku );
		gp = makeWakuGlist( gp, WAKU_KIND_256x32, DISPLAY_X1 + SX_2WAKU1, DISPLAY_Y1 + 127, WD_2WAKU, 16 );
		gp = makeWakuGlist( gp, WAKU_KIND_256x32, DISPLAY_X1 + SX_2WAKU2, DISPLAY_Y1 + 127, WD_2WAKU, 16 );
		if( playerNumLoadMachine == 0 ) {
			font_flag_1p = FONT_FLAG_FLASH_3;
			font_flag_2p = FONT_FLAG_NORMAL;
		}
		else {
			font_flag_1p = FONT_FLAG_NORMAL;
			font_flag_2p = FONT_FLAG_FLASH_3;
		}
#if (SW_KN_LANGUAGE == KN_EU)
		if( euLanguage == EL_ENGLISH ) {
			sx = SX_FOR1P12; sx2 = SX_FOR2P12;
		}
		else {
			sx = SX_FOR1P12_GE; sx2 = SX_FOR2P12_GE;
		}
#else
		sx = SX_FOR1P12; sx2 = SX_FOR2P12;
#endif
		gp = makeInitStrGlist( gp, font_flag_1p,
								   255,255,255, 255,255,255, 255,255,255, 255,255,255 );
#if (SW_KN_LANGUAGE == KN_EU||SW_KN_LANGUAGE == KN_US)
		gp = makeGameMessageGlist( gp, GMESG_KIND_12, GMESG_FOR1P12,
					   DISPLAY_X1 + sx, DISPLAY_Y1 + 130, 0, 0 );
#else
		gp = makeGameMessageGlist( gp, GMESG_KIND_10, GMESG_FOR1P10,
					   DISPLAY_X1 + sx, DISPLAY_Y1 + 131, 0, 0 );
#endif
		gp = makeInitStrGlist( gp, font_flag_2p,
								   255,255,255, 255,255,255, 255,255,255, 255,255,255 );
#if (SW_KN_LANGUAGE == KN_EU||SW_KN_LANGUAGE == KN_US)
		gp = makeGameMessageGlist( gp, GMESG_KIND_12, GMESG_FOR2P12,
					   DISPLAY_X1 + sx2, DISPLAY_Y1 + 130, 0, 0 );
#else
		gp = makeGameMessageGlist( gp, GMESG_KIND_10, GMESG_FOR2P10,
					   DISPLAY_X1 + sx2, DISPLAY_Y1 + 131, 0, 0 );
#endif
	}
//	#endif
	
	switch( seqPfsMessage ) {
		case PFS_ERROR_SEQ_APPR:
			countPfsError ++;
			ht = 20 * countPfsError / PFS_ERROR_WIN_APPR_COUNT;
			if( countPfsError >= PFS_ERROR_WIN_APPR_COUNT ) {
				sxWinPfsError = DISPLAY_X1 + 20;
				syWinPfsError = DISPLAY_Y1 + 48;
				seqPfsMessage = PFS_ERROR_SEQ_EXIT_WAIT;
				countPfsError = 0;
			}
			else syWinPfsError = DISPLAY_Y1 + 48 + 20 - ht;
			gp = makeInitRectangleGlist( gp, 0, 0, 0, 255 );
			gp = makeRectangleGlist( gp, (uint)sxWinPfsError, (uint)(syWinPfsError),
								 (uint)(sxWinPfsError + 264), (uint)(syWinPfsError+ht*2) );
			break;
		case PFS_ERROR_SEQ_EXIT_WAIT:
		case PFS_ERROR_SEQ_EXIT_WAIT2:
			gp = makeInitRectangleGlist( gp, 0, 0, 0, 255 );
			gp = makeRectangleGlist( gp, (uint)sxWinPfsError, (uint)(syWinPfsError),
								 (uint)(sxWinPfsError + 264), (uint)(syWinPfsError+40) );
			/* メッセージ */
			gp = makeErrorMessageGlist( gp, 1 );
			if( seqPfsMessage == PFS_ERROR_SEQ_EXIT_WAIT ) {
				countPfsError ++;
				if( countPfsError >= 2 ) seqPfsMessage = PFS_ERROR_SEQ_EXIT_WAIT2;
			}
			else pfsActOk = 1;
			break;
	}

	return( gp );
}

/* ====================================================================== */
/*
	メモリーパックエラーの表示
*/
static void initPfsError( int pfs_error )
{
	register int	se_flag = 0;
	
	seqPfsMessage = PFS_ERROR_SEQ_NOP;
	seqPfsError   = PFS_ERROR_SEQ_APPR;
	sxWinPfsError = DISPLAY_X1 + 20;
	syWinPfsError = DISPLAY_Y1 + 48;
	countPfsError = 0;
	switch( pfs_error ) {
		case PFS_ERROR_NOPACK:
			se_flag = 1;
			kindPfsError = PFS_ERROR_KIND_SET_CPACK;
			break;
//		case PFS_ERROR_DEAD:
		case PFS_ERROR_BRKDATA:
			se_flag = 1;
			kindPfsError = PFS_ERROR_KIND_NOT_READ;
			break;
		case PFS_ERROR_MEMORY:
			se_flag = 1;
			kindPfsError = PFS_ERROR_KIND_CPACK_FULL;
			break;
		case PFS_ERROR_NODATA:
			se_flag = 1;
			kindPfsError = PFS_ERROR_KIND_NONOTE;
			break;
		case PFS_ERROR_DEAD:
		case PFS_ERROR_EEP:
			se_flag = 1;
			if( cfgSaveMode == CFGSAVE_SAVE_MODE_COPY ) kindPfsError = PFS_ERROR_KIND_NOT_COPY;
			else kindPfsError = PFS_ERROR_KIND_NOT_ERASE;
			break;
		case PFS_ERROR_MOTOR:
			se_flag = 1;
			kindPfsError = PFS_ERROR_KIND_MOTOR2;
			break;
		case KN_PFS_ERROR_NOPLUG:	/* コントローラーパック抜くな */
			se_flag = 1;
			kindPfsError = PFS_ERROR_KIND_DONT_PULL_PFS;
			break;
		case PFS_ERROR_NOTE:
			se_flag = 1;
			kindPfsError = PFS_ERROR_KIND_NOTE;
			break;
	}
	#if SOUND_SW
	if( se_flag ) Na_Sys2Sound( NA_SYS2_PACKERR );
	#endif
}

static void initPfsMessage( int pfs_message )
{
	pfsActOk = 0;
	seqPfsMessage = PFS_ERROR_SEQ_APPR;
	sxWinPfsError = DISPLAY_X1 + 20;
	syWinPfsError = DISPLAY_Y1 + 48;
	countPfsError = 0;

	switch( pfs_message ) {
		case PFS_MESSAGE_KIND_NEW_RANK:
			kindPfsError = PFS_ERROR_KIND_NEW_RANK;
			break;
		case PFS_MESSAGE_KIND_COPY:
			kindPfsError = PFS_ERROR_KIND_COPY;
			break;
		case PFS_MESSAGE_KIND_ERASE:
			kindPfsError = PFS_ERROR_KIND_ERASE;
			break;
		case PFS_MESSAGE_KIND_MOTOR:
			kindPfsError = PFS_ERROR_KIND_MOTOR1;
			break;
	}
}

static Gfx	*makePfsErrorGlist( Gfx *gp )
{
	register ht;
	
	switch( seqPfsError ) {
		case PFS_ERROR_SEQ_APPR:
			countPfsError ++;
			ht = 20 * countPfsError / PFS_ERROR_WIN_APPR_COUNT;
			if( countPfsError >= PFS_ERROR_WIN_APPR_COUNT ) {
				sxWinPfsError = DISPLAY_X1 + 20;
				syWinPfsError = DISPLAY_Y1 + 48;
			}
			syWinPfsError = DISPLAY_Y1 + 48 + 20 - ht;
			gp = makeInitRectangleGlist( gp, 0, 0, 0, 255 );
			gp = makeRectangleGlist( gp, (uint)sxWinPfsError, (uint)(syWinPfsError),
								 (uint)(sxWinPfsError + 264), (uint)(syWinPfsError+ht*2) );
			break;
		case PFS_ERROR_SEQ_WAIT:
		case PFS_ERROR_SEQ_KEY_WAIT:
		case PFS_ERROR_SEQ_EXIT_WAIT:
			gp = makeInitRectangleGlist( gp, 0, 0, 0, 255 );
			gp = makeRectangleGlist( gp, (uint)sxWinPfsError, (uint)(syWinPfsError),
								 (uint)(sxWinPfsError + 264), (uint)(syWinPfsError+40) );
			/* メッセージ */
			gp = makeErrorMessageGlist( gp, 0 );
			break;
	}
	
	return( gp );
}

static Gfx	*makeErrorMessageGlist( Gfx *gp, int id )
{
	register int	i;
	register int	dx,dy,wd,ht,dht;
	register uint	timg;
	
#if (SW_KN_LANGUAGE == KN_JP || SW_KN_LANGUAGE == KN_ZH)
	#define SX_ERROR	(DISPLAY_X1+20)
#elif (SW_KN_LANGUAGE == KN_US)
	#define SX_ERROR	(DISPLAY_X1+24)
#elif (SW_KN_LANGUAGE == KN_EU)
	#define SX_ERROR	(DISPLAY_X1+24)
#endif
	#define SY_ERROR	(DISPLAY_Y1+48)

	if( id == 0 ) {
		gp = makeInitStrGlist( gp, FONT_FLAG_FLASH_1, 255, 255, 255, 255, 255, 255,
				       255, 255, 255, 255, 255, 255 );
	}
	else {
		gp = makeInitStrGlist( gp, FONT_FLAG_NORMAL, 255, 255, 255, 255, 255, 255,
				       255, 255, 255, 255, 255, 255 );
	}

	#ifndef ROM_FLAG	/* For Debug */
	if( mKnPad[KN_PAD_1P].pad.trig & U_CBUTTONS ) kindPfsError --;
	if( mKnPad[KN_PAD_1P].pad.trig & D_CBUTTONS ) kindPfsError ++;
	#endif
	
	switch( kindPfsError ) {
		case PFS_ERROR_KIND_CPACK_FULL:
#if (SW_KN_LANGUAGE == KN_JP || SW_KN_LANGUAGE == KN_ZH)
			#define DX_FULL	(52)
			#define DY_FULL	(2)
			#define WD_FULL	(160)
			#define HT_FULL	(18)
			#define TIMG_FULL	(texJfNoSpace)
			dx = DX_FULL; dy = DY_FULL; wd = WD_FULL; ht = HT_FULL;
			timg = (uint)TIMG_FULL;
#elif (SW_KN_LANGUAGE == KN_US)
			#define DX_FULL	(0)
			#define DY_FULL	(5)
			#define WD_FULL	(256)
			#define HT_FULL	(15)
			#define TIMG_FULL	(texEfNoSpace)
			dx = DX_FULL; dy = DY_FULL; wd = WD_FULL; ht = HT_FULL;
			timg = (uint)TIMG_FULL;
#elif (SW_KN_LANGUAGE == KN_EU)
			#define DX_FULL	(0)
			#define DY_FULL	(5)
			#define WD_FULL	(256)
			#define HT_FULL	(15)
			#define TIMG_FULL	(texEfNoSpace)
			#define DX_FULL_GE	(60)
			#define DY_FULL_GE	(5)
			#define WD_FULL_GE	(152)
			#define HT_FULL_GE	(16)
			#define TIMG_FULL_GE	(texGeNoSpace)
			if( euLanguage == EL_ENGLISH ) {
				dx = DX_FULL; dy = DY_FULL; wd = WD_FULL; ht = HT_FULL;
				timg = (uint)TIMG_FULL;
			}
			else {
				dx = DX_FULL_GE; dy = DY_FULL_GE; wd = WD_FULL_GE; ht = HT_FULL_GE;
				timg = (uint)TIMG_FULL_GE;
			}
#endif
			for( i = 0 ; i < 2 ; i ++ ) {
				gDPLoadTextureTile( gp++, timg + wd * ht * i,
					G_IM_FMT_IA, G_IM_SIZ_8b,
					(uint)wd, (uint)ht,
					0, 0,
					(uint)wd-1, (uint)ht-1, 0,
					G_TX_CLAMP, G_TX_CLAMP,
					G_TX_NOMASK, G_TX_NOMASK,
					G_TX_NOLOD, G_TX_NOLOD );
				gSPTextureRectangle( gp++,
					(SX_ERROR + dx) << 2,
					(SY_ERROR + dy + ht * i) << 2,
					(SX_ERROR + dx + wd) << 2,
					(SY_ERROR + dy + ht * i + ht) << 2,
					G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10 );
			}
			break;
			
		case PFS_ERROR_KIND_NOT_COPY:
#if (SW_KN_LANGUAGE == KN_JP || SW_KN_LANGUAGE == KN_ZH)
			#define DHT_NOT_COPY	0
			#define DX_NOT_COPY		44
			dht = DHT_NOT_COPY; dx = DX_NOT_COPY;
#elif (SW_KN_LANGUAGE == KN_US)
			#define DHT_NOT_COPY	2
			#define DX_NOT_COPY		40
			dht = DHT_NOT_COPY; dx = DX_NOT_COPY;
#elif (SW_KN_LANGUAGE == KN_EU)
			#define DHT_NOT_COPY	2
			#define DX_NOT_COPY		40
			#define DHT_NOT_COPY_GE	2
			#define DX_NOT_COPY_GE	24
			if( euLanguage == EL_ENGLISH ) {
				dht = DHT_NOT_COPY; dx = DX_NOT_COPY;
			}
			else {
				dht = DHT_NOT_COPY_GE; dx = DX_NOT_COPY_GE;
			}
#endif
			gp = makeGameMessageGlist( gp, GMESG_KIND_16, GMESG_NOT_COPY16, SX_ERROR + dx, SY_ERROR + 12,
									   dht, BANK_OFFSET_CFGSAVE_PFSMES );
			break;
		case PFS_ERROR_KIND_NOT_ERASE:
#if (SW_KN_LANGUAGE == KN_JP || SW_KN_LANGUAGE == KN_ZH)
			#define DHT_NOT_ERASE	0
			#define DX_NOT_ERASE	52
			dht = DHT_NOT_ERASE; dx = DX_NOT_ERASE;
#elif (SW_KN_LANGUAGE == KN_US)
			#define DHT_NOT_ERASE	2
			#define DX_NOT_ERASE	36
			dht = DHT_NOT_ERASE; dx = DX_NOT_ERASE;
#elif (SW_KN_LANGUAGE == KN_EU)
			#define DHT_NOT_ERASE		2
			#define DX_NOT_ERASE		36
			#define DHT_NOT_ERASE_GE	2
			#define DX_NOT_ERASE_GE		28
			if( euLanguage == EL_ENGLISH ) {
				dht = DHT_NOT_ERASE; dx = DX_NOT_ERASE;
			}
			else {
				dht = DHT_NOT_ERASE_GE; dx = DX_NOT_ERASE_GE;
			}
#endif
			gp = makeGameMessageGlist( gp, GMESG_KIND_16, GMESG_NOT_ERASE16, SX_ERROR + dx, SY_ERROR + 12,
									   dht, 0 );
			break;
		case PFS_ERROR_KIND_NONOTE:
			if( !fGhostError ) {
#if (SW_KN_LANGUAGE == KN_JP || SW_KN_LANGUAGE == KN_ZH)
				#define DX_NONOTE	(24)
				#define DY_NONOTE	(2)
				#define WD_NONOTE	(216)
				#define HT_NONOTE	(18)
				#define TIMG_NONOTE	(texJfNoNote)
				dx = DX_NONOTE; dy = DY_NONOTE; wd = WD_NONOTE; ht = HT_NONOTE;
				timg = (uint)TIMG_NONOTE;
#elif (SW_KN_LANGUAGE == KN_US)
				#define DX_NONOTE	(35)
				#define DY_NONOTE	(5)
				#define WD_NONOTE	(192)
				#define HT_NONOTE	(15)
				#define TIMG_NONOTE	(texEfNoNote)
				dx = DX_NONOTE; dy = DY_NONOTE; wd = WD_NONOTE; ht = HT_NONOTE;
				timg = (uint)TIMG_NONOTE;
#elif (SW_KN_LANGUAGE == KN_EU)
				#define DX_NONOTE	(35)
				#define DY_NONOTE	(5)
				#define WD_NONOTE	(192)
				#define HT_NONOTE	(15)
				#define TIMG_NONOTE	(texEfNoNote)
				#define DX_NONOTE_GE	(34)
				#define DY_NONOTE_GE	(5)
				#define WD_NONOTE_GE	(200)
				#define HT_NONOTE_GE	(16)
				#define TIMG_NONOTE_GE	(texGeNoNote)
				if( euLanguage == EL_ENGLISH ) {
					dx = DX_NONOTE; dy = DY_NONOTE; wd = WD_NONOTE; ht = HT_NONOTE;
					timg = (uint)TIMG_NONOTE;
				}
				else {
					dx = DX_NONOTE_GE; dy = DY_NONOTE_GE; wd = WD_NONOTE_GE; ht = HT_NONOTE_GE;
					timg = (uint)TIMG_NONOTE_GE;
				}
#endif
				for( i = 0 ; i < 2 ; i ++ ) {
					gDPLoadTextureTile( gp++, timg + wd * ht * i,
						G_IM_FMT_IA, G_IM_SIZ_8b,
						(uint)wd, (uint)ht,
						0, 0,
						(uint)wd-1, (uint)ht-1, 0,
						G_TX_CLAMP, G_TX_CLAMP,
						G_TX_NOMASK, G_TX_NOMASK,
						G_TX_NOLOD, G_TX_NOLOD );
					gSPTextureRectangle( gp++,
						(SX_ERROR + dx) << 2     , (SY_ERROR + dy + ht * i) << 2,
						(SX_ERROR + dx + wd) << 2, (SY_ERROR + dy + ht * i + ht) << 2,
						G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10 );
				}
			}
			else {
				#define DX_NOGHOST	(28)
				#define DY_NOGHOST	(13)
				#define WD_NOGHOST	(208)
				#define HT_NOGHOST	(7)
				#define TIMG_NOGHOST	(texJfSinNotNote)
				dx = DX_NOGHOST; dy = DY_NOGHOST; wd = WD_NOGHOST; ht = HT_NOGHOST;
				timg = (uint)TIMG_NOGHOST;
				for( i = 0 ; i < 2 ; i ++ ) {
					gDPLoadTextureTile( gp++, timg + wd * ht * i,
						G_IM_FMT_IA, G_IM_SIZ_8b,
						(uint)wd, (uint)ht,
						0, 0,
						(uint)wd-1, (uint)ht-1, 0,
						G_TX_CLAMP, G_TX_CLAMP,
						G_TX_NOMASK, G_TX_NOMASK,
						G_TX_NOLOD, G_TX_NOLOD );
					gSPTextureRectangle( gp++,
						(SX_ERROR + dx) << 2     , (SY_ERROR + dy + ht * i) << 2,
						(SX_ERROR + dx + wd) << 2, (SY_ERROR + dy + ht * i + ht) << 2,
						G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10 );
				}
			}
			break;
		case PFS_ERROR_KIND_SET_CPACK:
#if (SW_KN_LANGUAGE == KN_JP || SW_KN_LANGUAGE == KN_ZH)
#if (LOCALE==CHINA )

		   gp = makeGameMessageGlist( gp, GMESG_KIND_16, GMESG_SET_CPACK2_16, 320/2.0-208/2.0 /*SX_ERROR+28*/, SY_ERROR + 12, 0, 0 );
#else
			gp = makeGameMessageGlist( gp, GMESG_KIND_16, GMESG_SET_CPACK1_16, SX_ERROR + 68, SY_ERROR + 2, 0, 0 );
			gp = makeGameMessageGlist( gp, GMESG_KIND_16, GMESG_SET_CPACK2_16, SX_ERROR + 28, SY_ERROR + 2 + 20, 0, 0 );

#endif
#elif (SW_KN_LANGUAGE == KN_US)
			#define DX_SET_CPACK	(14)
			#define DY_SET_CPACK	(5)
			#define WD_SET_CPACK	(240)
			#define HT_SET_CPACK	(15)
			#define TIMG_SET_CPACK	(texEfSetCPack1_16)
			for( i = 0 ; i < 2 ; i ++ ) {
				gDPLoadTextureTile( gp++, TIMG_SET_CPACK + WD_SET_CPACK * HT_SET_CPACK * i,
					G_IM_FMT_IA, G_IM_SIZ_8b,
					(uint)WD_SET_CPACK, (uint)HT_SET_CPACK,
					0, 0,
					(uint)WD_SET_CPACK-1, (uint)HT_SET_CPACK-1, 0,
					G_TX_CLAMP, G_TX_CLAMP,
					G_TX_NOMASK, G_TX_NOMASK,
					G_TX_NOLOD, G_TX_NOLOD );
				gSPTextureRectangle( gp++,
					(SX_ERROR + DX_SET_CPACK) << 2,
					(SY_ERROR + DY_SET_CPACK + HT_SET_CPACK * i) << 2,
					(SX_ERROR + DX_SET_CPACK + WD_SET_CPACK) << 2,
					(SY_ERROR + DY_SET_CPACK + HT_SET_CPACK * i + HT_SET_CPACK) << 2,
					G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10 );
			}
#elif (SW_KN_LANGUAGE == KN_EU)
			#define DX_SET_CPACK	(14)
			#define DY_SET_CPACK	(5)
			#define WD_SET_CPACK	(240)
			#define HT_SET_CPACK	(15)
			#define TIMG_SET_CPACK	(texEfSetCPack1_16)
			#define DX_SET_CPACK_GE	(49)
			#define DY_SET_CPACK_GE	(5)
			#define WD_SET_CPACK_GE	(168)
			#define HT_SET_CPACK_GE	(16)
			#define TIMG_SET_CPACK_GE	(texGeSetCPack1_16)
			if( euLanguage == EL_ENGLISH ) {
				dx = DX_SET_CPACK; dy = DY_SET_CPACK; wd = WD_SET_CPACK; ht = HT_SET_CPACK;
				timg = (uint)TIMG_SET_CPACK;
			}
			else {
				dx = DX_SET_CPACK_GE; dy = DY_SET_CPACK_GE; wd = WD_SET_CPACK_GE; ht = HT_SET_CPACK_GE;
				timg = (uint)TIMG_SET_CPACK_GE;
			}
			for( i = 0 ; i < 2 ; i ++ ) {
				gDPLoadTextureTile( gp++, timg + wd * ht * i,
					G_IM_FMT_IA, G_IM_SIZ_8b,
					(uint)wd, (uint)ht,
					0, 0,
					(uint)wd-1, (uint)ht-1, 0,
					G_TX_CLAMP, G_TX_CLAMP,
					G_TX_NOMASK, G_TX_NOMASK,
					G_TX_NOLOD, G_TX_NOLOD );
				gSPTextureRectangle( gp++,
					(SX_ERROR + dx) << 2,
					(SY_ERROR + dy + ht * i) << 2,
					(SX_ERROR + dx + wd) << 2,
					(SY_ERROR + dy + ht * i + ht) << 2,
					G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10 );
			}
#endif
			break;
		case PFS_ERROR_KIND_NEW_RANK:
#if (SW_KN_LANGUAGE == KN_JP || SW_KN_LANGUAGE == KN_ZH)
			gp = makeGameMessageGlist( gp, GMESG_KIND_16, GMESG_NEWRANK1_16, SX_ERROR + 28, SY_ERROR + 2, 0, 0 );
			gp = makeGameMessageGlist( gp, GMESG_KIND_16, GMESG_NEWRANK2_16, SX_ERROR + 20, SY_ERROR + 2 + 20, 0, 0 );
#elif (SW_KN_LANGUAGE == KN_US)
			#define DX_NEW_RANK	(1)
			#define DY_NEW_RANK	(5)
			#define WD_NEW_RANK	(256)
			#define HT_NEW_RANK	(15)
			#define TIMG_NEW_RANK	(texEfNewRank1_16)
			for( i = 0 ; i < 2 ; i ++ ) {
				gDPLoadTextureTile( gp++, TIMG_NEW_RANK + WD_NEW_RANK * HT_NEW_RANK * i,
					G_IM_FMT_IA, G_IM_SIZ_8b,
					(uint)WD_NEW_RANK, (uint)HT_NEW_RANK,
					0, 0,
					(uint)WD_NEW_RANK-1, (uint)HT_NEW_RANK-1, 0,
					G_TX_CLAMP, G_TX_CLAMP,
					G_TX_NOMASK, G_TX_NOMASK,
					G_TX_NOLOD, G_TX_NOLOD );
				gSPTextureRectangle( gp++,
					(SX_ERROR + DX_NEW_RANK) << 2,
					(SY_ERROR + DY_NEW_RANK + HT_NEW_RANK * i) << 2,
					(SX_ERROR + DX_NEW_RANK + WD_NEW_RANK) << 2,
					(SY_ERROR + DY_NEW_RANK + HT_NEW_RANK * i + HT_NEW_RANK) << 2,
					G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10 );
			}
#elif (SW_KN_LANGUAGE == KN_EU)
			#define DX_NEW_RANK	(1)
			#define DY_NEW_RANK	(5)
			#define WD_NEW_RANK	(256)
			#define HT_NEW_RANK	(15)
			#define TIMG_NEW_RANK	(texEfNewRank1_16)
			#define DX_NEW_RANK_GE	(16)
			#define DY_NEW_RANK_GE	(5)
			#define WD_NEW_RANK_GE	(232)
			#define HT_NEW_RANK_GE	(16)
			#define TIMG_NEW_RANK_GE	(texGeNewRank1_16)
			if( euLanguage == EL_ENGLISH ) {
				dx = DX_NEW_RANK; dy = DY_NEW_RANK; wd = WD_NEW_RANK; ht = HT_NEW_RANK;
				timg = (uint)TIMG_NEW_RANK;
			}
			else {
				dx = DX_NEW_RANK_GE; dy = DY_NEW_RANK_GE; wd = WD_NEW_RANK_GE; ht = HT_NEW_RANK_GE;
				timg = (uint)TIMG_NEW_RANK_GE;
			}
			for( i = 0 ; i < 2 ; i ++ ) {
				gDPLoadTextureTile( gp++, timg + wd * ht * i,
					G_IM_FMT_IA, G_IM_SIZ_8b,
					(uint)wd, (uint)ht,
					0, 0,
					(uint)wd-1, (uint)ht-1, 0,
					G_TX_CLAMP, G_TX_CLAMP,
					G_TX_NOMASK, G_TX_NOMASK,
					G_TX_NOLOD, G_TX_NOLOD );
				gSPTextureRectangle( gp++,
					(SX_ERROR + dx) << 2,
					(SY_ERROR + dy + ht * i) << 2,
					(SX_ERROR + dx + wd) << 2,
					(SY_ERROR + dy + ht * i + ht) << 2,
					G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10 );
			}
#endif
			break;
		case PFS_ERROR_KIND_NOT_READ:
#if (SW_KN_LANGUAGE == KN_JP || SW_KN_LANGUAGE == KN_ZH)
			gp = makeGameMessageGlist( gp, GMESG_KIND_16, GMESG_NOT_READ16, SX_ERROR + 16, SY_ERROR + 12,
									   0, BANK_OFFSET_CFGSAVE_PFSMES_GHOST );
#elif (SW_KN_LANGUAGE == KN_US)
			#define DX_NOT_READ	(21)
			#define DY_NOT_READ	(5)
			#define WD_NOT_READ	(224)
			#define HT_NOT_READ	(15)
			#define TIMG_NOT_READ	(texEfPackNotRead16)
			for( i = 0 ; i < 2 ; i ++ ) {
				gDPLoadTextureTile( gp++, TIMG_NOT_READ + WD_NOT_READ * HT_NOT_READ * i,
					G_IM_FMT_IA, G_IM_SIZ_8b,
					(uint)WD_NOT_READ, (uint)HT_NOT_READ,
					0, 0,
					(uint)WD_NOT_READ-1, (uint)HT_NOT_READ-1, 0,
					G_TX_CLAMP, G_TX_CLAMP,
					G_TX_NOMASK, G_TX_NOMASK,
					G_TX_NOLOD, G_TX_NOLOD );
				gSPTextureRectangle( gp++,
					(SX_ERROR + DX_NOT_READ) << 2,
					(SY_ERROR + DY_NOT_READ + HT_NOT_READ * i) << 2,
					(SX_ERROR + DX_NOT_READ + WD_NOT_READ) << 2,
					(SY_ERROR + DY_NOT_READ + HT_NOT_READ * i + HT_NOT_READ) << 2,
					G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10 );
			}
#elif (SW_KN_LANGUAGE == KN_EU)
			#define DX_NOT_READ	(21)
			#define DY_NOT_READ	(5)
			#define WD_NOT_READ	(224)
			#define HT_NOT_READ	(15)
			#define TIMG_NOT_READ	(texEfPackNotRead16)
			#define DX_NOT_READ_GE		(56)
			#define DY_NOT_READ_GE		(5)
			#define WD_NOT_READ_GE		(160)
			#define HT_NOT_READ_GE		(16)
			#define TIMG_NOT_READ_GE	(texGePackNotRead16)
			if( euLanguage == EL_ENGLISH ) {
				dx = DX_NOT_READ; dy = DY_NOT_READ; wd = WD_NOT_READ; ht = HT_NOT_READ;
				timg = (uint)TIMG_NOT_READ;
			}
			else {
				dx = DX_NOT_READ_GE; dy = DY_NOT_READ_GE; wd = WD_NOT_READ_GE; ht = HT_NOT_READ_GE;
				timg = (uint)TIMG_NOT_READ_GE;
			}
			for( i = 0 ; i < 2 ; i ++ ) {
				gDPLoadTextureTile( gp++, timg + wd * ht * i,
					G_IM_FMT_IA, G_IM_SIZ_8b,
					(uint)wd, (uint)ht,
					0, 0,
					(uint)wd-1, (uint)ht-1, 0,
					G_TX_CLAMP, G_TX_CLAMP,
					G_TX_NOMASK, G_TX_NOMASK,
					G_TX_NOLOD, G_TX_NOLOD );
				gSPTextureRectangle( gp++,
					(SX_ERROR + dx) << 2,
					(SY_ERROR + dy + ht * i) << 2,
					(SX_ERROR + dx + wd) << 2,
					(SY_ERROR + dy + ht * i + ht) << 2,
					G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10 );
			}
#endif
			break;
		case PFS_ERROR_KIND_COPY:
#if (SW_KN_LANGUAGE == KN_JP || SW_KN_LANGUAGE == KN_ZH)
			#define DHT_COPY	0
			#define DX_COPY		84
			dht = DHT_COPY; dx = DX_COPY;
#elif (SW_KN_LANGUAGE == KN_US)
			#define DHT_COPY	2
			#define DX_COPY		87
			dht = DHT_COPY; dx = DX_COPY;
#elif (SW_KN_LANGUAGE == KN_EU)
			#define DHT_COPY	2
			#define DX_COPY		87
			#define DHT_COPY_GE	2
			#define DX_COPY_GE	95
			if( euLanguage == EL_ENGLISH ) {
				dht = DHT_COPY; dx = DX_COPY;
			}
			else {
				dht = DHT_COPY_GE; dx = DX_COPY_GE;
			}
#endif
			gp = makeGameMessageGlist( gp, GMESG_KIND_16, GMESG_COPY16, SX_ERROR + dx, SY_ERROR + 12, dht, BANK_OFFSET_CFGSAVE_PFSMES );
			break;
		case PFS_ERROR_KIND_ERASE:
#if (SW_KN_LANGUAGE == KN_JP || SW_KN_LANGUAGE == KN_ZH)
			#define DHT_ERASE		0
			#define DX_ERASE		88
			dht = DHT_ERASE; dx = DX_ERASE;
#elif (SW_KN_LANGUAGE == KN_US)
			#define DHT_ERASE		2
			#define DX_ERASE		88
			dht = DHT_ERASE; dx = DX_ERASE;
#elif (SW_KN_LANGUAGE == KN_EU)
			#define DHT_ERASE		2
			#define DX_ERASE		88
			#define DHT_ERASE_GE	2
			#define DX_ERASE_GE		99
			if( euLanguage == EL_ENGLISH ) {
				dht = DHT_ERASE; dx = DX_ERASE;
			}
			else {
				dht = DHT_ERASE_GE; dx = DX_ERASE_GE;
			}
#endif
			gp = makeGameMessageGlist( gp, GMESG_KIND_16, GMESG_ERASE16,
									   SX_ERROR + dx, SY_ERROR + 12, dht, 0 );
			break;

		case PFS_ERROR_KIND_MOTOR1:
#if LOCALE!=CHINA
			#define DX_MOTOR1	(20)
			#define DY_MOTOR1	(5)
			#define WD_MOTOR1	(216)
			#define HT_MOTOR1	(15)
			#define TIMG_MOTOR1	(texJfShindo1_10)
			for( i = 0 ; i < 2 ; i ++ ) {
				gDPLoadTextureTile( gp++, TIMG_MOTOR1 + WD_MOTOR1 * HT_MOTOR1 * i,
					G_IM_FMT_IA, G_IM_SIZ_8b,
					(uint)WD_MOTOR1, (uint)HT_MOTOR1,
					0, 0,
					(uint)WD_MOTOR1-1, (uint)HT_MOTOR1-1, 0,
					G_TX_CLAMP, G_TX_CLAMP,
					G_TX_NOMASK, G_TX_NOMASK,
					G_TX_NOLOD, G_TX_NOLOD );
				gSPTextureRectangle( gp++,
					(SX_ERROR + DX_MOTOR1) << 2,
					(SY_ERROR + DY_MOTOR1 + HT_MOTOR1 * i) << 2,
					(SX_ERROR + DX_MOTOR1 + WD_MOTOR1) << 2,
					(SY_ERROR + DY_MOTOR1 + HT_MOTOR1 * i + HT_MOTOR1) << 2,
					G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10 );
			}
#endif
			break;
		case PFS_ERROR_KIND_MOTOR2:
#if LOCALE!=CHINA
			#define DX_MOTOR2	(12)
			#define DY_MOTOR2	(5)
			#define WD_MOTOR2	(232)
			#define HT_MOTOR2	(15)
			#define TIMG_MOTOR2	(texJfShindo2_10)
			for( i = 0 ; i < 2 ; i ++ ) {
				gDPLoadTextureTile( gp++, TIMG_MOTOR2 + WD_MOTOR2 * HT_MOTOR2 * i,
					G_IM_FMT_IA, G_IM_SIZ_8b,
					(uint)WD_MOTOR2, (uint)HT_MOTOR2,
					0, 0,
					(uint)WD_MOTOR2-1, (uint)HT_MOTOR2-1, 0,
					G_TX_CLAMP, G_TX_CLAMP,
					G_TX_NOMASK, G_TX_NOMASK,
					G_TX_NOLOD, G_TX_NOLOD );
				gSPTextureRectangle( gp++,
					(SX_ERROR + DX_MOTOR2) << 2,
					(SY_ERROR + DY_MOTOR2 + HT_MOTOR2 * i) << 2,
					(SX_ERROR + DX_MOTOR2 + WD_MOTOR2) << 2,
					(SY_ERROR + DY_MOTOR2 + HT_MOTOR2 * i + HT_MOTOR2) << 2,
					G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10 );
			}
#endif
			break;
		case PFS_ERROR_KIND_DONT_PULL_PFS:
			#define DX_DONT_PULL_PFS	(60)
			#define DY_DONT_PULL_PFS	(5)
			#define WD_DONT_PULL_PFS	(136)
			#define HT_DONT_PULL_PFS	(15)
			#define TIMG_DONT_PULL_PFS	(texJfSinNukanai+BANK_OFFSET_CFGSAVE_PFSMES)
			for( i = 0 ; i < 2 ; i ++ ) {
				gDPLoadTextureTile( gp++, TIMG_DONT_PULL_PFS + WD_DONT_PULL_PFS * HT_DONT_PULL_PFS * i,
					G_IM_FMT_IA, G_IM_SIZ_8b,
					(uint)WD_DONT_PULL_PFS, (uint)HT_DONT_PULL_PFS,
					0, 0,
					(uint)WD_DONT_PULL_PFS-1, (uint)HT_DONT_PULL_PFS-1, 0,
					G_TX_CLAMP, G_TX_CLAMP,
					G_TX_NOMASK, G_TX_NOMASK,
					G_TX_NOLOD, G_TX_NOLOD );
				gSPTextureRectangle( gp++,
					(SX_ERROR + DX_DONT_PULL_PFS) << 2,
					(SY_ERROR + DY_DONT_PULL_PFS + HT_DONT_PULL_PFS * i) << 2,
					(SX_ERROR + DX_DONT_PULL_PFS + WD_DONT_PULL_PFS) << 2,
					(SY_ERROR + DY_DONT_PULL_PFS + HT_DONT_PULL_PFS * i + HT_DONT_PULL_PFS) << 2,
					G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10 );
			}
			break;
		case PFS_ERROR_KIND_NOTE:
			#define DX_NOTE	(44)
			#define DY_NOTE	(11)
			#define WD_NOTE	(168)
			#define HT_NOTE	(18)
			#define TIMG_NOTE	(texJfSinTukurenai+BANK_OFFSET_CFGSAVE_PFSMES)
			for( i = 0 ; i < 1 ; i ++ ) {
				gDPLoadTextureTile( gp++, TIMG_NOTE + WD_NOTE * HT_NOTE * i,
					G_IM_FMT_IA, G_IM_SIZ_8b,
					(uint)WD_NOTE, (uint)HT_NOTE,
					0, 0,
					(uint)WD_NOTE-1, (uint)HT_NOTE-1, 0,
					G_TX_CLAMP, G_TX_CLAMP,
					G_TX_NOMASK, G_TX_NOMASK,
					G_TX_NOLOD, G_TX_NOLOD );
				gSPTextureRectangle( gp++,
					(SX_ERROR + DX_NOTE) << 2,
					(SY_ERROR + DY_NOTE + HT_NOTE * i) << 2,
					(SX_ERROR + DX_NOTE + WD_NOTE) << 2,
					(SY_ERROR + DY_NOTE + HT_NOTE * i + HT_NOTE) << 2,
					G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10 );
			}
			break;
	}
	
	return( gp );
}

/* ====================================================================== */
/*
	次のモードへ
*/
static void initMainGlistCfgSave2Next( void )
{
	/* ゲームモード */
	gameModeOld = game_mode;
	gameModeNext = 0;
	game_mode = GM_CFGSAVE2NEXT;
	game_stat = GAME_STAT_CFGSAVE;
	gameModeChangeFlag = 1;
	gameModeSeq = 0;
	gameModeCount = 0;
	vram_mode = VM_NORMAL;
	Graph_timing_req = GRAPH_TIMING_CFGSAVE;

	/* プレイヤー制御変数 */

	/* ホバー制御フラグ */
	/* 海制御フラグ */
	/* シグナル制御 */

	/* 初期化関数 */
	initMoveMask( MASK_MODE_FADE_OUT, MASK_FADE_OUT_COUNT, 0 );

	/* 記録画面用カメラ */

	/* ＢＧＭ */
}

