From 65b4a76952d5e1cb5e9c3cd031517622851891f1 Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Wed, 28 Sep 2016 14:42:31 -0700 Subject: [PATCH] Opt: Add a libgba stub for interacting with debug registers --- opt/libgba/mgba.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++ opt/libgba/mgba.h | 46 +++++++++++++++++++++++ 2 files changed, 140 insertions(+) create mode 100644 opt/libgba/mgba.c create mode 100644 opt/libgba/mgba.h diff --git a/opt/libgba/mgba.c b/opt/libgba/mgba.c new file mode 100644 index 000000000..22a4f0851 --- /dev/null +++ b/opt/libgba/mgba.c @@ -0,0 +1,94 @@ +/* + mgba.h + Copyright (c) 2016 Jeffrey Pfau + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include + +#include +#include +#include +#include + +#define REG_DEBUG_ENABLE (vu16*) 0x4FFF780 +#define REG_DEBUG_FLAGS (vu16*) 0x4FFF700 +#define REG_DEBUG_STRING (char*) 0x4FFF600 + +ssize_t mgba_stdout_write(struct _reent* r __attribute__((unused)), int fd __attribute__((unused)), const char* ptr, size_t len) { + if (len > 0x100) { + len = 0x100; + } + strncpy(REG_DEBUG_STRING, ptr, len); + *REG_DEBUG_FLAGS = MGBA_LOG_INFO | 0x100; + return len; +} + +ssize_t mgba_stderr_write(struct _reent* r __attribute__((unused)), int fd __attribute__((unused)), const char* ptr, size_t len) { + if (len > 0x100) { + len = 0x100; + } + strncpy(REG_DEBUG_STRING, ptr, len); + *REG_DEBUG_FLAGS = MGBA_LOG_ERROR | 0x100; + return len; +} + +void mgba_printf(int level, const char* ptr, ...) { + level &= 0x7; + va_list args; + va_start(args, ptr); + vsnprintf(REG_DEBUG_STRING, 0x100, ptr, args); + va_end(args); + *REG_DEBUG_FLAGS = level | 0x100; +} + +static const devoptab_t dotab_mgba_stdout = { + "mgba_stdout", + 0, + NULL, + NULL, + mgba_stdout_write +}; + +static const devoptab_t dotab_mgba_stderr = { + "mgba_stderr", + 0, + NULL, + NULL, + mgba_stderr_write +}; + +bool mgba_console_open(void) { + if (!mgba_open()) { + return false; + } + devoptab_list[STD_OUT] = &dotab_mgba_stdout; + devoptab_list[STD_ERR] = &dotab_mgba_stderr; + return true; +} + +bool mgba_open(void) { + *REG_DEBUG_ENABLE = 0xC0DE; + return *REG_DEBUG_ENABLE == 0x1DEA; +} + +void mgba_close(void) { + *REG_DEBUG_ENABLE = 0; +} diff --git a/opt/libgba/mgba.h b/opt/libgba/mgba.h new file mode 100644 index 000000000..b2d64e02b --- /dev/null +++ b/opt/libgba/mgba.h @@ -0,0 +1,46 @@ +/* + mgba.h + Copyright (c) 2016 Jeffrey Pfau + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef MGBA_H +#define MGBA_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define MGBA_LOG_FATAL 0 +#define MGBA_LOG_ERROR 1 +#define MGBA_LOG_WARN 2 +#define MGBA_LOG_INFO 3 +#define MGBA_LOG_DEBUG 4 + +bool mgba_open(void); +void mgba_close(void); + +void mgba_printf(int level, const char* string, ...); +bool mgba_console_open(void); + +#ifdef __cplusplus +} +#endif + +#endif