diff --git a/include/services/ptm.hpp b/include/services/ptm.hpp index 1ee84264..7b2d48f2 100644 --- a/include/services/ptm.hpp +++ b/include/services/ptm.hpp @@ -13,10 +13,12 @@ class PTMService { const EmulatorConfig& config; // Service commands + void clearSoftwareClosedFlag(u32 messagePointer); void configureNew3DSCPU(u32 messagePointer); void getAdapterState(u32 messagePointer); void getBatteryChargeState(u32 messagePointer); void getBatteryLevel(u32 messagePointer); + void getSoftwareClosedFlag(u32 messagePointer); void getStepHistory(u32 messagePointer); void getStepHistoryAll(u32 messagePointer); void getSystemTime(u32 messagePointer); diff --git a/src/core/services/ptm.cpp b/src/core/services/ptm.cpp index 6f47996c..46d1ffeb 100644 --- a/src/core/services/ptm.cpp +++ b/src/core/services/ptm.cpp @@ -19,6 +19,8 @@ namespace PTMCommands { GetPlayHistoryStart = 0x08080000, GetPlayHistoryLength = 0x08090000, CalcPlayHistoryStart = 0x080B0080, + GetSoftwareClosedFlag = 0x080F0000, + ClearSoftwareClosedFlag = 0x08100000, }; } @@ -57,6 +59,13 @@ void PTMService::handleSyncRequest(u32 messagePointer, PTMService::Type type) { default: Helpers::panic("PTM GETS service requested. Command: %08X\n", command); break; } + } else if (type == Type::SYSM) { + switch (command) { + case PTMCommands::GetSoftwareClosedFlag: getSoftwareClosedFlag(messagePointer); break; + case PTMCommands::ClearSoftwareClosedFlag: clearSoftwareClosedFlag(messagePointer); break; + + default: Helpers::panic("PTM SYSM service requested. Command: %08X\n", command); break; + } } else { Helpers::panic("PTM service requested. Command: %08X\n", command); } @@ -119,4 +128,17 @@ void PTMService::getSystemTime(u32 messagePointer) { mem.write32(messagePointer, IPC::responseHeader(0x401, 3, 0)); mem.write32(messagePointer + 4, Result::Success); mem.write64(messagePointer + 8, 0); // Milliseconds since 2000? +} + +void PTMService::getSoftwareClosedFlag(u32 messagePointer) { + log("PTM::GetSoftwareClosedFlag\n"); + mem.write32(messagePointer, IPC::responseHeader(0x80F, 2, 0)); + mem.write32(messagePointer + 4, Result::Success); + mem.write8(messagePointer + 8, 0); // Show software closed dialog +} + +void PTMService::clearSoftwareClosedFlag(u32 messagePointer) { + log("PTM::ClearSoftwareClosedFlag\n"); + mem.write32(messagePointer, IPC::responseHeader(0x810, 1, 0)); + mem.write32(messagePointer + 4, Result::Success); } \ No newline at end of file