デバッガと実機で挙動が違いすぎるとデバッグに支障があるためゲームモードの関数を統一。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@784 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
nakasima 2008-03-03 05:55:19 +00:00
parent 7f0cd0f8f9
commit 339352192e
13 changed files with 297 additions and 222 deletions

View File

@ -29,7 +29,14 @@ TWL_PROC = ARM7
SRCDIR = ./src SRCDIR = ./src
INCDIR = ./include INCDIR = ./include
SRCS = blowfish.c hotsw.c ds_blowfish_table.c dsCardType1.c dsCardType2.c romEmulation.c customNDma.c SRCS = blowfish.c \
hotsw.c \
ds_blowfish_table.c \
dsCardCommon.c \
dsCardType1.c \
dsCardType2.c \
romEmulation.c \
customNDma.c \
TARGET_LIB = libhotsw_sp$(TWL_LIBSUFFIX).a TARGET_LIB = libhotsw_sp$(TWL_LIBSUFFIX).a

View File

@ -1,8 +1,8 @@
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Project: TwlFirm - GCD - include Project: TwlIPL - HOTSW - include
File: blowfish.h File: blowfish.h
Copyright 2007 Nintendo. All rights reserved. Copyright 2007-2008 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo proprietary information of Nintendo of America Inc. and/or Nintendo
@ -10,8 +10,8 @@
not be disclosed to third parties or copied or duplicated in any form, not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo. in whole or in part, without the prior written consent of Nintendo.
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#ifndef FIRM_GCD_BLOWFISH_H #ifndef HOTSW_GCD_BLOWFISH_H
#define FIRM_GCD_BLOWFISH_H #define HOTSW_GCD_BLOWFISH_H
#include <twl/types.h> #include <twl/types.h>
@ -47,4 +47,4 @@ void GCDm_MakeBlowfishTableDS(BLOWFISH_CTX *tableBufp, ROM_Header_Short *rhs, u3
} /* extern "C" */ } /* extern "C" */
#endif #endif
#endif // FIRM_GCD_BLOWFISH_H #endif // HOTSW_GCD_BLOWFISH_H

View File

@ -1,5 +1,5 @@
#ifndef __CUSTOM_NDMA_H__ #ifndef __HOTSW_CUSTOM_NDMA_H__
#define __CUSTOM_NDMA_H__ #define __HOTSW_CUSTOM_NDMA_H__
#include <twl.h> #include <twl.h>
@ -17,4 +17,4 @@ void HOTSW_NDmaCopy_Card(u32 ndmaNo, const void *src, void *dest, u32 size);
} /* extern "C" */ } /* extern "C" */
#endif #endif
#endif // __CUSTOM_NDMA_H__ #endif // __HOTSW_CUSTOM_NDMA_H__

View File

@ -0,0 +1,39 @@
/*---------------------------------------------------------------------------*
Project: TwlSDK
File:
*---------------------------------------------------------------------------*/
#ifndef __HOTSW_DSCARD_COMMON_H__
#define __HOTSW_DSCARD_COMMON_H__
#include <twl.h>
#include <hotswTypes.h>
#ifdef __cplusplus
extern "C" {
#endif
// ===========================================================================
// Function Describe
// ===========================================================================
// ■ ノーマルモードのコマンド ■
// DSカードのーマルモードのID読み込み
HotSwState ReadIDNormal(CardBootData *cbd);
// カード側のKeyTableをロード
HotSwState LoadTable(void);
// デバッガのROMエミュレーション情報読み込み
HotSwState ReadRomEmulationData(CardBootData *cbd);
// ■ ゲームモードのコマンド ■
// DSカードのゲームモードのID読み込み
HotSwState ReadIDGame(CardBootData *cbd);
// DSカードのゲームモードの指定ページ読み込み
HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif // __HOTSW_DSCARD_COMMON_H__

View File

@ -2,8 +2,8 @@
Project: TwlSDK Project: TwlSDK
File: File:
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#ifndef __DSCARD_TYPE1_H__ #ifndef __HOTSW_DSCARD_TYPE1_H__
#define __DSCARD_TYPE1_H__ #define __HOTSW_DSCARD_TYPE1_H__
#include <twl.h> #include <twl.h>
#include <hotswTypes.h> #include <hotswTypes.h>
@ -41,15 +41,8 @@ HotSwState SwitchOFFPNGSecure_DSType1(CardBootData *cbd);
HotSwState ChangeModeSecure_DSType1(CardBootData *cbd); HotSwState ChangeModeSecure_DSType1(CardBootData *cbd);
// ■ ゲームモードのコマンド ■
// DSカードType1のゲームモードのID読み込み
HotSwState ReadIDGame_DSType1(CardBootData *cbd);
// DSカードType1のゲームモードの指定ページ読み込み
HotSwState ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u32 size);
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
#endif #endif
#endif // __DSCARD_TYPE1_H__ #endif // __HOTSW_DSCARD_TYPE1_H__

