diff --git a/include/helpers.hpp b/include/helpers.hpp index 237a333b..fc3c0167 100644 --- a/include/helpers.hpp +++ b/include/helpers.hpp @@ -152,6 +152,12 @@ namespace Helpers { static constexpr inline u8 incBCDByte(u8 value) { return ((value & 0xf) == 0x9) ? value + 7 : value + 1; } + // Use this helper for platforms that lack a working std::bit_cast implementation + // TODO: Replace this with C++20 version if available + template< class To, class From > + constexpr To bit_cast( const From& from ) noexcept{ + return *reinterpret_cast(&from); + } }; // UDLs for memory size values diff --git a/src/core/kernel/threads.cpp b/src/core/kernel/threads.cpp index cf6b2cac..c8325031 100644 --- a/src/core/kernel/threads.cpp +++ b/src/core/kernel/threads.cpp @@ -1,3 +1,4 @@ +#include #include #include diff --git a/src/core/services/cfg.cpp b/src/core/services/cfg.cpp index ab969183..6925e3d8 100644 --- a/src/core/services/cfg.cpp +++ b/src/core/services/cfg.cpp @@ -73,7 +73,7 @@ void CFGService::getConfigInfoBlk2(u32 messagePointer) { }; for (int i = 0; i < 8; i++) { - mem.write32(output + i * 4, std::bit_cast(STEREO_CAMERA_SETTINGS[i])); + mem.write32(output + i * 4, Helpers::bit_cast(STEREO_CAMERA_SETTINGS[i])); } } else if (size == 0x1C && blockID == 0xA0000) { // Username writeStringU16(output, u"Pander"); diff --git a/src/core/services/hid.cpp b/src/core/services/hid.cpp index ed7f2afd..7993dc7a 100644 --- a/src/core/services/hid.cpp +++ b/src/core/services/hid.cpp @@ -83,7 +83,7 @@ void HIDService::getGyroscopeCoefficient(u32 messagePointer) { constexpr float gyroscopeCoeff = 14.375f; // Same as retail 3DS mem.write32(messagePointer, IPC::responseHeader(0x15, 2, 0)); mem.write32(messagePointer + 4, Result::Success); - mem.write32(messagePointer + 8, std::bit_cast(gyroscopeCoeff)); + mem.write32(messagePointer + 8, Helpers::bit_cast(gyroscopeCoeff)); } void HIDService::getIPCHandles(u32 messagePointer) {