I hate this

This commit is contained in:
wheremyfoodat 2023-08-04 20:32:09 +03:00
parent 17724e77ca
commit 77dff17107
5 changed files with 105 additions and 38 deletions

View file

@ -5,41 +5,43 @@
#include "result/result.hpp" #include "result/result.hpp"
namespace Applets { namespace Applets {
enum class AppletIDs : u32 { namespace AppletIDs {
None = 0, enum : u32 {
SysAppletMask = 0x100, None = 0,
HomeMenu = 0x101, SysAppletMask = 0x100,
AltMenu = 0x103, HomeMenu = 0x101,
Camera = 0x110, AltMenu = 0x103,
Friends = 0x112, Camera = 0x110,
GameNotes = 0x113, Friends = 0x112,
Browser = 0x114, GameNotes = 0x113,
InstructionManual = 0x115, Browser = 0x114,
Notifications = 0x116, InstructionManual = 0x115,
Miiverse = 0x117, Notifications = 0x116,
MiiversePosting = 0x118, Miiverse = 0x117,
AmiiboSettings = 0x119, MiiversePosting = 0x118,
SysLibraryAppletMask = 0x200, AmiiboSettings = 0x119,
SoftwareKeyboard = 0x201, SysLibraryAppletMask = 0x200,
MiiSelector = 0x202, SoftwareKeyboard = 0x201,
PNote = 0x204, // TODO: What dis? MiiSelector = 0x202,
SNote = 0x205, // What is this too? PNote = 0x204, // TODO: What dis?
ErrDisp = 0x206, SNote = 0x205, // What is this too?
EshopMint = 0x207, ErrDisp = 0x206,
CirclePadProCalib = 0x208, EshopMint = 0x207,
Notepad = 0x209, CirclePadProCalib = 0x208,
Application = 0x300, Notepad = 0x209,
EshopTiger = 0x301, Application = 0x300,
LibraryAppletMask = 0x400, EshopTiger = 0x301,
SoftwareKeyboard2 = 0x401, LibraryAppletMask = 0x400,
MiiSelector2 = 0x402, SoftwareKeyboard2 = 0x401,
Pnote2 = 0x404, MiiSelector2 = 0x402,
SNote2 = 0x405, Pnote2 = 0x404,
ErrDisp2 = 0x406, SNote2 = 0x405,
EshopMint2 = 0x407, ErrDisp2 = 0x406,
CirclePadProCalib2 = 0x408, EshopMint2 = 0x407,
Notepad2 = 0x409, CirclePadProCalib2 = 0x408,
}; Notepad2 = 0x409,
};
}
class AppletBase { class AppletBase {
Memory& mem; Memory& mem;

View file

@ -28,6 +28,7 @@ class APTService {
// Applets here // Applets here
Applets::MiiSelectorApplet miiSelector; Applets::MiiSelectorApplet miiSelector;
Applets::AppletBase* getApplet(u32 id);
MAKE_LOG_FUNCTION(log, aptLogger) MAKE_LOG_FUNCTION(log, aptLogger)
@ -38,17 +39,21 @@ class APTService {
void checkNew3DS(u32 messagePointer); void checkNew3DS(u32 messagePointer);
void checkNew3DSApp(u32 messagePointer); void checkNew3DSApp(u32 messagePointer);
void enable(u32 messagePointer); void enable(u32 messagePointer);
void getAppletInfo(u32 messagePointer);
void getSharedFont(u32 messagePointer); void getSharedFont(u32 messagePointer);
void getWirelessRebootInfo(u32 messagePointer); void getWirelessRebootInfo(u32 messagePointer);
void glanceParameter(u32 messagePointer); void glanceParameter(u32 messagePointer);
void initialize(u32 messagePointer); void initialize(u32 messagePointer);
void inquireNotification(u32 messagePointer); void inquireNotification(u32 messagePointer);
void isRegistered(u32 messagePointer);
void notifyToWait(u32 messagePointer); void notifyToWait(u32 messagePointer);
void preloadLibraryApplet(u32 messagePointer); void preloadLibraryApplet(u32 messagePointer);
void receiveParameter(u32 messagePointer); void receiveParameter(u32 messagePointer);
void replySleepQuery(u32 messagePointer); void replySleepQuery(u32 messagePointer);
void setApplicationCpuTimeLimit(u32 messagePointer); void setApplicationCpuTimeLimit(u32 messagePointer);
void setScreencapPostPermission(u32 messagePointer); void setScreencapPostPermission(u32 messagePointer);
void prepareToStartLibraryApplet(u32 messagePointer);
void startLibraryApplet(u32 messagePointer);
void theSmashBrosFunction(u32 messagePointer); void theSmashBrosFunction(u32 messagePointer);
// Percentage of the syscore available to the application, between 5% and 89% // Percentage of the syscore available to the application, between 5% and 89%

View file

@ -43,7 +43,9 @@ class GPUService {
// Service commands // Service commands
void acquireRight(u32 messagePointer); void acquireRight(u32 messagePointer);
void flushDataCache(u32 messagePointer); void flushDataCache(u32 messagePointer);
void importDisplayCaptureInfo(u32 messagePointer);
void registerInterruptRelayQueue(u32 messagePointer); void registerInterruptRelayQueue(u32 messagePointer);
void saveVramSysArea(u32 messagePointer);
void setAxiConfigQoSMode(u32 messagePointer); void setAxiConfigQoSMode(u32 messagePointer);
void setInternalPriorities(u32 messagePointer); void setInternalPriorities(u32 messagePointer);
void setLCDForceBlack(u32 messagePointer); void setLCDForceBlack(u32 messagePointer);

View file

@ -7,10 +7,13 @@ namespace APTCommands {
GetLockHandle = 0x00010040, GetLockHandle = 0x00010040,
Initialize = 0x00020080, Initialize = 0x00020080,
Enable = 0x00030040, Enable = 0x00030040,
GetAppletInfo = 0x00060040,
IsRegistered = 0x00090040,
InquireNotification = 0x000B0040, InquireNotification = 0x000B0040,
ReceiveParameter = 0x000D0080, ReceiveParameter = 0x000D0080,
GlanceParameter = 0x000E0080, GlanceParameter = 0x000E0080,
PreloadLibraryApplet = 0x00160040, PreloadLibraryApplet = 0x00160040,
StartLibraryApplet = 0x001E0084,
ReplySleepQuery = 0x003E0080, ReplySleepQuery = 0x003E0080,
NotifyToWait = 0x00430040, NotifyToWait = 0x00430040,
GetSharedFont = 0x00440000, GetSharedFont = 0x00440000,
@ -62,6 +65,17 @@ void APTService::reset() {
miiSelector.reset(); miiSelector.reset();
} }
Applets::AppletBase* APTService::getApplet(u32 id) {
using namespace Applets;
switch (id) {
case AppletIDs::MiiSelector:
case AppletIDs::MiiSelector2: return &miiSelector;
default: return nullptr;
}
}
void APTService::handleSyncRequest(u32 messagePointer) { void APTService::handleSyncRequest(u32 messagePointer) {
const u32 command = mem.read32(messagePointer); const u32 command = mem.read32(messagePointer);
switch (command) { switch (command) {
@ -69,9 +83,11 @@ void APTService::handleSyncRequest(u32 messagePointer) {
case APTCommands::CheckNew3DS: checkNew3DS(messagePointer); break; case APTCommands::CheckNew3DS: checkNew3DS(messagePointer); break;
case APTCommands::CheckNew3DSApp: checkNew3DSApp(messagePointer); break; case APTCommands::CheckNew3DSApp: checkNew3DSApp(messagePointer); break;
case APTCommands::Enable: enable(messagePointer); break; case APTCommands::Enable: enable(messagePointer); break;
case APTCommands::GetAppletInfo: getAppletInfo(messagePointer); break;
case APTCommands::GetSharedFont: getSharedFont(messagePointer); break; case APTCommands::GetSharedFont: getSharedFont(messagePointer); break;
case APTCommands::Initialize: initialize(messagePointer); break; case APTCommands::Initialize: initialize(messagePointer); break;
case APTCommands::InquireNotification: [[likely]] inquireNotification(messagePointer); break; case APTCommands::InquireNotification: [[likely]] inquireNotification(messagePointer); break;
case APTCommands::IsRegistered: isRegistered(messagePointer); break;
case APTCommands::GetApplicationCpuTimeLimit: getApplicationCpuTimeLimit(messagePointer); break; case APTCommands::GetApplicationCpuTimeLimit: getApplicationCpuTimeLimit(messagePointer); break;
case APTCommands::GetLockHandle: getLockHandle(messagePointer); break; case APTCommands::GetLockHandle: getLockHandle(messagePointer); break;
case APTCommands::GetWirelessRebootInfo: getWirelessRebootInfo(messagePointer); break; case APTCommands::GetWirelessRebootInfo: getWirelessRebootInfo(messagePointer); break;
@ -84,7 +100,7 @@ void APTService::handleSyncRequest(u32 messagePointer) {
case APTCommands::SetScreencapPostPermission: setScreencapPostPermission(messagePointer); break; case APTCommands::SetScreencapPostPermission: setScreencapPostPermission(messagePointer); break;
case APTCommands::TheSmashBrosFunction: theSmashBrosFunction(messagePointer); break; case APTCommands::TheSmashBrosFunction: theSmashBrosFunction(messagePointer); break;
default: default:
Helpers::panicDev("APT service requested. Command: %08X\n", command); Helpers::panic("APT service requested. Command: %08X\n", command);
mem.write32(messagePointer + 4, Result::Success); mem.write32(messagePointer + 4, Result::Success);
break; break;
} }
@ -102,9 +118,30 @@ void APTService::appletUtility(u32 messagePointer) {
mem.write32(messagePointer + 4, Result::Success); mem.write32(messagePointer + 4, Result::Success);
} }
void APTService::getAppletInfo(u32 messagePointer) {
const u32 appID = mem.read32(messagePointer + 4);
Helpers::warn("APT::GetAppletInfo (appID = %X)\n", appID);
mem.write32(messagePointer, IPC::responseHeader(0x06, 7, 0));
mem.write32(messagePointer + 4, Result::Success);
mem.write8(messagePointer + 20, 1); // 1 = registered
mem.write8(messagePointer + 24, 1); // 1 = loaded
// TODO: The rest of this
}
void APTService::isRegistered(u32 messagePointer) {
const u32 appID = mem.read32(messagePointer + 4);
Helpers::warn("APT::IsRegistered (appID = %X)\n", appID);
mem.write32(messagePointer, IPC::responseHeader(0x09, 2, 0));
mem.write32(messagePointer + 4, Result::Success);
mem.write8(messagePointer + 8, 1); // Return that the app is always registered. This might break with home menu?
}
void APTService::preloadLibraryApplet(u32 messagePointer) { void APTService::preloadLibraryApplet(u32 messagePointer) {
const u32 appID = mem.read32(messagePointer + 4); const u32 appID = mem.read32(messagePointer + 4);
log("APT::PreloadLibraryApplet (app ID = %d) (stubbed)\n", appID); log("APT::PreloadLibraryApplet (app ID = %X) (stubbed)\n", appID);
mem.write32(messagePointer, IPC::responseHeader(0x16, 1, 0)); mem.write32(messagePointer, IPC::responseHeader(0x16, 1, 0));
mem.write32(messagePointer + 4, Result::Success); mem.write32(messagePointer + 4, Result::Success);

View file

@ -13,6 +13,8 @@ namespace ServiceCommands {
FlushDataCache = 0x00080082, FlushDataCache = 0x00080082,
SetLCDForceBlack = 0x000B0040, SetLCDForceBlack = 0x000B0040,
TriggerCmdReqQueue = 0x000C0000, TriggerCmdReqQueue = 0x000C0000,
ImportDisplayCaptureInfo = 0x00180000,
SaveVramSysArea = 0x00190000,
SetInternalPriorities = 0x001E0080, SetInternalPriorities = 0x001E0080,
StoreDataCache = 0x001F0082 StoreDataCache = 0x001F0082
}; };
@ -40,14 +42,16 @@ void GPUService::reset() {
void GPUService::handleSyncRequest(u32 messagePointer) { void GPUService::handleSyncRequest(u32 messagePointer) {
const u32 command = mem.read32(messagePointer); const u32 command = mem.read32(messagePointer);
switch (command) { switch (command) {
case ServiceCommands::TriggerCmdReqQueue: [[likely]] triggerCmdReqQueue(messagePointer); break;
case ServiceCommands::AcquireRight: acquireRight(messagePointer); break; case ServiceCommands::AcquireRight: acquireRight(messagePointer); break;
case ServiceCommands::FlushDataCache: flushDataCache(messagePointer); break; case ServiceCommands::FlushDataCache: flushDataCache(messagePointer); break;
case ServiceCommands::ImportDisplayCaptureInfo: importDisplayCaptureInfo(messagePointer); break;
case ServiceCommands::RegisterInterruptRelayQueue: registerInterruptRelayQueue(messagePointer); break; case ServiceCommands::RegisterInterruptRelayQueue: registerInterruptRelayQueue(messagePointer); break;
case ServiceCommands::SaveVramSysArea: saveVramSysArea(messagePointer); break;
case ServiceCommands::SetAxiConfigQoSMode: setAxiConfigQoSMode(messagePointer); break; case ServiceCommands::SetAxiConfigQoSMode: setAxiConfigQoSMode(messagePointer); break;
case ServiceCommands::SetInternalPriorities: setInternalPriorities(messagePointer); break; case ServiceCommands::SetInternalPriorities: setInternalPriorities(messagePointer); break;
case ServiceCommands::SetLCDForceBlack: setLCDForceBlack(messagePointer); break; case ServiceCommands::SetLCDForceBlack: setLCDForceBlack(messagePointer); break;
case ServiceCommands::StoreDataCache: storeDataCache(messagePointer); break; case ServiceCommands::StoreDataCache: storeDataCache(messagePointer); break;
case ServiceCommands::TriggerCmdReqQueue: [[likely]] triggerCmdReqQueue(messagePointer); break;
case ServiceCommands::WriteHwRegs: writeHwRegs(messagePointer); break; case ServiceCommands::WriteHwRegs: writeHwRegs(messagePointer); break;
case ServiceCommands::WriteHwRegsWithMask: writeHwRegsWithMask(messagePointer); break; case ServiceCommands::WriteHwRegsWithMask: writeHwRegsWithMask(messagePointer); break;
; default: Helpers::panic("GPU service requested. Command: %08X\n", command); ; default: Helpers::panic("GPU service requested. Command: %08X\n", command);
@ -395,3 +399,20 @@ void GPUService::triggerTextureCopy(u32* cmd) {
// NSMB2 relies on this // NSMB2 relies on this
requestInterrupt(GPUInterrupt::PPF); requestInterrupt(GPUInterrupt::PPF);
} }
// Used when transitioning from the app to an OS applet, such as software keyboard, mii maker, mii selector, etc
// Stubbed until we decide to support LLE applets
void GPUService::saveVramSysArea(u32 messagePointer) {
Helpers::warn("GSP::GPU::SaveVramSysArea (stubbed)\n");
mem.write32(messagePointer, IPC::responseHeader(0x19, 1, 0));
mem.write32(messagePointer + 4, Result::Success);
}
// Used in similar fashion to the SaveVramSysArea function
void GPUService::importDisplayCaptureInfo(u32 messagePointer) {
Helpers::warn("GSP::GPU::ImportDisplayCaptureInfo (stubbed)\n");
mem.write32(messagePointer, IPC::responseHeader(0x18, 9, 0));
mem.write32(messagePointer + 4, Result::Success);
}