From 6226dcae7f98883e36915e2da0630b6fead85bfd Mon Sep 17 00:00:00 2001 From: N2614 Date: Fri, 15 Jul 2011 02:35:39 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=96=E3=83=A9=E3=83=B3=E3=83=81=E5=85=83?= =?UTF-8?q?=E3=83=AA=E3=83=93=E3=82=B8=E3=83=A7=E3=83=B3=E9=96=93=E9=81=95?= =?UTF-8?q?=E3=81=84=E3=81=AE=E3=81=9F=E3=82=81=E5=89=8A=E9=99=A4?= 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@383 385bec56-5757-e545-9c3a-d8741f4650f1 --- branches/SelfCupExecChecker/HeapManager.cpp | 59 --- branches/SelfCupExecChecker/HeapManager.h | 46 --- branches/SelfCupExecChecker/OMakefile | 47 --- branches/SelfCupExecChecker/OMakeroot | 73 ---- branches/SelfCupExecChecker/Readme.txt | 4 - branches/SelfCupExecChecker/SelfCupTool.bsf | Bin 2302 -> 0 bytes branches/SelfCupExecChecker/SelfCupTool.rsf | 26 -- branches/SelfCupExecChecker/VersionDetect.cpp | 67 ---- branches/SelfCupExecChecker/VersionDetect.h | 55 --- branches/SelfCupExecChecker/banner/model.cbmd | Bin 198785 -> 0 bytes branches/SelfCupExecChecker/banner/sound.cbsd | Bin 198785 -> 0 bytes .../banner/unknown24x24.ctpk | 1 - .../banner/unknown48x48.ctpk | 1 - branches/SelfCupExecChecker/main.cpp | 358 ------------------ .../romfiles/nup_version.bin | 1 - branches/SelfCupExecChecker/scrollBuffer.cpp | 89 ----- branches/SelfCupExecChecker/scrollBuffer.h | 55 --- 17 files changed, 882 deletions(-) delete mode 100644 branches/SelfCupExecChecker/HeapManager.cpp delete mode 100644 branches/SelfCupExecChecker/HeapManager.h delete mode 100644 branches/SelfCupExecChecker/OMakefile delete mode 100644 branches/SelfCupExecChecker/OMakeroot delete mode 100644 branches/SelfCupExecChecker/Readme.txt delete mode 100644 branches/SelfCupExecChecker/SelfCupTool.bsf delete mode 100644 branches/SelfCupExecChecker/SelfCupTool.rsf delete mode 100644 branches/SelfCupExecChecker/VersionDetect.cpp delete mode 100644 branches/SelfCupExecChecker/VersionDetect.h delete mode 100644 branches/SelfCupExecChecker/banner/model.cbmd delete mode 100644 branches/SelfCupExecChecker/banner/sound.cbsd delete mode 100644 branches/SelfCupExecChecker/banner/unknown24x24.ctpk delete mode 100644 branches/SelfCupExecChecker/banner/unknown48x48.ctpk delete mode 100644 branches/SelfCupExecChecker/main.cpp delete mode 100644 branches/SelfCupExecChecker/romfiles/nup_version.bin delete mode 100644 branches/SelfCupExecChecker/scrollBuffer.cpp delete mode 100644 branches/SelfCupExecChecker/scrollBuffer.h diff --git a/branches/SelfCupExecChecker/HeapManager.cpp b/branches/SelfCupExecChecker/HeapManager.cpp deleted file mode 100644 index 8e95885..0000000 --- a/branches/SelfCupExecChecker/HeapManager.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/*---------------------------------------------------------------------------* - 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/branches/SelfCupExecChecker/HeapManager.h b/branches/SelfCupExecChecker/HeapManager.h deleted file mode 100644 index f50f3fe..0000000 --- a/branches/SelfCupExecChecker/HeapManager.h +++ /dev/null @@ -1,46 +0,0 @@ -/*---------------------------------------------------------------------------* - 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/branches/SelfCupExecChecker/OMakefile b/branches/SelfCupExecChecker/OMakefile deleted file mode 100644 index 26a88d5..0000000 --- a/branches/SelfCupExecChecker/OMakefile +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env omake -#---------------------------------------------------------------------------- -# Project: Horizon -# File: OMakefile -# -# Copyright (C)2009 Nintendo Co., Ltd. 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$ -#---------------------------------------------------------------------------- -CTR_APPTYPE=CARD - -SUPPORTED_TARGETS = CTR-T*.Process.MPCore.* - -SAMPLED_DEMOS_COMMON_INCLUDE_DIR = $(dir $(HORIZON_ROOT)/../CTR/SampleDemos/common/include) -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 = SelfCupTool - -TITLE = SelfCupTool -ROM_SPEC_FILE = SelfCupTool.rsf - -CTR_BANNER_SPEC = $(TARGET_PROGRAM).bsf - -include $(ROOT_OMAKE)/modulerules - -build: $(DEFAULT_TARGETS) diff --git a/branches/SelfCupExecChecker/OMakeroot b/branches/SelfCupExecChecker/OMakeroot deleted file mode 100644 index 7ee1cb5..0000000 --- a/branches/SelfCupExecChecker/OMakeroot +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env omake -#---------------------------------------------------------------------------- -# Project: Horizon -# File: OMakeroot -# -# Copyright (C)2009 Nintendo Co., Ltd. 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:$ -#---------------------------------------------------------------------------- - -# fBNgCAEgɂ‚Ă̐ -# -# a) \[XR[h[gfBNgɔzuꍇ -# : -# /OMakeroot -# /foo/bar/OMakefile -# -# : -# OMakefile ƓfBNgȉ objects images ܂B -# -# /foo/bar/objects/... -# /foo/bar/images/.. -# -# -# b) \[XR[h sources ȉɔzuꍇ -# : -# /OMakeroot -# /sources/foo/bar/OMakefile -# -# : -# [gfBNgȉ objects images ܂B -# -# /objects/foo/bar/... -# /images/foo/bar/... -# -# - -# [g‹ϐ̎擾 -public.HORIZON_ROOT = -if $(defined-env HORIZON_ROOT) - HORIZON_ROOT = $(absname $(getenv HORIZON_ROOT)) - export - -if $(defined-env CTRSDK_ROOT) - CTRSDK_ROOT = $(absname $(getenv CTRSDK_ROOT)) - if $(and $(defined-env HORIZON_ROOT), $(not $(equal $(HORIZON_ROOT), $(CTRSDK_ROOT)))) - eprintln(HORIZON_ROOT CTRSDK_ROOT v܂BpXݒ肷邩Aǂ炩`ĉB) - exit(1) - HORIZON_ROOT = $(CTRSDK_ROOT) - export - -if $(not $(HORIZON_ROOT)) - eprintln($"$$CTRSDK_ROOT `Ă܂") - exit(1) - -include $(HORIZON_ROOT)/build/omake/commondefs - -DefineCommandVars() - -.PHONY: all build clean clobber -.PHONY: run run-scripts run-emumem - -# -# OMakefile ̓ǂݍ -# -.SUBDIRS: . - diff --git a/branches/SelfCupExecChecker/Readme.txt b/branches/SelfCupExecChecker/Readme.txt deleted file mode 100644 index 01dd48d..0000000 --- a/branches/SelfCupExecChecker/Readme.txt +++ /dev/null @@ -1,4 +0,0 @@ -rh‹ -ESDK - Horizon 2.3 branch r38025 + r38091 SelfCup.desc - + trunk r38944 pl_SharedDataTitleId.h diff --git a/branches/SelfCupExecChecker/SelfCupTool.bsf b/branches/SelfCupExecChecker/SelfCupTool.bsf deleted file mode 100644 index 104a94da96cd5d963d349ca5c6fcce26ae7e3cbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2302 zcmb7@%}&BV6ov0r6Q4m6H@Z+KhJ|rsM6B@-iN&}UA&7ugsXvL2;Tss=z?CbPK7-HU z)`;f}40Xb^b~0(1PS3sfyQi1I&zzJblt2oys8<2cr*etalpCCea)sR)c7e2|i~WpD z%Rcro7N2+UHiF)~Uy~`R|H-i|w|LvZ70EsBD^ipPeP2RkjQky)vxJ;2?`%a`MK<2; zYzL^;09`kOt2fp#wk|zHu)7fFWNu`{_Q#rGY=0EX_#@P9p&Pog2InT%2DrMq)-it1 z5bM@4GJuy|>5rV>09lO8Ax`gbHW_E@jjjxRjO#yrP0mrF2RAOE<`)kz2d6kOwUp*I z93`+s$UK?1hPc}iwV4q^!TDfENmN43p675qs~7dEzSM{MR`2Q)_czs1k9R9iC+b3# z6`dZs&Cc53ZE5GPQMHZQ&9SRVZt6E>3%bKUwF@%riEnqMis|N;Ye~iGdv;(iqYmL% zgnF^1x3#kaqppIk4p-ag{~U}rnxmrmV?1-}BHb4wwvf|Jvo7{BYB!CoUDx@U+m9xI zZ~1Ac&QC+NAI&!0$)cen)MPOjjbG&*sbyA9+-82Nvlu4Tel%g~#LiszPN!@7sdh7@sr_j7@Sk?igDXGP`DhB-LF)Z@%5t2-lYH^vj#EOln -#include -#include - -#include "VersionDetect.h" -#include "HeapManager.h" - -void GetNupVersion(nn::pl::CTR::NetworkUpdateVersion* nup, nn::cfg::CTR::CfgRegionCode region) -{ - nn::Result result; - const size_t BUF_SIZE = 1024; - u8 buf[BUF_SIZE]; - - // NUPバージョン - { - result = nn::fs::MountContent("nver:", nn::fs::MEDIA_TYPE_NAND, cNupVerId[region], 0, 1, 1, buf, - BUF_SIZE); - - nn::fs::FileInputStream fis; - - result = fis.TryInitialize(L"nver:/version.bin"); - if (result.IsSuccess()) - { - s64 fileSize = fis.GetSize(); - NN_LOG("version.bin size = %lld\n", fileSize); - s32 ret; - void* addr = NULL; - HeapManager heap(fileSize); - addr = heap.GetAddr(); - if (addr != NULL) - { - result = fis.TryRead(&ret, addr, fileSize); - if (result.IsSuccess()) - { - nn::pl::CTR::NetworkUpdateVersion* ver_buf = - reinterpret_cast (addr); - - std::memcpy(nup, ver_buf, sizeof(nn::pl::CTR::NetworkUpdateVersion)); - } - } - } - - fis.Finalize(); - nn::fs::Unmount("nver:"); - } - -} - -void GetSystemVersion(VerDef* mVerData, nn::cfg::CTR::CfgRegionCode region) -{ - GetNupVersion(&mVerData->nup, region); -} diff --git a/branches/SelfCupExecChecker/VersionDetect.h b/branches/SelfCupExecChecker/VersionDetect.h deleted file mode 100644 index 7f94174..0000000 --- a/branches/SelfCupExecChecker/VersionDetect.h +++ /dev/null @@ -1,55 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: VersionDetect.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 VERSIONDETECT_H_ -#define VERSIONDETECT_H_ - -#include -#include -#include - -struct VerDef -{ - nn::pl::CTR::CardUpdateVersion cup; - nn::pl::CTR::NetworkUpdateVersion nup; -}; - -// TODO:リージョン追加時に範囲外アクセスにならないよう注意 -const nn::ProgramId cCupVerId[] = -{ - nn::pl::CTR::SHAREDDATA_TITLEID_CUP_VERSION_JP, - nn::pl::CTR::SHAREDDATA_TITLEID_CUP_VERSION_US, - nn::pl::CTR::SHAREDDATA_TITLEID_CUP_VERSION_EU, - nn::pl::CTR::SHAREDDATA_TITLEID_CUP_VERSION_EU, - nn::pl::CTR::SHAREDDATA_TITLEID_CUP_VERSION_CN, - nn::pl::CTR::SHAREDDATA_TITLEID_CUP_VERSION_KR, - nn::pl::CTR::SHAREDDATA_TITLEID_CUP_VERSION_TW, -}; - -const nn::ProgramId cNupVerId[] = -{ - nn::pl::CTR::SHAREDDATA_TITLEID_NUP_VERSION_JP, - nn::pl::CTR::SHAREDDATA_TITLEID_NUP_VERSION_US, - nn::pl::CTR::SHAREDDATA_TITLEID_NUP_VERSION_EU, - nn::pl::CTR::SHAREDDATA_TITLEID_NUP_VERSION_EU, - nn::pl::CTR::SHAREDDATA_TITLEID_NUP_VERSION_CN, - nn::pl::CTR::SHAREDDATA_TITLEID_NUP_VERSION_KR, - nn::pl::CTR::SHAREDDATA_TITLEID_NUP_VERSION_TW, -}; - -// リージョンコードに基づいてバージョン情報を取得する -void GetSystemVersion(VerDef* mVerData, nn::cfg::CTR::CfgRegionCode region); - -#endif /* VERSIONDETECT_H_ */ diff --git a/branches/SelfCupExecChecker/banner/model.cbmd b/branches/SelfCupExecChecker/banner/model.cbmd deleted file mode 100644 index f1c7b6279e13f5278c419d615d7d03d5660005e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198785 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 MDvwobWH -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "demo.h" -#include "scrollBuffer.h" -#include "VersionDetect.h" -#include "HeapManager.h" - -namespace -{ -const s32 s_GxHeapSize = 0x800000; -uptr s_GxHeap; - -demo::RenderSystemDrawing s_RenderSystem; -ScrollBuffer s_scrollBufferInstance; -ScrollBuffer *s_scrollBuffer; - -char s_updaterBuffer[1 << 20] NN_ATTRIBUTE_ALIGN(4096); - -// デモの初期化 -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 - { - 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; - }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() -{ - NN_LOG("Start cup demo\n"); - nn::Result result; - Initialize(); - - nn::ProgramId MMEN_PROGRAM_ID = 0x0004003000008202; - - nn::cfg::CfgRegionCode region = nn::cfg::GetRegion(); - switch (region) - { - case nn::cfg::CFG_REGION_AMERICA: - { - MMEN_PROGRAM_ID = 0x0004003000008f02; - } - break; - - case nn::cfg::CFG_REGION_EUROPE: - case nn::cfg::CFG_REGION_AUSTRALIA: - { - MMEN_PROGRAM_ID = 0x0004003000009802; - } - break; - - case nn::cfg::CFG_REGION_JAPAN: - { - MMEN_PROGRAM_ID = 0x0004003000008202; - } - break; - } - - nn::am::ProgramInfo outInfos; - result = nn::am::GetProgramInfos(&outInfos, nn::fs::MEDIA_TYPE_NAND, &MMEN_PROGRAM_ID, 1); - if (result.IsSuccess()) - { - 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()) - { - 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()) - { - s_scrollBuffer->AppendText("Cannot find Home Menu"); - } - - s_scrollBuffer->AppendText("")->Render(); - - for (;;) - { - s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY0); - if (result.IsSuccess() || result == nn::cup::CTR::ResultUpdateNotRequired()) - { - s_RenderSystem.SetClearColor(NN_GX_DISPLAY0, 0, 1, 0, 1); - } - else - { - s_RenderSystem.SetClearColor(NN_GX_DISPLAY0, 1, 0, 0, 1); - } - s_RenderSystem.Clear(); - s_RenderSystem.SwapBuffers(); - s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY1); - if (result.IsSuccess() || result == nn::cup::CTR::ResultUpdateNotRequired()) - { - s_RenderSystem.SetClearColor(NN_GX_DISPLAY1, 0, 1, 0, 1); - } - else - { - s_RenderSystem.SetClearColor(NN_GX_DISPLAY1, 1, 0, 0, 1); - } - s_scrollBuffer->ReplaceText("%c Finished", GetProgressChar())->Render(); - - if (nn::applet::IsExpectedToCloseApplication()) - { - nn::applet::PrepareToCloseApplication(); - nn::applet::CloseApplication(); - } - - } -} diff --git a/branches/SelfCupExecChecker/romfiles/nup_version.bin b/branches/SelfCupExecChecker/romfiles/nup_version.bin deleted file mode 100644 index 45a8ca0..0000000 --- a/branches/SelfCupExecChecker/romfiles/nup_version.bin +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/branches/SelfCupExecChecker/scrollBuffer.cpp b/branches/SelfCupExecChecker/scrollBuffer.cpp deleted file mode 100644 index 54de11e..0000000 --- a/branches/SelfCupExecChecker/scrollBuffer.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: scrollBuffer.cpp - - Copyright (C)2009 Nintendo Co., Ltd. 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 -#include "scrollBuffer.h" - -using namespace std; - -char ScrollBuffer::s_buffers[MAX_BUFFER_LINE][MAX_BUFFER_CHARS]; - -char *ScrollBuffer::GetFormattedString(const char *fmt, va_list arg) -{ - static char formattedBuffer[MAX_BUFFER_CHARS]; - vsnprintf(formattedBuffer, MAX_BUFFER_CHARS, fmt, arg); - return formattedBuffer; -} - -ScrollBuffer *ScrollBuffer::Update() -{ - return this; -} - -ScrollBuffer *ScrollBuffer::AppendText(const char *fmt, ...) -{ - va_list vlist; - va_start(vlist, fmt); - - int nextPosition=(m_tail+1)%MAX_BUFFER_LINE; - if(nextPosition==m_head){ - // ヘッドとビューの移動 - if(m_head==m_currentView){ - m_currentView=(m_head+1)%MAX_BUFFER_LINE; - } - m_head=(m_head+1)%MAX_BUFFER_LINE; - - } - strlcpy(s_buffers[m_tail], GetFormattedString(fmt, vlist), MAX_BUFFER_CHARS); - m_tail=nextPosition; - NN_LOG("cup: %s\n", GetFormattedString(fmt, vlist)); - - // ビューの移動 - if((m_currentView+MAX_DISPLAY_LINES)%MAX_BUFFER_LINE==m_tail){ - m_currentView=(m_currentView+1)%MAX_BUFFER_LINE; - } - - return this; -} -ScrollBuffer *ScrollBuffer::ReplaceText(const char *fmt, ...) -{ - va_list vlist; - va_start(vlist, fmt); - - NN_ASSERT(m_tail!=m_head); - strlcpy(s_buffers[(m_tail-1)%MAX_BUFFER_LINE], GetFormattedString(fmt, vlist), MAX_BUFFER_CHARS); - - return this; -} - -void ScrollBuffer::Render() -{ - // 描画前処理 - m_render->SetRenderTarget(NN_GX_DISPLAY1); - m_render->Clear(); - m_render->SetColor(1.0f, 1.0f, 1.0f, 1.0f); - - // リングバッファなので、終端条件を調整 - int tail=(m_tailDrawText(0, (i-m_currentView)*FONT_SIZE, s_buffers[i%MAX_BUFFER_LINE]); - } - } - - // 描画転送 - m_render->SwapBuffers(); -} diff --git a/branches/SelfCupExecChecker/scrollBuffer.h b/branches/SelfCupExecChecker/scrollBuffer.h deleted file mode 100644 index 1d3563a..0000000 --- a/branches/SelfCupExecChecker/scrollBuffer.h +++ /dev/null @@ -1,55 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: scrollBuffer.h - - Copyright (C)2009 Nintendo Co., Ltd. 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 SCROLL_BUFFER_H_ -#define SCROLL_BUFFER_H_ - -#include "demo.h" -class ScrollBuffer -{ -private: - enum - { - MAX_BUFFER_LINE=128, - MAX_BUFFER_CHARS=80, - MAX_DISPLAY_LINES=20, - FONT_SIZE=12 - }; - // 表示文字のバッファ (リングバッファ) - static char s_buffers[MAX_BUFFER_LINE][MAX_BUFFER_CHARS]; - int m_head; - int m_tail; - int m_currentView; - - demo::RenderSystemDrawing *m_render; - - char *GetFormattedString(const char *fmt, va_list arg); - -public: - ScrollBuffer() : - m_head(0), m_tail(0), m_currentView(0) - {} - void Initialize(demo::RenderSystemDrawing *render) - { - m_render=render; - } - - ScrollBuffer *Update(); // キー入力を参照して、スクロールする - ScrollBuffer *AppendText(const char *fmt, ...); // 文字列を追加する - ScrollBuffer *ReplaceText(const char *fmt, ...); // 最新の文字列を置換する - void Render(); // レンダリング -}; - -#endif // SCROLL_BUFFER_H