diff options
Diffstat (limited to 'src/core/system.cpp')
-rw-r--r-- | src/core/system.cpp | 61 |
1 files changed, 48 insertions, 13 deletions
diff --git a/src/core/system.cpp b/src/core/system.cpp index a5f763805b..fa8bd0317a 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -13,33 +13,30 @@ #include "core/system.h" #include "video_core/video_core.h" -namespace System { +namespace Core { -static bool is_powered_on{false}; +/*static*/ System System::s_instance; -Result Init(EmuWindow* emu_window, u32 system_mode) { +System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) { Core::Init(); CoreTiming::Init(); Memory::Init(); HW::Init(); Kernel::Init(system_mode); HLE::Init(); - if (!VideoCore::Init(emu_window)) { - return Result::ErrorInitVideoCore; - } AudioCore::Init(); GDBStub::Init(); - is_powered_on = true; + if (!VideoCore::Init(emu_window)) { + return ResultStatus::ErrorVideoCore; + } - return Result::Success; -} + is_powered_on = true; -bool IsPoweredOn() { - return is_powered_on; + return ResultStatus::Success; } -void Shutdown() { +void System::Shutdown() { GDBStub::Shutdown(); AudioCore::Shutdown(); VideoCore::Shutdown(); @@ -52,4 +49,42 @@ void Shutdown() { is_powered_on = false; } -} // namespace +System::ResultStatus System::Load(EmuWindow* emu_window, const std::string& filepath) { + state.app_loader = Loader::GetLoader(filepath); + + if (!state.app_loader) { + LOG_CRITICAL(Frontend, "Failed to obtain loader for %s!", filepath.c_str()); + return ResultStatus::ErrorGetLoader; + } + + boost::optional<u32> system_mode{ state.app_loader->LoadKernelSystemMode() }; + if (!system_mode) { + LOG_CRITICAL(Frontend, "Failed to determine system mode!"); + return ResultStatus::ErrorSystemMode; + } + + ResultStatus init_result{ Init(emu_window, system_mode.get()) }; + if (init_result != ResultStatus::Success) { + LOG_CRITICAL(Frontend, "Failed to initialize system (Error %i)!", init_result); + System::Shutdown(); + return init_result; + } + + const Loader::ResultStatus load_result{ state.app_loader->Load() }; + if (Loader::ResultStatus::Success != load_result) { + LOG_CRITICAL(Frontend, "Failed to load ROM (Error %i)!", load_result); + System::Shutdown(); + + switch (load_result) { + case Loader::ResultStatus::ErrorEncrypted: + return ResultStatus::ErrorLoader_ErrorEncrypted; + case Loader::ResultStatus::ErrorInvalidFormat: + return ResultStatus::ErrorLoader_ErrorInvalidFormat; + default: + return ResultStatus::ErrorLoader; + } + } + return ResultStatus::Success; +} + +} // namespace Core |