#include "mtl/log.hpp" #include "mtl/string.hpp" #include "mtl/string_view.hpp" #include "mtl/string_stream.hpp" namespace mtl { namespace log { /** * \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. * * When 0x100 | LOG_LEVEL, the message buffer is flushed. MGBA levels are: * * Fatal: 0 (stops the emulator, unused) * Error: 1 * Warn: 2 * Info: 3 * Debug: 4 */ static volatile uint16_t& flags = *reinterpret_cast(0x4FFF700); /** * \brief MGBA debug string register. * * Max length of 0x100 (256) including null terminator. */ static string_ext string(reinterpret_cast(0x4FFF600), 256); }; // namespace reg stream::stream(istring& buf, level log_level) : basic_string_stream(buf), m_log_level(log_level) { reg::enable = 0xC0DE; } stream::~stream() { reg::enable = 0; } void stream::flush() { reg::flags = 0x100 | static_cast(m_log_level); clear(); } typeof(debug) debug(reg::string, level::debug); typeof(info) info(reg::string, level::info); typeof(warn) warn(reg::string, level::warn); typeof(error) error(reg::string, level::error); } // namespace log } // namespace mtl