From 88a759aec1e5965a1d0fea4c4b312a1494fb705e Mon Sep 17 00:00:00 2001 From: Madeline Busig Date: Thu, 29 Feb 2024 16:57:04 -0700 Subject: [PATCH] Add MGBA debug logging w/ puts MGBA debugging must be enabled using debug::open and disabled using debug::close. This commit adds logging through debug::puts. TODO: add logging using debug::printf and debug::write. --- include/debug.hpp | 16 ++++++++++++++++ src/debug.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 include/debug.hpp create mode 100644 src/debug.cpp diff --git a/include/debug.hpp b/include/debug.hpp new file mode 100644 index 0000000..fbc49a7 --- /dev/null +++ b/include/debug.hpp @@ -0,0 +1,16 @@ +#include + +namespace debug { +enum level { + fatal = 0, + error = 1, + warn = 2, + info = 3, + debug = 4, +}; + +void puts(const char* msg, level lvl = level::info ); + +bool open(); +void close(); +}; diff --git a/src/debug.cpp b/src/debug.cpp new file mode 100644 index 0000000..0c3d8b6 --- /dev/null +++ b/src/debug.cpp @@ -0,0 +1,49 @@ +#include "debug.hpp" + +#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) + */ +static char* string = reinterpret_cast(0x4FFF600); +constexpr size_t string_len = 0x100; +}; // namespace reg + + +void puts(const char* msg, level lvl) { + std::strncpy(reg::string, msg, reg::string_len); + *reg::flags = (lvl) | 0x100; +} + +bool open() { + *reg::enable = 0xC0DE; + return *reg::enable ==0x1DEA; +} + +void close() { + *reg::enable = 0; +} +}; // namespace debug