/******************************************************************************
	enrecord.h
******************************************************************************/

#ifndef ENRECORD_H
#define ENRECORD_H

#include "enchkcrs.h"
#include "kn_def.h"
#include "kn_machine.h"
#include "kn_backup.h"

/******************************************************************************
	define switch
******************************************************************************/
#define ENSW_USE_MOTOR

/******************************************************************************
	define constants
******************************************************************************/
#define RECPACK_SIZE		512
#define EEP_CHK_CODE_SIZE	2
#define REC_CHECK_BYTES		4
#define RANK_REC_SIZE_L		6
#define RANK_REC_SIZE		5
#define CHK_REC_SIZE		3

#define COMPANY_CODE	0x0001		/* NINTENDO */
#define GAME_CODE	0x4e57524a	/* NWRJ */

#define EEP_ERROR_NOEEP		1
#define EEP_ERROR_READ		2
#define EEP_ERROR_WRITE		3

#define PFS_ERROR_NOPACK	1
#define PFS_ERROR_DEAD		2
#define PFS_ERROR_MEMORY	3
#define PFS_ERROR_NODATA	4
#define PFS_ERROR_EEP		5
#define PFS_ERROR_BRKDATA	6
#define PFS_ERROR_MOTOR		7
#define PFS_ERROR_NOTE		8

#define PFS_RW_ALL		0
#define PFS_RW_MACHINE0		1
#define PFS_RW_MACHINE1		2
#define PFS_RW_MACHINE2		3
#define PFS_RW_MACHINE3		4
#define PFS_RW_RECORD		5
#define PFS_RW_MACHINE_2P_FLAG	0x80

/******************************************************************************
 	structures
******************************************************************************/
typedef struct {
	uchar	check_code[EEP_CHK_CODE_SIZE];					/*   2 bytes 		*/
	ushort	check_sum;							/*   2 bytes 		*/
	int	check_dummy;							/*   4 bytes 		*/

	char	gameClearCourseNum[GAME_CLEAR_COURSE_MAX_NUM];			/*   4 bytes 		*/
	char	gameClearFlag, d1, d2, d3;					/*   4 bytes		*/

	char	man_name[MAX_NUM_MACHINE_SEL][MAN_NAME_MAX_SIZE];		/*  40 bytes (4x10)	*/
	char	perf[2][MAX_NUM_MACHINE_SEL][MAX_NUM_MACHINE_DATA];		/*  24 bytes (1x2x4x3)	*/
	char	cfg[CFGCOND_MAX_NUM_MODE][CFGCOND_MAX_NUM_MEMBER];		/*   9 bytes (1x3x3)	*/
	char	cfg_dummy[7];							/*   7 bytes		*/

	uchar	time_rank[TOUR_COURSE_MAX][RANKING_MAX + 1][RANK_REC_SIZE_L];	/* 192 bytes (8x4x6)	*/
	uchar	score_rank[SCA_COURSE_MAX][RANKING_MAX][RANK_REC_SIZE];		/* 135 bytes (9x3x5)	*/
	char	dummy1;								/*   1 bytes		*/
	uchar	chk_time[TOUR_COURSE_MAX][CHK_TIME_REC_MAX][CHK_REC_SIZE];	/*  48 bytes (8x2x3)	*/
	uchar	rev_rank[TOUR_COURSE_MAX][RANK_REC_SIZE];			/*  40 bytes (8x5)	*/
} Recpack_t;

typedef union {
	Recpack_t	r;
	uwlong		f[RECPACK_SIZE >> 3];
} Recpack;

/******************************************************************************
	external variables
******************************************************************************/
extern int	feep_exist;

/******************************************************************************
	external functions
******************************************************************************/
extern int EepCheck(void);
extern int EepClear(void);
extern int EepReadData(void);
extern int EepWriteData(void);
extern int EepWriteDataTime(int num);
extern int EepWriteDataScore(int num);
extern int EepWriteDataReverse(int num);
extern int EepWriteDataMachine(void);
extern int EepWriteDataClearFlag(void);
extern int EepWriteDataConfig(void);
extern int EepClearDataRecord(int num);
extern int EepClearDataScore(int num);

extern int PfsIsPlug(void);		/* 0: not, 1:plugged */
extern int PfsCheck(void);		/* NOPACK, MOTOR, DEAD, CHANGE			*/
extern int PfsChkFree(void);		/* NOPACK, MOTOR, DEAD, MEMORY, NOTE		*/
extern int PfsFindData(void);		/* NOPACK, MOTOR, DEAD, NODATA, 		*/
extern int PfsReadData(int flag);	/* NOPACK, MOTOR, DEAD, NODATA, EEP, BRKDATA	*/
extern int PfsWriteData(int flag);	/* NOPACK, MOTOR, DEAD, MEMORY			*/
extern int PfsDeleteData(void);		/* NOPACK, MOTOR, DEAD, NODATA			*/




/******************************************************************************
-------------------------------------------------------------------------------
	ghost
-------------------------------------------------------------------------------
******************************************************************************/
#define GHOST_REC_SIZE			30976	/* 256x121 */
#define GHOST_REC_MAX			2
#define GHOST_INFO_REC_SIZE		64
#define GHOST_INFO_REC_PART_SIZE	256
#define GHOST_DATA_REC_SIZE		15360	/* 256x60 */
#define GHOST_DATA_REC_OFS0		GHOST_INFO_REC_PART_SIZE
#define GHOST_DATA_REC_OFS1		(GHOST_INFO_REC_PART_SIZE + GHOST_DATA_REC_SIZE)

typedef struct {
	int	sum_data;
	int	fdata_exist;
	int	ncourse;
	int	level;
	int	ctime;
} Ghost_info;

typedef struct {
	u32		sum_info;
	Ghost_info	info[GHOST_REC_MAX];
} Ghost_info_rec_t;

typedef union {
	Ghost_info_rec_t	i;
	uwlong			f[GHOST_INFO_REC_SIZE >> 3];
} Ghost_info_rec;

extern void ClearGhostInfoData(int num);
extern void ClearGhostInfoDataAll(void);
extern int PfsFindGhostFile(void);		/* NOPACK, MOTOR, DEAD, NODATA			*/
extern int PfsChkFreeGhost(void);		/* NOPACK, MOTOR, DEAD, MEMORY, NOTE		*/
extern int PfsReadGhostInfo(void);		/* NOPACK, MOTOR, DEAD, NODATA, BRKDATA		*/
extern int PfsReadGhostData(int num, u8 *buf);	/* NOPACK, MOTOR, DEAD, NODATA, BRKDATA		*/
extern int PfsWriteGhostData(int num, u8 *buf, int ncourse, int level, int ctime);
						/* NOPACK, MOTOR, DEAD, MEMORY			*/
extern int PfsDeleteGhostFile(void);		/* NOPACK, MOTOR, DEAD, NODATA			*/
	/* empty function, don't use */
extern int PfsDeleteGhostData(int num);		/* NOPACK, MOTOR, DEAD, NODATA, BRKDATA		*/
	/* num : 0 (data 0), 1 (data 1), 2 (data 0 & 1) */

#endif