View File

@ -2,8 +2,8 @@
Project: TwlSDK Project: TwlSDK
File: File:
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#ifndef __DSCARD_TYPE2_H__ #ifndef __HOTSW_DSCARD_TYPE2_H__
#define __DSCARD_TYPE2_H__ #define __HOTSW_DSCARD_TYPE2_H__
#include <twl.h> #include <twl.h>
#include <hotswTypes.h> #include <hotswTypes.h>
@ -40,15 +40,8 @@ HotSwState SwitchOFFPNGSecure_DSType2(CardBootData *cbd);
HotSwState ChangeModeSecure_DSType2(CardBootData *cbd); HotSwState ChangeModeSecure_DSType2(CardBootData *cbd);
// ■ ゲームモードのコマンド ■
// DSカードType2のゲームモードのID読み込み (Type1と同じ処理)
#define ReadIDGame_DSType2 ReadIDGame_DSType1
// DSカードType2のゲームモードの指定ページ読み込み
#define ReadPageGame_DSType2 ReadPageGame_DSType1
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
#endif #endif
#endif // __DSCARD_TYPE2_H__ #endif // __HOTSW_DSCARD_TYPE2_H__

View File

@ -242,8 +242,6 @@ typedef struct CardBootData{
u32 arm9Ltd; u32 arm9Ltd;
u32 arm7Ltd; u32 arm7Ltd;
u32 secureLatency;
BOOL twlFlg; BOOL twlFlg;
BOOL debuggerFlg; BOOL debuggerFlg;
@ -251,6 +249,8 @@ typedef struct CardBootData{
u32 keyBuf[KEY_BUF_SIZE]; u32 keyBuf[KEY_BUF_SIZE];
CardTypeEx cardType; CardTypeEx cardType;
u32 secureLatency;
u32 gameCommondParam;
BootSegmentData *pBootSegBuf; BootSegmentData *pBootSegBuf;
u32 *pSecureSegBuf; u32 *pSecureSegBuf;

View File

@ -2,8 +2,8 @@
Project: TwlSDK Project: TwlSDK
File: romEmulation.h File: romEmulation.h
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
#ifndef __ROM_EMULATION_H__ #ifndef __HOTSW_ROM_EMULATION_H__
#define __ROM_EMULATION_H__ #define __HOTSW_ROM_EMULATION_H__
#include <twl.h> #include <twl.h>
#include <hotswTypes.h> #include <hotswTypes.h>
@ -52,4 +52,4 @@ HotSwState ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32
} /* extern "C" */ } /* extern "C" */
#endif #endif
#endif // __ROM_EMULATION_H__ #endif // __HOTSW_ROM_EMULATION_H__

View File

