From 0f8be2d2cc54feda0a52ec8f9633fd022879816a Mon Sep 17 00:00:00 2001 From: Subv Date: Fri, 4 Dec 2015 16:05:23 -0500 Subject: HLE/Applets: Implemented a dummy Mii Selector applet. This prevents some games (like Super Mario 3D Land) from freezing when trying to launch it, however, it's not complete and won't let you go past Mii selection as the parameter structure hasn't been reverse engineered yet. --- src/core/hle/service/apt/apt.cpp | 19 +++++++++++++++++++ src/core/hle/service/apt/apt.h | 17 ++++++++++++++++- src/core/hle/service/apt/apt_u.cpp | 2 +- 3 files changed, 36 insertions(+), 2 deletions(-) (limited to 'src/core/hle/service/apt') diff --git a/src/core/hle/service/apt/apt.cpp b/src/core/hle/service/apt/apt.cpp index ba66569b4..feb579778 100644 --- a/src/core/hle/service/apt/apt.cpp +++ b/src/core/hle/service/apt/apt.cpp @@ -12,6 +12,7 @@ #include "core/hle/service/apt/apt_a.h" #include "core/hle/service/apt/apt_s.h" #include "core/hle/service/apt/apt_u.h" +#include "core/hle/service/fs/archive.h" #include "core/hle/hle.h" #include "core/hle/kernel/event.h" @@ -380,6 +381,24 @@ void StartLibraryApplet(Service::Interface* self) { cmd_buff[1] = applet->Start(parameter).raw; } +void GetAppletInfo(Service::Interface* self) { + u32* cmd_buff = Kernel::GetCommandBuffer(); + auto app_id = static_cast(cmd_buff[1]); + + if (auto applet = HLE::Applets::Applet::Get(app_id)) { + // TODO(Subv): Get the title id for the current applet and write it in the response[2-3] + cmd_buff[1] = RESULT_SUCCESS.raw; + cmd_buff[4] = static_cast(Service::FS::MediaType::NAND); + cmd_buff[5] = 1; // Registered + cmd_buff[6] = 1; // Loaded + cmd_buff[7] = 0; // Applet Attributes + } else { + cmd_buff[1] = ResultCode(ErrorDescription::NotFound, ErrorModule::Applet, + ErrorSummary::NotFound, ErrorLevel::Status).raw; + } + LOG_WARNING(Service_APT, "(stubbed) called appid=%u", app_id); +} + void Init() { AddService(new APT_A_Interface); AddService(new APT_S_Interface); diff --git a/src/core/hle/service/apt/apt.h b/src/core/hle/service/apt/apt.h index 4a72b6b5c..47a97c1a1 100644 --- a/src/core/hle/service/apt/apt.h +++ b/src/core/hle/service/apt/apt.h @@ -54,7 +54,7 @@ enum class AppletId : u32 { Notifications = 0x116, Miiverse = 0x117, SoftwareKeyboard1 = 0x201, - Ed = 0x202, + Ed1 = 0x202, PnoteApp = 0x204, SnoteApp = 0x205, Error = 0x206, @@ -64,6 +64,7 @@ enum class AppletId : u32 { Application = 0x300, AnyLibraryApplet = 0x400, SoftwareKeyboard2 = 0x401, + Ed2 = 0x402, }; /// Send a parameter to the currently-running application, which will read it via ReceiveParameter @@ -132,6 +133,20 @@ void Enable(Service::Interface* self); */ void GetAppletManInfo(Service::Interface* self); +/** + * APT::GetAppletInfo service function. + * Inputs: + * 1 : AppId + * Outputs: + * 1 : Result of function, 0 on success, otherwise error code + * 2-3 : Title ID + * 4 : Media Type + * 5 : Registered + * 6 : Loaded + * 7 : Attributes + */ +void GetAppletInfo(Service::Interface* self); + /** * APT::IsRegistered service function. This returns whether the specified AppID is registered with NS yet. * An AppID is "registered" once the process associated with the AppID uses APT:Enable. Home Menu uses this diff --git a/src/core/hle/service/apt/apt_u.cpp b/src/core/hle/service/apt/apt_u.cpp index 146bfd595..2e9d1f4b4 100644 --- a/src/core/hle/service/apt/apt_u.cpp +++ b/src/core/hle/service/apt/apt_u.cpp @@ -17,7 +17,7 @@ const Interface::FunctionInfo FunctionTable[] = { {0x00030040, Enable, "Enable"}, {0x00040040, nullptr, "Finalize"}, {0x00050040, GetAppletManInfo, "GetAppletManInfo"}, - {0x00060040, nullptr, "GetAppletInfo"}, + {0x00060040, GetAppletInfo, "GetAppletInfo"}, {0x00070000, nullptr, "GetLastSignaledAppletId"}, {0x00080000, nullptr, "CountRegisteredApplet"}, {0x00090040, IsRegistered, "IsRegistered"}, -- cgit v1.2.3