mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
(更新:Akabane Jumpei)
・デバッガがエミュレートしているRomデータを読み込む関数を追加。 git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@453 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
46ff11fc0a
commit
4e23ff1ac6
@ -29,7 +29,7 @@ TWL_PROC = ARM7
|
|||||||
SRCDIR = ./src
|
SRCDIR = ./src
|
||||||
INCDIR = ./include
|
INCDIR = ./include
|
||||||
|
|
||||||
SRCS = blowfish.c hotsw.c ds_blowfish_table.c dsCardType1.c dsCardType2.c customNDma.c
|
SRCS = blowfish.c hotsw.c ds_blowfish_table.c dsCardType1.c dsCardType2.c romEmulation.c customNDma.c
|
||||||
|
|
||||||
TARGET_LIB = libcardboot_sp$(TWL_LIBSUFFIX).a
|
TARGET_LIB = libcardboot_sp$(TWL_LIBSUFFIX).a
|
||||||
|
|
||||||
|
|||||||
@ -84,6 +84,8 @@ extern "C" {
|
|||||||
#define START_SHIFT 31
|
#define START_SHIFT 31
|
||||||
#define START_MASK 0x80000000
|
#define START_MASK 0x80000000
|
||||||
|
|
||||||
|
#define SCRAMBLE_MASK 0x00406000
|
||||||
|
|
||||||
#define AddLatency2ToLatency1(param)\
|
#define AddLatency2ToLatency1(param)\
|
||||||
( (((param) & LATENCY2_MASK) \
|
( (((param) & LATENCY2_MASK) \
|
||||||
>> LATENCY2_SHIFT) \
|
>> LATENCY2_SHIFT) \
|
||||||
@ -146,7 +148,8 @@ extern "C" {
|
|||||||
typedef enum CardTypeEx{
|
typedef enum CardTypeEx{
|
||||||
DS_CARD_TYPE_1 = 0,
|
DS_CARD_TYPE_1 = 0,
|
||||||
DS_CARD_TYPE_2,
|
DS_CARD_TYPE_2,
|
||||||
TWL_CARD
|
TWL_CARD,
|
||||||
|
ROM_EMULATION
|
||||||
}CardTypeEx;
|
}CardTypeEx;
|
||||||
|
|
||||||
typedef enum NormalCommandType{
|
typedef enum NormalCommandType{
|
||||||
@ -221,7 +224,8 @@ typedef struct CardBootData{
|
|||||||
u32 secureLatency;
|
u32 secureLatency;
|
||||||
|
|
||||||
BOOL twlFlg;
|
BOOL twlFlg;
|
||||||
|
BOOL debuggerFlg;
|
||||||
|
|
||||||
u32 romEmuBuf[ROM_EMULATION_DATA_SIZE/sizeof(u32)];
|
u32 romEmuBuf[ROM_EMULATION_DATA_SIZE/sizeof(u32)];
|
||||||
u32 keyBuf[KEY_BUF_SIZE];
|
u32 keyBuf[KEY_BUF_SIZE];
|
||||||
|
|
||||||
|
|||||||
55
build/libraries_sysmenu/hotsw/ARM7/include/romEmulation.h
Normal file
55
build/libraries_sysmenu/hotsw/ARM7/include/romEmulation.h
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: TwlSDK
|
||||||
|
File: romEmulation.h
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#ifndef __ROM_EMULATION_H__
|
||||||
|
#define __ROM_EMULATION_H__
|
||||||
|
|
||||||
|
#include <twl.h>
|
||||||
|
#include <hotswTypes.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ===========================================================================
|
||||||
|
// Function Describe
|
||||||
|
// ===========================================================================
|
||||||
|
|
||||||
|
// ■ ノーマルモードのコマンド ■
|
||||||
|
// Rom EmulationのノーマルモードのBoot Segment(4Kbyte)読み込み
|
||||||
|
void ReadBootSegNormal_ROMEMU(CardBootData *cbd);
|
||||||
|
|
||||||
|
// Rom Emulationのノーマルモードのモード変更
|
||||||
|
void ChangeModeNormal_ROMEMU(CardBootData *cbd);
|
||||||
|
|
||||||
|
|
||||||
|
// ■ セキュアモードのコマンド ■
|
||||||
|
// Rom EmulationのセキュアモードのID読み込み
|
||||||
|
void ReadIDSecure_ROMEMU(CardBootData *cbd);
|
||||||
|
|
||||||
|
// Rom EmulationのセキュアモードのSecure Segment(16Kbyte)読み込み
|
||||||
|
void ReadSegSecure_ROMEMU(CardBootData *cbd);
|
||||||
|
|
||||||
|
// Rom EmulationのセキュアモードのPNジェネレータON
|
||||||
|
void SwitchONPNGSecure_ROMEMU(CardBootData *cbd);
|
||||||
|
|
||||||
|
// Rom EmulationのセキュアモードのPNジェネレータOFF
|
||||||
|
void SwitchOFFPNGSecure_ROMEMU(CardBootData *cbd);
|
||||||
|
|
||||||
|
// Rom Emulationのセキュアモードのモード変更
|
||||||
|
void ChangeModeSecure_ROMEMU(CardBootData *cbd);
|
||||||
|
|
||||||
|
|
||||||
|
// ■ ゲームモードのコマンド ■
|
||||||
|
// DSカードType1のゲームモードのID読み込み
|
||||||
|
void ReadIDGame_ROMEMU(CardBootData *cbd);
|
||||||
|
|
||||||
|
// DSカードType1のゲームモードの指定ページ読み込み
|
||||||
|
void ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32 size);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // __ROM_EMULATION_H__
|
||||||
@ -130,9 +130,11 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// コマンドの暗号化
|
if(!cbd->debuggerFlg){
|
||||||
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
|
// コマンドの暗号化
|
||||||
|
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
|
||||||
|
}
|
||||||
|
|
||||||
// ビッグエンディアンに直す(暗号化後)
|
// ビッグエンディアンに直す(暗号化後)
|
||||||
cndBE.b[7] = cndLE.b[0];
|
cndBE.b[7] = cndLE.b[0];
|
||||||
cndBE.b[6] = cndLE.b[1];
|
cndBE.b[6] = cndLE.b[1];
|
||||||
|
|||||||
@ -126,8 +126,10 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// コマンドの暗号化
|
if(!cbd->debuggerFlg){
|
||||||
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
|
// コマンドの暗号化
|
||||||
|
EncryptByBlowfish( &cbd->keyTable, (u32*)&cndLE.b[4], (u32*)cndLE.b );
|
||||||
|
}
|
||||||
|
|
||||||
// ビッグエンディアンに直す(暗号化後)
|
// ビッグエンディアンに直す(暗号化後)
|
||||||
cndBE.b[7] = cndLE.b[0];
|
cndBE.b[7] = cndLE.b[0];
|
||||||
@ -148,10 +150,12 @@ static void SetSecureCommand(SecureCommandType type, CardBootData *cbd)
|
|||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: ReadIDSecure_DSType2
|
Name: ReadIDSecure_DSType2
|
||||||
|
|
||||||
Description:
|
Description: SCRAMBLE_MASK -> CS SE DS をマスクできる
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
void ReadIDSecure_DSType2(CardBootData *cbd)
|
void ReadIDSecure_DSType2(CardBootData *cbd)
|
||||||
{
|
{
|
||||||
|
u32 scrambleMask;
|
||||||
|
|
||||||
// NewDMA転送の準備
|
// NewDMA転送の準備
|
||||||
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) );
|
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) );
|
||||||
|
|
||||||
@ -169,9 +173,12 @@ void ReadIDSecure_DSType2(CardBootData *cbd)
|
|||||||
reg_HOTSW_MCCMD0 = 0x0;
|
reg_HOTSW_MCCMD0 = 0x0;
|
||||||
reg_HOTSW_MCCMD1 = 0x0;
|
reg_HOTSW_MCCMD1 = 0x0;
|
||||||
|
|
||||||
|
// スクランブルの設定
|
||||||
|
scrambleMask = cbd->debuggerFlg ? 0 : (u32)(SCRAMBLE_MASK & ~CS_MASK);
|
||||||
|
|
||||||
// MCCNT1 レジスタ設定
|
// MCCNT1 レジスタ設定
|
||||||
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param |
|
reg_HOTSW_MCCNT1 = cbd->pBootSegBuf->rh.s.secure_cmd_param |
|
||||||
START_MASK | PC_MASK & (0x7 << PC_SHIFT) | SE_MASK | DS_MASK;
|
START_MASK | PC_MASK & (0x7 << PC_SHIFT) | scrambleMask;
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
OS_SleepThread(NULL);
|
OS_SleepThread(NULL);
|
||||||
|
|||||||
@ -19,6 +19,7 @@
|
|||||||
#include <blowfish.h>
|
#include <blowfish.h>
|
||||||
#include <dsCardType1.h>
|
#include <dsCardType1.h>
|
||||||
#include <dsCardType2.h>
|
#include <dsCardType2.h>
|
||||||
|
#include <romEmulation.h>
|
||||||
#include <customNDma.h>
|
#include <customNDma.h>
|
||||||
|
|
||||||
// define -------------------------------------------------------------------
|
// define -------------------------------------------------------------------
|
||||||
@ -63,6 +64,7 @@ static void ShowRomHeaderData(void);
|
|||||||
|
|
||||||
// Static Values ------------------------------------------------------------
|
// Static Values ------------------------------------------------------------
|
||||||
static char *encrypt_object_key ATTRIBUTE_ALIGN(4) = "encryObj";
|
static char *encrypt_object_key ATTRIBUTE_ALIGN(4) = "encryObj";
|
||||||
|
static char *rom_emu_info ATTRIBUTE_ALIGN(4) = "TWLD";
|
||||||
|
|
||||||
static u64 s_MCStack[STACK_SIZE / sizeof(u64)];
|
static u64 s_MCStack[STACK_SIZE / sizeof(u64)];
|
||||||
static OSThread s_MCThread;
|
static OSThread s_MCThread;
|
||||||
@ -105,7 +107,15 @@ static CardBootFunction s_funcTable[] = {
|
|||||||
// 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_DSType2, ReadPageGame_DSType2}, // Game モード関数
|
||||||
|
// TWL Card Type 1
|
||||||
|
{ ReadBootSegNormal_DSType2, ChangeModeNormal_DSType2, // Normalモード関数
|
||||||
|
ReadIDSecure_DSType2, ReadSegSecure_DSType2, SwitchONPNGSecure_DSType2, ChangeModeSecure_DSType2, // Secureモード関数
|
||||||
|
ReadIDGame_DSType2, ReadPageGame_DSType2}, // Game モード関数
|
||||||
|
// RomEmulation
|
||||||
|
{ ReadBootSegNormal_ROMEMU, ChangeModeNormal_ROMEMU, // Normalモード関数
|
||||||
|
ReadIDSecure_ROMEMU, ReadSegSecure_ROMEMU, SwitchONPNGSecure_ROMEMU, ChangeModeSecure_ROMEMU, // Secureモード関数
|
||||||
|
ReadIDGame_ROMEMU, ReadPageGame_ROMEMU} // Game モード関数
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -234,6 +244,9 @@ BOOL HOTSW_Boot(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
u8 i;
|
||||||
|
u8 *romEmuInf = (u8 *)s_cbData.romEmuBuf;
|
||||||
|
|
||||||
// ※最低限ARM9と排他制御しないといけない範囲はこれだけ
|
// ※最低限ARM9と排他制御しないといけない範囲はこれだけ
|
||||||
u16 id = (u16)OS_GetLockID();
|
u16 id = (u16)OS_GetLockID();
|
||||||
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM9と排他制御する
|
(void)OS_LockByWord( id, &SYSMi_GetWork()->lockCardRsc, NULL ); // ARM9と排他制御する
|
||||||
@ -245,10 +258,23 @@ BOOL HOTSW_Boot(void)
|
|||||||
OS_TPrintf(" | Secure Command Param : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.secure_cmd_param);
|
OS_TPrintf(" | Secure Command Param : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.secure_cmd_param);
|
||||||
OS_TPrintf(" | Secure Command Latency : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.secure_cmd_latency);
|
OS_TPrintf(" | Secure Command Latency : 0x%08x\n", s_cbData.pBootSegBuf->rh.s.secure_cmd_latency);
|
||||||
|
|
||||||
// Romエミュレーションデータを取得
|
// Romエミュレーション情報を取得
|
||||||
ReadRomEmulationData();
|
ReadRomEmulationData();
|
||||||
OS_TPrintf("Rom Emulation Data : 0x%08x\n",s_cbData.romEmuBuf[0]);
|
|
||||||
|
|
||||||
|
// 取得したRomエミュレーション情報を比較
|
||||||
|
s_cbData.debuggerFlg = TRUE;
|
||||||
|
for(i=0; i<4; i++){
|
||||||
|
if ( rom_emu_info[i] != romEmuInf[i] ){
|
||||||
|
s_cbData.debuggerFlg = FALSE;
|
||||||
|
OS_PutString("Rom Emulation Info Doesn't Match...\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OS_TPrintf("Rom Emulation Data : 0x%04x\n",s_cbData.romEmuBuf[0]);
|
||||||
|
if(s_cbData.debuggerFlg){
|
||||||
|
s_cbData.cardType = ROM_EMULATION;
|
||||||
|
}
|
||||||
|
|
||||||
// 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 );
|
||||||
OS_TPrintf( "RomHeaderCRC16 : calc = %04x romh = %04x\n",
|
OS_TPrintf( "RomHeaderCRC16 : calc = %04x romh = %04x\n",
|
||||||
@ -284,7 +310,7 @@ BOOL HOTSW_Boot(void)
|
|||||||
|
|
||||||
// セキュアモードに移行
|
// セキュアモードに移行
|
||||||
s_funcTable[s_cbData.cardType].ChangeMode_N(&s_cbData);
|
s_funcTable[s_cbData.cardType].ChangeMode_N(&s_cbData);
|
||||||
|
|
||||||
// ---------------------- Secure Mode ----------------------
|
// ---------------------- Secure Mode ----------------------
|
||||||
// PNG設定
|
// PNG設定
|
||||||
s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData);
|
s_funcTable[s_cbData.cardType].SetPNG_S(&s_cbData);
|
||||||
@ -294,17 +320,17 @@ BOOL HOTSW_Boot(void)
|
|||||||
|
|
||||||
// ID読み込み
|
// ID読み込み
|
||||||
s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData);
|
s_funcTable[s_cbData.cardType].ReadID_S(&s_cbData);
|
||||||
|
|
||||||
// Secure領域のSegment読み込み
|
// Secure領域のSegment読み込み
|
||||||
s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData);
|
s_funcTable[s_cbData.cardType].ReadSegment_S(&s_cbData);
|
||||||
|
|
||||||
// ゲームモードに移行
|
// ゲームモードに移行
|
||||||
s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData);
|
s_funcTable[s_cbData.cardType].ChangeMode_S(&s_cbData);
|
||||||
|
|
||||||
// ---------------------- Game Mode ----------------------
|
// ---------------------- Game Mode ----------------------
|
||||||
// ID読み込み
|
// ID読み込み
|
||||||
s_funcTable[s_cbData.cardType].ReadID_G(&s_cbData);
|
s_funcTable[s_cbData.cardType].ReadID_G(&s_cbData);
|
||||||
|
|
||||||
// 常駐モジュール残りを指定先に転送
|
// 常駐モジュール残りを指定先に転送
|
||||||
HOTSW_LoadStaticModule();
|
HOTSW_LoadStaticModule();
|
||||||
|
|
||||||
@ -377,7 +403,7 @@ void HOTSW_LoadStaticModule(void)
|
|||||||
OS_TPrintf("Before Relocate Address : 0x%08x\n", s_cbData.arm9Stc);
|
OS_TPrintf("Before Relocate Address : 0x%08x\n", s_cbData.arm9Stc);
|
||||||
// 配置先と再配置情報を取得
|
// 配置先と再配置情報を取得
|
||||||
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_STATIC, &s_cbData.arm9Stc, s_cbData.pBootSegBuf->rh.s.main_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC] , s_cbData.twlFlg);
|
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_STATIC, &s_cbData.arm9Stc, s_cbData.pBootSegBuf->rh.s.main_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_STATIC] , s_cbData.twlFlg);
|
||||||
|
OS_TPrintf("After Relocate Address : 0x%08x\n", s_cbData.arm9Stc);
|
||||||
// Arm9の常駐モジュール残りを指定先に転送
|
// Arm9の常駐モジュール残りを指定先に転送
|
||||||
s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
|
s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
|
||||||
s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE,
|
s_cbData.pBootSegBuf->rh.s.main_rom_offset + SECURE_SEGMENT_SIZE,
|
||||||
@ -389,7 +415,7 @@ void HOTSW_LoadStaticModule(void)
|
|||||||
OS_TPrintf("Before Relocate Address : 0x%08x\n", s_cbData.arm7Stc);
|
OS_TPrintf("Before Relocate Address : 0x%08x\n", s_cbData.arm7Stc);
|
||||||
// 配置先と再配置情報を取得
|
// 配置先と再配置情報を取得
|
||||||
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_STATIC, &s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_STATIC] , s_cbData.twlFlg);
|
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_STATIC, &s_cbData.arm7Stc, s_cbData.pBootSegBuf->rh.s.sub_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_STATIC] , s_cbData.twlFlg);
|
||||||
|
OS_TPrintf("After Relocate Address : 0x%08x\n", s_cbData.arm7Stc);
|
||||||
// Arm7の常駐モジュールを指定先に転送
|
// Arm7の常駐モジュールを指定先に転送
|
||||||
s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
|
s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
|
||||||
s_cbData.pBootSegBuf->rh.s.sub_rom_offset,
|
s_cbData.pBootSegBuf->rh.s.sub_rom_offset,
|
||||||
@ -402,10 +428,10 @@ void HOTSW_LoadStaticModule(void)
|
|||||||
s_cbData.pBootSegBuf->rh.s.main_ltd_size : SECURE_SEGMENT_SIZE;
|
s_cbData.pBootSegBuf->rh.s.main_ltd_size : SECURE_SEGMENT_SIZE;
|
||||||
OS_TPrintf(" - Arm9 Ltd. Static Module Loading...\n");
|
OS_TPrintf(" - Arm9 Ltd. Static Module Loading...\n");
|
||||||
s_cbData.arm9Ltd = (u32)s_cbData.pBootSegBuf->rh.s.main_ltd_ram_address;
|
s_cbData.arm9Ltd = (u32)s_cbData.pBootSegBuf->rh.s.main_ltd_ram_address;
|
||||||
|
OS_TPrintf("Before Relocate Address : 0x%08x\n", s_cbData.arm9Ltd);
|
||||||
// 配置先と再配置情報を取得
|
// 配置先と再配置情報を取得
|
||||||
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_LTD_STATIC, &s_cbData.arm9Ltd, s_cbData.pBootSegBuf->rh.s.main_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC] , TRUE);
|
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM9_LTD_STATIC, &s_cbData.arm9Ltd, s_cbData.pBootSegBuf->rh.s.main_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM9_LTD_STATIC] , TRUE);
|
||||||
|
OS_TPrintf("After Relocate Address : 0x%08x\n", s_cbData.arm9Ltd);
|
||||||
// Arm9の常駐モジュールを指定先に転送(※TWLカード対応していないので、注意!!)
|
// Arm9の常駐モジュールを指定先に転送(※TWLカード対応していないので、注意!!)
|
||||||
s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
|
s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
|
||||||
s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset,
|
s_cbData.pBootSegBuf->rh.s.main_ltd_rom_offset,
|
||||||
@ -420,10 +446,10 @@ void HOTSW_LoadStaticModule(void)
|
|||||||
|
|
||||||
OS_TPrintf(" - Arm7 Ltd. Static Module Loading...\n");
|
OS_TPrintf(" - Arm7 Ltd. Static Module Loading...\n");
|
||||||
s_cbData.arm7Ltd = (u32)s_cbData.pBootSegBuf->rh.s.sub_ltd_ram_address;
|
s_cbData.arm7Ltd = (u32)s_cbData.pBootSegBuf->rh.s.sub_ltd_ram_address;
|
||||||
|
OS_TPrintf("Before Relocate Address : 0x%08x\n", s_cbData.arm7Ltd);
|
||||||
// 配置先と再配置情報を取得
|
// 配置先と再配置情報を取得
|
||||||
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_LTD_STATIC, &s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_LTD_STATIC], TRUE);
|
SYSM_CheckLoadRegionAndSetRelocateInfo( ARM7_LTD_STATIC, &s_cbData.arm7Ltd, s_cbData.pBootSegBuf->rh.s.sub_ltd_size, &SYSMi_GetWork()->romRelocateInfo[ARM7_LTD_STATIC], TRUE);
|
||||||
|
OS_TPrintf("After Relocate Address : 0x%08x\n", s_cbData.arm7Ltd);
|
||||||
// Arm7の常駐モジュールを指定先に転送
|
// Arm7の常駐モジュールを指定先に転送
|
||||||
s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
|
s_funcTable[s_cbData.cardType].ReadPage_G(&s_cbData,
|
||||||
s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset,
|
s_cbData.pBootSegBuf->rh.s.sub_ltd_rom_offset,
|
||||||
@ -625,7 +651,6 @@ void ReadIDNormal(void)
|
|||||||
|
|
||||||
// MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に)
|
// MCCNT1 レジスタ設定 (START = 1 PC = 111(ステータスリード) latency1 = 1 に)
|
||||||
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK);
|
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x7 << PC_SHIFT) | (0x1 & LATENCY1_MASK);
|
||||||
|
|
||||||
|
|
||||||
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
OS_SleepThread(NULL);
|
OS_SleepThread(NULL);
|
||||||
|
|||||||
393
build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c
Normal file
393
build/libraries_sysmenu/hotsw/ARM7/src/romEmulation.c
Normal file
@ -0,0 +1,393 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: TwlSDK
|
||||||
|
File: romEmulation.c
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include <twl.h>
|
||||||
|
#include <blowfish.h>
|
||||||
|
#include <romEmulation.h>
|
||||||
|
#include <customNDma.h>
|
||||||
|
|
||||||
|
// Define Data --------------------------------------------------------------
|
||||||
|
#define BOOT_PAGE_NUM 8
|
||||||
|
#define SECURE_PAGE_NUM 32
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ===========================================================================
|
||||||
|
// Function Describe
|
||||||
|
// ===========================================================================
|
||||||
|
|
||||||
|
// ■--------------------------------------■
|
||||||
|
// ■ ノーマルモードのコマンド ■
|
||||||
|
// ■--------------------------------------■
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: ReadIDNormal_ROMEMU
|
||||||
|
|
||||||
|
Description: DSカードType1のノーマルモードのID読み込み
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
// 共通
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: ReadBootSegNormal_ROMEMU
|
||||||
|
|
||||||
|
Description: DSカードType1のノーマルモードのBoot Segment読み込み
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void ReadBootSegNormal_ROMEMU(CardBootData *cbd)
|
||||||
|
{
|
||||||
|
u32 i,j=0;
|
||||||
|
u64 page = 0;
|
||||||
|
GCDCmd64 tempCnd, cnd;
|
||||||
|
// u32 n = 0;
|
||||||
|
|
||||||
|
for(i=0; i<BOOT_PAGE_NUM; i++){
|
||||||
|
// ゼロクリア
|
||||||
|
MI_CpuClear8(&tempCnd, sizeof(GCDCmd64));
|
||||||
|
|
||||||
|
// リトルエンディアンで作って
|
||||||
|
tempCnd.dw = page << 33;
|
||||||
|
|
||||||
|
// ビックエンディアンにする
|
||||||
|
cnd.b[0] = tempCnd.b[7];
|
||||||
|
cnd.b[1] = tempCnd.b[6];
|
||||||
|
cnd.b[2] = tempCnd.b[5];
|
||||||
|
cnd.b[3] = tempCnd.b[4];
|
||||||
|
cnd.b[4] = tempCnd.b[3];
|
||||||
|
cnd.b[5] = tempCnd.b[2];
|
||||||
|
cnd.b[6] = tempCnd.b[1];
|
||||||
|
cnd.b[7] = tempCnd.b[0];
|
||||||
|
|
||||||
|
// MCCMD レジスタ設定
|
||||||
|
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
|
||||||
|
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
|
||||||
|
|
||||||
|
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||||
|
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||||
|
|
||||||
|
// MCCNT1 レジスタ設定 (START = 1 PC_MASK PC = 001(1ページリード)に latency1 = 0xd)
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0xd & LATENCY1_MASK);
|
||||||
|
|
||||||
|
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
||||||
|
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||||
|
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||||
|
*(cbd->pBootSegBuf->word + j++) = reg_HOTSW_MCD1;
|
||||||
|
}
|
||||||
|
|
||||||
|
page++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
// NewDMA転送の準備
|
||||||
|
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->pBootSegBuf->word, BOOT_SEGMENT_SIZE );
|
||||||
|
|
||||||
|
// MCCMD レジスタ設定
|
||||||
|
reg_HOTSW_MCCMD0 = 0x00000000;
|
||||||
|
reg_HOTSW_MCCMD1 = 0x00000000;
|
||||||
|
|
||||||
|
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||||
|
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||||
|
|
||||||
|
// MCCNT1 レジスタ設定 (START = 1 PC_MASK PC = 100(8ページリード)に latency1 = 0xd)
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (0x4 << PC_SHIFT) | (0xd & LATENCY1_MASK);
|
||||||
|
|
||||||
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
|
OS_SleepThread(NULL);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: ChangeModeNormal_ROMEMU
|
||||||
|
|
||||||
|
Description: DSカードType1のノーマルモードのモード変更
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void ChangeModeNormal_ROMEMU(CardBootData *cbd)
|
||||||
|
{
|
||||||
|
#pragma unused( cbd )
|
||||||
|
|
||||||
|
GCDCmd64 tempCnd, cnd;
|
||||||
|
|
||||||
|
// ゼロクリア
|
||||||
|
MI_CpuClear8(&tempCnd, sizeof(GCDCmd64));
|
||||||
|
|
||||||
|
// リトルエンディアンで作って
|
||||||
|
tempCnd.dw = 0x3c00000000000000;
|
||||||
|
|
||||||
|
// ビックエンディアンにする
|
||||||
|
cnd.b[0] = tempCnd.b[7];
|
||||||
|
cnd.b[1] = tempCnd.b[6];
|
||||||
|
cnd.b[2] = tempCnd.b[5];
|
||||||
|
cnd.b[3] = tempCnd.b[4];
|
||||||
|
cnd.b[4] = tempCnd.b[3];
|
||||||
|
cnd.b[5] = tempCnd.b[2];
|
||||||
|
cnd.b[6] = tempCnd.b[1];
|
||||||
|
cnd.b[7] = tempCnd.b[0];
|
||||||
|
|
||||||
|
// MCCMD レジスタ設定
|
||||||
|
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
|
||||||
|
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
|
||||||
|
|
||||||
|
// MCCNT1 レジスタ設定 (START = 1 に)
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK;
|
||||||
|
|
||||||
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
|
OS_SleepThread(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ■--------------------------------------■
|
||||||
|
// ■ セキュアモードのコマンド ■
|
||||||
|
// ■--------------------------------------■
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: ReadIDSecure_ROMEMU
|
||||||
|
|
||||||
|
Description:
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void ReadIDSecure_ROMEMU(CardBootData *cbd)
|
||||||
|
{
|
||||||
|
// カード割り込みによるDMAコピー
|
||||||
|
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, &cbd->id_scr, sizeof(cbd->id_scr) );
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: ReadSegSecure_ROMEMU
|
||||||
|
|
||||||
|
Description:
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void ReadSegSecure_ROMEMU(CardBootData *cbd)
|
||||||
|
{
|
||||||
|
u32 i,j=0;
|
||||||
|
u64 page = 0x20;
|
||||||
|
GCDCmd64 tempCnd, cnd;
|
||||||
|
u32 n = 0;
|
||||||
|
|
||||||
|
for(i=0; i<SECURE_PAGE_NUM; i++){
|
||||||
|
// ゼロクリア
|
||||||
|
MI_CpuClear8(&tempCnd, sizeof(GCDCmd64));
|
||||||
|
|
||||||
|
// リトルエンディアンで作って
|
||||||
|
tempCnd.dw = page << 33;
|
||||||
|
|
||||||
|
// ビックエンディアンにする
|
||||||
|
cnd.b[0] = tempCnd.b[7];
|
||||||
|
cnd.b[1] = tempCnd.b[6];
|
||||||
|
cnd.b[2] = tempCnd.b[5];
|
||||||
|
cnd.b[3] = tempCnd.b[4];
|
||||||
|
cnd.b[4] = tempCnd.b[3];
|
||||||
|
cnd.b[5] = tempCnd.b[2];
|
||||||
|
cnd.b[6] = tempCnd.b[1];
|
||||||
|
cnd.b[7] = tempCnd.b[0];
|
||||||
|
|
||||||
|
// MCCMD レジスタ設定
|
||||||
|
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
|
||||||
|
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
|
||||||
|
|
||||||
|
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||||
|
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||||
|
|
||||||
|
// MCCNT1 レジスタ設定 (START = 1 PC_MASK PC = 001(1ページリード)に latency1 = 0xd)
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0xd & LATENCY1_MASK);
|
||||||
|
|
||||||
|
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
||||||
|
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||||
|
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||||
|
*(cbd->pSecureSegBuf + j++) = reg_HOTSW_MCD1;
|
||||||
|
// OS_TPrintf("Secure Data Address : %08x\n", (cbd->pSecureSegBuf + j));
|
||||||
|
/* OS_TPrintf("%02x ",reg_HOTSW_MCD1);
|
||||||
|
if(!(n++ % 0xf)){
|
||||||
|
OS_PutString("\n");
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
page++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* u64 segNum = 4;
|
||||||
|
u64 vae = cbd->vae;
|
||||||
|
GCDCmd64 cndLE, cndBE;
|
||||||
|
|
||||||
|
// NewDMA転送の準備
|
||||||
|
HOTSW_NDmaCopy_Card( HOTSW_DMA_NO, (u32 *)HOTSW_MCD1, cbd->pSecureSegBuf, SECURE_SEGMENT_SIZE );
|
||||||
|
|
||||||
|
// コマンド構造体初期化
|
||||||
|
MI_CpuClear8(&cndLE, sizeof(GCDCmd64));
|
||||||
|
|
||||||
|
// コマンド作成
|
||||||
|
cndLE.dw = 0x20 << 33;
|
||||||
|
|
||||||
|
// ビッグエンディアンに直す(暗号化後)
|
||||||
|
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];
|
||||||
|
|
||||||
|
// MCCNT0 レジスタ設定 (E = 1 I = 1 SEL = 0に)
|
||||||
|
reg_HOTSW_MCCNT0 = (u16)((reg_HOTSW_MCCNT0 & 0x0fff) | 0xc000);
|
||||||
|
|
||||||
|
// MCCNT1 レジスタ設定 (START = 1 PC_MASK PC = 110(32ページリード)に latency1 = 0xd)
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK | CT_MASK | PC_MASK & (0x6 << PC_SHIFT) | (0xd & LATENCY1_MASK);
|
||||||
|
|
||||||
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
|
OS_SleepThread(NULL);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: SwitchONPNGSecure_ROMEMU
|
||||||
|
|
||||||
|
Description:
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void SwitchONPNGSecure_ROMEMU(CardBootData *cbd)
|
||||||
|
{
|
||||||
|
#pragma unused( cbd )
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: SwitchOFFPNGSecure_ROMEMU
|
||||||
|
|
||||||
|
Description:
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void SwitchOFFPNGSecure_ROMEMU(CardBootData *cbd)
|
||||||
|
{
|
||||||
|
#pragma unused( cbd )
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: ChangeModeSecure_ROMEMU
|
||||||
|
|
||||||
|
Description:
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void ChangeModeSecure_ROMEMU(CardBootData *cbd)
|
||||||
|
{
|
||||||
|
#pragma unused( cbd )
|
||||||
|
|
||||||
|
GCDCmd64 tempCnd, cnd;
|
||||||
|
|
||||||
|
// ゼロクリア
|
||||||
|
MI_CpuClear8(&tempCnd, sizeof(GCDCmd64));
|
||||||
|
|
||||||
|
// リトルエンディアンで作って
|
||||||
|
tempCnd.dw = 0xa000000000000000;
|
||||||
|
|
||||||
|
// ビックエンディアンにする
|
||||||
|
cnd.b[0] = tempCnd.b[7];
|
||||||
|
cnd.b[1] = tempCnd.b[6];
|
||||||
|
cnd.b[2] = tempCnd.b[5];
|
||||||
|
cnd.b[3] = tempCnd.b[4];
|
||||||
|
cnd.b[4] = tempCnd.b[3];
|
||||||
|
cnd.b[5] = tempCnd.b[2];
|
||||||
|
cnd.b[6] = tempCnd.b[1];
|
||||||
|
cnd.b[7] = tempCnd.b[0];
|
||||||
|
|
||||||
|
// MCCMD レジスタ設定
|
||||||
|
reg_HOTSW_MCCMD0 = *(u32 *)cnd.b;
|
||||||
|
reg_HOTSW_MCCMD1 = *(u32 *)&cnd.b[4];
|
||||||
|
|
||||||
|
// MCCNT1 レジスタ設定 (START = 1 に)
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK;
|
||||||
|
|
||||||
|
// カードデータ転送終了割り込みが起こるまで寝る(割り込みハンドラの中で起こされる)
|
||||||
|
OS_SleepThread(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ■------------------------------------■
|
||||||
|
// ■ ゲームモードのコマンド ■
|
||||||
|
// ■------------------------------------■
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: ReadIDGame_ROMEMU
|
||||||
|
|
||||||
|
Description: ゲームモードでIDを読み込む
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void ReadIDGame_ROMEMU(CardBootData *cbd)
|
||||||
|
{
|
||||||
|
#pragma unused( cbd )
|
||||||
|
|
||||||
|
// カード割り込みによるDMAコピー
|
||||||
|
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;
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: ReadPageGame_ROMEMU
|
||||||
|
|
||||||
|
Description: ゲームモードで、指定されたページを指定バッファに指定サイズ分を読み込む
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void ReadPageGame_ROMEMU(CardBootData *cbd, u32 start_addr, void* buf, u32 size)
|
||||||
|
{
|
||||||
|
#pragma unused( cbd )
|
||||||
|
|
||||||
|
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++){
|
||||||
|
// ゼロクリア
|
||||||
|
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 PC = 111(ステータスリード) latency1 = d に)
|
||||||
|
reg_HOTSW_MCCNT1 = START_MASK | PC_MASK & (0x1 << PC_SHIFT) | (0xd & LATENCY1_MASK);
|
||||||
|
|
||||||
|
// MCCNTレジスタのRDYフラグをポーリングして、フラグが立ったらデータをMCD1レジスタに再度セット。スタートフラグが0になるまでループ。
|
||||||
|
while(reg_HOTSW_MCCNT1 & START_FLG_MASK){
|
||||||
|
while(!(reg_HOTSW_MCCNT1 & READY_FLG_MASK)){}
|
||||||
|
*((u32 *)buf + counter++) = reg_HOTSW_MCD1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user