Module gba::mgba

source · []
Expand description

Lets you interact with the mGBA debug output buffer.

This buffer works as a “standard output” sort of interface:

  • First use core::fmt::Write; so that the Write trait is in scope.
  • Try to make a logger with MgbaBufferedLogger::try_new(log_level).
  • Use the write! macro to write data into the logger.
  • The logger will automatically flush itself (using the log level you set) when the buffer is full, on a newline, and when it’s dropped.

Logging is not always available. Obviously the mGBA output buffer can’t be used if the game isn’t running within the mGBA emulator. MgbaBufferedLogger::try_new will fail to make a logger when logging isn’t available. You can also call mgba_logging_available directly to check if mGBA logging is possible.

use core::fmt::Write;
let log_level = MgbaMessageLevel::Debug;
if let Ok(logger) = MgbaBufferedLogger::try_new(log_level) {
  writeln!(logger, "hello").ok();
}

Fine Details

Even when the program is running within mGBA, the MGBA_LOG_ENABLE address needs to be written with the MGBA_LOGGING_ENABLE_REQUEST value to allow logging. This is automatically done for you by the assembly runtime. If the MGBA_LOG_ENABLE address reads back MGBA_LOGGING_ENABLE_RESPONSE then mGBA logging is possible. If you’re running outside of mGBA then the MGBA_LOG_ENABLE address maps to nothing. Writes will do no harm, and reads won’t read the correct value.

Once you know that logging is possible, write your message to MGBA_LOG_BUFFER. This works similar to a C-style string: the first 0 byte in the buffer will be considered the end of the message.

When the message is ready to go out, write a message level to MGBA_LOG_SEND. This makes the message available within the emulator’s logs at that message level and also implicitly zeroes the message buffer so that it’s ready for the next message.

Structs

Enums

Constants

Functions

Returns if mGBA logging is possible.