/*
 ******************************************************************************
 *  	File 		: s_cpak.h
 *	Programer	: Gentaro Takaki
 *  
 *	$Id: s_cpak.h,v 1.2 2004/02/12 22:54:41 tong Exp $
 ******************************************************************************
 */
#ifndef S_CPAK_H_INCLUDED
#define S_CPAK_H_INCLUDED

#if	defined(LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)

#ifdef	_LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif

#include "ultra64.h"
#include "os.h"

/*
 ***************************************
 *	コントローラパックファイル構造体
 ***************************************
 */
typedef struct contpak_file_s	sCPk_pkf_c;
struct contpak_file_s {
    OSPfs	pfs;    	/** ファイルハンドル */
    s32		file_no;	/** ノート番号 */
    s32		error;		/** エラーメッセージ番号 */
};



/*
 ****************************************************************
 *	会社コードとゲームコード設定関数
 *
 *	in	: 会社コード (u8 *)
 *		  ゲームコード (u8 *)
 *
 *	out	: ファイルステータス構造体 (OSPfsState *)
 *
 *	返り値	: なし
 ****************************************************************
 */
extern void sCPk_SetCode(
    OSPfsState *pakstate,	/** ファイルステータス構造体 */
    const u8 *co_code,		/** 会社コード */
    const u8 *game_code		/** ゲーム構造体 */
    );


/*
 ****************************************************************
 *	指定したコントローラにパックがささっているかチェック
 *	コントローラパックのファイルハンドルの初期化を行う
 *
 *	in	: コントローラ番号 (int)
 *		  
 *	out	: コントローラパックファイル構造体 (sCPk_pkf_c *)
 *
 *	返り値	: 正常終了 1
 *		  異常終了 0
 ****************************************************************
 */
extern int sCPk_PakOpen(
    sCPk_pkf_c *pakf,			/** コントローラパックファイル構造体 */
    int pakno				/** コントローラ番号 */
    );

/*
 ****************************************************************
 *	コントローラパックの空き領域をチェックする関数
 *
 *	in	: コントローラパックファイル構造体 (sCPk_pkf_c *)
 *
 *	out	: なし
 *
 *	返り値	: 空き領域バイト数 (s32)
 *---------------------------------------------------------------
 *   (♀)備考
 *	使用するファイルハンドル ( OSPfs構造体 )は,
 *	sCPk_PakOpenによって, 初期化しておく必要があります.
 ****************************************************************
 */
extern s32 sCPk_PakFreeArea(
    sCPk_pkf_c *pakf	/** コントローラパックファイル構造体 */
    );

/*
 ******************************************************************************
 *	コントローラパック書き込み関数
 *
 *	in	: コントローラパックファイル構造体 (sCPk_pkf_c *)
 *		  パック中のゲームデータ領域内の書き込み位置 (int)
 *		  書き込みサイズ  バイト (int)
 *		  書き込みバッファ (u8 *)
 *		  
 *	out	: エラーメッセージコード (パックファイル構造体中)
 *
 *	返り値	: 1 正常終了 / 0 異常終了
 * ---------------------------------------------------------------------------
 * (♀)備考 ... 指定したサイズが 32の倍数でない場合にはアライメントされます.
 *   		指定するサイズはノートのファイルサイズよりも小さくなくてはい
 *		けません. また, パックの容量以上の指定も禁止です.
 *		使用するファイルハンドル ( OSPfs構造体 )は, sCPk_PakOpenに
 *		よって, 初期化しておく必要があります.
 ******************************************************************************
 */
extern int sCPk_Save(
    sCPk_pkf_c *pakf,	/** コントローラパックファイル構造体 */
    int offset_byt,	/** 書き込み位置 */
    int size,		/** 書き込みサイズ */
    u8 *data		/** 書き込みバッファ */
    );

