/************************************************************************
 *									*
 *	¥¹¥¿¡¼ ¥Õ¥©¥Ã¥¯¥¹ ¤Î £Å£Å£Ð£Ò£Ï£ÍÁàºî				*
 *				1997Ç¯ 1·î29Æü(¿åÍËÆü) 16»þ05Ê¬38ÉÃ JST	*
 ************************************************************************/
#include "sys_main.h"
#include "fox_eeprom.h"

eeprom	fox_save;	/* ¥¹¥¿¡¼ ¥Õ¥©¥Ã¥¯¥¹ ¤Î £Ó£Á£Ö£Å £Ä£Á£Ô£Á */
char	fox_save_initial[] = {
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* pl_stat */
    1, 2, 3, 4,						/* no_data1 */
    0,							/* sound_mode */
    99,							/* sound_music */
    99,							/* sound_voice */
    99,							/* sound_se */
    'F', 'O', 'X',					/* rank_name[0] */
    'P', 'E', 'P',					/* rank_name[1] */
    'S', 'L', 'P',					/* rank_name[2] */
    'F', 'A', 'L',					/* rank_name[3] */
    'W', 'L', 'F',					/* rank_name[4] */
    'L', 'O', 'N',					/* rank_name[5] */
    'P', 'I', 'G',					/* rank_name[6] */
    'A', 'N', 'L',					/* rank_name[7] */
    'B', 'I', 'L',					/* rank_name[8] */
    'C', 'A', 'T',					/* rank_name[9] */
    1,							/* rank_rootptr[0] */
    1,							/* rank_rootptr[1] */
    1,							/* rank_rootptr[2] */
    1,							/* rank_rootptr[3] */
    1,							/* rank_rootptr[4] */
    1,							/* rank_rootptr[5] */
    1,							/* rank_rootptr[6] */
    1,							/* rank_rootptr[7] */
    1,							/* rank_rootptr[8] */
    1,							/* rank_rootptr[9] */
    0,							/* rank_zanki[0] */
    0,							/* rank_zanki[1] */
    0,							/* rank_zanki[2] */
    0,							/* rank_zanki[3] */
    0,							/* rank_zanki[4] */
    0,							/* rank_zanki[5] */
    0,							/* rank_zanki[6] */
    0,							/* rank_zanki[7] */
    0,							/* rank_zanki[8] */
    0,							/* rank_zanki[9] */
    0, 0,						/* rank_time[0] */
    0, 0,						/* rank_time[1] */
    0, 0,						/* rank_time[2] */
    0, 0,						/* rank_time[3] */
    0, 0,						/* rank_time[4] */
    0, 0,						/* rank_time[5] */
    0, 0,						/* rank_time[6] */
    0, 0,						/* rank_time[7] */
    0, 0,						/* rank_time[8] */
    0, 0,						/* rank_time[9] */
    100, 0x90, 9, 0x57, 9, 0xb7, 9, 0x87, 9, 0x37, 9, 0x17, 9, 0xf7,	/* rank_stage[0] */
    90, 0x90, 9, 0x54, 9, 0x64, 9, 0xd4, 9, 0x74, 9, 0x14, 9, 0xf4,	/* rank_stage[1] */
    80, 0x90, 9, 0x02, 9, 0xc2, 9, 0x42, 9, 0xa2, 9, 0x22, 9, 0xe2,	/* rank_stage[2] */
    70, 0x90, 9, 0x01, 9, 0xc1, 9, 0x41, 9, 0xa1, 9, 0x21, 9, 0xe1,	/* rank_stage[3] */
     60, 0x90, 9, 0x05, 9, 0xc5, 9, 0x45, 9, 0xa5, 9, 0x25, 9, 0xe5,	/* rank_stage[4] */
     50, 0x90, 4, 0x03, 9, 0xc3, 9, 0x43, 9, 0xa3, 9, 0x23, 9, 0xe3,	/* rank_stage[5] */
     40, 0x90, 1, 0x06, 2, 0xc6, 9, 0x46, 9, 0xa6, 9, 0x26, 9, 0xe6,	/* rank_stage[6] */
     30, 0x90, 1, 0x02, 1, 0xc4, 1, 0x47, 8, 0xa5, 9, 0x23, 9, 0xe6,	/* rank_stage[7] */
     20, 0x90, 1, 0x03, 1, 0xc5, 1, 0x47, 1, 0xa4, 6, 0x22, 9, 0xe1,	/* rank_stage[8] */
     10, 0x90, 1, 0x07, 1, 0xc4, 1, 0x44, 1, 0xa2, 1, 0x21, 4, 0xe5,	/* rank_stage[9] */
    255,							/* last_rname */
    9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9,	/* no_data2 */
};

