ctr_Repair/trunk/Initializer2ndNUP/main.cpp
N2614 52a69bc436 エラー発生時に表示できるように
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@456 385bec56-5757-e545-9c3a-d8741f4650f1
2011-10-20 01:28:23 +00:00

152 lines
4.7 KiB
C++

/*---------------------------------------------------------------------------*
Project: Horizon
File: main.cpp
Copyright 2009-2011 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
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.
$Rev$
*---------------------------------------------------------------------------*/
#include <nn.h>
#include <nn/cfg.h>
#include <nn/CTR/CTR_ProgramId.h>
#include <nn/applet.h>
#include <nn/applet/CTR/applet_Private.h>
#include <vector>
#include <string>
#include "demo.h"
namespace
{
demo::RenderSystemDrawing s_RenderSystem;
nn::os::StackBuffer<1024> s_StackBuffer;
std::vector<std::string> s_DispMessage;
}
#define HANDLE_RESULT(result) \
if(result.IsFailure()) \
{ \
DrawResult(result); \
} \
//==========================================================================
// MSET ProgramId取得
//==========================================================================
nn::ProgramId GetProgramIdMsetWithRegion_()
{
bit32 pid = nn::CTR::PROGRAM_ID_UNIQUE_ID_MSET; // JP
switch (nn::cfg::GetRegion())
{
case nn::cfg::CTR::CFG_REGION_AMERICA:
{
pid = nn::CTR::PROGRAM_ID_UNIQUE_ID_MSET_US; // US
}
break;
case nn::cfg::CTR::CFG_REGION_EUROPE:
case nn::cfg::CTR::CFG_REGION_AUSTRALIA:
{
pid = nn::CTR::PROGRAM_ID_UNIQUE_ID_MSET_EU; // EU
}
break;
case nn::cfg::CTR::CFG_REGION_CHINA:
{
pid = nn::CTR::PROGRAM_ID_UNIQUE_ID_MSET_CN; // CN
}
break;
case nn::cfg::CTR::CFG_REGION_KOREA:
{
pid = nn::CTR::PROGRAM_ID_UNIQUE_ID_MSET_KR; // KR
}
break;
case nn::cfg::CTR::CFG_REGION_TAIWAN:
{
pid = nn::CTR::PROGRAM_ID_UNIQUE_ID_MSET_TW; // TW
}
break;
}
return nn::CTR::MakeProgramId(nn::CTR::PROGRAM_ID_CATEGORY_SYSTEM_APPLICATION, pid, nn::CTR::PROGRAM_ID_VERSION_APP);
}
void DrawResult(nn::Result result)
{
char buf[16];
nn::nstd::TSNPrintf(buf, sizeof(buf), "%08X", result.GetPrintableBits());
s_DispMessage.push_back(std::string(buf));
}
void JumpThreadFunc()
{
nn::Result result;
// 規定サイズの配列としてパラメータバッファを確保
u8 jumpParam[NN_APPLET_PARAM_BUF_SIZE];
*reinterpret_cast<u32*>(jumpParam) = 124; // 本体初期化画面
s_DispMessage.push_back(std::string("Prepare jump to mset"));
// MSETにジャンプすることを宣言
nn::Result rseult;
result = nn::applet::PrepareToJumpToOtherApplication(GetProgramIdMsetWithRegion_(), nn::fs::MEDIA_TYPE_NAND);
HANDLE_RESULT(result);
s_DispMessage.push_back(std::string("Jump to mset"));
// MSETにジャンプするためのパラメータを渡してジャンプ
// この関数からは返ってこない
result = nn::applet::JumpToOtherApplication(jumpParam);
HANDLE_RESULT(result);
}
extern "C" void nnMain()
{
nn::applet::Enable();
nn::cfg::Initialize();
s_DispMessage.clear();
// ジャンプ用スレッドの生成
nn::os::Thread drawThread;
drawThread.Start(JumpThreadFunc, s_StackBuffer, nn::os::DEFAULT_THREAD_PRIORITY + 1);
// RenderSystem の準備
nn::fnd::ExpHeap appHeap;
appHeap.Initialize(nn::os::GetDeviceMemoryAddress(), nn::os::GetDeviceMemorySize());
const size_t s_GxHeapSize = 8 * 1024 * 1024;
uptr heapForGx = reinterpret_cast<uptr>(appHeap.Allocate(s_GxHeapSize));
s_RenderSystem.Initialize(heapForGx, s_GxHeapSize);
s_RenderSystem.SetClearColor(NN_GX_DISPLAY_BOTH, 0, 0, 0, 1);
s_RenderSystem.SetColor(1, 1, 1);
u32 counter = 0;
for (;;)
{
s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY0);
s_RenderSystem.Clear();
s_RenderSystem.DrawText(0, 0, "count = %d", counter++);
s32 i = 0;
for(std::vector<std::string>::iterator it = s_DispMessage.begin(); it != s_DispMessage.end(); it++)
{
s_RenderSystem.DrawText(0, (i + 1) * 10, "%s", it->c_str());
}
s_RenderSystem.SwapBuffers();
s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY1);
s_RenderSystem.Clear();
s_RenderSystem.SwapBuffers();
s_RenderSystem.WaitVsync(NN_GX_DISPLAY_BOTH);
}
}