From b564029a8f115ec057025fa7d56caf305708366d Mon Sep 17 00:00:00 2001 From: wheremyfoodat Date: Mon, 13 Mar 2023 00:31:09 +0200 Subject: [PATCH] [Y2R] Implement some srervice calls --- include/services/y2r.hpp | 5 +++++ src/core/services/y2r.cpp | 29 ++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/include/services/y2r.hpp b/include/services/y2r.hpp index ecb21ce4..4f15f592 100644 --- a/include/services/y2r.hpp +++ b/include/services/y2r.hpp @@ -9,7 +9,12 @@ class Y2RService { Memory& mem; MAKE_LOG_FUNCTION(log, y2rLogger) + bool transferEndInterruptEnabled; + // Service commands + void driverInitialize(u32 messagePointer); + void pingProcess(u32 messagePointer); + void setTransferEndInterrupt(u32 messagePointer); public: Y2RService(Memory& mem) : mem(mem) {} diff --git a/src/core/services/y2r.cpp b/src/core/services/y2r.cpp index 5d990f30..1c932f03 100644 --- a/src/core/services/y2r.cpp +++ b/src/core/services/y2r.cpp @@ -2,6 +2,9 @@ namespace Y2RCommands { enum : u32 { + SetTransferEndInterrupt = 0x000D0040, + PingProcess = 0x002A0000, + DriverInitialize = 0x002B0000 }; } @@ -11,11 +14,35 @@ namespace Result { }; } -void Y2RService::reset() {} +void Y2RService::reset() { + transferEndInterruptEnabled = false; +} void Y2RService::handleSyncRequest(u32 messagePointer) { const u32 command = mem.read32(messagePointer); switch (command) { + case Y2RCommands::DriverInitialize: driverInitialize(messagePointer); break; + case Y2RCommands::PingProcess: pingProcess(messagePointer); break; + case Y2RCommands::SetTransferEndInterrupt: setTransferEndInterrupt(messagePointer); break; default: Helpers::panic("Y2R service requested. Command: %08X\n", command); } +} + +void Y2RService::pingProcess(u32 messagePointer) { + log("Y2R::PingProcess\n"); + mem.write32(messagePointer + 4, Result::Success); + mem.write32(messagePointer + 8, 0); // Connected number +} + +void Y2RService::driverInitialize(u32 messagePointer) { + log("Y2R::DriverInitialize\n"); + mem.write32(messagePointer + 4, Result::Success); +} + +void Y2RService::setTransferEndInterrupt(u32 messagePointer) { + const bool enable = mem.read32(messagePointer + 4) != 0; + log("Y2R::SetTransferEndInterrupt (enabled: %s)\n", enable ? "yes" : "no"); + + mem.write32(messagePointer + 4, Result::Success); + transferEndInterruptEnabled = enable; } \ No newline at end of file