@ -0,0 +1,212 @@
/*---------------------------------------------------------------------------*
Project: TwlSDK
File: dsCardType1.c
*---------------------------------------------------------------------------*/
#include <twl.h>
#include <blowfish.h>
#include <dsCardCommon.h>
#include <customNDma.h>
// define -------------------------------------------------------------------
#define ROM_EMULATION_START_OFS 0x160
#define ROM_EMULATION_END_OFS 0x180
// Function prototype -------------------------------------------------------
// ===========================================================================
// Function Describe
// ===========================================================================
// ■------------------------------------■
// ■ ノーマルモードのコマンド ■
// ■------------------------------------■
/* -----------------------------------------------------------------
* ReadIDNormal関数
*
* IDを読み込む関数
* ----------------------------------------------------------------- */
HotSwState ReadIDNormal(CardBootData *cbd)
{
// カード割り込みによるDMAコピー
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_nml, sizeof(cbd->id_nml) );
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x00000090;
reg_HOTSW_MCCMD1 = 0x00000000;
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
// MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に)
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK);
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
return HOTSW_SUCCESS;
}
/* -----------------------------------------------------------------
* LoadTable関数
*
* Key Table
*
*
*
* ----------------------------------------------------------------- */
HotSwState LoadTable(void)
{
u32 temp;
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x0000009f;
reg_HOTSW_MCCMD1 = 0x00000000;
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に)
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x5 << PC_SHIFT);
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
temp = reg_HOTSW_MCD1;
}
return HOTSW_SUCCESS;
}
/*---------------------------------------------------------------------------*
Name: ReadRomEmulationData
Description: Romエミュレーションデータの読み込み
*---------------------------------------------------------------------------*/
HotSwState ReadRomEmulationData(CardBootData *cbd)
{
u32 count=0;
u32 temp;
u32 *dst = cbd->romEmuBuf;
// 量産用CPUでは平文アクセス防止のためリードしない
if ( ! (*(u8*)(OS_CHIPTYPE_DEBUGGER_ADDR) & OS_CHIPTYPE_DEBUGGER_MASK) )
{
return HOTSW_SUCCESS;
}
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x3e000000;
reg_HOTSW_MCCMD1 = 0x0;
// MCCNT1 レジスタ設定 (START = 1 PC = 001(1ページリード)に latency1 = 0x5fe)
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0x5fe & LATENCY1_MASK);
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
if(count >= ROM_EMULATION_START_OFS && count < ROM_EMULATION_END_OFS){
*dst++ = reg_HOTSW_MCD1;
}
else{
temp = reg_HOTSW_MCD1;
}
count+=4;
}
MI_CpuCopyFast(cbd->romEmuBuf, (void*)HW_ISD_RESERVED, 32);
return HOTSW_SUCCESS;
}
// ■------------------------------------■
// ■ ゲームモードのコマンド ■
// ■------------------------------------■
/*---------------------------------------------------------------------------*
* Name: ReadIDGame
*
* Description: IDを読み込む
*---------------------------------------------------------------------------*/
HotSwState ReadIDGame(CardBootData *cbd)
{
if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR;
}
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) );
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x000000B8;
reg_HOTSW_MCCMD1 = 0x00000000;
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ)
reg_HOTSW_MCCNT1 = cbd->gameCommondParam |
START_MASK | (PC_MASK & (0x7 << PC_SHIFT));
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
return HOTSW_SUCCESS;
}
/*---------------------------------------------------------------------------*
* Name: ReadPageGame
*
* Description:
*
* CT=150ns Pagecount=1page Latency=RomHeaderで指定の値
*---------------------------------------------------------------------------*/
HotSwState ReadPageGame(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
{
u32 loop, counter=0;
u64 i, page;
GCDCmd64 cndLE, cndBE;
page = (u32)(start_addr / PAGE_SIZE);
loop = (u32)(size / PAGE_SIZE);
loop = (size % PAGE_SIZE) ? loop + 1 : loop;
// OS_TPrintf("Src Addr : 0x%08x Dst Addr : 0x%08x\n", start_addr, buf);
// OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size);
for(i=0; i<loop; i++){
if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR;
}
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (u32 *)buf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
// ゼロクリア
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
// コマンド作成
cndLE.dw = (page + i) << 33;
cndLE.dw |= 0xB700000000000000;
// ビッグエンディアンに直す(暗号化後)
cndBE.b[7] = cndLE.b[0];
cndBE.b[6] = cndLE.b[1];
cndBE.b[5] = cndLE.b[2];
cndBE.b[4] = cndLE.b[3];
cndBE.b[3] = cndLE.b[4];
cndBE.b[2] = cndLE.b[5];
cndBE.b[1] = cndLE.b[6];
cndBE.b[0] = cndLE.b[7];
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) その他Romヘッダの情報におまかせ)
reg_HOTSW_MCCNT1 = cbd->gameCommondParam |
START_MASK | (PC_MASK & (0x1 << PC_SHIFT));
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
}
return HOTSW_SUCCESS;
}