/*======================================================================*
 *									*
 *	¥Ç¡¼¥¿¤Î¥Á¥§¥Ã¥¯¥µ¥à¤ò¤·¤é¤Ù¤ë					*
 *									*
 *======================================================================*/
static unsigned short getchecksum(
    eeprom	*d
)
{
    int			i;
    unsigned short	data = 0;

    for(i = 0; i < EEPROM_SIZE / 2 - 2; i += 1) {
	data ^= d->rom[0].ckeck_sum.data[i];
	data <<= 1;
	data = (data & 0x00fe) | ((data >> 8) & 0x0001);
    }
    data = (data & 0x00ff) | 0x9500;
    return data;
}

/*======================================================================*
 *									*
 *	¥Ç¡¼¥¿¤Î¥»¡¼¥Ö							*
 *									*
 *======================================================================*/
int data_save(void)
{
    OSMesg	osmsg;

    fox_save.rom[0].ckeck_sum.check = getchecksum(&fox_save);
    fox_save.rom[1] = fox_save.rom[0];
    eeprom_data = fox_save;
    osSendMesg(&controllerMsgQ, (OSMesg)MSG_EEPR_SAVE, OS_MESG_NOBLOCK);
    osRecvMesg(&eepromMsgQ, &osmsg, OS_MESG_BLOCK);
    if((int)osmsg != MSG_EEPR_CORRECT) {
	return -1;
    }
    return 0;
}
/*======================================================================*
 *									*
 *	¥Ç¡¼¥¿¤Î¥í¡¼¥É							*
 *									*
 *======================================================================*/
int data_load(void)
{
    OSMesg	osmsg;
    int		i;

    osSendMesg(&controllerMsgQ, (OSMesg)MSG_EEPR_LOAD, OS_MESG_NOBLOCK);
    osRecvMesg(&eepromMsgQ, &osmsg, OS_MESG_BLOCK);
    if((int)osmsg != MSG_EEPR_CORRECT) {
	return -1;
    }
    fox_save = eeprom_data;
    if(fox_save.rom[0].ckeck_sum.check == getchecksum(&fox_save)) {
	PRINTF("£Å£Å£Ð£Ò£Ï£Í £Ò£Ï£Í¡Î£°¡Ï Àµ¾ï\n");
	return 0;
    }
    for(i = 0; i < EEPROM_SIZE / 2 - 1; i += 1) {
	fox_save.rom[0].ckeck_sum.data[i] =
	    fox_save.rom[1].ckeck_sum.data[i];
    }
    fox_save.rom[0].ckeck_sum.check = fox_save.rom[1].ckeck_sum.check;
    if(fox_save.rom[0].ckeck_sum.check == getchecksum(&fox_save)) {
	PRINTF("£Å£Å£Ð£Ò£Ï£Í £Ò£Ï£Í¡Î1¡Ï Àµ¾ï\n");
	return 0;
    }
    PRINTF("£Å£Å£Ð£Ò£Ï£Í £Ò£Ï£Í¡Î£°¡Ï ¡õ £Ò£Ï£Í¡Î1¡Ï °Û¾ï\n");
    return -1;
}
