
//**************************************************************
//
//						save.c
//
//**************************************************************
#include	<agb.h>
#include	<backup/AgbSram.h>

#include	"define.h"

#define		GLOBAL_VALUE_DEFINE
#include	"save.h"
#undef		GLOBAL_VALUE_DEFINE

#include	"global.h"

//--------------------------------------------------------------
//	コメント
//--------------------------------------------------------------
//	VerifySram	1ﾊﾞｲﾄ単位のﾍﾞﾘﾌｧｲ
//		正常終了	(戻り値 = 0)
//		エラー		(戻り値 = ｴﾗｰ個所のadr)

//--------------------------------------------------------------
//
//--------------------------------------------------------------
extern const u32 ExBackUp_Auto_M_Tbl[2];
extern const u32 ExBackUp_Auto_S_Tbl[2];
extern const u32 ExBackUp_DisCon_Tbl[2];

//--------------------------------------------------------------
//	定義
//--------------------------------------------------------------

//----- SRAM ADR TBL 2SAVE -----(ucSaveNum)
static const u32 SramBackUp_Auto_M_Tbl[] = {
	(u32)SRBACKUP_A_AUTO_M,
	(u32)SRBACKUP_B_AUTO_M,
};
static const u32 SramBackUp_Auto_S_Tbl[] = {
	(u32)SRBACKUP_A_AUTO_S,
	(u32)SRBACKUP_B_AUTO_S,
};
static const u32 SramBackUp_Point_Tbl[] = {
	(u32)SRBACKUP_A_POINT,
	(u32)SRBACKUP_B_POINT,
};
static const u32 SramBackUp_DisCon_Tbl[] = {
	(u32)SRBACKUP_A_DISCON,
	(u32)SRBACKUP_B_DISCON,
};

//==============================================================
//		(CLEAR)SRAM,IMAGE-ALL
//==============================================================
void CartridgeSram_AllClear(void)
{
	DmaClear(3, 0, EXBACKUPIMAGE+0x100 ,  SRAM_SIZE_256K-0x100 , 16);			//CPU外部ワークRAM クリア
	WriteSramEx((u8*)EXBACKUPIMAGE+0x100 , (u8*)SRAM_ADR+0x100 , SRAM_SIZE_256K-0x100);
}
//==============================================================
//		(CLEAR)SRAM,IMAGE-GROUND
//==============================================================
void CartridgeSram_GndClear(void)
{
	DmaClear(3, 0, EXBACKUPIMAGE ,  SRAM_SIZE_256K , 16);			//CPU外部ワークRAM クリア
	WriteSramEx((u8*)EXBACKUPIMAGE , (u8*)SRAM_ADR , SRAM_SIZE_256K);
}
//==============================================================
//		(CLEAR)SRAM-KEYWORD_DISCONTINUE-CLEAR
//				GAME-READ後専用
//==============================================================
void	DisContinue_KeyWord_Clear(void)
{
	DmaClear(3, 0, EXBACKUP_A_DISCON ,  16 , 16);
	WriteSramEx((u8*)EXBACKUP_A_DISCON , (u8*)SramBackUp_DisCon_Tbl[ucSaveNum] , 16);
	DmaClear(3, 0, (EXBACKUP_A_DISCON+EXBACKUP_PT8_DISCONKEY2),  16 , 16);
	WriteSramEx((u8*)EXBACKUP_A_DISCON+EXBACKUP_PT8_DISCONKEY2,
					(u8*)SramBackUp_DisCon_Tbl[ucSaveNum]+EXBACKUP_PT8_DISCONKEY2, 16);
}