View File

@ -354,28 +354,7 @@ HotSwState ChangeModeSecure_DSType1(CardBootData *cbd)
* *
* Description: IDを読み込む * Description: IDを読み込む
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
HotSwState ReadIDGame_DSType1(CardBootData *cbd) // 共通
{
if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR;
}
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_gam, sizeof(cbd->id_gam) );
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x000000B8;
reg_HOTSW_MCCMD1 = 0x00000000;
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 111(ステータスリード) その他Romヘッダの情報におまかせ)
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.game_cmd_param |
START_MASK | (PC_MASK & (0x7 << PC_SHIFT));
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
return HOTSW_SUCCESS;
}
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
* Name: ReadPageGame_DSType1 * Name: ReadPageGame_DSType1
@ -384,55 +363,5 @@ HotSwState ReadIDGame_DSType1(CardBootData *cbd)
* *
* CT=150ns Pagecount=1page Latency=RomHeaderで指定の値 * CT=150ns Pagecount=1page Latency=RomHeaderで指定の値
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
HotSwState ReadPageGame_DSType1(CardBootData *cbd, u32 start_addr, void* buf, u32 size) // 共通
{
u32 loop, counter=0;
u64 i, page;
GCDCmd64 cndLE, cndBE;
page = (u32)(start_addr / PAGE_SIZE);
loop = (u32)(size / PAGE_SIZE);
loop = (size % PAGE_SIZE) ? loop + 1 : loop;
// OS_TPrintf("Src Addr : 0x%08x Dst Addr : 0x%08x\n", start_addr, buf);
// OS_TPrintf("Read Game Segment Page Count : %d size : %x\n", loop, size);
for(i=0; i<loop; i++){
if(!HOTSW_IsCardAccessible()){
return HOTSW_PULLED_OUT_ERROR;
}
// NewDMA転送の準備
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, (u32 *)buf + (u32)(PAGE_WORD_SIZE*i), PAGE_SIZE );
// ゼロクリア
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
// コマンド作成
cndLE.dw = (page + i) << 33;
cndLE.dw |= 0xB700000000000000;
// ビッグエンディアンに直す(暗号化後)
cndBE.b[7] = cndLE.b[0];
cndBE.b[6] = cndLE.b[1];
cndBE.b[5] = cndLE.b[2];
cndBE.b[4] = cndLE.b[3];
cndBE.b[3] = cndLE.b[4];
cndBE.b[2] = cndLE.b[5];
cndBE.b[1] = cndLE.b[6];
cndBE.b[0] = cndLE.b[7];
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = *(u32*)cndBE.b;
reg_HOTSW_MCCMD1 = *(u32*)&cndBE.b[4];
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 001(1ページリード) その他Romヘッダの情報におまかせ)
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.game_cmd_param |
START_MASK | (PC_MASK & (0x1 << PC_SHIFT));
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
}
return HOTSW_SUCCESS;
}

View File

