/*
  ▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲
  △▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽
  
  	File :		m_flashrom.h
  	Programer :	Gentaro Takaki
  
	$Id: m_flashrom.h,v 1.1 2003/06/06 00:15:12 tong Exp $
	
  △▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽
  ▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲▼▲
*/


/*
  *****************************************************************************

  				注意 !!

		ここにあるほとんどの関数, マクロはまだ実験段階です
 
  *****************************************************************************
 */
  

#ifndef	M_FLASHROM_H_INCLUDED
#define	M_FLASHROM_H_INCLUDED

#if	defined(LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)

#ifdef	_LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif

#include "u64basic.h"
#include "m_common_data.h"

#if	defined(FDEBUG) || defined(U_gen_U)
#include "gfxprint.h"
#endif	/** defined(FDEBUG) end */


#define	mFRm_FLASH_DMA_FINISHED		mFRm_FlashDmaCheck( ) == 0

/** フラッシュロムのステータス */
#define	mFRm_FLASH_ROM_DATA_IS_OK		(0)
#define	mFRm_FLASH_ROM_DATA_IS_CRASHED		(1)

/*
 *	フラッシュロム使用領域
 */
#define	mFRm_USE_REAL		(0)
#define	mFRm_USE_BACKUP		(1)
#define	mFRm_USE_MAX		(2)

/** 16Kバイト分のページ数 */
#define	mFRm_ARRAY_PAGE_NUM	(0x080)
/** バックアップの書き込みスタート位置 */
#define	mFRm_BACKUP_START_PAGE_NO	(mFRm_ARRAY_PAGE_NUM * 4)

/*
 *	フラッシュロム領域 バーション
 */
#define	mFRm_FLROM_VERSION	0x00000002	/* 2000.11.16 M.Sasaki	*/
						/* 2001.01.24 服飾デザイナーイベント	*/
/*
  △▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽
	  ■ FlashRomの初期化関数
	  
  	   in	: なし

	   out	: なし

	   返り値	: なし
  ----------------------------------------------------------------------------
 */
extern void mFRm_FlashRomInit( void );
		
/*
 ****************************************************************
 *	使用しているフラッシュロムのエリア
 ****************************************************************
 */
extern int mFRm_GetFlashArea( void );

/*
 ****************************************************************
 *	リペア─行ったかチェック
 ****************************************************************
 */
extern int mFRm_GetRepair( void );

/*
  △▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽
	  ■ FlashRomに DMA中のデータがあるかどうか調べる関数
	  	DMA中であれば 1を DMA中でなければ 0を返す
		
  	   in	: なし

	   out	: なし

	   返り値	: 0 DMA中のデータ無し / 1 DMA中のデータ有り
  ----------------------------------------------------------------------------
 */
extern unchar mFRm_FlashDmaCheck( void );
		
/*
 ****************************************************************
 *	チェックサムの取得
 ****************************************************************
 */
extern unshort mFRm_ReturnCheckSum(
    unshort	*data_p,
    int		size	/** 2バイトのアライメント */
    );

/*
 ****************************************************************
 *	チェックサムの算出
 *
 *	全体の加算値が 0になるようにチェックサムを算出
 ****************************************************************
 */
extern unshort mFRm_GetFlatCheckSum(
    unshort	*data_p,	/** チェックサムを含むデータ */
    int		size,		/**  2バイトのアライメント */
    unshort	now_check_sum	/** 現在のチェックサム */
    );

/*
 ****************************************************************
 *	読み込んだセーブデータのIDチェック
 *
 *	TRUE	正常ID
 *	FALSE	異常ID
 ****************************************************************
 */
extern int mFRm_CheckSaveData_ID(
    mFRm_chk_c	*save_check_p
    );

/*
  △▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽△▽

  	■ 読み込んだセーブデータのチェック

  	TRUE 正常データ / FALSE 異常データ( セーブデータ無しを含む )
  ----------------------------------------------------------------------------
 */
extern int mFRm_CheckSaveData(
    void
    );

/*
 ****************************************************************
 *	指定のセクタからセーブデータを BGで書き込む
 *
 *	正常終了	TRUE
 *	処理中		0
 *	異常終了	-1
 ****************************************************************
 */
extern int mFRm_WriteHalfFlash_bg(
    u32		*buf_p,
    int		status
    );

/*
 ****************************************************************
 *	リペア─情報の初期化
 ****************************************************************
 */
extern void mFRm_ClearRepair( void );

/*
 ******************************************************************************
 *	■ セーブチェックデータのクリア
 ******************************************************************************
 */
extern void mFRm_ClearSaveCheckData(
    mFRm_chk_c *save_check
    );

/*
 ****************************************************************
 *	セーブチェックデータのセット
 ****************************************************************
 */
extern void mFRm_SetSaveCheckData(
    mFRm_chk_c	*save_check_p
    );

/*
 ****************************************************************
 *	ゲーム開始時のセーブデータチェック
 *
 *	処理終了	TRUE
 *	処理中		FALSE
 ****************************************************************
 */
extern int mFRm_RepairSaveData(
    RWF_c		*write_file_p,
    RWF_c		*read_file_p
    );

/*
 ****************************************************************
 *	全データのセーブ関数
 ****************************************************************
 */
extern int mFRm_FlashSaveAllData( void );

/*
 ****************************************************************
 *	フラッシュロム書き込み制御情報クリア
 ****************************************************************
 */
extern void mFRm_ClearFlashromControl( void );

/*
 ****************************************************************
 *	バックグランドでの全データのセーブ
 *
 *	(※ 注意 : TRUEが返ってくるまで呼び続けること )
 ****************************************************************
 */
extern int mFRm_FlashSaveAllData_bg( void );


/*
 ******************************************************************************
 *	全データのロード基本関数
 *
 *	Flashromの仕様でセクタ 511, 1023については後半 64バイトが読み込み不能
 *	そのため, このセクタに関しては問題の部分には読み込みを行わない
 *
 ******************************************************************************
 */
extern int mFRm_FlashLoadAllData_common(
    u32		*buf_p,
    u32		start_sector
    );
/*
 ******************************************************************************
 *	■ 全データのロード関数
 ******************************************************************************
 */
extern int mFRm_FlashLoadAllData( void );

/*
 ****************************************************************
 *	全データロード	zelda_malloc ver.
 *
 *	読み込み成功	TRUE
 *	読み込み失敗	FALSE
 ****************************************************************
 */
extern int mFRm_FlashLoadAllData_malloc( void );











/*
 *	■ Forestのセーブデータの表示( デバッグ用 )
 */
#if	DEBUG
extern void mFRm_PrintForestSaveData2( int no, int no2 );
#endif

    
/*
 ------------------------------------------------------------------------------
 *		ファイナルロム用デバッグ情報表示
 ------------------------------------------------------------------------------
 */
#if	defined(FDEBUG)
extern void mFRm_PrintSavedDebug(
    gfxprint_t	*gfxprint
    );
#endif	/** defined(FDEBUG) end */

#if	defined(FDEBUG) || defined(U_gen_U)
extern void mFRm_PrintErrInfo(
    gfxprint_t	*gfxprint
    );
#endif	/** defined(FDEBUG) || defined(U_gen_U) end */






/** その他 実験中の関数 */
#if	DEBUG
extern void mFRm_TEST( void );
#endif
    
#ifdef	_LANGUAGE_C_PLUS_PLUS
}
#endif

#endif	/** defined(LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */
#endif	/** M_FLASHROM_H_INCLUDED */