//==============================================================
//		(CLEAR)SRAM-KEYWORD_DISCONTINUE-CLEAR
//				READY-DELETE専用
//==============================================================
void	ReadySaveSelect_KeyWord_Clear(u8 num)
{
	WriteSramEx((u8*)ExBackUp_Auto_M_Tbl[num], (u8*)SramBackUp_Auto_M_Tbl[num], 16);
	WriteSramEx((u8*)ExBackUp_Auto_M_Tbl[num]+EXBACKUP_PT8_AUTOKEY2,
			 						(u8*)SramBackUp_Auto_M_Tbl[num]+EXBACKUP_PT8_AUTOKEY2, 16);
	WriteSramEx((u8*)ExBackUp_Auto_S_Tbl[num], (u8*)SramBackUp_Auto_S_Tbl[num], 16);

	WriteSramEx((u8*)ExBackUp_Auto_S_Tbl[num]+EXBACKUP_PT8_AUTOKEY2,
									(u8*)SramBackUp_Auto_S_Tbl[num]+EXBACKUP_PT8_AUTOKEY2, 16);
	WriteSramEx((u8*)ExBackUp_DisCon_Tbl[num], (u8*)SramBackUp_DisCon_Tbl[num], 16);
	WriteSramEx((u8*)ExBackUp_DisCon_Tbl[num]+EXBACKUP_PT8_DISCONKEY2,
									(u8*)SramBackUp_DisCon_Tbl[num]+EXBACKUP_PT8_DISCONKEY2, 16);
}

//==============================================================
//		(WRITE)SRAM-ALL
//==============================================================
void	CartridgeSram_WriteAllImage(void)
{
	WriteSramEx((u8*)EXBACKUPIMAGE , (u8*)SRAM_ADR , SRAM_SIZE_256K);
}

//==============================================================
//		(WRITE)GROUND MAIN
//==============================================================
void	CartridgeSram_WriteGroundImageMain(void)
{
	WriteSramEx((u8*)EXBACKUP_GNDSAVE_M ,(u8*)SRBACKUP_GNDSAVE_M , BACKUP_SIZE_GNDSAVE);
	DmaCopy(3, EXBACKUP_GNDSAVE_M, EXBACKUP_GNDSAVE_T, BACKUP_SIZE_GNDSAVE, 16);	//正常なDATAを main->third
	WriteSramEx((u8*)EXBACKUP_GNDSAVE_T ,(u8*)SRBACKUP_GNDSAVE_T , BACKUP_SIZE_GNDSAVE);
#if CHINA
	WriteSramEx((u8*)EXBACKUP_GNDSAVE_M ,(u8*)SRBACKUP_GNDSAVE_S , BACKUP_SIZE_GNDSAVE);
#endif
}
//==============================================================
//		(WRITE)GROUND SUB
//==============================================================
void	CartridgeSram_WriteGroundImageSub(void)
{
	WriteSramEx((u8*)EXBACKUP_GNDSAVE_S ,(u8*)SRBACKUP_GNDSAVE_S , BACKUP_SIZE_GNDSAVE);
}
//==============================================================
//		(WRITE)GROUND THIRD
//==============================================================
void	CartridgeSram_WriteGroundImageThird(void)
{
	WriteSramEx((u8*)EXBACKUP_GNDSAVE_T ,(u8*)SRBACKUP_GNDSAVE_T , BACKUP_SIZE_GNDSAVE);
}

//==============================================================
//		(WRITE)DISCONTINUE
//==============================================================
void	CartridgeSram_WriteDiscontinueImage(void)
{
	WriteSramEx((u8*)EXBACKUP_A_DISCON , (u8*)SramBackUp_DisCon_Tbl[ucSaveNum] , BACKUP_SIZE_DISCON);
}

//==============================================================
//		(WRITE)AUTO_MAIN
//==============================================================
void	CartridgeSram_WriteAutoMainImage(void)
{
	WriteSramEx((u8*)EXBACKUP_A_AUTO_M , (u8*)SramBackUp_Auto_M_Tbl[ucSaveNum] , BACKUP_SIZE_WORK+BACKUP_SIZE_POINT);
#if CHINA
	WriteSramEx((u8*)EXBACKUP_A_AUTO_M , (u8*)SramBackUp_Auto_S_Tbl[ucSaveNum] , BACKUP_SIZE_WORK+BACKUP_SIZE_POINT);
#endif
}
//==============================================================
//		(WRITE)AUTO_SUB
//==============================================================
void	CartridgeSram_WriteAutoSubImage(void)
{
	WriteSramEx((u8*)EXBACKUP_A_AUTO_S , (u8*)SramBackUp_Auto_S_Tbl[ucSaveNum] , BACKUP_SIZE_WORK+BACKUP_SIZE_POINT);
}

