#include "debug.hpp" #include #include #include #include #include #include namespace debug { /** * \brief MGBA debug registers and constants */ namespace reg { /** * \brief MGBA debug enable register. * * When 0xC0DE is written to the register, debug output is enabled. * When 0 is written to the register, debug output is disabled. * Will be set to 0x1DEA when successfully enabled. */ static volatile uint16_t& enable = *reinterpret_cast(0x4FFF780); /** * \brief MGBA debug flags register. */ static volatile uint16_t& flags = *reinterpret_cast(0x4FFF700); /** * \brief MGBA debug string register. * * Max length of 0x100 (256) including null terminator. */ static char* string = reinterpret_cast(0x4FFF600); constexpr static size_t string_len = 255; }; // namespace reg void puts(const mtl::string_view& msg, level lvl) { size_t count = msg.length(); if (count > reg::string_len) { count = reg::string_len; } // Must be copied manually because the MGBA string register does // not allow copying in reverse (I think) msg.copy(reg::string, count); reg::flags = lvl | 0x100; } bool open() { reg::enable = 0xC0DE; return reg::enable == 0x1DEA; } void close() { reg::enable = 0; } }; // namespace debug