diff --git a/include/kernel/handles.hpp b/include/kernel/handles.hpp index 947f6589..f0ded503 100644 --- a/include/kernel/handles.hpp +++ b/include/kernel/handles.hpp @@ -31,6 +31,7 @@ namespace KernelHandles { MaxServiceHandle = PTM, GSPSharedMemHandle = MaxServiceHandle + 1, // Handle for the GSP shared memory + FontSharedMemHandle, HIDSharedMemHandle, MinSharedMemHandle = GSPSharedMemHandle, @@ -56,16 +57,21 @@ namespace KernelHandles { // Returns the name of a handle as a string based on the given handle static const char* getServiceName(Handle handle) { switch (handle) { + case AC: return "AC"; + case AM: return "AM"; case APT: return "APT"; + case BOSS: return "BOSS"; case CECD: return "CECD"; case CFG: return "CFG"; case HID: return "HID"; + case FRD: return "FRD"; case FS: return "FS"; case DSP: return "DSP"; case GPU: return "GPU"; case LCD: return "LCD"; case MIC: return "MIC"; case NDM: return "NDM"; + case NIM: return "NIM"; case PTM: return "PTM"; default: return "Unknown"; } diff --git a/include/services/apt.hpp b/include/services/apt.hpp index 6c6c5fb4..255699ef 100644 --- a/include/services/apt.hpp +++ b/include/services/apt.hpp @@ -26,6 +26,7 @@ class APTService { void checkNew3DS(u32 messagePointer); void checkNew3DSApp(u32 messagePointer); void enable(u32 messagePointer); + void getSharedFont(u32 messagePointer); void initialize(u32 messagePointer); void inquireNotification(u32 messagePointer); void notifyToWait(u32 messagePointer); diff --git a/src/core/services/apt.cpp b/src/core/services/apt.cpp index 24e41a17..a4bd264d 100644 --- a/src/core/services/apt.cpp +++ b/src/core/services/apt.cpp @@ -10,6 +10,7 @@ namespace APTCommands { ReceiveParameter = 0x000D0080, ReplySleepQuery = 0x003E0080, NotifyToWait = 0x00430040, + GetSharedFont = 0x00440000, AppletUtility = 0x004B00C2, SetApplicationCpuTimeLimit = 0x004F0080, GetApplicationCpuTimeLimit = 0x00500040, @@ -50,6 +51,7 @@ void APTService::handleSyncRequest(u32 messagePointer) { case APTCommands::CheckNew3DS: checkNew3DS(messagePointer); break; case APTCommands::CheckNew3DSApp: checkNew3DSApp(messagePointer); break; case APTCommands::Enable: enable(messagePointer); break; + case APTCommands::GetSharedFont: getSharedFont(messagePointer); break; case APTCommands::Initialize: initialize(messagePointer); break; case APTCommands::InquireNotification: inquireNotification(messagePointer); break; case APTCommands::GetApplicationCpuTimeLimit: getApplicationCpuTimeLimit(messagePointer); break; @@ -182,4 +184,13 @@ void APTService::setScreencapPostPermission(u32 messagePointer) { // Apparently only 1-3 are valid values, but I see 0 used in some games like Pokemon Rumble mem.write32(messagePointer, Result::Success); screencapPostPermission = perm; +} + +void APTService::getSharedFont(u32 messagePointer) { + log("APT::GetSharedFont\n"); + + constexpr u32 fontVaddr = 0x18000000; + mem.write32(messagePointer + 4, Result::Success); + mem.write32(messagePointer + 8, fontVaddr); + mem.write32(messagePointer + 16, KernelHandles::FontSharedMemHandle); } \ No newline at end of file