@ -423,7 +423,7 @@ HotSwState ChangeModeSecure_DSType2(CardBootData *cbd)
Description: IDを読み込む Description: IDを読み込む
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
// Type1と同じ // 共通
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
@ -431,4 +431,4 @@ HotSwState ChangeModeSecure_DSType2(CardBootData *cbd)
* *
* Description: * Description:
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
// Type1と同じ // 共通

View File

@ -16,6 +16,7 @@
#include <sysmenu.h> #include <sysmenu.h>
#include <hotswTypes.h> #include <hotswTypes.h>
#include <blowfish.h> #include <blowfish.h>
#include <dsCardCommon.h>
#include <dsCardType1.h> #include <dsCardType1.h>
#include <dsCardType2.h> #include <dsCardType2.h>
#include <romEmulation.h> #include <romEmulation.h>
@ -34,9 +35,6 @@
#define DIGEST_HASH_BLOCK_SIZE_SHA1 (512/8) #define DIGEST_HASH_BLOCK_SIZE_SHA1 (512/8)
#define ROM_EMULATION_START_OFS 0x160
#define ROM_EMULATION_END_OFS 0x180
#define HOTSW_THREAD_STACK_SIZE (1024 + PAGE_SIZE) // スタックサイズ #define HOTSW_THREAD_STACK_SIZE (1024 + PAGE_SIZE) // スタックサイズ
#define HOTSW_THREAD_PRIO 11 // カード電源ON → ゲームモードのスレッド優先度 #define HOTSW_THREAD_PRIO 11 // カード電源ON → ゲームモードのスレッド優先度
#define HOTSW_INSERT_MSG_NUM 16 // 挿し割り込み送信メッセージの数 #define HOTSW_INSERT_MSG_NUM 16 // 挿し割り込み送信メッセージの数
@ -100,9 +98,6 @@ static void SetMCSCR(void);
static void GenVA_VB_VD(void); static void GenVA_VB_VD(void);
static HotSwState DecryptObjectFile(void); static HotSwState DecryptObjectFile(void);
static HotSwState LoadTable(void);
static HotSwState ReadRomEmulationData(void);
static HotSwState ReadIDNormal(void);
static HotSwState LoadBannerData(void); static HotSwState LoadBannerData(void);
static HotSwState LoadStaticModule(void); static HotSwState LoadStaticModule(void);
static HotSwState LoadCardData(void); static HotSwState LoadCardData(void);
@ -164,19 +159,19 @@ static CardBootFunction s_funcTable[] = {
// DS Card Type 1 // DS Card Type 1
{ ReadBootSegNormal_DSType1, ChangeModeNormal_DSType1, // Normalモード関数 { ReadBootSegNormal_DSType1, ChangeModeNormal_DSType1, // Normalモード関数
ReadIDSecure_DSType1, ReadSegSecure_DSType1, SwitchONPNGSecure_DSType1, ChangeModeSecure_DSType1, // Secureモード関数 ReadIDSecure_DSType1, ReadSegSecure_DSType1, SwitchONPNGSecure_DSType1, ChangeModeSecure_DSType1, // Secureモード関数
ReadIDGame_DSType1, ReadPageGame_DSType1}, // Game モード関数 ReadIDGame, ReadPageGame}, // Game モード関数
// DS Card Type 2 // DS Card Type 2
{ ReadBootSegNormal_DSType2, ChangeModeNormal_DSType2, // Normalモード関数 { ReadBootSegNormal_DSType2, ChangeModeNormal_DSType2, // Normalモード関数
ReadIDSecure_DSType2, ReadSegSecure_DSType2, SwitchONPNGSecure_DSType2, ChangeModeSecure_DSType2, // Secureモード関数 ReadIDSecure_DSType2, ReadSegSecure_DSType2, SwitchONPNGSecure_DSType2, ChangeModeSecure_DSType2, // Secureモード関数
ReadIDGame_DSType2, ReadPageGame_DSType2}, // Game モード関数 ReadIDGame, ReadPageGame}, // Game モード関数
// TWL Card Type 1 // TWL Card Type 1
{ ReadBootSegNormal_DSType2, ChangeModeNormal_DSType2, // Normalモード関数 { ReadBootSegNormal_DSType2, ChangeModeNormal_DSType2, // Normalモード関数
ReadIDSecure_DSType2, ReadSegSecure_DSType2, SwitchONPNGSecure_DSType2, ChangeModeSecure_DSType2, // Secureモード関数 ReadIDSecure_DSType2, ReadSegSecure_DSType2, SwitchONPNGSecure_DSType2, ChangeModeSecure_DSType2, // Secureモード関数
ReadIDGame_DSType2, ReadPageGame_DSType2}, // Game モード関数 ReadIDGame, ReadPageGame}, // Game モード関数
// RomEmulation // RomEmulation
{ ReadBootSegNormal_ROMEMU, ChangeModeNormal_ROMEMU, // Normalモード関数 { ReadBootSegNormal_ROMEMU, ChangeModeNormal_ROMEMU, // Normalモード関数
ReadIDSecure_ROMEMU, ReadSegSecure_ROMEMU, SwitchONPNGSecure_ROMEMU, ChangeModeSecure_ROMEMU, // Secureモード関数 ReadIDSecure_ROMEMU, ReadSegSecure_ROMEMU, SwitchONPNGSecure_ROMEMU, ChangeModeSecure_ROMEMU, // Secureモード関数
ReadIDGame_ROMEMU, ReadPageGame_ROMEMU} // Game モード関数 ReadIDGame, ReadPageGame}, // Game モード関数
}; };
@ -318,7 +313,7 @@ static HotSwState LoadCardData(void)
// ---------------------- Normal Mode ---------------------- // ---------------------- Normal Mode ----------------------
// カードID読み込み // カードID読み込み
state = ReadIDNormal(); state = ReadIDNormal(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval; retval = (retval == HOTSW_SUCCESS) ? state : retval;
// カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM // カードタイプを判別をして、使う関数を切替える IDの最上位ビットが1なら3DM
@ -336,7 +331,7 @@ static HotSwState LoadCardData(void)
retval = (retval == HOTSW_SUCCESS) ? state : retval; retval = (retval == HOTSW_SUCCESS) ? state : retval;
// Romエミュレーション情報を取得 // Romエミュレーション情報を取得
state = ReadRomEmulationData(); state = ReadRomEmulationData(&s_cbData);
retval = (retval == HOTSW_SUCCESS) ? state : retval; retval = (retval == HOTSW_SUCCESS) ? state : retval;
// 取得したRomエミュレーション情報を比較 // 取得したRomエミュレーション情報を比較
@ -350,12 +345,13 @@ static HotSwState LoadCardData(void)
if(s_cbData.debuggerFlg){ if(s_cbData.debuggerFlg){
OS_PutString("Read Debugger\n"); OS_PutString("Read Debugger\n");
s_cbData.cardType = ROM_EMULATION; s_cbData.cardType = ROM_EMULATION;
SYSMi_GetWork()->gameCommondParam = s_cbData.pBootSegBuf->rh.s.game_cmd_param & ~SCRAMBLE_MASK; s_cbData.gameCommondParam = s_cbData.pBootSegBuf->rh.s.game_cmd_param & ~SCRAMBLE_MASK;
OS_TPrintf("SYSMi_GetWork()->gameCommondParam : 0x%08x\n",SYSMi_GetWork()->gameCommondParam); OS_TPrintf("SYSMi_GetWork()->gameCommondParam : 0x%08x\n", s_cbData.gameCommondParam);
} }
else{ else{
SYSMi_GetWork()->gameCommondParam = s_cbData.pBootSegBuf->rh.s.game_cmd_param; s_cbData.gameCommondParam = s_cbData.pBootSegBuf->rh.s.game_cmd_param;
} }
SYSMi_GetWork()->gameCommondParam = s_cbData.gameCommondParam;
// ROMヘッダCRCを算出してチェック。NintendoロゴCRCも確認。 // ROMヘッダCRCを算出してチェック。NintendoロゴCRCも確認。
SYSMi_GetWork()->cardHeaderCrc16_bak = SVC_GetCRC16( 65535, s_cbData.pBootSegBuf, 0x015e ); SYSMi_GetWork()->cardHeaderCrc16_bak = SVC_GetCRC16( 65535, s_cbData.pBootSegBuf, 0x015e );
@ -755,104 +751,6 @@ static void GenVA_VB_VD(void)
s_cbData.vd &= 0xffffff; s_cbData.vd &= 0xffffff;
} }
/* -----------------------------------------------------------------
* LoadTable関数
*
* Key Table
*
*
*
* ----------------------------------------------------------------- */
static HotSwState LoadTable(void)
{
u32 temp;
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x0000009f;
reg_HOTSW_MCCMD1 = 0x00000000;
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
// MCCNT1 レジスタ設定 (START = 1 W/R = 0 PC = 101(16ページ) latency1 = 0(必要ないけど) に)
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x5 << PC_SHIFT);
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
temp = reg_HOTSW_MCD1;
}
return HOTSW_SUCCESS;
}
/*---------------------------------------------------------------------------*
Name: ReadRomEmulationData
Description: Romエミュレーションデータの読み込み
*---------------------------------------------------------------------------*/
static HotSwState ReadRomEmulationData(void)
{
u32 count=0;
u32 temp;
u32 *dst = s_cbData.romEmuBuf;
// 量産用CPUでは平文アクセス防止のためリードしない
if ( ! (*(u8*)(OS_CHIPTYPE_DEBUGGER_ADDR) & OS_CHIPTYPE_DEBUGGER_MASK) )
{
return HOTSW_SUCCESS;
}
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x3e000000;
reg_HOTSW_MCCMD1 = 0x0;
// MCCNT1 レジスタ設定 (START = 1 PC = 001(1ページリード)に latency1 = 0x5fe)
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0x5fe & LATENCY1_MASK);
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
if(count >= ROM_EMULATION_START_OFS && count < ROM_EMULATION_END_OFS){
*dst++ = reg_HOTSW_MCD1;
}
else{
temp = reg_HOTSW_MCD1;
}
count+=4;
}
MI_CpuCopyFast(s_cbData.romEmuBuf, (void*)HW_ISD_RESERVED, 32);
return HOTSW_SUCCESS;
}
/* -----------------------------------------------------------------
* ReadIDNormal関数
*
* IDを読み込む関数
* ----------------------------------------------------------------- */
static HotSwState ReadIDNormal(void)
{
// カード割り込みによるDMAコピー
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &s_cbData.id_nml, sizeof(s_cbData.id_nml) );
// MCCMD レジスタ設定
reg_HOTSW_MCCMD0 = 0x00000090;
reg_HOTSW_MCCMD1 = 0x00000000;
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
// MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に)
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK);
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
OS_SleepThread(NULL);
return HOTSW_SUCCESS;
}
/* ----------------------------------------------------------------- /* -----------------------------------------------------------------
* DecryptObjectFile関数 * DecryptObjectFile関数
* *

View File

@ -287,6 +287,8 @@ HotSwState ChangeModeSecure_ROMEMU(CardBootData *cbd)
// ■------------------------------------■ // ■------------------------------------■
// ■ ゲームモードのコマンド ■ // ■ ゲームモードのコマンド ■
// ■------------------------------------■ // ■------------------------------------■
#if 0
/*---------------------------------------------------------------------------* /*---------------------------------------------------------------------------*
Name: ReadIDGame_ROMEMU Name: ReadIDGame_ROMEMU
@ -377,3 +379,5 @@ HotSwState ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32
return HOTSW_SUCCESS; return HOTSW_SUCCESS;
} }
#endif