/*
 ******************************************************************************
 *	コントローラパック読み込み関数
 *
 *	in	: コントローラパックファイル構造体 (sCPk_pkf_c *)
 *		  パック中のゲームデータ領域内の読み込み位置 (int)
 *		  読み込みサイズ  バイト (int)
 *		  読み込みバッファ (u8 *)
 *		  
 *	out	: エラーメッセージコード (パックファイル構造体中)
 *
 *	返り値	: 1 正常終了 / 0 異常終了
 * ---------------------------------------------------------------------------
 * (♀)備考 ... 指定したサイズが 32の倍数でない場合にはアライメントされます.
 *   		指定するサイズはノートのファイルサイズよりも小さくなくてはい
 *		けません. また, パックの容量以上の指定も禁止です.
 *		使用するファイルハンドル ( OSPfs構造体 )は, sCPk_PakOpenに
 *		よって, 初期化しておく必要があります.
 ******************************************************************************
 */
extern int sCPk_Load(
    sCPk_pkf_c *pakf,	/** コントローラパックファイル構造体 */
    int offset_byt,	/** 読み込み開始位置 */
    int size,		/** 読み込みサイズ */
    u8 *data		/** 読み込みバッファ */
    );


/*
 ******************************************************************************
 *	新規ゲームノートの作成関数
 *
 *	in	: コントローラパックファイル構造体 (sCPk_pkf_c *)
 *		  ファイルステータス構造体 (OSPfsState *)
 *		  ノートサイズ (int)
 *		  
 *	out	: エラーメッセージコード (パックファイル構造体中)
 *
 *	返り値	: 1 正常終了 / 0 異常終了
 * ---------------------------------------------------------------------------
 * (♀)備考 ...	使用するファイルハンドル ( OSPfs構造体 )は, sCPk_PakOpenに
 *		よって, 初期化しておく必要があります.
 *		ファイルステータス構造体 (OSPfsState)は, 前もって各値を
 *		セットしておく必要があります.
 *		指定するノートサイズは, 256の倍数でなくてはいけません.
 *		 256の倍数でない場合はアライメントされます. また, パック内
 *		に指定したサイズより大きい空き領域がない場合は, 異常終了し
 *		ます. すでにパック内に 16冊のゲームノートが存在する場合も
 *		新規作成されません.
 ******************************************************************************
 */
extern int sCPk_MakeFile(
    sCPk_pkf_c *pakf,		/** コントローラパックファイル構造体 */
    OSPfsState *pak_state,	/** ファイルステータス構造体 */
    int size			/** 新規作成ノートのサイズ */
    );

/*
 ******************************************************************************
 *	ゲームノートのオープン関数
 *
 *	in	: コントローラパックファイル構造体 (sCPk_pkf_c *)
 *		  ファールステータス構造体 (OSPfsState *)
 *		  
 *	out	: エラーメッセージコード (パックファイル構造体中)
 *
 *	返り値	: 1 正常終了 / 0 異常終了
 * ---------------------------------------------------------------------------
 * (♀)備考 ...	使用するファイルハンドル ( OSPfs構造体 )は, sCPk_PakOpenに
 *		よって, 初期化しておく必要があります.
 *		ファイルステータス構造体 (OSPfsState)は, 前もって各値を
 *		セットしておく必要があります.
 ******************************************************************************
 */
extern int sCPk_FileOpen(
    sCPk_pkf_c *pakf,		/** コントローラパックファイル構造体 */
    OSPfsState *pak_state	/** ファイルステータス構造体 */
    );

/*
 ******************************************************************************
 *	ゲームノートの消去関数
 *
 *	in	: コントローラパックファイル構造体 (sCPk_pkf_c *)
 *		  ファールステータス構造体 (OSPfsState *)
 *		  
 *	out	: エラーメッセージコード (パックファイル構造体中)
 *
 *	返り値	: 1 正常終了 / 0 異常終了
 * ---------------------------------------------------------------------------
 * (♀)備考 ...	使用するファイルハンドル ( OSPfs構造体 )は, sCPk_PakOpenに
 *		よって, 初期化しておく必要があります.
 *		ファイルステータス構造体 (OSPfsState)は, 前もって各値を
 *		セットしておく必要があります.
 ******************************************************************************
 */
