From 6b864c9c80d53d54dc4a2bce037d7fdd38764c42 Mon Sep 17 00:00:00 2001 From: N2614 Date: Tue, 5 Jul 2011 02:34:43 +0000 Subject: [PATCH] =?UTF-8?q?CUP=E4=B8=8D=E8=A6=81=E6=99=82=E3=81=AB?= =?UTF-8?q?=E3=82=82NUP=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7=E3=83=B3?= =?UTF-8?q?=E3=82=92=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E3=81=97=E3=81=A6?= =?UTF-8?q?=E5=BF=85=E8=A6=81=E3=81=AA=E3=82=89=E5=BC=B7=E5=88=B6=E7=9A=84?= =?UTF-8?q?=E3=81=ABCUP=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=20NUP?= =?UTF-8?q?=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7=E3=83=B3=E3=82=92romfs?= =?UTF-8?q?=E3=81=8B=E3=82=89=E8=AA=AD=E3=81=BF=E5=87=BA=E3=81=99=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=20=E3=82=A2=E3=83=97=E3=83=AA=E5=90=8D?= =?UTF-8?q?=E3=81=AE=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@355 385bec56-5757-e545-9c3a-d8741f4650f1 --- trunk/CardCup/HeapManager.cpp | 59 +++ trunk/CardCup/HeapManager.h | 46 ++ trunk/CardCup/OMakefile | 9 +- trunk/CardCup/Readme.txt | Bin 138 -> 70 bytes .../CardCup/{CardCup.bsf => SelfCupTool.bsf} | Bin .../CardCup/{CardCup.rsf => SelfCupTool.rsf} | 4 +- trunk/CardCup/main.cpp | 436 ++++++++++-------- trunk/CardCup/romfiles/nup_version.bin | 1 + 8 files changed, 355 insertions(+), 200 deletions(-) create mode 100644 trunk/CardCup/HeapManager.cpp create mode 100644 trunk/CardCup/HeapManager.h rename trunk/CardCup/{CardCup.bsf => SelfCupTool.bsf} (100%) rename trunk/CardCup/{CardCup.rsf => SelfCupTool.rsf} (80%) create mode 100644 trunk/CardCup/romfiles/nup_version.bin diff --git a/trunk/CardCup/HeapManager.cpp b/trunk/CardCup/HeapManager.cpp new file mode 100644 index 0000000..8e95885 --- /dev/null +++ b/trunk/CardCup/HeapManager.cpp @@ -0,0 +1,59 @@ +/*---------------------------------------------------------------------------* + Project: Horizon + File: HeapManager.cpp + + Copyright 2009 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 "HeapManager.h" + +nn::fnd::ThreadSafeExpHeap s_AppHeap; + + +HeapManager::HeapManager(size_t byteSize, s32 alignment, bit8 groupId, nn::fnd::ExpHeapBase::AllocationMode mode, bool reuse) +{ + m_Ptr = s_AppHeap.Allocate(byteSize, alignment, groupId, mode, reuse); +} + +HeapManager::~HeapManager() +{ + if(m_Ptr != NULL) + { + s_AppHeap.Free(m_Ptr); + } +} +void* HeapManager::GetAddr() +{ + return m_Ptr; +} + +void InitializeHeap() +{ + s_AppHeap.Initialize(nn::os::GetDeviceMemoryAddress(), nn::os::GetDeviceMemorySize(), nn::os::ALLOCATE_OPTION_LINEAR); +} + +size_t GetAllocatableSize(s32 alignment) +{ + return s_AppHeap.GetAllocatableSize(alignment); +} + +void* ForceAllocate(size_t byteSize, s32 alignment, bit8 groupId, nn::fnd::ExpHeapBase::AllocationMode mode, bool reuse) +{ + return s_AppHeap.Allocate(byteSize, alignment, groupId, mode, reuse); +} + +void ForceFree(void* ptr) +{ + if(ptr != NULL) + { + s_AppHeap.Free(ptr); + } +} diff --git a/trunk/CardCup/HeapManager.h b/trunk/CardCup/HeapManager.h new file mode 100644 index 0000000..f50f3fe --- /dev/null +++ b/trunk/CardCup/HeapManager.h @@ -0,0 +1,46 @@ +/*---------------------------------------------------------------------------* + Project: Horizon + File: HeapManager.h + + Copyright 2009 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$ + *---------------------------------------------------------------------------*/ + +#ifndef HEAPMANAGER_H_ +#define HEAPMANAGER_H_ + +#include +#include + +class HeapManager +{ +public: + explicit HeapManager(size_t byteSize, s32 alignment = nn::fnd::ExpHeapBase::DEFAULT_ALIGNMENT, bit8 groupId = 0, + nn::fnd::ExpHeapBase::AllocationMode mode = nn::fnd::ExpHeapBase::ALLOCATION_MODE_FIRST_FIT, bool reuse = false); + virtual ~HeapManager(); + + void* GetAddr(); + +private: + void* m_Ptr; + +}; + +void InitializeHeap(); +size_t GetAllocatableSize(s32 alignment = nn::fnd::ExpHeapBase::DEFAULT_ALIGNMENT); + +// HeapManagerを使わず確保する場合のみ +void* ForceAllocate(size_t byteSize, s32 alignment = nn::fnd::ExpHeapBase::DEFAULT_ALIGNMENT, bit8 groupId = 0, + nn::fnd::ExpHeapBase::AllocationMode mode = nn::fnd::ExpHeapBase::ALLOCATION_MODE_FIRST_FIT, bool reuse = false); + +// HeapManagerを使わず解放する場合のみ +void ForceFree(void* ptr); + +#endif /* HEAPMANAGER_H_ */ diff --git a/trunk/CardCup/OMakefile b/trunk/CardCup/OMakefile index 4e9b587..26a88d5 100644 --- a/trunk/CardCup/OMakefile +++ b/trunk/CardCup/OMakefile @@ -23,19 +23,22 @@ INCLUDES += $(SAMPLED_DEMOS_COMMON_INCLUDE_DIR) SOURCES[] = main.cpp scrollBuffer.cpp + VersionDetect.cpp + HeapManager.cpp LIBS += lib_demo \ libnn_am \ libnn_cup \ libnn_ns \ +ROMFS_ROOT = romfiles DESCRIPTOR = $(HORIZON_ROOT)/resources/specfiles/SelfCup.desc -TARGET_PROGRAM = CardCup +TARGET_PROGRAM = SelfCupTool -TITLE = CardCup -ROM_SPEC_FILE = CardCup.rsf +TITLE = SelfCupTool +ROM_SPEC_FILE = SelfCupTool.rsf CTR_BANNER_SPEC = $(TARGET_PROGRAM).bsf diff --git a/trunk/CardCup/Readme.txt b/trunk/CardCup/Readme.txt index b54f3e8d28d8325aa874def3c25d2a83b1be9006..829387732ad05d92e4e2ef1c8d1829bf016e29af 100644 GIT binary patch literal 70 zcmZoJYVK~%=sMKBnwP85HQ2?QmrFsxBfluKDnC!bNY7XysVFfoIYXhy*xb^ #include #include +#include #include #include "demo.h" #include "scrollBuffer.h" +#include "VersionDetect.h" +#include "HeapManager.h" namespace { - const int s_GxHeapSize=0x800000; - nn::fnd::ExpHeap s_appHeap; - uptr s_GxHeap; +const s32 s_GxHeapSize = 0x800000; +uptr s_GxHeap; - demo::RenderSystemDrawing s_RenderSystem; - ScrollBuffer s_scrollBufferInstance; - ScrollBuffer *s_scrollBuffer; +demo::RenderSystemDrawing s_RenderSystem; +ScrollBuffer s_scrollBufferInstance; +ScrollBuffer *s_scrollBuffer; - char s_updaterBuffer[1<<20] NN_ATTRIBUTE_ALIGN(4096); +char s_updaterBuffer[1 << 20] NN_ATTRIBUTE_ALIGN(4096); - // デモの初期化 - void Initialize() +// デモの初期化 +void Initialize() +{ + // NuiShellの初期化 (CUPに必須) + NN_UTIL_PANIC_IF_FAILED(nn::ns::CTR::InitializeForShell()); + + // ndmの初期化 + nn::ndm::Initialize(); + + // 全デーモンの自律動作をacの自動接続も含めて止める + nn::ndm::SuspendScheduler(); + + // amの初期化 + nn::am::InitializeForSystemMenu(); + + // fsの初期化 (カード確認用) + nn::fs::Initialize(); + + // appletの初期化 + //nn::applet::InitializeForSystem( nn::applet::PHOME_MENU_APPLET_ID, nn::applet::TYPE_SYS ); + //nn::applet::Initialize( nn::applet::TEST2_APPLET_ID); + //nn::applet::SetAppletMode(); + nn::applet::Enable(); + + nn::cfg::Initialize(); + + // デバイスメモリの設定 + const s32 DEVICE_MEMORY_SIZE = 32 * 1024 * 1024; + NN_UTIL_PANIC_IF_FAILED(nn::os::SetDeviceMemorySize(DEVICE_MEMORY_SIZE)); + + // ヒープの初期化 + InitializeHeap(); + + // 描画インスタンスの初期化 + s_GxHeap = reinterpret_cast(ForceAllocate(s_GxHeapSize));s_RenderSystem + .Initialize(s_GxHeap, s_GxHeapSize); + + // 描画インスタンスの初期化 + s_scrollBufferInstance.Initialize(&s_RenderSystem); + s_scrollBuffer = &s_scrollBufferInstance; + + // GPU利用宣言 + nn::applet::AssignGpuRight(); +} + +// 消費時間取得用関数群 +s64 s_StartTick; +void SetTick() +{ + s_StartTick = nn::os::Tick::GetSystemCurrent(); +} +s64 GetConsumedMillisec() +{ + s64 endTick = nn::os::Tick::GetSystemCurrent(); + nn::os::Tick consumed(endTick - s_StartTick); + return ((nn::fnd::TimeSpan) consumed).GetMilliSeconds(); +} + +// 動いていることを知らせるための、くるくる画面表示取得用メソッド +const char s_progress[] = "-\\|/"; +s32 s_progressIndex = 0; +char GetProgressChar() +{ + s_progressIndex = (s_progressIndex + 1) % (sizeof(s_progress) - 1); + return s_progress[s_progressIndex]; +} + +nn::Result UpdateCore() +{ + nn::Result result; + nn::cup::ProgressInfo info; + + /********************** アップデート*******************/ + SetTick(); + s_scrollBuffer->AppendText("Start Card Update")->Render(); + NN_UTIL_RETURN_IF_FAILED(nn::cup::CTR::DoUpdate()); + + // ステータスがStartedになるまで、プログレスは取得できない + s_scrollBuffer->AppendText(""); + do { - // os の初期化 - nn::os::Initialize(); - - // NuiShellの初期化 (CUPに必須) - NN_UTIL_PANIC_IF_FAILED(nn::ns::CTR::InitializeForShell()); - - // ndmの初期化 - nn::ndm::Initialize(); - - // 全デーモンの自律動作をacの自動接続も含めて止める - nn::ndm::SuspendScheduler(); - - // amの初期化 - nn::am::InitializeForSystemMenu(); - - // fsの初期化 (カード確認用) - nn::fs::Initialize(); - - // appletの初期化 - //nn::applet::InitializeForSystem( nn::applet::PHOME_MENU_APPLET_ID, nn::applet::TYPE_SYS ); - //nn::applet::Initialize( nn::applet::TEST2_APPLET_ID); - //nn::applet::SetAppletMode(); - nn::applet::Enable(); - - nn::cfg::Initialize(); - - // デバイスメモリの設定 - const int DEVICE_MEMORY_SIZE = 12*1024 * 1024; - NN_UTIL_PANIC_IF_FAILED(nn::os::SetDeviceMemorySize(DEVICE_MEMORY_SIZE)); - - // ヒープの初期化 - s_appHeap.Initialize(nn::os::GetDeviceMemoryAddress(), nn::os::GetDeviceMemorySize(), nn::os::ALLOCATE_OPTION_LINEAR); - - // 描画インスタンスの初期化 - s_GxHeap = reinterpret_cast(s_appHeap.Allocate(s_GxHeapSize)); - s_RenderSystem.Initialize(s_GxHeap, s_GxHeapSize); - - // 描画インスタンスの初期化 - s_scrollBufferInstance.Initialize(&s_RenderSystem); - s_scrollBuffer=&s_scrollBufferInstance; - - // GPU利用宣言 - nn::applet::AssignGpuRight(); - } - - // 消費時間取得用関数群 - s64 s_StartTick; - void SetTick() - { - s_StartTick=nn::os::Tick::GetSystemCurrent(); - } - s64 GetConsumedMillisec() - { - s64 endTick=nn::os::Tick::GetSystemCurrent(); - nn::os::Tick consumed(endTick-s_StartTick); - return ((nn::fnd::TimeSpan)consumed).GetMilliSeconds(); - } - - // 動いていることを知らせるための、くるくる画面表示取得用メソッド - const char s_progress[]="-\\|/"; - int s_progressIndex=0; - char GetProgressChar() - { - s_progressIndex=(s_progressIndex+1)%(sizeof(s_progress)-1); - return s_progress[s_progressIndex]; - } - - nn::Result UpdateCore() - { - nn::Result result; - nn::cup::ProgressInfo info; - - /********************** アップデート*******************/ - SetTick(); - s_scrollBuffer->AppendText("Start Card Update")->Render(); - NN_UTIL_RETURN_IF_FAILED(nn::cup::CTR::DoUpdate()); - - // ステータスがStartedになるまで、プログレスは取得できない - s_scrollBuffer->AppendText(""); - do{ - s_scrollBuffer->ReplaceText(" %c Initializing", GetProgressChar())->Render(); - result = nn::cup::CTR::GetProgressInfo(&info); - NN_UTIL_RETURN_IF_FAILED(result); - nn::os::Thread::Sleep(nn::fnd::TimeSpan::FromMilliSeconds(40)); - }while(info.state==nn::cup::CTR::UPDATE_STATE_INITIALIZING); - - // 抜けた際のstateがFAILEDかどうか確認 - if(info.state==nn::cup::CTR::UPDATE_STATE_FAILED){ - NN_UTIL_RETURN_IF_FAILED(info.lastResult); - } - s_scrollBuffer->ReplaceText(" - Initialized (%lldmsec)", GetConsumedMillisec()); - - /********************* アップデート中 ******************/ - SetTick(); - s_scrollBuffer->AppendText("")->Render(); - do{ - result = nn::cup::CTR::GetProgressInfo(&info); - NN_UTIL_RETURN_IF_FAILED(result); - s_scrollBuffer->ReplaceText(" %c Title %d/%d, size %lld/%lld", - GetProgressChar(), - info.numImportedTitles, info.numTotalTitles, - info.importedSize, info.totalSize)->Render(); - nn::os::Thread::Sleep(nn::fnd::TimeSpan::FromMilliSeconds(40)); - - }while(info.state==nn::cup::CTR::UPDATE_STATE_STARTED); - // 抜けた際のstateがFAILEDかどうか確認 - if(info.state==nn::cup::CTR::UPDATE_STATE_FAILED){ - NN_UTIL_RETURN_IF_FAILED(info.lastResult); - } - s_scrollBuffer->AppendText(" - Imported (%lldmsec)", GetConsumedMillisec())->Render(); - - /***************** アップデート終了中 ******************/ - SetTick(); - s_scrollBuffer->AppendText("")->Render(); - do{ - result = nn::cup::CTR::GetProgressInfo(&info); - NN_UTIL_RETURN_IF_FAILED(result); - s_scrollBuffer->ReplaceText(" %c Update Finalizing", GetProgressChar())->Render(); - nn::os::Thread::Sleep(nn::fnd::TimeSpan::FromMilliSeconds(40)); - }while(info.state==nn::cup::CTR::UPDATE_STATE_FINALIZING); - // 抜けた際のstateがFAILEDかどうか確認 - if(info.state==nn::cup::CTR::UPDATE_STATE_FAILED){ - NN_UTIL_RETURN_IF_FAILED(info.lastResult); - } - - /******************* アップデート終了 *******************/ - s_scrollBuffer->AppendText(" - Finalized (%lldmsec)", GetConsumedMillisec())->Render(); - s_scrollBuffer->AppendText(""); - - return nn::ResultSuccess(); - } - - nn::Result UpdateSequence(bool *isHandledError) - { - nn::Result result; - nn::Result lastResult=nn::ResultSuccess(); - - /********************* CUPの初期化 *******************/ - s_scrollBuffer->AppendText("Initializing Cup Library")->Render(); - SetTick(); // 初期化開始前の時間をセット - result=nn::cup::CTR::Initialize(s_updaterBuffer,sizeof(s_updaterBuffer)); - if(result==nn::cup::CTR::ResultUpdatePartitionNotFound()){ - s_scrollBuffer->AppendText(" - Update Partition Not Found (%lldmsec)", GetConsumedMillisec())->Render(); - s_scrollBuffer->AppendText("")->Render(); - *isHandledError=true; - return result; - } - if(result==nn::cup::CTR::ResultUpdateNotRequired()){ - s_scrollBuffer->AppendText(" - Already Updated (%lldmsec)", GetConsumedMillisec())->Render(); - s_scrollBuffer->AppendText("")->Render(); - *isHandledError=true; - return result; - } - if(result==nn::cup::CTR::ResultInvalidUpdatePartitionFormat()){ - s_scrollBuffer->AppendText(" - Invalid Update Partition (%lldmsec)", GetConsumedMillisec())->Render(); - s_scrollBuffer->AppendText("")->Render(); - *isHandledError=true; - return result; - } + s_scrollBuffer->ReplaceText(" %c Initializing", GetProgressChar())->Render(); + result = nn::cup::CTR::GetProgressInfo(&info); NN_UTIL_RETURN_IF_FAILED(result); + nn::os::Thread::Sleep(nn::fnd::TimeSpan::FromMilliSeconds(40)); + } while (info.state == nn::cup::CTR::UPDATE_STATE_INITIALIZING); - s_scrollBuffer->AppendText(" - Need Update (%lldmsec)", GetConsumedMillisec())->Render(); - s_scrollBuffer->AppendText("")->Render(); - - lastResult=UpdateCore(); - - // Initializeに成功した場合のみ、再びInitializeするためにFinalizeが必要 - SetTick(); - s_scrollBuffer->AppendText("Finalizing Cup Library")->Render(); - NN_UTIL_RETURN_IF_FAILED(nn::cup::CTR::Finalize()); - s_scrollBuffer->AppendText(" - Complete (%lldmsec)", GetConsumedMillisec())->Render(); - s_scrollBuffer->AppendText("")->Render(); - - return lastResult; + // 抜けた際のstateがFAILEDかどうか確認 + if (info.state == nn::cup::CTR::UPDATE_STATE_FAILED) + { + NN_UTIL_RETURN_IF_FAILED(info.lastResult); } + s_scrollBuffer->ReplaceText(" - Initialized (%lldmsec)", GetConsumedMillisec()); + + /********************* アップデート中 ******************/ + SetTick(); + s_scrollBuffer->AppendText("")->Render(); + do + { + result = nn::cup::CTR::GetProgressInfo(&info); + NN_UTIL_RETURN_IF_FAILED(result); + s_scrollBuffer->ReplaceText(" %c Title %d/%d, size %lld/%lld", GetProgressChar(), info.numImportedTitles, + info.numTotalTitles, info.importedSize, info.totalSize)->Render(); + nn::os::Thread::Sleep(nn::fnd::TimeSpan::FromMilliSeconds(40)); + + } while (info.state == nn::cup::CTR::UPDATE_STATE_STARTED); + // 抜けた際のstateがFAILEDかどうか確認 + if (info.state == nn::cup::CTR::UPDATE_STATE_FAILED) + { + NN_UTIL_RETURN_IF_FAILED(info.lastResult); + } + s_scrollBuffer->AppendText(" - Imported (%lldmsec)", GetConsumedMillisec())->Render(); + + /***************** アップデート終了中 ******************/ + SetTick(); + s_scrollBuffer->AppendText("")->Render(); + do + { + result = nn::cup::CTR::GetProgressInfo(&info); + NN_UTIL_RETURN_IF_FAILED(result); + s_scrollBuffer->ReplaceText(" %c Update Finalizing", GetProgressChar())->Render(); + nn::os::Thread::Sleep(nn::fnd::TimeSpan::FromMilliSeconds(40)); + } while (info.state == nn::cup::CTR::UPDATE_STATE_FINALIZING); + // 抜けた際のstateがFAILEDかどうか確認 + if (info.state == nn::cup::CTR::UPDATE_STATE_FAILED) + { + NN_UTIL_RETURN_IF_FAILED(info.lastResult); + } + + /******************* アップデート終了 *******************/ + s_scrollBuffer->AppendText(" - Finalized (%lldmsec)", GetConsumedMillisec())->Render(); + s_scrollBuffer->AppendText(""); + + return nn::ResultSuccess(); +} + +nn::Result UpdateSequence(bool *isHandledError) +{ + nn::Result result; + nn::Result lastResult = nn::ResultSuccess(); + + /********************* CUPの初期化 *******************/ + s_scrollBuffer->AppendText("Initializing Cup Library")->Render(); + SetTick(); // 初期化開始前の時間をセット + result = nn::cup::CTR::Initialize(s_updaterBuffer, sizeof(s_updaterBuffer)); + if (result == nn::cup::CTR::ResultUpdatePartitionNotFound()) + { + s_scrollBuffer->AppendText(" - Update Partition Not Found (%lldmsec)", GetConsumedMillisec())->Render(); + s_scrollBuffer->AppendText("")->Render(); + *isHandledError = true; + return result; + } + if (result == nn::cup::CTR::ResultUpdateNotRequired()) + { + s_scrollBuffer->AppendText(" - Already Updated (%lldmsec)", GetConsumedMillisec())->Render(); + s_scrollBuffer->AppendText("")->Render(); + *isHandledError = true; + return result; + } + if (result == nn::cup::CTR::ResultInvalidUpdatePartitionFormat()) + { + s_scrollBuffer->AppendText(" - Invalid Update Partition (%lldmsec)", GetConsumedMillisec())->Render(); + s_scrollBuffer->AppendText("")->Render(); + *isHandledError = true; + return result; + }NN_UTIL_RETURN_IF_FAILED(result); + + s_scrollBuffer->AppendText(" - Need Update (%lldmsec)", GetConsumedMillisec())->Render(); + s_scrollBuffer->AppendText("")->Render(); + + lastResult = UpdateCore(); + + // Initializeに成功した場合のみ、再びInitializeするためにFinalizeが必要 + SetTick(); + s_scrollBuffer->AppendText("Finalizing Cup Library")->Render(); + NN_UTIL_RETURN_IF_FAILED(nn::cup::CTR::Finalize()); + s_scrollBuffer->AppendText(" - Complete (%lldmsec)", GetConsumedMillisec())->Render(); + s_scrollBuffer->AppendText("")->Render(); + + return lastResult; +} +} + +nn::Result ExecuteCup(ScrollBuffer* scrollBuf) +{ + nn::Result result; + bool isHandledError = false; + result = UpdateSequence(&isHandledError); + if (isHandledError == false && result.IsFailure()) + { + { + // それ以外の場合は、Resultを表示 + scrollBuf->AppendText(" - Unhandled Error: 0x%08x", result.GetPrintableBits()); + scrollBuf->AppendText("")->Render(); + } + } + + return result; } extern "C" void nnMain() @@ -233,7 +255,7 @@ extern "C" void nnMain() nn::ProgramId MMEN_PROGRAM_ID = 0x0004003000008202; nn::cfg::CfgRegionCode region = nn::cfg::GetRegion(); - switch(region) + switch (region) { case nn::cfg::CFG_REGION_AMERICA: { @@ -255,35 +277,57 @@ extern "C" void nnMain() break; } - nn::am::ProgramInfo outInfos; result = nn::am::GetProgramInfos(&outInfos, nn::fs::MEDIA_TYPE_NAND, &MMEN_PROGRAM_ID, 1); if (result.IsSuccess()) { - - /******************** CUPの実行 *******************/ - bool isHandledError = false; - result = UpdateSequence(&isHandledError); - if (isHandledError == false && result.IsFailure()) + result = ExecuteCup(s_scrollBuffer); + // CUP不要だがNUPバージョンのほうが新しかったら強制的に実行 + if (result == nn::cup::CTR::ResultUpdateNotRequired()) { + // バージョンの取得 + VerDef versionData; + GetSystemVersion(&versionData, region); + + const size_t ROMFS_BUFFER_SIZE = 1024 * 32; + u8 buffer[ROMFS_BUFFER_SIZE]; + result = nn::fs::MountRom(16, 16, buffer, ROMFS_BUFFER_SIZE); + if (result.IsSuccess()) { - // それ以外の場合は、Resultを表示 - s_scrollBuffer->AppendText(" - Unhandled Error: 0x%08x", result.GetPrintableBits()); - s_scrollBuffer->AppendText("")->Render(); + nn::fs::FileReader fileReader; + result = fileReader.TryInitialize("rom:/nup_version.bin"); + if (result.IsSuccess()) + { + u8 buf[1024]; + s32 readSize; + result = fileReader.TryRead(&readSize, buf, sizeof(buf)); + if (result.IsSuccess()) + { + if (versionData.nup.majorVersion < *reinterpret_cast(buf)) + { + // CUPバージョンを削除 + result = nn::am::DeleteProgram(nn::fs::MEDIA_TYPE_NAND, cCupVerId[region]); + if (result.IsSuccess()) + { + result = ExecuteCup(s_scrollBuffer); + } + } + } + } } } } - else if(result == nn::am::ResultNotFound()) + else if (result == nn::am::ResultNotFound()) { s_scrollBuffer->AppendText("Cannot find Home Menu"); } s_scrollBuffer->AppendText("")->Render(); - for(;;) + for (;;) { s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY0); - if(result.IsSuccess() || result == nn::cup::CTR::ResultUpdateNotRequired()) + if (result.IsSuccess() || result == nn::cup::CTR::ResultUpdateNotRequired()) { s_RenderSystem.SetClearColor(NN_GX_DISPLAY0, 0, 1, 0, 1); } @@ -294,7 +338,7 @@ extern "C" void nnMain() s_RenderSystem.Clear(); s_RenderSystem.SwapBuffers(); s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY1); - if(result.IsSuccess() || result == nn::cup::CTR::ResultUpdateNotRequired()) + if (result.IsSuccess() || result == nn::cup::CTR::ResultUpdateNotRequired()) { s_RenderSystem.SetClearColor(NN_GX_DISPLAY1, 0, 1, 0, 1); } @@ -304,7 +348,7 @@ extern "C" void nnMain() } s_scrollBuffer->ReplaceText("%c Finished", GetProgressChar())->Render(); - if ( nn::applet::IsExpectedToCloseApplication() ) + if (nn::applet::IsExpectedToCloseApplication()) { nn::applet::PrepareToCloseApplication(); nn::applet::CloseApplication(); diff --git a/trunk/CardCup/romfiles/nup_version.bin b/trunk/CardCup/romfiles/nup_version.bin new file mode 100644 index 0000000..45a8ca0 --- /dev/null +++ b/trunk/CardCup/romfiles/nup_version.bin @@ -0,0 +1 @@ + \ No newline at end of file