/*
 * $Id: famicom_check.c,v 1.1 2004/02/12 23:00:01 tong Exp $
 *
 * ファミコンエミュレータ
 */

#include "famicom_check.h"
#include "m_cpak_lib.h"         /* m_osPfsFindFile_Alt */
#include "padmgr.h"		/* padmgr_LockSerialMesgQ */
#include <ultra64.h>
#include <debug.h>              /* disp */

#define nesinfo_cpak_company_code    M_CPAK_COMPANY_CODE
#define nesinfo_cpak_game_code       M_CPAK_GAME_CODE

/*
 * ファミコンゲームデータがコントローラパックにあるかどうかをチェックする
 *
 * 会社コード  :1
 * ゲームコード:NSGJ
 * ゲーム名    :NESROMIMAGE
 */
extern int
contpak_exist_check( void )
{
    int status = -1;		/* return value */
    static u8 ext_name[PFS_FILE_EXT_LEN];
    s32 file_no;
    s32 r;
    OSPfs pfs;
    OSMesgQueue *Q = NULL;	/* SI Q */
    int cont_no;

    PRINTF(ESC_YELLOW "コントローラパックにファミコンデータがあるかなチェック\n" ESC_NORMAL);
    
    /*
     * SIの排他制御用ロック
     */
    Q = padmgr_LockSerialMesgQ();

    for (cont_no = 0; cont_no < 2; cont_no++) {
        /*
         * コントローラパック初期化
         * エラーは無視
         */
        r = osPfsInitPak(Q, &pfs, cont_no);
        if (r == 0) {
            /*
             * ファイルを探す
             * 見つかればループを抜ける
             */
            r = m_osPfsFindFile_Alt(&pfs, nesinfo_cpak_company_code, nesinfo_cpak_game_code, (u8 *)M_CPAK_GAME_NAME, ext_name, &file_no);
            if (r == 0) {
                PRINTF0(ESC_YELLOW "ファミコンデータが見つかりました！\n" ESC_NORMAL);
                break;
            } else if (r == PFS_ERR_INVALID) {
                PRINTF0(ESC_WARNING "ファミコンデータが見つかりません！\n" ESC_NORMAL);
            } else {
                PRINTF0(ESC_WARNING "コントローラパックのエラーです\n" ESC_NORMAL);
            }
        } else if (r == PFS_ERR_NOPACK) {
            PRINTF1(ESC_WARNING "コントローラパック %d はありません\n" ESC_NORMAL, cont_no);
        } else {
            PRINTF2(ESC_WARNING "コントローラパック %d の初期化に失敗(%d)しました\n" ESC_NORMAL, cont_no, r);
        }
    }

    if (cont_no >= 2)
        goto error_exit;
    
    /*
     * 成功！
     */
    status = 0;
    
error_exit:

    if (r != 0) {
	disp(d, r);
    }
    
    /*
     * SIの排他制御用ロック解除
     */
    if (Q != NULL) {
	padmgr_UnlockSerialMesgQ( Q );
	Q = NULL;
    }

    return status;
}