//==============================================================
//		(WRITE)POINT
//==============================================================
void	CartridgeSram_WritePointImage(void)
{
	WriteSramEx((u8*)EXBACKUP_A_POINT , (u8*)SramBackUp_Point_Tbl[ucSaveNum] , BACKUP_SIZE_POINT);
}

//==============================================================
//		(WRITE)AUTO_MAIN SAVE2
//==============================================================
void	CartridgeSram_WriteAutoMainImage2(void)
{
	WriteSramEx((u8*)ExBackUp_Auto_M_Tbl[ucSaveNum] , (u8*)SramBackUp_Auto_M_Tbl[ucSaveNum],
													 BACKUP_SIZE_WORK+BACKUP_SIZE_POINT);
#if CHINA
	WriteSramEx((u8*)ExBackUp_Auto_M_Tbl[ucSaveNum] , (u8*)SramBackUp_Auto_S_Tbl[ucSaveNum] ,	BACKUP_SIZE_WORK+BACKUP_SIZE_POINT);
#endif													
}
//==============================================================
//		(WRITE)AUTO_SUB SAVE2 
//==============================================================
void	CartridgeSram_WriteAutoSubImage2(void)
{
	WriteSramEx((u8*)ExBackUp_Auto_S_Tbl[ucSaveNum] , (u8*)SramBackUp_Auto_S_Tbl[ucSaveNum] ,
													BACKUP_SIZE_WORK+BACKUP_SIZE_POINT);
}
//==============================================================
//		(WRITE)DISCONTINUE SAVE2
//==============================================================
void	CartridgeSram_WriteDiscontinueImage2(void)
{
	WriteSramEx((u8*)ExBackUp_DisCon_Tbl[ucSaveNum], (u8*)SramBackUp_DisCon_Tbl[ucSaveNum] ,
													BACKUP_SIZE_DISCON);
}

//==============================================================
//		(WRITE)SAVE-SELECT NUM
//==============================================================
void	CartridgeSram_WriteSelectSave(void)
{
	WriteSramEx((u8*)EXBACKUP_SELECT , (u8*)SRBACKUP_SELECT , BACKUP_SIZE_SELECT);
}

//==============================================================
//		(WRITE)KEYDATA 採取専用
//==============================================================
void	CartridgeSram_WriteKeyData(void)
{
	WriteSramEx((u8*)EXBACKUP_KEYDATA , (u8*)SRBACKUP_KEYDATA , 0x400);
}


//==============================================================
//		(READ) TO IMAGE GAME	(256k-BACKUP_SIZE_GNDSAVE*2)
//==============================================================
void	CartridgeSram_ReadAllImageGame(void)
{
	ReadSram((u8*)SRBACKUP_SELECT , (u8*)EXBACKUP_SELECT , (SRAM_SIZE_256K-BACKUP_SIZE_GNDSAVE*2));	//READ
}
//==============================================================
//		(READ) TO IMAGE GROUND
//==============================================================
void	CartridgeSram_ReadAllImageGround(void)
{
	ReadSram((u8*)SRBACKUP_GNDSAVE_M , (u8*)EXBACKUP_GNDSAVE_M , BACKUP_SIZE_GNDSAVE*2);	//READ
	ReadSram((u8*)SRBACKUP_GNDSAVE_T , (u8*)EXBACKUP_GNDSAVE_T , BACKUP_SIZE_GNDSAVE);		//READ
}


//**************************************************************
//end