extern int sCPk_DeleteFile(
    sCPk_pkf_c *pakf,		/** コントローラパックファイル構造体 */
    OSPfsState *pak_state	/** ファイルステータス構造体 */
    );
    
/*
 ******************************************************************************
 *	ゲームノートの消去関数
 *
 *	in	: コントローラパックファイル構造体 (sCPk_pkf_c *)
 *
 *	out	: エラーメッセージコード (パックファイル構造体中)
 *		  ファールステータス構造体 (OSPfsState *)
 *
 *	返り値	: ファイルサイズ (u32) / 0 異常終了
 *  ---------------------------------------------------------------------------
 * (♀)備考 ...	使用するファイルハンドル ( OSPfs構造体 )は, sCPk_PakOpenに
 *		よって, 初期化しておく必要があります.
 *		OSPfs構造体中の file_noで指定したゲームノートの
 *		ファイルステータス構造体を求めます.
 ******************************************************************************
 */
extern u32 sCPk_FileState(
    sCPk_pkf_c *pakf,		/** コントローラパックファイル構造体 */
    OSPfsState *pak_state	/** ファイルステータス構造体 */
    );

/*
 ******************************************************************************
 *	パックの最大ノート数と使用ノート数の取得関数
 *
 *	in	: コントローラパックファイル構造体 (sCPk_pkf_c *)
 *	  
 *	out	: 最大ノート数 (s32)
 *		  使用ノート数 (s32)
 *
 *	返り値	: 1 正常終了 / 0 異常終了
 * ---------------------------------------------------------------------------
 * (♀)備考 ...	使用するファイルハンドル ( OSPfs構造体 )は, sCPk_PakOpenに
 *		よって, 初期化しておく必要があります.
 ******************************************************************************
 */
extern int sCPk_FileNum(
    sCPk_pkf_c *pakf,	/** コントローラパックファイル構造体 */
    s32 *max_files,	/** 最大ノート数 */
    s32 *files_used	/** 使用ノート数 */
    );

/*
 ******************************************************************************
 *	コントローラパックのファイルシステムの修正関数
 *
 *	in	: コントローラパックファイル構造体 (sCPk_pkf_c *)
 *	  
 *	out	: エラーメッセージコード (sCPk_pkf_c中)
 *
 *	返り値	: 1 正常終了 / 0 異常終了
 * ---------------------------------------------------------------------------
 * (♀)備考 ...	使用するファイルハンドル ( OSPfs構造体 )は, sCPk_PakOpenに
 *		よって, 初期化しておく必要があります.
 ******************************************************************************
 */
extern int sCPk_RepairID(
    sCPk_pkf_c *pakf	/** コントローラパックファイル構造体 */
    );

/*
 ****************************************************************
 *	別スレッドで書き込み開始
 ****************************************************************
 */
extern void sCPk_Save_bg(
    sCPk_pkf_c *const	pakf_p,
    int const		offset_byt,
    int const		size,
    u8 *const		data_p
    );

/*
 ****************************************************************
 *	書き込み終了チェック
 *
 *	終了		1
 *	処理中		0
 *	パックなし	-1
 ****************************************************************
 */
extern s32 sCPk_PakWrite_isFinished( void );
    
/*
 ****************************************************************
 *	別スレッド後始末処理
 ****************************************************************
 */
extern s32 sCPk_Pak_sync( void );

/*
 ******************************************
 *	FGで書き込み ( 開始〜終了 )
 ******************************************
 */
extern s32 sCPk_Save_fg(
    sCPk_pkf_c *const	pakf_p,
    int const		offset_byt,
    int const		size,
    u8 *const		data_p
    );
/*
 ****************************************************************
 *	パックバックグランドステータス取得
 ****************************************************************
 */
extern s32 mCPk_GetPakCommandStatus( void );


#ifdef _LANGUAGE_C_PLUS_PLUS
} /* extern "C" */
#endif

#endif
#endif
