diff --git a/CMakeLists.txt b/CMakeLists.txt index ef5e03e9..ed3b75de 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,13 +48,13 @@ set(SOURCE_FILES src/main.cpp src/emulator.cpp src/core/CPU/cpu_dynarmic.cpp src set(KERNEL_SOURCE_FILES src/core/kernel/kernel.cpp src/core/kernel/resource_limits.cpp src/core/kernel/memory_management.cpp src/core/kernel/ports.cpp ) -set(SERVICE_SOURCE_FILES src/core/services/service_manager.cpp src/core/services/apt.cpp) +set(SERVICE_SOURCE_FILES src/core/services/service_manager.cpp src/core/services/apt.cpp src/core/services/hid.cpp) set(HEADER_FILES include/emulator.hpp include/helpers.hpp include/opengl.hpp include/termcolor.hpp include/cpu.hpp include/cpu_dynarmic.hpp include/memory.hpp include/kernel/kernel.hpp include/dynarmic_cp15.hpp include/kernel/resource_limits.hpp include/kernel/kernel_types.hpp include/kernel/config_mem.hpp include/services/service_manager.hpp include/services/apt.hpp - include/kernel/handles.hpp + include/kernel/handles.hpp include/services/hid.hpp ) set(THIRD_PARTY_SOURCE_FILES third_party/imgui/imgui.cpp diff --git a/include/services/apt.hpp b/include/services/apt.hpp index 1b570b07..b39b01f0 100644 --- a/include/services/apt.hpp +++ b/include/services/apt.hpp @@ -1,11 +1,17 @@ #pragma once #include "helpers.hpp" #include "kernel_types.hpp" +#include "memory.hpp" class APTService { Handle handle = KernelHandles::APT; + Memory& mem; + + // Service commands + void getLockHandle(u32 messagePointer); public: + APTService(Memory& mem) : mem(mem) {} void reset(); void handleSyncRequest(u32 messagePointer); }; \ No newline at end of file diff --git a/include/services/hid.hpp b/include/services/hid.hpp new file mode 100644 index 00000000..e69de29b diff --git a/src/core/services/apt.cpp b/src/core/services/apt.cpp index 6ecefdf0..f42ffc38 100644 --- a/src/core/services/apt.cpp +++ b/src/core/services/apt.cpp @@ -1,7 +1,30 @@ #include "services/apt.hpp" +namespace APTCommands { + enum : u32 { + GetLockHandle = 0x00010040 + }; +} + +namespace Result { + enum : u32 { + Success = 0, + Failure = 0xFFFFFFFF + }; +} + void APTService::reset() {} void APTService::handleSyncRequest(u32 messagePointer) { - Helpers::panic("APT service requested"); + const u32 command = mem.read32(messagePointer); + switch (command) { + case APTCommands::GetLockHandle: getLockHandle(messagePointer); break; + default: Helpers::panic("APT service requested. Command: %08X\n", command); + } +} + +void APTService::getLockHandle(u32 messagePointer) { + printf("APT: getLockHandle (Failure)\n"); + mem.write32(messagePointer + 4, Result::Failure); // Result code + mem.write32(messagePointer + 16, 0); // Translation descriptor } \ No newline at end of file diff --git a/src/core/services/hid.cpp b/src/core/services/hid.cpp new file mode 100644 index 00000000..e69de29b diff --git a/src/core/services/service_manager.cpp b/src/core/services/service_manager.cpp index 0504f544..edb8828a 100644 --- a/src/core/services/service_manager.cpp +++ b/src/core/services/service_manager.cpp @@ -1,6 +1,6 @@ #include "services/service_manager.hpp" -ServiceManager::ServiceManager(std::array& regs, Memory& mem) : regs(regs), mem(mem) {} +ServiceManager::ServiceManager(std::array& regs, Memory& mem) : regs(regs), mem(mem), apt(mem) {} void ServiceManager::reset() { apt.reset();