commit: 12974fe6a9577d4ca446d156a5aead2b70232199
parent a9a93cdf0f5474307fa0f3d967c4c9da08b927b6
Author: Michael Forney <mforney@mforney.org>
Date: Sat, 7 Nov 2020 15:56:50 -0800
Add mgba 0.8.4
Diffstat:
11 files changed, 2784 insertions(+), 0 deletions(-)
diff --git a/.gitmodules b/.gitmodules
@@ -180,6 +180,10 @@
[submodule "pkg/mc/src"]
path = pkg/mc/src
url = https://github.com/oridb/mc
+[submodule "pkg/mgba/src"]
+ path = pkg/mgba/src
+ url = https://github.com/mgba-emu/mgba.git
+ ignore = all
[submodule "pkg/mpv/src"]
path = pkg/mpv/src
url = https://github.com/mpv-player/mpv
diff --git a/pkg/gen.lua b/pkg/gen.lua
@@ -70,6 +70,7 @@ subgen 'man-pages-posix'
subgen 'mandoc'
subgen 'mblaze'
subgen 'mc'
+subgen 'mgba'
subgen 'mpv'
subgen 'msmtp'
subgen 'mtdev'
diff --git a/pkg/mgba/config.h b/pkg/mgba/config.h
@@ -0,0 +1,15 @@
+#define COLOR_16_BIT 1
+#define COLOR_5_6_5 1
+#define DISABLE_THREADING 1
+#define HAVE_CHMOD 1
+#define HAVE_LOCALE 1
+#define HAVE_LOCALTIME_R 1
+#define HAVE_SETLOCALE 1
+#define HAVE_STRDUP 1
+#define HAVE_STRNDUP 1
+#define HAVE_UMASK 1
+#define MGBA_STANDALONE 1
+#define MINIMAL_CORE 1
+#define M_CORE_GB 1
+#define M_CORE_GBA 1
+#define NDEBUG 1
diff --git a/pkg/mgba/gen.lua b/pkg/mgba/gen.lua
@@ -0,0 +1,139 @@
+cflags{
+ '-std=c11', '-Wpedantic', '-Wno-overflow', '-Wno-discarded-qualifiers',
+ '-D _DEFAULT_SOURCE',
+ '-include $dir/config.h',
+ '-I $srcdir/include',
+ '-I $srcdir/src',
+}
+
+build('sed', '$outdir/version.c', '$srcdir/src/core/version.c.in', {
+ expr={
+ [[-e '/$${GIT_COMMIT}/d']],
+ [[-e '/$${GIT_COMMIT_SHORT}/d']],
+ [[-e '/$${GIT_BRANCH}/d']],
+ [[-e '/$${GIT_REV}/d']],
+ [[-e 's,$${BINARY_NAME},mgba,']],
+ [[-e 's,$${PROJECT_NAME},mGBA,']],
+ [[-e 's,$${VERSION_STRING},0.8.4,']],
+ }
+})
+
+lib('mgba_libretro.a', [[
+ src/(
+ platform/(
+ libretro/libretro.c
+ posix/memory.c
+ )
+ core/(
+ bitmap-cache.c
+ cache-set.c
+ cheats.c
+ config.c
+ core.c
+ directories.c
+ input.c
+ interface.c
+ library.c
+ lockstep.c
+ log.c
+ map-cache.c
+ mem-search.c
+ rewind.c
+ scripting.c
+ serialize.c
+ sync.c
+ thread.c
+ tile-cache.c
+ timing.c
+ )
+ util/(
+ circle-buffer.c
+ configuration.c
+ crc32.c
+ elf-read.c
+ export.c
+ formatting.c
+ gbk-table.c
+ hash.c
+ patch.c
+ patch-fast.c
+ patch-ips.c
+ patch-ups.c
+ png-io.c
+ ring-fifo.c
+ string.c
+ table.c
+ text-codec.c
+ vfs.c
+ vfs/(vfs-mem.c vfs-fifo.c vfs-fd.c vfs-dirent.c)
+ )
+ gb/(
+ audio.c
+ cheats.c
+ core.c
+ gb.c
+ io.c
+ mbc.c
+ memory.c
+ overrides.c
+ serialize.c
+ renderers/cache-set.c
+ renderers/software.c
+ sio.c
+ timer.c
+ video.c
+ )
+ sm83/(
+ decoder.c
+ isa-sm83.c
+ sm83.c
+ )
+ gba/(
+ audio.c
+ bios.c
+ cheats.c
+ cheats/codebreaker.c
+ cheats/gameshark.c
+ cheats/parv3.c
+ core.c
+ dma.c
+ gba.c
+ hardware.c
+ hle-bios.c
+ input.c
+ io.c
+ matrix.c
+ memory.c
+ overrides.c
+ renderers/cache-set.c
+ renderers/common.c
+ renderers/gl.c
+ renderers/software-bg.c
+ renderers/software-mode0.c
+ renderers/software-obj.c
+ renderers/video-software.c
+ savedata.c
+ serialize.c
+ sharkport.c
+ sio.c
+ timer.c
+ vfame.c
+ video.c
+ )
+ arm/(
+ arm.c
+ decoder-arm.c
+ decoder.c
+ decoder-thumb.c
+ isa-arm.c
+ isa-thumb.c
+ )
+ third-party/(
+ blip_buf/blip_buf.c
+ inih/ini.c
+ )
+ )
+ $outdir/version.c
+]])
+
+fetch 'git'
diff --git a/pkg/mgba/patch/0001-Libretro-Only-set-camera-peripheral-when-it-is-avail.patch b/pkg/mgba/patch/0001-Libretro-Only-set-camera-peripheral-when-it-is-avail.patch
@@ -0,0 +1,32 @@
+From 2e5f5c0cefff728097068e447aab4d75678a671a Mon Sep 17 00:00:00 2001
+From: Michael Forney <mforney@mforney.org>
+Date: Sat, 7 Nov 2020 03:39:33 -0800
+Subject: [PATCH] Libretro: Only set camera peripheral when it is available
+
+Otherwise, if the frontend does not support GET_CAMERA_INTERFACE,
+the start and stop functions are NULL, causing a crash when a gameboy
+ROM is unloaded.
+---
+ src/platform/libretro/libretro.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/src/platform/libretro/libretro.c b/src/platform/libretro/libretro.c
+index 0d2d0e60b..0b59dd4ce 100644
+--- a/src/platform/libretro/libretro.c
++++ b/src/platform/libretro/libretro.c
+@@ -606,9 +606,10 @@ bool retro_load_game(const struct retro_game_info* game) {
+ cam.width = GBCAM_WIDTH;
+ cam.caps = 1 << RETRO_CAMERA_BUFFER_RAW_FRAMEBUFFER;
+ cam.frame_raw_framebuffer = _updateCamera;
+- core->setPeripheral(core, mPERIPH_IMAGE_SOURCE, &imageSource);
++ if (environCallback(RETRO_ENVIRONMENT_GET_CAMERA_INTERFACE, &cam)) {
++ core->setPeripheral(core, mPERIPH_IMAGE_SOURCE, &imageSource);
++ }
+
+- environCallback(RETRO_ENVIRONMENT_GET_CAMERA_INTERFACE, &cam);
+ const char* modelName = mCoreConfigGetValue(&core->config, "gb.model");
+ struct GB* gb = core->board;
+
+--
+2.29.2
+
diff --git a/pkg/mgba/patch/0002-All-Avoid-extraneous-semicolons-at-top-level.patch b/pkg/mgba/patch/0002-All-Avoid-extraneous-semicolons-at-top-level.patch
@@ -0,0 +1,2314 @@
+From 44be0c1af5be67d662b9a92cddc5d8b85b4e788c Mon Sep 17 00:00:00 2001
+From: Michael Forney <mforney@mforney.org>
+Date: Sat, 7 Nov 2020 13:58:35 -0800
+Subject: [PATCH] All: Avoid extraneous semicolons at top-level
+
+These are unnecessary and not allowed in ISO C.
+---
+ include/mgba-util/common.h | 2 +-
+ include/mgba-util/elf-read.h | 4 +-
+ include/mgba-util/patch/fast.h | 2 +-
+ include/mgba-util/vector.h | 2 +-
+ include/mgba/core/bitmap-cache.h | 18 +-
+ include/mgba/core/cache-set.h | 6 +-
+ include/mgba/core/cheats.h | 6 +-
+ include/mgba/core/interface.h | 2 +-
+ include/mgba/core/library.h | 2 +-
+ include/mgba/core/map-cache.h | 34 ++--
+ include/mgba/core/mem-search.h | 2 +-
+ include/mgba/core/rewind.h | 2 +-
+ include/mgba/core/tile-cache.h | 12 +-
+ include/mgba/debugger/debugger.h | 6 +-
+ include/mgba/internal/arm/debugger/debugger.h | 2 +-
+ include/mgba/internal/debugger/parser.h | 2 +-
+ include/mgba/internal/gb/audio.h | 116 ++++++------
+ include/mgba/internal/gb/cheats.h | 2 +-
+ include/mgba/internal/gb/gb.h | 2 +-
+ include/mgba/internal/gb/io.h | 2 +-
+ include/mgba/internal/gb/mbc.h | 2 +-
+ include/mgba/internal/gb/memory.h | 14 +-
+ include/mgba/internal/gb/serialize.h | 110 ++++++------
+ include/mgba/internal/gb/sio.h | 10 +-
+ include/mgba/internal/gb/timer.h | 6 +-
+ include/mgba/internal/gb/video.h | 62 +++----
+ include/mgba/internal/gba/audio.h | 34 ++--
+ include/mgba/internal/gba/bios.h | 2 +-
+ include/mgba/internal/gba/dma.h | 18 +-
+ include/mgba/internal/gba/gba.h | 10 +-
+ include/mgba/internal/gba/hardware.h | 20 +--
+ include/mgba/internal/gba/io.h | 2 +-
+ include/mgba/internal/gba/memory.h | 2 +-
+ include/mgba/internal/gba/rr/rr.h | 2 +-
+ include/mgba/internal/gba/savedata.h | 2 +-
+ include/mgba/internal/gba/serialize.h | 38 ++--
+ include/mgba/internal/gba/sio.h | 34 ++--
+ include/mgba/internal/gba/timer.h | 10 +-
+ include/mgba/internal/gba/video.h | 168 +++++++++---------
+ src/arm/debugger/debugger.c | 2 +-
+ src/arm/isa-arm.c | 2 +-
+ src/core/cache-set.c | 6 +-
+ src/core/cheats.c | 6 +-
+ src/core/input.c | 4 +-
+ src/core/interface.c | 2 +-
+ src/core/library.c | 2 +-
+ src/core/mem-search.c | 2 +-
+ src/core/rewind.c | 2 +-
+ src/core/serialize.c | 2 +-
+ src/debugger/debugger.c | 6 +-
+ src/debugger/parser.c | 2 +-
+ src/gb/cheats.c | 2 +-
+ src/gb/gb.c | 2 +-
+ src/gb/io.c | 2 +-
+ src/gb/mbc.c | 2 +-
+ src/gb/memory.c | 2 +-
+ src/gb/serialize.c | 2 +-
+ src/gb/sio.c | 2 +-
+ src/gba/audio.c | 2 +-
+ src/gba/bios.c | 10 +-
+ src/gba/dma.c | 2 +-
+ src/gba/extra/battlechip.c | 4 +-
+ src/gba/gba.c | 4 +-
+ src/gba/hardware.c | 2 +-
+ src/gba/io.c | 2 +-
+ src/gba/memory.c | 2 +-
+ src/gba/savedata.c | 2 +-
+ src/gba/serialize.c | 2 +-
+ src/gba/sio.c | 2 +-
+ src/gba/video.c | 2 +-
+ src/platform/opengl/gles2.c | 8 +-
+ src/platform/sdl/sdl-audio.c | 2 +-
+ src/platform/sdl/sdl-audio.h | 2 +-
+ src/platform/sdl/sdl-events.c | 4 +-
+ src/platform/sdl/sdl-events.h | 4 +-
+ src/sm83/decoder.c | 88 ++++-----
+ src/sm83/isa-sm83.c | 110 ++++++------
+ src/util/elf-read.c | 4 +-
+ src/util/patch-fast.c | 2 +-
+ src/util/string.c | 2 +-
+ 80 files changed, 543 insertions(+), 543 deletions(-)
+
+diff --git a/include/mgba-util/common.h b/include/mgba-util/common.h
+index 8c52f3463..e2b0529b6 100644
+--- a/include/mgba-util/common.h
++++ b/include/mgba-util/common.h
+@@ -258,7 +258,7 @@ typedef intptr_t ssize_t;
+ #define CONSTRUCTOR(FN) static __attribute__((constructor)) void FN(void)
+ #endif
+
+-#define DECL_BITFIELD(NAME, TYPE) typedef TYPE NAME
++#define DECL_BITFIELD(NAME, TYPE) typedef TYPE NAME;
+
+ #define DECL_BITS(TYPE, FIELD, START, SIZE) \
+ ATTRIBUTE_UNUSED static inline TYPE TYPE ## Is ## FIELD (TYPE src) { \
+diff --git a/include/mgba-util/elf-read.h b/include/mgba-util/elf-read.h
+index 86683ea82..d57c16a4a 100644
+--- a/include/mgba-util/elf-read.h
++++ b/include/mgba-util/elf-read.h
+@@ -19,8 +19,8 @@ CXX_GUARD_START
+ struct ELF;
+ struct VFile;
+
+-DECLARE_VECTOR(ELFProgramHeaders, Elf32_Phdr);
+-DECLARE_VECTOR(ELFSectionHeaders, Elf32_Shdr);
++DECLARE_VECTOR(ELFProgramHeaders, Elf32_Phdr)
++DECLARE_VECTOR(ELFSectionHeaders, Elf32_Shdr)
+
+ struct ELF* ELFOpen(struct VFile*);
+ void ELFClose(struct ELF*);
+diff --git a/include/mgba-util/patch/fast.h b/include/mgba-util/patch/fast.h
+index ee59cd23f..2130a8fb4 100644
+--- a/include/mgba-util/patch/fast.h
++++ b/include/mgba-util/patch/fast.h
+@@ -21,7 +21,7 @@ struct PatchFastExtent {
+ uint32_t extent[PATCH_FAST_EXTENT];
+ };
+
+-DECLARE_VECTOR(PatchFastExtents, struct PatchFastExtent);
++DECLARE_VECTOR(PatchFastExtents, struct PatchFastExtent)
+
+ struct PatchFast {
+ struct Patch d;
+diff --git a/include/mgba-util/vector.h b/include/mgba-util/vector.h
+index c18b6c8b5..8d911d3d0 100644
+--- a/include/mgba-util/vector.h
++++ b/include/mgba-util/vector.h
+@@ -96,7 +96,7 @@ CXX_GUARD_START
+ dest->size = src->size; \
+ } \
+
+-DECLARE_VECTOR(StringList, char*);
++DECLARE_VECTOR(StringList, char*)
+
+ CXX_GUARD_END
+
+diff --git a/include/mgba/core/bitmap-cache.h b/include/mgba/core/bitmap-cache.h
+index d8bd416e9..48a4b8cd0 100644
+--- a/include/mgba/core/bitmap-cache.h
++++ b/include/mgba/core/bitmap-cache.h
+@@ -12,15 +12,15 @@ CXX_GUARD_START
+
+ #include <mgba/core/interface.h>
+
+-DECL_BITFIELD(mBitmapCacheConfiguration, uint32_t);
+-DECL_BIT(mBitmapCacheConfiguration, ShouldStore, 0);
+-
+-DECL_BITFIELD(mBitmapCacheSystemInfo, uint32_t);
+-DECL_BITS(mBitmapCacheSystemInfo, EntryBPP, 0, 3);
+-DECL_BIT(mBitmapCacheSystemInfo, UsesPalette, 3);
+-DECL_BITS(mBitmapCacheSystemInfo, Width, 4, 10);
+-DECL_BITS(mBitmapCacheSystemInfo, Height, 14, 10);
+-DECL_BITS(mBitmapCacheSystemInfo, Buffers, 24, 2);
++DECL_BITFIELD(mBitmapCacheConfiguration, uint32_t)
++DECL_BIT(mBitmapCacheConfiguration, ShouldStore, 0)
++
++DECL_BITFIELD(mBitmapCacheSystemInfo, uint32_t)
++DECL_BITS(mBitmapCacheSystemInfo, EntryBPP, 0, 3)
++DECL_BIT(mBitmapCacheSystemInfo, UsesPalette, 3)
++DECL_BITS(mBitmapCacheSystemInfo, Width, 4, 10)
++DECL_BITS(mBitmapCacheSystemInfo, Height, 14, 10)
++DECL_BITS(mBitmapCacheSystemInfo, Buffers, 24, 2)
+
+ struct mBitmapCacheEntry {
+ uint32_t paletteVersion;
+diff --git a/include/mgba/core/cache-set.h b/include/mgba/core/cache-set.h
+index 5749c0e64..abeb639e7 100644
+--- a/include/mgba/core/cache-set.h
++++ b/include/mgba/core/cache-set.h
+@@ -15,9 +15,9 @@ CXX_GUARD_START
+ #include <mgba/core/tile-cache.h>
+ #include <mgba-util/vector.h>
+
+-DECLARE_VECTOR(mMapCacheSet, struct mMapCache);
+-DECLARE_VECTOR(mBitmapCacheSet, struct mBitmapCache);
+-DECLARE_VECTOR(mTileCacheSet, struct mTileCache);
++DECLARE_VECTOR(mMapCacheSet, struct mMapCache)
++DECLARE_VECTOR(mBitmapCacheSet, struct mBitmapCache)
++DECLARE_VECTOR(mTileCacheSet, struct mTileCache)
+
+ struct mCacheSet {
+ struct mMapCacheSet maps;
+diff --git a/include/mgba/core/cheats.h b/include/mgba/core/cheats.h
+index d05ac8e5f..885aee7ec 100644
+--- a/include/mgba/core/cheats.h
++++ b/include/mgba/core/cheats.h
+@@ -44,9 +44,9 @@ struct mCheat {
+ int32_t operandOffset;
+ };
+
+-mLOG_DECLARE_CATEGORY(CHEATS);
++mLOG_DECLARE_CATEGORY(CHEATS)
+
+-DECLARE_VECTOR(mCheatList, struct mCheat);
++DECLARE_VECTOR(mCheatList, struct mCheat)
+
+ struct mCheatDevice;
+ struct mCheatSet {
+@@ -69,7 +69,7 @@ struct mCheatSet {
+ struct StringList lines;
+ };
+
+-DECLARE_VECTOR(mCheatSets, struct mCheatSet*);
++DECLARE_VECTOR(mCheatSets, struct mCheatSet*)
+
+ struct mCheatDevice {
+ struct mCPUComponent d;
+diff --git a/include/mgba/core/interface.h b/include/mgba/core/interface.h
+index 51ba6447f..73bb091ec 100644
+--- a/include/mgba/core/interface.h
++++ b/include/mgba/core/interface.h
+@@ -93,7 +93,7 @@ struct mCoreCallbacks {
+ void (*keysRead)(void* context);
+ };
+
+-DECLARE_VECTOR(mCoreCallbacksList, struct mCoreCallbacks);
++DECLARE_VECTOR(mCoreCallbacksList, struct mCoreCallbacks)
+
+ struct mAVStream {
+ void (*videoDimensionsChanged)(struct mAVStream*, unsigned width, unsigned height);
+diff --git a/include/mgba/core/library.h b/include/mgba/core/library.h
+index d55ad4094..b53ff833d 100644
+--- a/include/mgba/core/library.h
++++ b/include/mgba/core/library.h
+@@ -26,7 +26,7 @@ struct mLibraryEntry {
+
+ #ifdef USE_SQLITE3
+
+-DECLARE_VECTOR(mLibraryListing, struct mLibraryEntry);
++DECLARE_VECTOR(mLibraryListing, struct mLibraryEntry)
+
+ struct mLibrary;
+ struct mLibrary* mLibraryCreateEmpty(void);
+diff --git a/include/mgba/core/map-cache.h b/include/mgba/core/map-cache.h
+index 6dc9e72f6..a1521e462 100644
+--- a/include/mgba/core/map-cache.h
++++ b/include/mgba/core/map-cache.h
+@@ -13,23 +13,23 @@ CXX_GUARD_START
+ #include <mgba/core/interface.h>
+ #include <mgba/core/tile-cache.h>
+
+-DECL_BITFIELD(mMapCacheConfiguration, uint32_t);
+-DECL_BIT(mMapCacheConfiguration, ShouldStore, 0);
+-
+-DECL_BITFIELD(mMapCacheSystemInfo, uint32_t);
+-DECL_BITS(mMapCacheSystemInfo, PaletteBPP, 0, 2);
+-DECL_BITS(mMapCacheSystemInfo, PaletteCount, 2, 4);
+-DECL_BITS(mMapCacheSystemInfo, TilesWide, 8, 4);
+-DECL_BITS(mMapCacheSystemInfo, TilesHigh, 12, 4);
+-DECL_BITS(mMapCacheSystemInfo, MacroTileSize, 16, 7);
+-DECL_BITS(mMapCacheSystemInfo, MapAlign, 23, 2);
+-
+-DECL_BITFIELD(mMapCacheEntryFlags, uint16_t);
+-DECL_BITS(mMapCacheEntryFlags, PaletteId, 0, 4);
+-DECL_BIT(mMapCacheEntryFlags, VramClean, 4);
+-DECL_BIT(mMapCacheEntryFlags, HMirror, 5);
+-DECL_BIT(mMapCacheEntryFlags, VMirror, 6);
+-DECL_BITS(mMapCacheEntryFlags, Mirror, 5, 2);
++DECL_BITFIELD(mMapCacheConfiguration, uint32_t)
++DECL_BIT(mMapCacheConfiguration, ShouldStore, 0)
++
++DECL_BITFIELD(mMapCacheSystemInfo, uint32_t)
++DECL_BITS(mMapCacheSystemInfo, PaletteBPP, 0, 2)
++DECL_BITS(mMapCacheSystemInfo, PaletteCount, 2, 4)
++DECL_BITS(mMapCacheSystemInfo, TilesWide, 8, 4)
++DECL_BITS(mMapCacheSystemInfo, TilesHigh, 12, 4)
++DECL_BITS(mMapCacheSystemInfo, MacroTileSize, 16, 7)
++DECL_BITS(mMapCacheSystemInfo, MapAlign, 23, 2)
++
++DECL_BITFIELD(mMapCacheEntryFlags, uint16_t)
++DECL_BITS(mMapCacheEntryFlags, PaletteId, 0, 4)
++DECL_BIT(mMapCacheEntryFlags, VramClean, 4)
++DECL_BIT(mMapCacheEntryFlags, HMirror, 5)
++DECL_BIT(mMapCacheEntryFlags, VMirror, 6)
++DECL_BITS(mMapCacheEntryFlags, Mirror, 5, 2)
+
+ struct mMapCacheEntry {
+ uint32_t vramVersion;
+diff --git a/include/mgba/core/mem-search.h b/include/mgba/core/mem-search.h
+index d45601556..110c13982 100644
+--- a/include/mgba/core/mem-search.h
++++ b/include/mgba/core/mem-search.h
+@@ -51,7 +51,7 @@ struct mCoreMemorySearchResult {
+ int32_t oldValue;
+ };
+
+-DECLARE_VECTOR(mCoreMemorySearchResults, struct mCoreMemorySearchResult);
++DECLARE_VECTOR(mCoreMemorySearchResults, struct mCoreMemorySearchResult)
+
+ struct mCore;
+ void mCoreMemorySearch(struct mCore* core, const struct mCoreMemorySearchParams* params, struct mCoreMemorySearchResults* out, size_t limit);
+diff --git a/include/mgba/core/rewind.h b/include/mgba/core/rewind.h
+index 04549761d..0779c5b67 100644
+--- a/include/mgba/core/rewind.h
++++ b/include/mgba/core/rewind.h
+@@ -15,7 +15,7 @@ CXX_GUARD_START
+ #include <mgba-util/threading.h>
+ #endif
+
+-DECLARE_VECTOR(mCoreRewindPatches, struct PatchFast);
++DECLARE_VECTOR(mCoreRewindPatches, struct PatchFast)
+
+ struct VFile;
+ struct mCoreRewindContext {
+diff --git a/include/mgba/core/tile-cache.h b/include/mgba/core/tile-cache.h
+index f8600b3ad..64a9937b2 100644
+--- a/include/mgba/core/tile-cache.h
++++ b/include/mgba/core/tile-cache.h
+@@ -12,13 +12,13 @@ CXX_GUARD_START
+
+ #include <mgba/core/interface.h>
+
+-DECL_BITFIELD(mTileCacheConfiguration, uint32_t);
+-DECL_BIT(mTileCacheConfiguration, ShouldStore, 0);
++DECL_BITFIELD(mTileCacheConfiguration, uint32_t)
++DECL_BIT(mTileCacheConfiguration, ShouldStore, 0)
+
+-DECL_BITFIELD(mTileCacheSystemInfo, uint32_t);
+-DECL_BITS(mTileCacheSystemInfo, PaletteBPP, 0, 2);
+-DECL_BITS(mTileCacheSystemInfo, PaletteCount, 2, 4);
+-DECL_BITS(mTileCacheSystemInfo, MaxTiles, 16, 13);
++DECL_BITFIELD(mTileCacheSystemInfo, uint32_t)
++DECL_BITS(mTileCacheSystemInfo, PaletteBPP, 0, 2)
++DECL_BITS(mTileCacheSystemInfo, PaletteCount, 2, 4)
++DECL_BITS(mTileCacheSystemInfo, MaxTiles, 16, 13)
+
+ struct mTileCacheEntry {
+ uint32_t paletteVersion;
+diff --git a/include/mgba/debugger/debugger.h b/include/mgba/debugger/debugger.h
+index 2a4bc2dce..353b5da4e 100644
+--- a/include/mgba/debugger/debugger.h
++++ b/include/mgba/debugger/debugger.h
+@@ -14,7 +14,7 @@ CXX_GUARD_START
+ #include <mgba/core/log.h>
+ #include <mgba-util/vector.h>
+
+-mLOG_DECLARE_CATEGORY(DEBUGGER);
++mLOG_DECLARE_CATEGORY(DEBUGGER)
+
+ extern const uint32_t DEBUGGER_ID;
+
+@@ -87,8 +87,8 @@ struct mWatchpoint {
+ struct ParseTree* condition;
+ };
+
+-DECLARE_VECTOR(mBreakpointList, struct mBreakpoint);
+-DECLARE_VECTOR(mWatchpointList, struct mWatchpoint);
++DECLARE_VECTOR(mBreakpointList, struct mBreakpoint)
++DECLARE_VECTOR(mWatchpointList, struct mWatchpoint)
+
+ struct mDebugger;
+ struct ParseTree;
+diff --git a/include/mgba/internal/arm/debugger/debugger.h b/include/mgba/internal/arm/debugger/debugger.h
+index 5dc73485c..a2d9e581a 100644
+--- a/include/mgba/internal/arm/debugger/debugger.h
++++ b/include/mgba/internal/arm/debugger/debugger.h
+@@ -24,7 +24,7 @@ struct ARMDebugBreakpoint {
+ } sw;
+ };
+
+-DECLARE_VECTOR(ARMDebugBreakpointList, struct ARMDebugBreakpoint);
++DECLARE_VECTOR(ARMDebugBreakpointList, struct ARMDebugBreakpoint)
+
+ struct ARMDebugger {
+ struct mDebuggerPlatform d;
+diff --git a/include/mgba/internal/debugger/parser.h b/include/mgba/internal/debugger/parser.h
+index 37f194ddb..6edea602f 100644
+--- a/include/mgba/internal/debugger/parser.h
++++ b/include/mgba/internal/debugger/parser.h
+@@ -13,7 +13,7 @@
+ CXX_GUARD_START
+
+ struct Token;
+-DECLARE_VECTOR(LexVector, struct Token);
++DECLARE_VECTOR(LexVector, struct Token)
+
+ enum Operation {
+ OP_ASSIGN,
+diff --git a/include/mgba/internal/gb/audio.h b/include/mgba/internal/gb/audio.h
+index e01e60a3f..62367bbb8 100644
+--- a/include/mgba/internal/gb/audio.h
++++ b/include/mgba/internal/gb/audio.h
+@@ -12,64 +12,64 @@ CXX_GUARD_START
+
+ #include <mgba/core/timing.h>
+
+-DECL_BITFIELD(GBAudioRegisterDuty, uint8_t);
+-DECL_BITS(GBAudioRegisterDuty, Length, 0, 6);
+-DECL_BITS(GBAudioRegisterDuty, Duty, 6, 2);
+-
+-DECL_BITFIELD(GBAudioRegisterSweep, uint8_t);
+-DECL_BITS(GBAudioRegisterSweep, StepTime, 0, 3);
+-DECL_BIT(GBAudioRegisterSweep, Direction, 3);
+-DECL_BITS(GBAudioRegisterSweep, InitialVolume, 4, 4);
+-
+-DECL_BITFIELD(GBAudioRegisterControl, uint16_t);
+-DECL_BITS(GBAudioRegisterControl, Rate, 0, 11);
+-DECL_BITS(GBAudioRegisterControl, Frequency, 0, 11);
+-DECL_BIT(GBAudioRegisterControl, Stop, 14);
+-DECL_BIT(GBAudioRegisterControl, Restart, 15);
+-
+-DECL_BITFIELD(GBAudioRegisterSquareSweep, uint8_t);
+-DECL_BITS(GBAudioRegisterSquareSweep, Shift, 0, 3);
+-DECL_BIT(GBAudioRegisterSquareSweep, Direction, 3);
+-DECL_BITS(GBAudioRegisterSquareSweep, Time, 4, 3);
+-
+-DECL_BITFIELD(GBAudioRegisterBank, uint8_t);
+-DECL_BIT(GBAudioRegisterBank, Size, 5);
+-DECL_BIT(GBAudioRegisterBank, Bank, 6);
+-DECL_BIT(GBAudioRegisterBank, Enable, 7);
+-
+-DECL_BITFIELD(GBAudioRegisterBankVolume, uint8_t);
+-DECL_BITS(GBAudioRegisterBankVolume, VolumeGB, 5, 2);
+-DECL_BITS(GBAudioRegisterBankVolume, VolumeGBA, 5, 3);
+-
+-DECL_BITFIELD(GBAudioRegisterNoiseFeedback, uint8_t);
+-DECL_BITS(GBAudioRegisterNoiseFeedback, Ratio, 0, 3);
+-DECL_BIT(GBAudioRegisterNoiseFeedback, Power, 3);
+-DECL_BITS(GBAudioRegisterNoiseFeedback, Frequency, 4, 4);
+-
+-DECL_BITFIELD(GBAudioRegisterNoiseControl, uint8_t);
+-DECL_BIT(GBAudioRegisterNoiseControl, Stop, 6);
+-DECL_BIT(GBAudioRegisterNoiseControl, Restart, 7);
+-
+-DECL_BITFIELD(GBRegisterNR50, uint8_t);
+-DECL_BITS(GBRegisterNR50, VolumeRight, 0, 3);
+-DECL_BITS(GBRegisterNR50, VolumeLeft, 4, 3);
+-
+-DECL_BITFIELD(GBRegisterNR51, uint8_t);
+-DECL_BIT(GBRegisterNR51, Ch1Right, 0);
+-DECL_BIT(GBRegisterNR51, Ch2Right, 1);
+-DECL_BIT(GBRegisterNR51, Ch3Right, 2);
+-DECL_BIT(GBRegisterNR51, Ch4Right, 3);
+-DECL_BIT(GBRegisterNR51, Ch1Left, 4);
+-DECL_BIT(GBRegisterNR51, Ch2Left, 5);
+-DECL_BIT(GBRegisterNR51, Ch3Left, 6);
+-DECL_BIT(GBRegisterNR51, Ch4Left, 7);
+-
+-DECL_BITFIELD(GBAudioEnable, uint8_t);
+-DECL_BIT(GBAudioEnable, PlayingCh1, 0);
+-DECL_BIT(GBAudioEnable, PlayingCh2, 1);
+-DECL_BIT(GBAudioEnable, PlayingCh3, 2);
+-DECL_BIT(GBAudioEnable, PlayingCh4, 3);
+-DECL_BIT(GBAudioEnable, Enable, 7);
++DECL_BITFIELD(GBAudioRegisterDuty, uint8_t)
++DECL_BITS(GBAudioRegisterDuty, Length, 0, 6)
++DECL_BITS(GBAudioRegisterDuty, Duty, 6, 2)
++
++DECL_BITFIELD(GBAudioRegisterSweep, uint8_t)
++DECL_BITS(GBAudioRegisterSweep, StepTime, 0, 3)
++DECL_BIT(GBAudioRegisterSweep, Direction, 3)
++DECL_BITS(GBAudioRegisterSweep, InitialVolume, 4, 4)
++
++DECL_BITFIELD(GBAudioRegisterControl, uint16_t)
++DECL_BITS(GBAudioRegisterControl, Rate, 0, 11)
++DECL_BITS(GBAudioRegisterControl, Frequency, 0, 11)
++DECL_BIT(GBAudioRegisterControl, Stop, 14)
++DECL_BIT(GBAudioRegisterControl, Restart, 15)
++
++DECL_BITFIELD(GBAudioRegisterSquareSweep, uint8_t)
++DECL_BITS(GBAudioRegisterSquareSweep, Shift, 0, 3)
++DECL_BIT(GBAudioRegisterSquareSweep, Direction, 3)
++DECL_BITS(GBAudioRegisterSquareSweep, Time, 4, 3)
++
++DECL_BITFIELD(GBAudioRegisterBank, uint8_t)
++DECL_BIT(GBAudioRegisterBank, Size, 5)
++DECL_BIT(GBAudioRegisterBank, Bank, 6)
++DECL_BIT(GBAudioRegisterBank, Enable, 7)
++
++DECL_BITFIELD(GBAudioRegisterBankVolume, uint8_t)
++DECL_BITS(GBAudioRegisterBankVolume, VolumeGB, 5, 2)
++DECL_BITS(GBAudioRegisterBankVolume, VolumeGBA, 5, 3)
++
++DECL_BITFIELD(GBAudioRegisterNoiseFeedback, uint8_t)
++DECL_BITS(GBAudioRegisterNoiseFeedback, Ratio, 0, 3)
++DECL_BIT(GBAudioRegisterNoiseFeedback, Power, 3)
++DECL_BITS(GBAudioRegisterNoiseFeedback, Frequency, 4, 4)
++
++DECL_BITFIELD(GBAudioRegisterNoiseControl, uint8_t)
++DECL_BIT(GBAudioRegisterNoiseControl, Stop, 6)
++DECL_BIT(GBAudioRegisterNoiseControl, Restart, 7)
++
++DECL_BITFIELD(GBRegisterNR50, uint8_t)
++DECL_BITS(GBRegisterNR50, VolumeRight, 0, 3)
++DECL_BITS(GBRegisterNR50, VolumeLeft, 4, 3)
++
++DECL_BITFIELD(GBRegisterNR51, uint8_t)
++DECL_BIT(GBRegisterNR51, Ch1Right, 0)
++DECL_BIT(GBRegisterNR51, Ch2Right, 1)
++DECL_BIT(GBRegisterNR51, Ch3Right, 2)
++DECL_BIT(GBRegisterNR51, Ch4Right, 3)
++DECL_BIT(GBRegisterNR51, Ch1Left, 4)
++DECL_BIT(GBRegisterNR51, Ch2Left, 5)
++DECL_BIT(GBRegisterNR51, Ch3Left, 6)
++DECL_BIT(GBRegisterNR51, Ch4Left, 7)
++
++DECL_BITFIELD(GBAudioEnable, uint8_t)
++DECL_BIT(GBAudioEnable, PlayingCh1, 0)
++DECL_BIT(GBAudioEnable, PlayingCh2, 1)
++DECL_BIT(GBAudioEnable, PlayingCh3, 2)
++DECL_BIT(GBAudioEnable, PlayingCh4, 3)
++DECL_BIT(GBAudioEnable, Enable, 7)
+
+ struct GB;
+ struct GBAudioEnvelope {
+diff --git a/include/mgba/internal/gb/cheats.h b/include/mgba/internal/gb/cheats.h
+index 0eb7d3b3c..45a01d167 100644
+--- a/include/mgba/internal/gb/cheats.h
++++ b/include/mgba/internal/gb/cheats.h
+@@ -29,7 +29,7 @@ struct GBCheatPatch {
+ bool checkByte;
+ };
+
+-DECLARE_VECTOR(GBCheatPatchList, struct GBCheatPatch);
++DECLARE_VECTOR(GBCheatPatchList, struct GBCheatPatch)
+
+ struct GBCheatSet {
+ struct mCheatSet d;
+diff --git a/include/mgba/internal/gb/gb.h b/include/mgba/internal/gb/gb.h
+index d0e59e07e..7750a2d92 100644
+--- a/include/mgba/internal/gb/gb.h
++++ b/include/mgba/internal/gb/gb.h
+@@ -25,7 +25,7 @@ extern const uint32_t DMG_SM83_FREQUENCY;
+ extern const uint32_t CGB_SM83_FREQUENCY;
+ extern const uint32_t SGB_SM83_FREQUENCY;
+
+-mLOG_DECLARE_CATEGORY(GB);
++mLOG_DECLARE_CATEGORY(GB)
+
+ // TODO: Prefix GBAIRQ
+ enum GBIRQ {
+diff --git a/include/mgba/internal/gb/io.h b/include/mgba/internal/gb/io.h
+index 1df09da2f..c642970b5 100644
+--- a/include/mgba/internal/gb/io.h
++++ b/include/mgba/internal/gb/io.h
+@@ -12,7 +12,7 @@ CXX_GUARD_START
+
+ #include <mgba/core/log.h>
+
+-mLOG_DECLARE_CATEGORY(GB_IO);
++mLOG_DECLARE_CATEGORY(GB_IO)
+
+ enum GBIORegisters {
+ REG_JOYP = 0x00,
+diff --git a/include/mgba/internal/gb/mbc.h b/include/mgba/internal/gb/mbc.h
+index 72f4e1a47..22ed2f407 100644
+--- a/include/mgba/internal/gb/mbc.h
++++ b/include/mgba/internal/gb/mbc.h
+@@ -12,7 +12,7 @@ CXX_GUARD_START
+
+ #include <mgba/core/log.h>
+
+-mLOG_DECLARE_CATEGORY(GB_MBC);
++mLOG_DECLARE_CATEGORY(GB_MBC)
+
+ struct GB;
+ struct GBMemory;
+diff --git a/include/mgba/internal/gb/memory.h b/include/mgba/internal/gb/memory.h
+index 3c7387b14..43134c723 100644
+--- a/include/mgba/internal/gb/memory.h
++++ b/include/mgba/internal/gb/memory.h
+@@ -14,8 +14,8 @@ CXX_GUARD_START
+ #include <mgba/core/timing.h>
+ #include <mgba/gb/interface.h>
+
+-mLOG_DECLARE_CATEGORY(GB_MBC);
+-mLOG_DECLARE_CATEGORY(GB_MEM);
++mLOG_DECLARE_CATEGORY(GB_MBC)
++mLOG_DECLARE_CATEGORY(GB_MEM)
+
+ struct GB;
+
+@@ -72,11 +72,11 @@ struct GBMemory;
+ typedef void (*GBMemoryBankControllerWrite)(struct GB*, uint16_t address, uint8_t value);
+ typedef uint8_t (*GBMemoryBankControllerRead)(struct GBMemory*, uint16_t address);
+
+-DECL_BITFIELD(GBMBC7Field, uint8_t);
+-DECL_BIT(GBMBC7Field, CS, 7);
+-DECL_BIT(GBMBC7Field, CLK, 6);
+-DECL_BIT(GBMBC7Field, DI, 1);
+-DECL_BIT(GBMBC7Field, DO, 0);
++DECL_BITFIELD(GBMBC7Field, uint8_t)
++DECL_BIT(GBMBC7Field, CS, 7)
++DECL_BIT(GBMBC7Field, CLK, 6)
++DECL_BIT(GBMBC7Field, DI, 1)
++DECL_BIT(GBMBC7Field, DO, 0)
+
+ enum GBMBC7MachineState {
+ GBMBC7_STATE_IDLE = 0,
+diff --git a/include/mgba/internal/gb/serialize.h b/include/mgba/internal/gb/serialize.h
+index ef2d5c4bc..90faeeafa 100644
+--- a/include/mgba/internal/gb/serialize.h
++++ b/include/mgba/internal/gb/serialize.h
+@@ -16,7 +16,7 @@ CXX_GUARD_START
+ extern const uint32_t GB_SAVESTATE_MAGIC;
+ extern const uint32_t GB_SAVESTATE_VERSION;
+
+-mLOG_DECLARE_CATEGORY(GB_STATE);
++mLOG_DECLARE_CATEGORY(GB_STATE)
+
+ /* Savestate format:
+ * 0x00000 - 0x00003: Version Magic (0x01000002)
+@@ -182,25 +182,25 @@ mLOG_DECLARE_CATEGORY(GB_STATE);
+ * Total size: 0x11800 (71,680) bytes
+ */
+
+-DECL_BITFIELD(GBSerializedAudioFlags, uint32_t);
+-DECL_BITS(GBSerializedAudioFlags, Ch1Volume, 0, 4);
+-DECL_BITS(GBSerializedAudioFlags, Ch1Dead, 4, 2);
+-DECL_BIT(GBSerializedAudioFlags, Ch1Hi, 6);
+-DECL_BITS(GBSerializedAudioFlags, Ch2Volume, 8, 4);
+-DECL_BITS(GBSerializedAudioFlags, Ch2Dead, 12, 2);
+-DECL_BIT(GBSerializedAudioFlags, Ch2Hi, 14);
+-DECL_BITS(GBSerializedAudioFlags, Ch4Volume, 16, 4);
+-DECL_BITS(GBSerializedAudioFlags, Ch4Dead, 20, 2);
+-DECL_BITS(GBSerializedAudioFlags, Frame, 22, 3);
+-DECL_BIT(GBSerializedAudioFlags, Ch1SweepEnabled, 25);
+-DECL_BIT(GBSerializedAudioFlags, Ch1SweepOccurred, 26);
+-DECL_BIT(GBSerializedAudioFlags, Ch3Readable, 27);
+-DECL_BIT(GBSerializedAudioFlags, SkipFrame, 28);
+-
+-DECL_BITFIELD(GBSerializedAudioEnvelope, uint32_t);
+-DECL_BITS(GBSerializedAudioEnvelope, Length, 0, 7);
+-DECL_BITS(GBSerializedAudioEnvelope, NextStep, 7, 3);
+-DECL_BITS(GBSerializedAudioEnvelope, Frequency, 10, 11);
++DECL_BITFIELD(GBSerializedAudioFlags, uint32_t)
++DECL_BITS(GBSerializedAudioFlags, Ch1Volume, 0, 4)
++DECL_BITS(GBSerializedAudioFlags, Ch1Dead, 4, 2)
++DECL_BIT(GBSerializedAudioFlags, Ch1Hi, 6)
++DECL_BITS(GBSerializedAudioFlags, Ch2Volume, 8, 4)
++DECL_BITS(GBSerializedAudioFlags, Ch2Dead, 12, 2)
++DECL_BIT(GBSerializedAudioFlags, Ch2Hi, 14)
++DECL_BITS(GBSerializedAudioFlags, Ch4Volume, 16, 4)
++DECL_BITS(GBSerializedAudioFlags, Ch4Dead, 20, 2)
++DECL_BITS(GBSerializedAudioFlags, Frame, 22, 3)
++DECL_BIT(GBSerializedAudioFlags, Ch1SweepEnabled, 25)
++DECL_BIT(GBSerializedAudioFlags, Ch1SweepOccurred, 26)
++DECL_BIT(GBSerializedAudioFlags, Ch3Readable, 27)
++DECL_BIT(GBSerializedAudioFlags, SkipFrame, 28)
++
++DECL_BITFIELD(GBSerializedAudioEnvelope, uint32_t)
++DECL_BITS(GBSerializedAudioEnvelope, Length, 0, 7)
++DECL_BITS(GBSerializedAudioEnvelope, NextStep, 7, 3)
++DECL_BITS(GBSerializedAudioEnvelope, Frequency, 10, 11)
+
+ struct GBSerializedPSGState {
+ struct {
+@@ -229,41 +229,41 @@ struct GBSerializedPSGState {
+ } ch4;
+ };
+
+-DECL_BITFIELD(GBSerializedCpuFlags, uint32_t);
+-DECL_BIT(GBSerializedCpuFlags, Condition, 0);
+-DECL_BIT(GBSerializedCpuFlags, IrqPending, 1);
+-DECL_BIT(GBSerializedCpuFlags, DoubleSpeed, 2);
+-DECL_BIT(GBSerializedCpuFlags, EiPending, 3);
+-
+-DECL_BITFIELD(GBSerializedTimerFlags, uint8_t);
+-DECL_BIT(GBSerializedTimerFlags, IrqPending, 0);
+-
+-DECL_BITFIELD(GBSerializedVideoFlags, uint8_t);
+-DECL_BIT(GBSerializedVideoFlags, BcpIncrement, 0);
+-DECL_BIT(GBSerializedVideoFlags, OcpIncrement, 1);
+-DECL_BITS(GBSerializedVideoFlags, Mode, 2, 2);
+-DECL_BIT(GBSerializedVideoFlags, NotModeEventScheduled, 4);
+-DECL_BIT(GBSerializedVideoFlags, NotFrameEventScheduled, 5);
+-
+-DECL_BITFIELD(GBSerializedMBC7Flags, uint8_t);
+-DECL_BITS(GBSerializedMBC7Flags, Command, 0, 2);
+-DECL_BIT(GBSerializedMBC7Flags, Writable, 2);
+-
+-DECL_BITFIELD(GBSerializedMemoryFlags, uint16_t);
+-DECL_BIT(GBSerializedMemoryFlags, SramAccess, 0);
+-DECL_BIT(GBSerializedMemoryFlags, RtcAccess, 1);
+-DECL_BIT(GBSerializedMemoryFlags, RtcLatched, 2);
+-DECL_BIT(GBSerializedMemoryFlags, Ime, 3);
+-DECL_BIT(GBSerializedMemoryFlags, IsHdma, 4);
+-DECL_BITS(GBSerializedMemoryFlags, ActiveRtcReg, 5, 3);
+-
+-DECL_BITFIELD(GBSerializedSGBFlags, uint32_t);
+-DECL_BITS(GBSerializedSGBFlags, P1Bits, 0, 2);
+-DECL_BITS(GBSerializedSGBFlags, RenderMode, 2, 2);
+-DECL_BITS(GBSerializedSGBFlags, BufferIndex, 4, 3);
+-DECL_BITS(GBSerializedSGBFlags, CurrentController, 7, 2);
+-DECL_BITS(GBSerializedSGBFlags, ReqControllers, 9, 2);
+-DECL_BIT(GBSerializedSGBFlags, Increment, 11);
++DECL_BITFIELD(GBSerializedCpuFlags, uint32_t)
++DECL_BIT(GBSerializedCpuFlags, Condition, 0)
++DECL_BIT(GBSerializedCpuFlags, IrqPending, 1)
++DECL_BIT(GBSerializedCpuFlags, DoubleSpeed, 2)
++DECL_BIT(GBSerializedCpuFlags, EiPending, 3)
++
++DECL_BITFIELD(GBSerializedTimerFlags, uint8_t)
++DECL_BIT(GBSerializedTimerFlags, IrqPending, 0)
++
++DECL_BITFIELD(GBSerializedVideoFlags, uint8_t)
++DECL_BIT(GBSerializedVideoFlags, BcpIncrement, 0)
++DECL_BIT(GBSerializedVideoFlags, OcpIncrement, 1)
++DECL_BITS(GBSerializedVideoFlags, Mode, 2, 2)
++DECL_BIT(GBSerializedVideoFlags, NotModeEventScheduled, 4)
++DECL_BIT(GBSerializedVideoFlags, NotFrameEventScheduled, 5)
++
++DECL_BITFIELD(GBSerializedMBC7Flags, uint8_t)
++DECL_BITS(GBSerializedMBC7Flags, Command, 0, 2)
++DECL_BIT(GBSerializedMBC7Flags, Writable, 2)
++
++DECL_BITFIELD(GBSerializedMemoryFlags, uint16_t)
++DECL_BIT(GBSerializedMemoryFlags, SramAccess, 0)
++DECL_BIT(GBSerializedMemoryFlags, RtcAccess, 1)
++DECL_BIT(GBSerializedMemoryFlags, RtcLatched, 2)
++DECL_BIT(GBSerializedMemoryFlags, Ime, 3)
++DECL_BIT(GBSerializedMemoryFlags, IsHdma, 4)
++DECL_BITS(GBSerializedMemoryFlags, ActiveRtcReg, 5, 3)
++
++DECL_BITFIELD(GBSerializedSGBFlags, uint32_t)
++DECL_BITS(GBSerializedSGBFlags, P1Bits, 0, 2)
++DECL_BITS(GBSerializedSGBFlags, RenderMode, 2, 2)
++DECL_BITS(GBSerializedSGBFlags, BufferIndex, 4, 3)
++DECL_BITS(GBSerializedSGBFlags, CurrentController, 7, 2)
++DECL_BITS(GBSerializedSGBFlags, ReqControllers, 9, 2)
++DECL_BIT(GBSerializedSGBFlags, Increment, 11)
+
+ #pragma pack(push, 1)
+ struct GBSerializedState {
+diff --git a/include/mgba/internal/gb/sio.h b/include/mgba/internal/gb/sio.h
+index 50d62868b..6744a76ec 100644
+--- a/include/mgba/internal/gb/sio.h
++++ b/include/mgba/internal/gb/sio.h
+@@ -18,7 +18,7 @@ CXX_GUARD_START
+
+ extern const int GBSIOCyclesPerTransfer[2];
+
+-mLOG_DECLARE_CATEGORY(GB_SIO);
++mLOG_DECLARE_CATEGORY(GB_SIO)
+
+ struct GB;
+ struct GBSIODriver;
+@@ -35,10 +35,10 @@ struct GBSIO {
+ uint8_t pendingSB;
+ };
+
+-DECL_BITFIELD(GBRegisterSC, uint8_t);
+-DECL_BIT(GBRegisterSC, ShiftClock, 0);
+-DECL_BIT(GBRegisterSC, ClockSpeed, 1);
+-DECL_BIT(GBRegisterSC, Enable, 7);
++DECL_BITFIELD(GBRegisterSC, uint8_t)
++DECL_BIT(GBRegisterSC, ShiftClock, 0)
++DECL_BIT(GBRegisterSC, ClockSpeed, 1)
++DECL_BIT(GBRegisterSC, Enable, 7)
+
+ void GBSIOInit(struct GBSIO* sio);
+ void GBSIOReset(struct GBSIO* sio);
+diff --git a/include/mgba/internal/gb/timer.h b/include/mgba/internal/gb/timer.h
+index b81ff1c34..31f5fb849 100644
+--- a/include/mgba/internal/gb/timer.h
++++ b/include/mgba/internal/gb/timer.h
+@@ -12,9 +12,9 @@ CXX_GUARD_START
+
+ #include <mgba/core/timing.h>
+
+-DECL_BITFIELD(GBRegisterTAC, uint8_t);
+-DECL_BITS(GBRegisterTAC, Clock, 0, 2);
+-DECL_BIT(GBRegisterTAC, Run, 2);
++DECL_BITFIELD(GBRegisterTAC, uint8_t)
++DECL_BITS(GBRegisterTAC, Clock, 0, 2)
++DECL_BIT(GBRegisterTAC, Run, 2)
+
+ enum {
+ GB_DMG_DIV_PERIOD = 16
+diff --git a/include/mgba/internal/gb/video.h b/include/mgba/internal/gb/video.h
+index 69a3b0420..56c6cda0f 100644
+--- a/include/mgba/internal/gb/video.h
++++ b/include/mgba/internal/gb/video.h
+@@ -37,20 +37,20 @@ enum {
+ SGB_SIZE_ATF_RAM = 0x1000
+ };
+
+-DECL_BITFIELD(GBObjAttributes, uint8_t);
+-DECL_BITS(GBObjAttributes, CGBPalette, 0, 3);
+-DECL_BIT(GBObjAttributes, Bank, 3);
+-DECL_BIT(GBObjAttributes, Palette, 4);
+-DECL_BIT(GBObjAttributes, XFlip, 5);
+-DECL_BIT(GBObjAttributes, YFlip, 6);
+-DECL_BIT(GBObjAttributes, Priority, 7);
+-
+-DECL_BITFIELD(SGBBgAttributes, uint16_t);
+-DECL_BITS(SGBBgAttributes, Tile, 0, 10);
+-DECL_BITS(SGBBgAttributes, Palette, 10, 3);
+-DECL_BIT(SGBBgAttributes, Priority, 13);
+-DECL_BIT(SGBBgAttributes, XFlip, 14);
+-DECL_BIT(SGBBgAttributes, YFlip, 15);
++DECL_BITFIELD(GBObjAttributes, uint8_t)
++DECL_BITS(GBObjAttributes, CGBPalette, 0, 3)
++DECL_BIT(GBObjAttributes, Bank, 3)
++DECL_BIT(GBObjAttributes, Palette, 4)
++DECL_BIT(GBObjAttributes, XFlip, 5)
++DECL_BIT(GBObjAttributes, YFlip, 6)
++DECL_BIT(GBObjAttributes, Priority, 7)
++
++DECL_BITFIELD(SGBBgAttributes, uint16_t)
++DECL_BITS(SGBBgAttributes, Tile, 0, 10)
++DECL_BITS(SGBBgAttributes, Palette, 10, 3)
++DECL_BIT(SGBBgAttributes, Priority, 13)
++DECL_BIT(SGBBgAttributes, XFlip, 14)
++DECL_BIT(SGBBgAttributes, YFlip, 15)
+
+ struct GBObj {
+ uint8_t y;
+@@ -98,23 +98,23 @@ struct GBVideoRenderer {
+ bool disableWIN;
+ };
+
+-DECL_BITFIELD(GBRegisterLCDC, uint8_t);
+-DECL_BIT(GBRegisterLCDC, BgEnable, 0);
+-DECL_BIT(GBRegisterLCDC, ObjEnable, 1);
+-DECL_BIT(GBRegisterLCDC, ObjSize, 2);
+-DECL_BIT(GBRegisterLCDC, TileMap, 3);
+-DECL_BIT(GBRegisterLCDC, TileData, 4);
+-DECL_BIT(GBRegisterLCDC, Window, 5);
+-DECL_BIT(GBRegisterLCDC, WindowTileMap, 6);
+-DECL_BIT(GBRegisterLCDC, Enable, 7);
+-
+-DECL_BITFIELD(GBRegisterSTAT, uint8_t);
+-DECL_BITS(GBRegisterSTAT, Mode, 0, 2);
+-DECL_BIT(GBRegisterSTAT, LYC, 2);
+-DECL_BIT(GBRegisterSTAT, HblankIRQ, 3);
+-DECL_BIT(GBRegisterSTAT, VblankIRQ, 4);
+-DECL_BIT(GBRegisterSTAT, OAMIRQ, 5);
+-DECL_BIT(GBRegisterSTAT, LYCIRQ, 6);
++DECL_BITFIELD(GBRegisterLCDC, uint8_t)
++DECL_BIT(GBRegisterLCDC, BgEnable, 0)
++DECL_BIT(GBRegisterLCDC, ObjEnable, 1)
++DECL_BIT(GBRegisterLCDC, ObjSize, 2)
++DECL_BIT(GBRegisterLCDC, TileMap, 3)
++DECL_BIT(GBRegisterLCDC, TileData, 4)
++DECL_BIT(GBRegisterLCDC, Window, 5)
++DECL_BIT(GBRegisterLCDC, WindowTileMap, 6)
++DECL_BIT(GBRegisterLCDC, Enable, 7)
++
++DECL_BITFIELD(GBRegisterSTAT, uint8_t)
++DECL_BITS(GBRegisterSTAT, Mode, 0, 2)
++DECL_BIT(GBRegisterSTAT, LYC, 2)
++DECL_BIT(GBRegisterSTAT, HblankIRQ, 3)
++DECL_BIT(GBRegisterSTAT, VblankIRQ, 4)
++DECL_BIT(GBRegisterSTAT, OAMIRQ, 5)
++DECL_BIT(GBRegisterSTAT, LYCIRQ, 6)
+
+ struct GBVideo {
+ struct GB* p;
+diff --git a/include/mgba/internal/gba/audio.h b/include/mgba/internal/gba/audio.h
+index f08f845b6..2eebdf81b 100644
+--- a/include/mgba/internal/gba/audio.h
++++ b/include/mgba/internal/gba/audio.h
+@@ -18,7 +18,7 @@ CXX_GUARD_START
+ #define MP2K_MAGIC 0x68736D53
+ #define MP2K_MAX_SOUND_CHANNELS 12
+
+-mLOG_DECLARE_CATEGORY(GBA_AUDIO);
++mLOG_DECLARE_CATEGORY(GBA_AUDIO)
+
+ struct GBADMA;
+
+@@ -31,22 +31,22 @@ struct GBAAudioFIFO {
+ int8_t sample;
+ };
+
+-DECL_BITFIELD(GBARegisterSOUNDCNT_HI, uint16_t);
+-DECL_BITS(GBARegisterSOUNDCNT_HI, Volume, 0, 2);
+-DECL_BIT(GBARegisterSOUNDCNT_HI, VolumeChA, 2);
+-DECL_BIT(GBARegisterSOUNDCNT_HI, VolumeChB, 3);
+-DECL_BIT(GBARegisterSOUNDCNT_HI, ChARight, 8);
+-DECL_BIT(GBARegisterSOUNDCNT_HI, ChALeft, 9);
+-DECL_BIT(GBARegisterSOUNDCNT_HI, ChATimer, 10);
+-DECL_BIT(GBARegisterSOUNDCNT_HI, ChAReset, 11);
+-DECL_BIT(GBARegisterSOUNDCNT_HI, ChBRight, 12);
+-DECL_BIT(GBARegisterSOUNDCNT_HI, ChBLeft, 13);
+-DECL_BIT(GBARegisterSOUNDCNT_HI, ChBTimer, 14);
+-DECL_BIT(GBARegisterSOUNDCNT_HI, ChBReset, 15);
+-
+-DECL_BITFIELD(GBARegisterSOUNDBIAS, uint16_t);
+-DECL_BITS(GBARegisterSOUNDBIAS, Bias, 0, 10);
+-DECL_BITS(GBARegisterSOUNDBIAS, Resolution, 14, 2);
++DECL_BITFIELD(GBARegisterSOUNDCNT_HI, uint16_t)
++DECL_BITS(GBARegisterSOUNDCNT_HI, Volume, 0, 2)
++DECL_BIT(GBARegisterSOUNDCNT_HI, VolumeChA, 2)
++DECL_BIT(GBARegisterSOUNDCNT_HI, VolumeChB, 3)
++DECL_BIT(GBARegisterSOUNDCNT_HI, ChARight, 8)
++DECL_BIT(GBARegisterSOUNDCNT_HI, ChALeft, 9)
++DECL_BIT(GBARegisterSOUNDCNT_HI, ChATimer, 10)
++DECL_BIT(GBARegisterSOUNDCNT_HI, ChAReset, 11)
++DECL_BIT(GBARegisterSOUNDCNT_HI, ChBRight, 12)
++DECL_BIT(GBARegisterSOUNDCNT_HI, ChBLeft, 13)
++DECL_BIT(GBARegisterSOUNDCNT_HI, ChBTimer, 14)
++DECL_BIT(GBARegisterSOUNDCNT_HI, ChBReset, 15)
++
++DECL_BITFIELD(GBARegisterSOUNDBIAS, uint16_t)
++DECL_BITS(GBARegisterSOUNDBIAS, Bias, 0, 10)
++DECL_BITS(GBARegisterSOUNDBIAS, Resolution, 14, 2)
+
+ struct GBAAudioMixer;
+ struct GBAAudio {
+diff --git a/include/mgba/internal/gba/bios.h b/include/mgba/internal/gba/bios.h
+index a89edfd68..efa2a1025 100644
+--- a/include/mgba/internal/gba/bios.h
++++ b/include/mgba/internal/gba/bios.h
+@@ -12,7 +12,7 @@ CXX_GUARD_START
+
+ #include <mgba/core/log.h>
+
+-mLOG_DECLARE_CATEGORY(GBA_BIOS);
++mLOG_DECLARE_CATEGORY(GBA_BIOS)
+
+ struct ARMCore;
+ void GBASwi16(struct ARMCore* cpu, int immediate);
+diff --git a/include/mgba/internal/gba/dma.h b/include/mgba/internal/gba/dma.h
+index 6f880c971..815077f8d 100644
+--- a/include/mgba/internal/gba/dma.h
++++ b/include/mgba/internal/gba/dma.h
+@@ -24,15 +24,15 @@ enum GBADMATiming {
+ GBA_DMA_TIMING_CUSTOM = 3
+ };
+
+-DECL_BITFIELD(GBADMARegister, uint16_t);
+-DECL_BITS(GBADMARegister, DestControl, 5, 2);
+-DECL_BITS(GBADMARegister, SrcControl, 7, 2);
+-DECL_BIT(GBADMARegister, Repeat, 9);
+-DECL_BIT(GBADMARegister, Width, 10);
+-DECL_BIT(GBADMARegister, DRQ, 11);
+-DECL_BITS(GBADMARegister, Timing, 12, 2);
+-DECL_BIT(GBADMARegister, DoIRQ, 14);
+-DECL_BIT(GBADMARegister, Enable, 15);
++DECL_BITFIELD(GBADMARegister, uint16_t)
++DECL_BITS(GBADMARegister, DestControl, 5, 2)
++DECL_BITS(GBADMARegister, SrcControl, 7, 2)
++DECL_BIT(GBADMARegister, Repeat, 9)
++DECL_BIT(GBADMARegister, Width, 10)
++DECL_BIT(GBADMARegister, DRQ, 11)
++DECL_BITS(GBADMARegister, Timing, 12, 2)
++DECL_BIT(GBADMARegister, DoIRQ, 14)
++DECL_BIT(GBADMARegister, Enable, 15)
+
+ struct GBADMA {
+ GBADMARegister reg;
+diff --git a/include/mgba/internal/gba/gba.h b/include/mgba/internal/gba/gba.h
+index fffd46936..343ed6f10 100644
+--- a/include/mgba/internal/gba/gba.h
++++ b/include/mgba/internal/gba/gba.h
+@@ -55,12 +55,12 @@ struct GBA;
+ struct Patch;
+ struct VFile;
+
+-mLOG_DECLARE_CATEGORY(GBA);
+-mLOG_DECLARE_CATEGORY(GBA_DEBUG);
++mLOG_DECLARE_CATEGORY(GBA)
++mLOG_DECLARE_CATEGORY(GBA_DEBUG)
+
+-DECL_BITFIELD(GBADebugFlags, uint16_t);
+-DECL_BITS(GBADebugFlags, Level, 0, 3);
+-DECL_BIT(GBADebugFlags, Send, 8);
++DECL_BITFIELD(GBADebugFlags, uint16_t)
++DECL_BITS(GBADebugFlags, Level, 0, 3)
++DECL_BIT(GBADebugFlags, Send, 8)
+
+ struct GBA {
+ struct mCPUComponent d;
+diff --git a/include/mgba/internal/gba/hardware.h b/include/mgba/internal/gba/hardware.h
+index fab175538..54b2f5971 100644
+--- a/include/mgba/internal/gba/hardware.h
++++ b/include/mgba/internal/gba/hardware.h
+@@ -14,7 +14,7 @@ CXX_GUARD_START
+ #include <mgba/core/timing.h>
+ #include <mgba/gba/interface.h>
+
+-mLOG_DECLARE_CATEGORY(GBA_HW);
++mLOG_DECLARE_CATEGORY(GBA_HW)
+
+ #define IS_GPIO_REGISTER(reg) ((reg) == GPIO_REG_DATA || (reg) == GPIO_REG_DIRECTION || (reg) == GPIO_REG_CONTROL)
+
+@@ -48,10 +48,10 @@ enum GPIODirection {
+ GPIO_READ_WRITE = 1
+ };
+
+-DECL_BITFIELD(RTCControl, uint32_t);
+-DECL_BIT(RTCControl, MinIRQ, 3);
+-DECL_BIT(RTCControl, Hour24, 6);
+-DECL_BIT(RTCControl, Poweroff, 7);
++DECL_BITFIELD(RTCControl, uint32_t)
++DECL_BIT(RTCControl, MinIRQ, 3)
++DECL_BIT(RTCControl, Hour24, 6)
++DECL_BIT(RTCControl, Poweroff, 7)
+
+ enum RTCCommand {
+ RTC_RESET = 0,
+@@ -61,10 +61,10 @@ enum RTCCommand {
+ RTC_TIME = 6
+ };
+
+-DECL_BITFIELD(RTCCommandData, uint32_t);
+-DECL_BITS(RTCCommandData, Magic, 0, 4);
+-DECL_BITS(RTCCommandData, Command, 4, 3);
+-DECL_BIT(RTCCommandData, Reading, 7);
++DECL_BITFIELD(RTCCommandData, uint32_t)
++DECL_BITS(RTCCommandData, Magic, 0, 4)
++DECL_BITS(RTCCommandData, Command, 4, 3)
++DECL_BIT(RTCCommandData, Reading, 7)
+
+ #ifndef PYCPARSE
+ #pragma pack(push, 1)
+@@ -93,7 +93,7 @@ struct GBAGBPSIODriver {
+ struct GBACartridgeHardware* p;
+ };
+
+-DECL_BITFIELD(GPIOPin, uint16_t);
++DECL_BITFIELD(GPIOPin, uint16_t)
+
+ struct GBACartridgeHardware {
+ struct GBA* p;
+diff --git a/include/mgba/internal/gba/io.h b/include/mgba/internal/gba/io.h
+index 9875061f3..7075e0e9e 100644
+--- a/include/mgba/internal/gba/io.h
++++ b/include/mgba/internal/gba/io.h
+@@ -159,7 +159,7 @@ enum GBAIORegisters {
+ REG_DEBUG_ENABLE = 0xFFF780,
+ };
+
+-mLOG_DECLARE_CATEGORY(GBA_IO);
++mLOG_DECLARE_CATEGORY(GBA_IO)
+
+ extern MGBA_EXPORT const char* const GBAIORegisterNames[];
+
+diff --git a/include/mgba/internal/gba/memory.h b/include/mgba/internal/gba/memory.h
+index f98b7e94a..4c3746ef9 100644
+--- a/include/mgba/internal/gba/memory.h
++++ b/include/mgba/internal/gba/memory.h
+@@ -88,7 +88,7 @@ enum {
+ AGB_PRINT_FLUSH_ADDR = 0x01FE209C,
+ };
+
+-mLOG_DECLARE_CATEGORY(GBA_MEM);
++mLOG_DECLARE_CATEGORY(GBA_MEM)
+
+ struct GBAPrintContext {
+ uint16_t request;
+diff --git a/include/mgba/internal/gba/rr/rr.h b/include/mgba/internal/gba/rr/rr.h
+index b4fc2e627..e8fda37bc 100644
+--- a/include/mgba/internal/gba/rr/rr.h
++++ b/include/mgba/internal/gba/rr/rr.h
+@@ -15,7 +15,7 @@ CXX_GUARD_START
+
+ struct VFile;
+
+-mLOG_DECLARE_CATEGORY(GBA_RR);
++mLOG_DECLARE_CATEGORY(GBA_RR)
+
+ enum GBARRInitFrom {
+ INIT_EX_NIHILO = 0,
+diff --git a/include/mgba/internal/gba/savedata.h b/include/mgba/internal/gba/savedata.h
+index 05cd65963..3fa6813c2 100644
+--- a/include/mgba/internal/gba/savedata.h
++++ b/include/mgba/internal/gba/savedata.h
+@@ -13,7 +13,7 @@ CXX_GUARD_START
+ #include <mgba/core/log.h>
+ #include <mgba/core/timing.h>
+
+-mLOG_DECLARE_CATEGORY(GBA_SAVE);
++mLOG_DECLARE_CATEGORY(GBA_SAVE)
+
+ struct VFile;
+
+diff --git a/include/mgba/internal/gba/serialize.h b/include/mgba/internal/gba/serialize.h
+index 3d2e0e69c..83b337b2c 100644
+--- a/include/mgba/internal/gba/serialize.h
++++ b/include/mgba/internal/gba/serialize.h
+@@ -17,7 +17,7 @@ CXX_GUARD_START
+ extern const uint32_t GBA_SAVESTATE_MAGIC;
+ extern const uint32_t GBA_SAVESTATE_VERSION;
+
+-mLOG_DECLARE_CATEGORY(GBA_STATE);
++mLOG_DECLARE_CATEGORY(GBA_STATE)
+
+ /* Savestate format:
+ * 0x00000 - 0x00003: Version Magic (0x01000001)
+@@ -208,28 +208,28 @@ mLOG_DECLARE_CATEGORY(GBA_STATE);
+ * Total size: 0x61000 (397,312) bytes
+ */
+
+-DECL_BITFIELD(GBASerializedHWFlags1, uint16_t);
+-DECL_BIT(GBASerializedHWFlags1, ReadWrite, 0);
+-DECL_BIT(GBASerializedHWFlags1, GyroEdge, 1);
+-DECL_BIT(GBASerializedHWFlags1, LightEdge, 2);
+-DECL_BITS(GBASerializedHWFlags1, LightCounter, 4, 12);
++DECL_BITFIELD(GBASerializedHWFlags1, uint16_t)
++DECL_BIT(GBASerializedHWFlags1, ReadWrite, 0)
++DECL_BIT(GBASerializedHWFlags1, GyroEdge, 1)
++DECL_BIT(GBASerializedHWFlags1, LightEdge, 2)
++DECL_BITS(GBASerializedHWFlags1, LightCounter, 4, 12)
+
+-DECL_BITFIELD(GBASerializedHWFlags2, uint8_t);
+-DECL_BITS(GBASerializedHWFlags2, TiltState, 0, 2);
+-DECL_BITS(GBASerializedHWFlags2, GbpInputsPosted, 2, 2);
+-DECL_BITS(GBASerializedHWFlags2, GbpTxPosition, 4, 5);
++DECL_BITFIELD(GBASerializedHWFlags2, uint8_t)
++DECL_BITS(GBASerializedHWFlags2, TiltState, 0, 2)
++DECL_BITS(GBASerializedHWFlags2, GbpInputsPosted, 2, 2)
++DECL_BITS(GBASerializedHWFlags2, GbpTxPosition, 4, 5)
+
+-DECL_BITFIELD(GBASerializedHWFlags3, uint16_t);
++DECL_BITFIELD(GBASerializedHWFlags3, uint16_t)
+
+-DECL_BITFIELD(GBASerializedSavedataFlags, uint8_t);
+-DECL_BITS(GBASerializedSavedataFlags, FlashState, 0, 2);
+-DECL_BIT(GBASerializedSavedataFlags, FlashBank, 4);
+-DECL_BIT(GBASerializedSavedataFlags, DustSettling, 5);
++DECL_BITFIELD(GBASerializedSavedataFlags, uint8_t)
++DECL_BITS(GBASerializedSavedataFlags, FlashState, 0, 2)
++DECL_BIT(GBASerializedSavedataFlags, FlashBank, 4)
++DECL_BIT(GBASerializedSavedataFlags, DustSettling, 5)
+
+-DECL_BITFIELD(GBASerializedMiscFlags, uint32_t);
+-DECL_BIT(GBASerializedMiscFlags, Halted, 0);
+-DECL_BIT(GBASerializedMiscFlags, POSTFLG, 1);
+-DECL_BIT(GBASerializedMiscFlags, IrqPending, 2);
++DECL_BITFIELD(GBASerializedMiscFlags, uint32_t)
++DECL_BIT(GBASerializedMiscFlags, Halted, 0)
++DECL_BIT(GBASerializedMiscFlags, POSTFLG, 1)
++DECL_BIT(GBASerializedMiscFlags, IrqPending, 2)
+
+ struct GBASerializedState {
+ uint32_t versionMagic;
+diff --git a/include/mgba/internal/gba/sio.h b/include/mgba/internal/gba/sio.h
+index 7a4e3ecfb..263def9b8 100644
+--- a/include/mgba/internal/gba/sio.h
++++ b/include/mgba/internal/gba/sio.h
+@@ -17,7 +17,7 @@ CXX_GUARD_START
+
+ extern const int GBASIOCyclesPerTransfer[4][MAX_GBAS];
+
+-mLOG_DECLARE_CATEGORY(GBA_SIO);
++mLOG_DECLARE_CATEGORY(GBA_SIO)
+
+ enum {
+ RCNT_INITIAL = 0x8000
+@@ -33,22 +33,22 @@ enum {
+ JOYSTAT_RECV_BIT = 2,
+ };
+
+-DECL_BITFIELD(GBASIONormal, uint16_t);
+-DECL_BIT(GBASIONormal, Sc, 0);
+-DECL_BIT(GBASIONormal, InternalSc, 1);
+-DECL_BIT(GBASIONormal, Si, 2);
+-DECL_BIT(GBASIONormal, IdleSo, 3);
+-DECL_BIT(GBASIONormal, Start, 7);
+-DECL_BIT(GBASIONormal, Length, 12);
+-DECL_BIT(GBASIONormal, Irq, 14);
+-DECL_BITFIELD(GBASIOMultiplayer, uint16_t);
+-DECL_BITS(GBASIOMultiplayer, Baud, 0, 2);
+-DECL_BIT(GBASIOMultiplayer, Slave, 2);
+-DECL_BIT(GBASIOMultiplayer, Ready, 3);
+-DECL_BITS(GBASIOMultiplayer, Id, 4, 2);
+-DECL_BIT(GBASIOMultiplayer, Error, 6);
+-DECL_BIT(GBASIOMultiplayer, Busy, 7);
+-DECL_BIT(GBASIOMultiplayer, Irq, 14);
++DECL_BITFIELD(GBASIONormal, uint16_t)
++DECL_BIT(GBASIONormal, Sc, 0)
++DECL_BIT(GBASIONormal, InternalSc, 1)
++DECL_BIT(GBASIONormal, Si, 2)
++DECL_BIT(GBASIONormal, IdleSo, 3)
++DECL_BIT(GBASIONormal, Start, 7)
++DECL_BIT(GBASIONormal, Length, 12)
++DECL_BIT(GBASIONormal, Irq, 14)
++DECL_BITFIELD(GBASIOMultiplayer, uint16_t)
++DECL_BITS(GBASIOMultiplayer, Baud, 0, 2)
++DECL_BIT(GBASIOMultiplayer, Slave, 2)
++DECL_BIT(GBASIOMultiplayer, Ready, 3)
++DECL_BITS(GBASIOMultiplayer, Id, 4, 2)
++DECL_BIT(GBASIOMultiplayer, Error, 6)
++DECL_BIT(GBASIOMultiplayer, Busy, 7)
++DECL_BIT(GBASIOMultiplayer, Irq, 14)
+
+ struct GBASIODriverSet {
+ struct GBASIODriver* normal;
+diff --git a/include/mgba/internal/gba/timer.h b/include/mgba/internal/gba/timer.h
+index 664842e6b..b10335f72 100644
+--- a/include/mgba/internal/gba/timer.h
++++ b/include/mgba/internal/gba/timer.h
+@@ -12,11 +12,11 @@ CXX_GUARD_START
+
+ #include <mgba/core/timing.h>
+
+-DECL_BITFIELD(GBATimerFlags, uint32_t);
+-DECL_BITS(GBATimerFlags, PrescaleBits, 0, 4);
+-DECL_BIT(GBATimerFlags, CountUp, 4);
+-DECL_BIT(GBATimerFlags, DoIrq, 5);
+-DECL_BIT(GBATimerFlags, Enable, 6);
++DECL_BITFIELD(GBATimerFlags, uint32_t)
++DECL_BITS(GBATimerFlags, PrescaleBits, 0, 4)
++DECL_BIT(GBATimerFlags, CountUp, 4)
++DECL_BIT(GBATimerFlags, DoIrq, 5)
++DECL_BIT(GBATimerFlags, Enable, 6)
+
+ struct GBA;
+ struct GBATimer {
+diff --git a/include/mgba/internal/gba/video.h b/include/mgba/internal/gba/video.h
+index 77ff3cf0e..5cc14c18c 100644
+--- a/include/mgba/internal/gba/video.h
++++ b/include/mgba/internal/gba/video.h
+@@ -14,7 +14,7 @@ CXX_GUARD_START
+ #include <mgba/core/timing.h>
+ #include <mgba/gba/interface.h>
+
+-mLOG_DECLARE_CATEGORY(GBA_VIDEO);
++mLOG_DECLARE_CATEGORY(GBA_VIDEO)
+
+ enum {
+ VIDEO_HBLANK_PIXELS = 68,
+@@ -52,27 +52,27 @@ enum GBAVideoBlendEffect {
+ BLEND_DARKEN = 3
+ };
+
+-DECL_BITFIELD(GBAObjAttributesA, uint16_t);
+-DECL_BITS(GBAObjAttributesA, Y, 0, 8);
+-DECL_BIT(GBAObjAttributesA, Transformed, 8);
+-DECL_BIT(GBAObjAttributesA, Disable, 9);
+-DECL_BIT(GBAObjAttributesA, DoubleSize, 9);
+-DECL_BITS(GBAObjAttributesA, Mode, 10, 2);
+-DECL_BIT(GBAObjAttributesA, Mosaic, 12);
+-DECL_BIT(GBAObjAttributesA, 256Color, 13);
+-DECL_BITS(GBAObjAttributesA, Shape, 14, 2);
+-
+-DECL_BITFIELD(GBAObjAttributesB, uint16_t);
+-DECL_BITS(GBAObjAttributesB, X, 0, 9);
+-DECL_BITS(GBAObjAttributesB, MatIndex, 9, 5);
+-DECL_BIT(GBAObjAttributesB, HFlip, 12);
+-DECL_BIT(GBAObjAttributesB, VFlip, 13);
+-DECL_BITS(GBAObjAttributesB, Size, 14, 2);
+-
+-DECL_BITFIELD(GBAObjAttributesC, uint16_t);
+-DECL_BITS(GBAObjAttributesC, Tile, 0, 10);
+-DECL_BITS(GBAObjAttributesC, Priority, 10, 2);
+-DECL_BITS(GBAObjAttributesC, Palette, 12, 4);
++DECL_BITFIELD(GBAObjAttributesA, uint16_t)
++DECL_BITS(GBAObjAttributesA, Y, 0, 8)
++DECL_BIT(GBAObjAttributesA, Transformed, 8)
++DECL_BIT(GBAObjAttributesA, Disable, 9)
++DECL_BIT(GBAObjAttributesA, DoubleSize, 9)
++DECL_BITS(GBAObjAttributesA, Mode, 10, 2)
++DECL_BIT(GBAObjAttributesA, Mosaic, 12)
++DECL_BIT(GBAObjAttributesA, 256Color, 13)
++DECL_BITS(GBAObjAttributesA, Shape, 14, 2)
++
++DECL_BITFIELD(GBAObjAttributesB, uint16_t)
++DECL_BITS(GBAObjAttributesB, X, 0, 9)
++DECL_BITS(GBAObjAttributesB, MatIndex, 9, 5)
++DECL_BIT(GBAObjAttributesB, HFlip, 12)
++DECL_BIT(GBAObjAttributesB, VFlip, 13)
++DECL_BITS(GBAObjAttributesB, Size, 14, 2)
++
++DECL_BITFIELD(GBAObjAttributesC, uint16_t)
++DECL_BITS(GBAObjAttributesC, Tile, 0, 10)
++DECL_BITS(GBAObjAttributesC, Priority, 10, 2)
++DECL_BITS(GBAObjAttributesC, Palette, 12, 4)
+
+ struct GBAObj {
+ GBAObjAttributesA a;
+@@ -108,68 +108,68 @@ struct GBAVideoWindowRegion {
+ #define GBA_TEXT_MAP_VFLIP(MAP) ((MAP) & 0x0800)
+ #define GBA_TEXT_MAP_PALETTE(MAP) (((MAP) & 0xF000) >> 12)
+
+-DECL_BITFIELD(GBARegisterDISPCNT, uint16_t);
+-DECL_BITS(GBARegisterDISPCNT, Mode, 0, 3);
+-DECL_BIT(GBARegisterDISPCNT, Cgb, 3);
+-DECL_BIT(GBARegisterDISPCNT, FrameSelect, 4);
+-DECL_BIT(GBARegisterDISPCNT, HblankIntervalFree, 5);
+-DECL_BIT(GBARegisterDISPCNT, ObjCharacterMapping, 6);
+-DECL_BIT(GBARegisterDISPCNT, ForcedBlank, 7);
+-DECL_BIT(GBARegisterDISPCNT, Bg0Enable, 8);
+-DECL_BIT(GBARegisterDISPCNT, Bg1Enable, 9);
+-DECL_BIT(GBARegisterDISPCNT, Bg2Enable, 10);
+-DECL_BIT(GBARegisterDISPCNT, Bg3Enable, 11);
+-DECL_BIT(GBARegisterDISPCNT, ObjEnable, 12);
+-DECL_BIT(GBARegisterDISPCNT, Win0Enable, 13);
+-DECL_BIT(GBARegisterDISPCNT, Win1Enable, 14);
+-DECL_BIT(GBARegisterDISPCNT, ObjwinEnable, 15);
+-
+-DECL_BITFIELD(GBARegisterDISPSTAT, uint16_t);
+-DECL_BIT(GBARegisterDISPSTAT, InVblank, 0);
+-DECL_BIT(GBARegisterDISPSTAT, InHblank, 1);
+-DECL_BIT(GBARegisterDISPSTAT, Vcounter, 2);
+-DECL_BIT(GBARegisterDISPSTAT, VblankIRQ, 3);
+-DECL_BIT(GBARegisterDISPSTAT, HblankIRQ, 4);
+-DECL_BIT(GBARegisterDISPSTAT, VcounterIRQ, 5);
+-DECL_BITS(GBARegisterDISPSTAT, VcountSetting, 8, 8);
+-
+-DECL_BITFIELD(GBARegisterBGCNT, uint16_t);
+-DECL_BITS(GBARegisterBGCNT, Priority, 0, 2);
+-DECL_BITS(GBARegisterBGCNT, CharBase, 2, 2);
+-DECL_BIT(GBARegisterBGCNT, Mosaic, 6);
+-DECL_BIT(GBARegisterBGCNT, 256Color, 7);
+-DECL_BITS(GBARegisterBGCNT, ScreenBase, 8, 5);
+-DECL_BIT(GBARegisterBGCNT, Overflow, 13);
+-DECL_BITS(GBARegisterBGCNT, Size, 14, 2);
+-
+-DECL_BITFIELD(GBARegisterBLDCNT, uint16_t);
+-DECL_BIT(GBARegisterBLDCNT, Target1Bg0, 0);
+-DECL_BIT(GBARegisterBLDCNT, Target1Bg1, 1);
+-DECL_BIT(GBARegisterBLDCNT, Target1Bg2, 2);
+-DECL_BIT(GBARegisterBLDCNT, Target1Bg3, 3);
+-DECL_BIT(GBARegisterBLDCNT, Target1Obj, 4);
+-DECL_BIT(GBARegisterBLDCNT, Target1Bd, 5);
+-DECL_BITS(GBARegisterBLDCNT, Effect, 6, 2);
+-DECL_BIT(GBARegisterBLDCNT, Target2Bg0, 8);
+-DECL_BIT(GBARegisterBLDCNT, Target2Bg1, 9);
+-DECL_BIT(GBARegisterBLDCNT, Target2Bg2, 10);
+-DECL_BIT(GBARegisterBLDCNT, Target2Bg3, 11);
+-DECL_BIT(GBARegisterBLDCNT, Target2Obj, 12);
+-DECL_BIT(GBARegisterBLDCNT, Target2Bd, 13);
+-
+-DECL_BITFIELD(GBAWindowControl, uint8_t);
+-DECL_BIT(GBAWindowControl, Bg0Enable, 0);
+-DECL_BIT(GBAWindowControl, Bg1Enable, 1);
+-DECL_BIT(GBAWindowControl, Bg2Enable, 2);
+-DECL_BIT(GBAWindowControl, Bg3Enable, 3);
+-DECL_BIT(GBAWindowControl, ObjEnable, 4);
+-DECL_BIT(GBAWindowControl, BlendEnable, 5);
+-
+-DECL_BITFIELD(GBAMosaicControl, uint16_t);
+-DECL_BITS(GBAMosaicControl, BgH, 0, 4);
+-DECL_BITS(GBAMosaicControl, BgV, 4, 4);
+-DECL_BITS(GBAMosaicControl, ObjH, 8, 4);
+-DECL_BITS(GBAMosaicControl, ObjV, 12, 4);
++DECL_BITFIELD(GBARegisterDISPCNT, uint16_t)
++DECL_BITS(GBARegisterDISPCNT, Mode, 0, 3)
++DECL_BIT(GBARegisterDISPCNT, Cgb, 3)
++DECL_BIT(GBARegisterDISPCNT, FrameSelect, 4)
++DECL_BIT(GBARegisterDISPCNT, HblankIntervalFree, 5)
++DECL_BIT(GBARegisterDISPCNT, ObjCharacterMapping, 6)
++DECL_BIT(GBARegisterDISPCNT, ForcedBlank, 7)
++DECL_BIT(GBARegisterDISPCNT, Bg0Enable, 8)
++DECL_BIT(GBARegisterDISPCNT, Bg1Enable, 9)
++DECL_BIT(GBARegisterDISPCNT, Bg2Enable, 10)
++DECL_BIT(GBARegisterDISPCNT, Bg3Enable, 11)
++DECL_BIT(GBARegisterDISPCNT, ObjEnable, 12)
++DECL_BIT(GBARegisterDISPCNT, Win0Enable, 13)
++DECL_BIT(GBARegisterDISPCNT, Win1Enable, 14)
++DECL_BIT(GBARegisterDISPCNT, ObjwinEnable, 15)
++
++DECL_BITFIELD(GBARegisterDISPSTAT, uint16_t)
++DECL_BIT(GBARegisterDISPSTAT, InVblank, 0)
++DECL_BIT(GBARegisterDISPSTAT, InHblank, 1)
++DECL_BIT(GBARegisterDISPSTAT, Vcounter, 2)
++DECL_BIT(GBARegisterDISPSTAT, VblankIRQ, 3)
++DECL_BIT(GBARegisterDISPSTAT, HblankIRQ, 4)
++DECL_BIT(GBARegisterDISPSTAT, VcounterIRQ, 5)
++DECL_BITS(GBARegisterDISPSTAT, VcountSetting, 8, 8)
++
++DECL_BITFIELD(GBARegisterBGCNT, uint16_t)
++DECL_BITS(GBARegisterBGCNT, Priority, 0, 2)
++DECL_BITS(GBARegisterBGCNT, CharBase, 2, 2)
++DECL_BIT(GBARegisterBGCNT, Mosaic, 6)
++DECL_BIT(GBARegisterBGCNT, 256Color, 7)
++DECL_BITS(GBARegisterBGCNT, ScreenBase, 8, 5)
++DECL_BIT(GBARegisterBGCNT, Overflow, 13)
++DECL_BITS(GBARegisterBGCNT, Size, 14, 2)
++
++DECL_BITFIELD(GBARegisterBLDCNT, uint16_t)
++DECL_BIT(GBARegisterBLDCNT, Target1Bg0, 0)
++DECL_BIT(GBARegisterBLDCNT, Target1Bg1, 1)
++DECL_BIT(GBARegisterBLDCNT, Target1Bg2, 2)
++DECL_BIT(GBARegisterBLDCNT, Target1Bg3, 3)
++DECL_BIT(GBARegisterBLDCNT, Target1Obj, 4)
++DECL_BIT(GBARegisterBLDCNT, Target1Bd, 5)
++DECL_BITS(GBARegisterBLDCNT, Effect, 6, 2)
++DECL_BIT(GBARegisterBLDCNT, Target2Bg0, 8)
++DECL_BIT(GBARegisterBLDCNT, Target2Bg1, 9)
++DECL_BIT(GBARegisterBLDCNT, Target2Bg2, 10)
++DECL_BIT(GBARegisterBLDCNT, Target2Bg3, 11)
++DECL_BIT(GBARegisterBLDCNT, Target2Obj, 12)
++DECL_BIT(GBARegisterBLDCNT, Target2Bd, 13)
++
++DECL_BITFIELD(GBAWindowControl, uint8_t)
++DECL_BIT(GBAWindowControl, Bg0Enable, 0)
++DECL_BIT(GBAWindowControl, Bg1Enable, 1)
++DECL_BIT(GBAWindowControl, Bg2Enable, 2)
++DECL_BIT(GBAWindowControl, Bg3Enable, 3)
++DECL_BIT(GBAWindowControl, ObjEnable, 4)
++DECL_BIT(GBAWindowControl, BlendEnable, 5)
++
++DECL_BITFIELD(GBAMosaicControl, uint16_t)
++DECL_BITS(GBAMosaicControl, BgH, 0, 4)
++DECL_BITS(GBAMosaicControl, BgV, 4, 4)
++DECL_BITS(GBAMosaicControl, ObjH, 8, 4)
++DECL_BITS(GBAMosaicControl, ObjV, 12, 4)
+
+ struct GBAVideoRenderer {
+ void (*init)(struct GBAVideoRenderer* renderer);
+diff --git a/src/arm/debugger/debugger.c b/src/arm/debugger/debugger.c
+index 7449ece33..8e8f4b523 100644
+--- a/src/arm/debugger/debugger.c
++++ b/src/arm/debugger/debugger.c
+@@ -12,7 +12,7 @@
+ #include <mgba/internal/arm/debugger/memory-debugger.h>
+ #include <mgba/internal/debugger/parser.h>
+
+-DEFINE_VECTOR(ARMDebugBreakpointList, struct ARMDebugBreakpoint);
++DEFINE_VECTOR(ARMDebugBreakpointList, struct ARMDebugBreakpoint)
+
+ static struct ARMDebugBreakpoint* _lookupBreakpoint(struct ARMDebugBreakpointList* breakpoints, uint32_t address) {
+ size_t i;
+diff --git a/src/arm/isa-arm.c b/src/arm/isa-arm.c
+index 68a9726dc..46dfb8bae 100644
+--- a/src/arm/isa-arm.c
++++ b/src/arm/isa-arm.c
+@@ -682,7 +682,7 @@ DEFINE_INSTRUCTION_ARM(MRC, ARM_STUB)
+
+ // Begin miscellaneous definitions
+
+-DEFINE_INSTRUCTION_ARM(BKPT, cpu->irqh.bkpt32(cpu, ((opcode >> 4) & 0xFFF0) | (opcode & 0xF))); // Not strictly in ARMv4T, but here for convenience
++DEFINE_INSTRUCTION_ARM(BKPT, cpu->irqh.bkpt32(cpu, ((opcode >> 4) & 0xFFF0) | (opcode & 0xF))) // Not strictly in ARMv4T, but here for convenience
+ DEFINE_INSTRUCTION_ARM(ILL, ARM_ILL) // Illegal opcode
+
+ DEFINE_INSTRUCTION_ARM(MSR,
+diff --git a/src/core/cache-set.c b/src/core/cache-set.c
+index a638c786e..f107fca04 100644
+--- a/src/core/cache-set.c
++++ b/src/core/cache-set.c
+@@ -5,9 +5,9 @@
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ #include <mgba/core/cache-set.h>
+
+-DEFINE_VECTOR(mMapCacheSet, struct mMapCache);
+-DEFINE_VECTOR(mBitmapCacheSet, struct mBitmapCache);
+-DEFINE_VECTOR(mTileCacheSet, struct mTileCache);
++DEFINE_VECTOR(mMapCacheSet, struct mMapCache)
++DEFINE_VECTOR(mBitmapCacheSet, struct mBitmapCache)
++DEFINE_VECTOR(mTileCacheSet, struct mTileCache)
+
+ void mCacheSetInit(struct mCacheSet* cache, size_t nMaps, size_t nBitmaps, size_t nTiles) {
+ mMapCacheSetInit(&cache->maps, nMaps);
+diff --git a/src/core/cheats.c b/src/core/cheats.c
+index acd994393..92b6ff481 100644
+--- a/src/core/cheats.c
++++ b/src/core/cheats.c
+@@ -14,10 +14,10 @@
+
+ const uint32_t M_CHEAT_DEVICE_ID = 0xABADC0DE;
+
+-mLOG_DEFINE_CATEGORY(CHEATS, "Cheats", "core.cheats");
++mLOG_DEFINE_CATEGORY(CHEATS, "Cheats", "core.cheats")
+
+-DEFINE_VECTOR(mCheatList, struct mCheat);
+-DEFINE_VECTOR(mCheatSets, struct mCheatSet*);
++DEFINE_VECTOR(mCheatList, struct mCheat)
++DEFINE_VECTOR(mCheatSets, struct mCheatSet*)
+
+ static int32_t _readMem(struct mCore* core, uint32_t address, int width) {
+ switch (width) {
+diff --git a/src/core/input.c b/src/core/input.c
+index fe24d0822..fab88a50e 100644
+--- a/src/core/input.c
++++ b/src/core/input.c
+@@ -16,8 +16,8 @@
+ #define KEY_VALUE_MAX 16
+ #define AXIS_INFO_MAX 12
+
+-DECLARE_VECTOR(mInputHatList, struct mInputHatBindings);
+-DEFINE_VECTOR(mInputHatList, struct mInputHatBindings);
++DECLARE_VECTOR(mInputHatList, struct mInputHatBindings)
++DEFINE_VECTOR(mInputHatList, struct mInputHatBindings)
+
+ struct mInputMapImpl {
+ int* map;
+diff --git a/src/core/interface.c b/src/core/interface.c
+index 961b83619..e6288e274 100644
+--- a/src/core/interface.c
++++ b/src/core/interface.c
+@@ -8,7 +8,7 @@
+ #include <mgba/core/core.h>
+ #include <mgba/core/serialize.h>
+
+-DEFINE_VECTOR(mCoreCallbacksList, struct mCoreCallbacks);
++DEFINE_VECTOR(mCoreCallbacksList, struct mCoreCallbacks)
+
+ static void _rtcGenericSample(struct mRTCSource* source) {
+ struct mRTCGenericSource* rtc = (struct mRTCGenericSource*) source;
+diff --git a/src/core/library.c b/src/core/library.c
+index 60e16592f..61c144a02 100644
+--- a/src/core/library.c
++++ b/src/core/library.c
+@@ -13,7 +13,7 @@
+ #include <sqlite3.h>
+ #include "feature/sqlite3/no-intro.h"
+
+-DEFINE_VECTOR(mLibraryListing, struct mLibraryEntry);
++DEFINE_VECTOR(mLibraryListing, struct mLibraryEntry)
+
+ struct mLibrary {
+ sqlite3* db;
+diff --git a/src/core/mem-search.c b/src/core/mem-search.c
+index 7f0c215a1..8ffa540d5 100644
+--- a/src/core/mem-search.c
++++ b/src/core/mem-search.c
+@@ -8,7 +8,7 @@
+ #include <mgba/core/core.h>
+ #include <mgba/core/interface.h>
+
+-DEFINE_VECTOR(mCoreMemorySearchResults, struct mCoreMemorySearchResult);
++DEFINE_VECTOR(mCoreMemorySearchResults, struct mCoreMemorySearchResult)
+
+ static bool _op(int32_t value, int32_t match, enum mCoreMemorySearchOp op) {
+ switch (op) {
+diff --git a/src/core/rewind.c b/src/core/rewind.c
+index 3a554ff4e..41a6ce3db 100644
+--- a/src/core/rewind.c
++++ b/src/core/rewind.c
+@@ -10,7 +10,7 @@
+ #include <mgba-util/patch/fast.h>
+ #include <mgba-util/vfs.h>
+
+-DEFINE_VECTOR(mCoreRewindPatches, struct PatchFast);
++DEFINE_VECTOR(mCoreRewindPatches, struct PatchFast)
+
+ void _rewindDiff(struct mCoreRewindContext* context);
+
+diff --git a/src/core/serialize.c b/src/core/serialize.c
+index ed99107dd..800076f7b 100644
+--- a/src/core/serialize.c
++++ b/src/core/serialize.c
+@@ -17,7 +17,7 @@
+ #include <zlib.h>
+ #endif
+
+-mLOG_DEFINE_CATEGORY(SAVESTATE, "Savestate", "core.serialize");
++mLOG_DEFINE_CATEGORY(SAVESTATE, "Savestate", "core.serialize")
+
+ struct mBundledState {
+ size_t stateSize;
+diff --git a/src/debugger/debugger.c b/src/debugger/debugger.c
+index 675e04698..b894c341a 100644
+--- a/src/debugger/debugger.c
++++ b/src/debugger/debugger.c
+@@ -20,10 +20,10 @@
+
+ const uint32_t DEBUGGER_ID = 0xDEADBEEF;
+
+-mLOG_DEFINE_CATEGORY(DEBUGGER, "Debugger", "core.debugger");
++mLOG_DEFINE_CATEGORY(DEBUGGER, "Debugger", "core.debugger")
+
+-DEFINE_VECTOR(mBreakpointList, struct mBreakpoint);
+-DEFINE_VECTOR(mWatchpointList, struct mWatchpoint);
++DEFINE_VECTOR(mBreakpointList, struct mBreakpoint)
++DEFINE_VECTOR(mWatchpointList, struct mWatchpoint)
+
+ static void mDebuggerInit(void* cpu, struct mCPUComponent* component);
+ static void mDebuggerDeinit(struct mCPUComponent* component);
+diff --git a/src/debugger/parser.c b/src/debugger/parser.c
+index 41197b53e..ea94c7600 100644
+--- a/src/debugger/parser.c
++++ b/src/debugger/parser.c
+@@ -9,7 +9,7 @@
+ #include <mgba/debugger/debugger.h>
+ #include <mgba-util/string.h>
+
+-DEFINE_VECTOR(LexVector, struct Token);
++DEFINE_VECTOR(LexVector, struct Token)
+
+ enum LexState {
+ LEX_ERROR = -1,
+diff --git a/src/gb/cheats.c b/src/gb/cheats.c
+index 5c202782c..a157e3e28 100644
+--- a/src/gb/cheats.c
++++ b/src/gb/cheats.c
+@@ -10,7 +10,7 @@
+ #include <mgba/internal/gb/memory.h>
+ #include <mgba-util/string.h>
+
+-DEFINE_VECTOR(GBCheatPatchList, struct GBCheatPatch);
++DEFINE_VECTOR(GBCheatPatchList, struct GBCheatPatch)
+
+ static void _patchROM(struct mCheatDevice* device, struct GBCheatSet* cheats) {
+ if (!device->p) {
+diff --git a/src/gb/gb.c b/src/gb/gb.c
+index 461b574a6..e34f17d6a 100644
+--- a/src/gb/gb.c
++++ b/src/gb/gb.c
+@@ -33,7 +33,7 @@ static const uint8_t _knownHeader[4] = { 0xCE, 0xED, 0x66, 0x66};
+ #define SGB2_BIOS_CHECKSUM 0X53D0DD63
+ #define CGB_BIOS_CHECKSUM 0x41884E46
+
+-mLOG_DEFINE_CATEGORY(GB, "GB", "gb");
++mLOG_DEFINE_CATEGORY(GB, "GB", "gb")
+
+ static void GBInit(void* cpu, struct mCPUComponent* component);
+ static void GBDeinit(struct mCPUComponent* component);
+diff --git a/src/gb/io.c b/src/gb/io.c
+index 535e0995a..9e0727b98 100644
+--- a/src/gb/io.c
++++ b/src/gb/io.c
+@@ -9,7 +9,7 @@
+ #include <mgba/internal/gb/sio.h>
+ #include <mgba/internal/gb/serialize.h>
+
+-mLOG_DEFINE_CATEGORY(GB_IO, "GB I/O", "gb.io");
++mLOG_DEFINE_CATEGORY(GB_IO, "GB I/O", "gb.io")
+
+ MGBA_EXPORT const char* const GBIORegisterNames[] = {
+ [REG_JOYP] = "JOYP",
+diff --git a/src/gb/mbc.c b/src/gb/mbc.c
+index 6014a200c..333d1e576 100644
+--- a/src/gb/mbc.c
++++ b/src/gb/mbc.c
+@@ -14,7 +14,7 @@
+
+ const uint32_t GB_LOGO_HASH = 0x46195417;
+
+-mLOG_DEFINE_CATEGORY(GB_MBC, "GB MBC", "gb.mbc");
++mLOG_DEFINE_CATEGORY(GB_MBC, "GB MBC", "gb.mbc")
+
+ static void _GBMBCNone(struct GB* gb, uint16_t address, uint8_t value) {
+ UNUSED(gb);
+diff --git a/src/gb/memory.c b/src/gb/memory.c
+index a5c047d0f..5aa3ec204 100644
+--- a/src/gb/memory.c
++++ b/src/gb/memory.c
+@@ -14,7 +14,7 @@
+
+ #include <mgba-util/memory.h>
+
+-mLOG_DEFINE_CATEGORY(GB_MEM, "GB Memory", "gb.memory");
++mLOG_DEFINE_CATEGORY(GB_MEM, "GB Memory", "gb.memory")
+
+ static const uint8_t _yankBuffer[] = { 0xFF };
+
+diff --git a/src/gb/serialize.c b/src/gb/serialize.c
+index 0c1884c67..3568971da 100644
+--- a/src/gb/serialize.c
++++ b/src/gb/serialize.c
+@@ -11,7 +11,7 @@
+
+ #include <mgba-util/memory.h>
+
+-mLOG_DEFINE_CATEGORY(GB_STATE, "GB Savestate", "gb.serialize");
++mLOG_DEFINE_CATEGORY(GB_STATE, "GB Savestate", "gb.serialize")
+
+ const uint32_t GB_SAVESTATE_MAGIC = 0x00400000;
+ const uint32_t GB_SAVESTATE_VERSION = 0x00000002;
+diff --git a/src/gb/sio.c b/src/gb/sio.c
+index f2bb20fe8..6ffb98775 100644
+--- a/src/gb/sio.c
++++ b/src/gb/sio.c
+@@ -9,7 +9,7 @@
+ #include <mgba/internal/gb/io.h>
+ #include <mgba/internal/gb/serialize.h>
+
+-mLOG_DEFINE_CATEGORY(GB_SIO, "GB Serial I/O", "gb.sio");
++mLOG_DEFINE_CATEGORY(GB_SIO, "GB Serial I/O", "gb.sio")
+
+ const int GBSIOCyclesPerTransfer[2] = {
+ 512,
+diff --git a/src/gba/audio.c b/src/gba/audio.c
+index 72f49b7e3..48febf959 100644
+--- a/src/gba/audio.c
++++ b/src/gba/audio.c
+@@ -20,7 +20,7 @@
+ #define blip_add_delta blip_add_delta_fast
+ #endif
+
+-mLOG_DEFINE_CATEGORY(GBA_AUDIO, "GBA Audio", "gba.audio");
++mLOG_DEFINE_CATEGORY(GBA_AUDIO, "GBA Audio", "gba.audio")
+
+ const unsigned GBA_AUDIO_SAMPLES = 2048;
+ const unsigned GBA_AUDIO_FIFO_SIZE = 8 * sizeof(int32_t);
+diff --git a/src/gba/bios.c b/src/gba/bios.c
+index 0a7982ad5..c9c96d72d 100644
+--- a/src/gba/bios.c
++++ b/src/gba/bios.c
+@@ -15,7 +15,7 @@
+ const uint32_t GBA_BIOS_CHECKSUM = 0xBAAE187F;
+ const uint32_t GBA_DS_BIOS_CHECKSUM = 0xBAAE1880;
+
+-mLOG_DEFINE_CATEGORY(GBA_BIOS, "GBA BIOS", "gba.bios");
++mLOG_DEFINE_CATEGORY(GBA_BIOS, "GBA BIOS", "gba.bios")
+
+ static void _unLz77(struct GBA* gba, int width);
+ static void _unHuffman(struct GBA* gba);
+@@ -681,10 +681,10 @@ static void _unLz77(struct GBA* gba, int width) {
+ cpu->gprs[3] = 0;
+ }
+
+-DECL_BITFIELD(HuffmanNode, uint8_t);
+-DECL_BITS(HuffmanNode, Offset, 0, 6);
+-DECL_BIT(HuffmanNode, RTerm, 6);
+-DECL_BIT(HuffmanNode, LTerm, 7);
++DECL_BITFIELD(HuffmanNode, uint8_t)
++DECL_BITS(HuffmanNode, Offset, 0, 6)
++DECL_BIT(HuffmanNode, RTerm, 6)
++DECL_BIT(HuffmanNode, LTerm, 7)
+
+ static void _unHuffman(struct GBA* gba) {
+ struct ARMCore* cpu = gba->cpu;
+diff --git a/src/gba/dma.c b/src/gba/dma.c
+index 2c112716f..cccff346e 100644
+--- a/src/gba/dma.c
++++ b/src/gba/dma.c
+@@ -102,7 +102,7 @@ uint16_t GBADMAWriteCNT_HI(struct GBA* gba, int dma, uint16_t control) {
+ }
+ // If the DMA has already occurred, this value might have changed since the function started
+ return currentDma->reg;
+-};
++}
+
+ void GBADMASchedule(struct GBA* gba, int number, struct GBADMA* info) {
+ switch (GBADMARegisterGetTiming(info->reg)) {
+diff --git a/src/gba/extra/battlechip.c b/src/gba/extra/battlechip.c
+index ae8aedff0..1731fb20f 100644
+--- a/src/gba/extra/battlechip.c
++++ b/src/gba/extra/battlechip.c
+@@ -9,8 +9,8 @@
+ #include <mgba/internal/gba/io.h>
+ #include <mgba/internal/gba/sio.h>
+
+-mLOG_DECLARE_CATEGORY(GBA_BATTLECHIP);
+-mLOG_DEFINE_CATEGORY(GBA_BATTLECHIP, "GBA BattleChip Gate", "gba.battlechip");
++mLOG_DECLARE_CATEGORY(GBA_BATTLECHIP)
++mLOG_DEFINE_CATEGORY(GBA_BATTLECHIP, "GBA BattleChip Gate", "gba.battlechip")
+
+ enum {
+ BATTLECHIP_STATE_SYNC = -1,
+diff --git a/src/gba/gba.c b/src/gba/gba.c
+index 07043c8eb..02b7cee16 100644
+--- a/src/gba/gba.c
++++ b/src/gba/gba.c
+@@ -27,8 +27,8 @@
+
+ #define GBA_IRQ_DELAY 7
+
+-mLOG_DEFINE_CATEGORY(GBA, "GBA", "gba");
+-mLOG_DEFINE_CATEGORY(GBA_DEBUG, "GBA Debug", "gba.debug");
++mLOG_DEFINE_CATEGORY(GBA, "GBA", "gba")
++mLOG_DEFINE_CATEGORY(GBA_DEBUG, "GBA Debug", "gba.debug")
+
+ const uint32_t GBA_COMPONENT_MAGIC = 0x1000000;
+
+diff --git a/src/gba/hardware.c b/src/gba/hardware.c
+index 5ee4c55e8..cb7ac44d6 100644
+--- a/src/gba/hardware.c
++++ b/src/gba/hardware.c
+@@ -11,7 +11,7 @@
+ #include <mgba-util/formatting.h>
+ #include <mgba-util/hash.h>
+
+-mLOG_DEFINE_CATEGORY(GBA_HW, "GBA Pak Hardware", "gba.hardware");
++mLOG_DEFINE_CATEGORY(GBA_HW, "GBA Pak Hardware", "gba.hardware")
+
+ MGBA_EXPORT const int GBA_LUX_LEVELS[10] = { 5, 11, 18, 27, 42, 62, 84, 109, 139, 183 };
+
+diff --git a/src/gba/io.c b/src/gba/io.c
+index 209335ec6..5df243b49 100644
+--- a/src/gba/io.c
++++ b/src/gba/io.c
+@@ -11,7 +11,7 @@
+ #include <mgba/internal/gba/rr/rr.h>
+ #include <mgba/internal/gba/serialize.h>
+
+-mLOG_DEFINE_CATEGORY(GBA_IO, "GBA I/O", "gba.io");
++mLOG_DEFINE_CATEGORY(GBA_IO, "GBA I/O", "gba.io")
+
+ const char* const GBAIORegisterNames[] = {
+ // Video
+diff --git a/src/gba/memory.c b/src/gba/memory.c
+index d2ba5a419..d2a8e8280 100644
+--- a/src/gba/memory.c
++++ b/src/gba/memory.c
+@@ -19,7 +19,7 @@
+
+ #define IDLE_LOOP_THRESHOLD 10000
+
+-mLOG_DEFINE_CATEGORY(GBA_MEM, "GBA Memory", "gba.memory");
++mLOG_DEFINE_CATEGORY(GBA_MEM, "GBA Memory", "gba.memory")
+
+ static void _pristineCow(struct GBA* gba);
+ static void _agbPrintStore(struct GBA* gba, uint32_t address, int16_t value);
+diff --git a/src/gba/savedata.c b/src/gba/savedata.c
+index 39a805725..70b18d93a 100644
+--- a/src/gba/savedata.c
++++ b/src/gba/savedata.c
+@@ -26,7 +26,7 @@
+ #define EEPROM_SETTLE_CYCLES 115000
+ #define CLEANUP_THRESHOLD 15
+
+-mLOG_DEFINE_CATEGORY(GBA_SAVE, "GBA Savedata", "gba.savedata");
++mLOG_DEFINE_CATEGORY(GBA_SAVE, "GBA Savedata", "gba.savedata")
+
+ static void _flashSwitchBank(struct GBASavedata* savedata, int bank);
+ static void _flashErase(struct GBASavedata* savedata);
+diff --git a/src/gba/serialize.c b/src/gba/serialize.c
+index 6f09e3005..8741d40e8 100644
+--- a/src/gba/serialize.c
++++ b/src/gba/serialize.c
+@@ -18,7 +18,7 @@
+ const uint32_t GBA_SAVESTATE_MAGIC = 0x01000000;
+ const uint32_t GBA_SAVESTATE_VERSION = 0x00000003;
+
+-mLOG_DEFINE_CATEGORY(GBA_STATE, "GBA Savestate", "gba.serialize");
++mLOG_DEFINE_CATEGORY(GBA_STATE, "GBA Savestate", "gba.serialize")
+
+ struct GBABundledState {
+ struct GBASerializedState* state;
+diff --git a/src/gba/sio.c b/src/gba/sio.c
+index a153cb1fa..e5cbf97ba 100644
+--- a/src/gba/sio.c
++++ b/src/gba/sio.c
+@@ -8,7 +8,7 @@
+ #include <mgba/internal/gba/gba.h>
+ #include <mgba/internal/gba/io.h>
+
+-mLOG_DEFINE_CATEGORY(GBA_SIO, "GBA Serial I/O", "gba.sio");
++mLOG_DEFINE_CATEGORY(GBA_SIO, "GBA Serial I/O", "gba.sio")
+
+ const int GBASIOCyclesPerTransfer[4][MAX_GBAS] = {
+ { 38326, 73003, 107680, 142356 },
+diff --git a/src/gba/video.c b/src/gba/video.c
+index a05d6a7f0..f3dc99db4 100644
+--- a/src/gba/video.c
++++ b/src/gba/video.c
+@@ -16,7 +16,7 @@
+
+ #include <mgba-util/memory.h>
+
+-mLOG_DEFINE_CATEGORY(GBA_VIDEO, "GBA Video", "gba.video");
++mLOG_DEFINE_CATEGORY(GBA_VIDEO, "GBA Video", "gba.video")
+
+ static void GBAVideoDummyRendererInit(struct GBAVideoRenderer* renderer);
+ static void GBAVideoDummyRendererReset(struct GBAVideoRenderer* renderer);
+diff --git a/src/platform/opengl/gles2.c b/src/platform/opengl/gles2.c
+index fbb0fa601..af959d410 100644
+--- a/src/platform/opengl/gles2.c
++++ b/src/platform/opengl/gles2.c
+@@ -12,8 +12,8 @@
+ #include <mgba-util/vector.h>
+ #include <mgba-util/vfs.h>
+
+-mLOG_DECLARE_CATEGORY(OPENGL);
+-mLOG_DEFINE_CATEGORY(OPENGL, "OpenGL", "video.ogl");
++mLOG_DECLARE_CATEGORY(OPENGL)
++mLOG_DEFINE_CATEGORY(OPENGL, "OpenGL", "video.ogl")
+
+ #define MAX_PASSES 8
+
+@@ -626,8 +626,8 @@ static bool _lookupBoolValue(const struct Configuration* config, const char* sec
+ return true;
+ }
+
+-DECLARE_VECTOR(mGLES2UniformList, struct mGLES2Uniform);
+-DEFINE_VECTOR(mGLES2UniformList, struct mGLES2Uniform);
++DECLARE_VECTOR(mGLES2UniformList, struct mGLES2Uniform)
++DEFINE_VECTOR(mGLES2UniformList, struct mGLES2Uniform)
+
+ static void _uniformHandler(const char* sectionName, void* user) {
+ struct mGLES2UniformList* uniforms = user;
+diff --git a/src/platform/sdl/sdl-audio.c b/src/platform/sdl/sdl-audio.c
+index f1666aa4e..85f9d761a 100644
+--- a/src/platform/sdl/sdl-audio.c
++++ b/src/platform/sdl/sdl-audio.c
+@@ -14,7 +14,7 @@
+
+ #define BUFFER_SIZE (GBA_AUDIO_SAMPLES >> 2)
+
+-mLOG_DEFINE_CATEGORY(SDL_AUDIO, "SDL Audio", "platform.sdl.audio");
++mLOG_DEFINE_CATEGORY(SDL_AUDIO, "SDL Audio", "platform.sdl.audio")
+
+ static void _mSDLAudioCallback(void* context, Uint8* data, int len);
+
+diff --git a/src/platform/sdl/sdl-audio.h b/src/platform/sdl/sdl-audio.h
+index 2ae920af4..b131c7d2f 100644
+--- a/src/platform/sdl/sdl-audio.h
++++ b/src/platform/sdl/sdl-audio.h
+@@ -22,7 +22,7 @@ CXX_GUARD_START
+ #define bool _Bool
+ #endif
+
+-mLOG_DECLARE_CATEGORY(SDL_AUDIO);
++mLOG_DECLARE_CATEGORY(SDL_AUDIO)
+
+ struct mSDLAudio {
+ // Input
+diff --git a/src/platform/sdl/sdl-events.c b/src/platform/sdl/sdl-events.c
+index c7291ff32..0a4a26310 100644
+--- a/src/platform/sdl/sdl-events.c
++++ b/src/platform/sdl/sdl-events.c
+@@ -25,9 +25,9 @@
+ #define RUMBLE_PWM 16
+ #define RUMBLE_STEPS 2
+
+-mLOG_DEFINE_CATEGORY(SDL_EVENTS, "SDL Events", "platform.sdl.events");
++mLOG_DEFINE_CATEGORY(SDL_EVENTS, "SDL Events", "platform.sdl.events")
+
+-DEFINE_VECTOR(SDL_JoystickList, struct SDL_JoystickCombo);
++DEFINE_VECTOR(SDL_JoystickList, struct SDL_JoystickCombo)
+
+ #if SDL_VERSION_ATLEAST(2, 0, 0)
+ static void _mSDLSetRumble(struct mRumble* rumble, int enable);
+diff --git a/src/platform/sdl/sdl-events.h b/src/platform/sdl/sdl-events.h
+index 8cb1aede2..8998449a2 100644
+--- a/src/platform/sdl/sdl-events.h
++++ b/src/platform/sdl/sdl-events.h
+@@ -25,7 +25,7 @@ CXX_GUARD_START
+ #define bool _Bool
+ #endif
+
+-mLOG_DECLARE_CATEGORY(SDL_EVENTS);
++mLOG_DECLARE_CATEGORY(SDL_EVENTS)
+
+ #define SDL_BINDING_KEY 0x53444C4BU
+ #define SDL_BINDING_BUTTON 0x53444C42U
+@@ -45,7 +45,7 @@ struct SDL_JoystickCombo {
+ #endif
+ };
+
+-DECLARE_VECTOR(SDL_JoystickList, struct SDL_JoystickCombo);
++DECLARE_VECTOR(SDL_JoystickList, struct SDL_JoystickCombo)
+
+ struct mSDLPlayer;
+ struct mSDLEvents {
+diff --git a/src/sm83/decoder.c b/src/sm83/decoder.c
+index 949a8119a..7d9ae040f 100644
+--- a/src/sm83/decoder.c
++++ b/src/sm83/decoder.c
+@@ -75,20 +75,20 @@ DEFINE_DECODER_SM83(NOP, info->mnemonic = SM83_MN_NOP;)
+ info->op1.reg = SM83_REG_ ## NAME; \
+ return 2;)
+
+-DEFINE_LD_DECODER_SM83(B);
+-DEFINE_LD_DECODER_SM83(C);
+-DEFINE_LD_DECODER_SM83(D);
+-DEFINE_LD_DECODER_SM83(E);
+-DEFINE_LD_DECODER_SM83(H);
+-DEFINE_LD_DECODER_SM83(L);
+-DEFINE_LD_DECODER_SM83(A);
+-DEFINE_LD_DECODER_SM83_MEM(A, BC);
+-DEFINE_LD_DECODER_SM83_MEM(A, DE);
+-
+-DEFINE_LD_2_DECODER_SM83(BC);
+-DEFINE_LD_2_DECODER_SM83(DE);
+-DEFINE_LD_2_DECODER_SM83(HL);
+-DEFINE_LD_2_DECODER_SM83(SP);
++DEFINE_LD_DECODER_SM83(B)
++DEFINE_LD_DECODER_SM83(C)
++DEFINE_LD_DECODER_SM83(D)
++DEFINE_LD_DECODER_SM83(E)
++DEFINE_LD_DECODER_SM83(H)
++DEFINE_LD_DECODER_SM83(L)
++DEFINE_LD_DECODER_SM83(A)
++DEFINE_LD_DECODER_SM83_MEM(A, BC)
++DEFINE_LD_DECODER_SM83_MEM(A, DE)
++
++DEFINE_LD_2_DECODER_SM83(BC)
++DEFINE_LD_2_DECODER_SM83(DE)
++DEFINE_LD_2_DECODER_SM83(HL)
++DEFINE_LD_2_DECODER_SM83(SP)
+
+ DEFINE_DECODER_SM83(LDHL_, \
+ info->mnemonic = SM83_MN_LD; \
+@@ -157,16 +157,16 @@ DEFINE_DECODER_SM83(LDIOA, \
+ return 1;) \
+ DEFINE_ALU_DECODER_SM83_NOHL(NAME)
+
+-DEFINE_ALU_DECODER_SM83_NOHL(INC);
+-DEFINE_ALU_DECODER_SM83_NOHL(DEC);
+-DEFINE_ALU_DECODER_SM83(AND);
+-DEFINE_ALU_DECODER_SM83(XOR);
+-DEFINE_ALU_DECODER_SM83(OR);
+-DEFINE_ALU_DECODER_SM83(CP);
+-DEFINE_ALU_DECODER_SM83(ADD);
+-DEFINE_ALU_DECODER_SM83(ADC);
+-DEFINE_ALU_DECODER_SM83(SUB);
+-DEFINE_ALU_DECODER_SM83(SBC);
++DEFINE_ALU_DECODER_SM83_NOHL(INC)
++DEFINE_ALU_DECODER_SM83_NOHL(DEC)
++DEFINE_ALU_DECODER_SM83(AND)
++DEFINE_ALU_DECODER_SM83(XOR)
++DEFINE_ALU_DECODER_SM83(OR)
++DEFINE_ALU_DECODER_SM83(CP)
++DEFINE_ALU_DECODER_SM83(ADD)
++DEFINE_ALU_DECODER_SM83(ADC)
++DEFINE_ALU_DECODER_SM83(SUB)
++DEFINE_ALU_DECODER_SM83(SBC)
+
+ #define DEFINE_ALU_DECODER_SM83_ADD_HL(REG) \
+ DEFINE_DECODER_SM83(ADDHL_ ## REG, info->mnemonic = SM83_MN_ADD; \
+@@ -213,10 +213,10 @@ DEFINE_DECODER_SM83(ADDSP, info->mnemonic = SM83_MN_ADD; \
+ info->mnemonic = SM83_MN_RET; \
+ info->condition = CONDITION;)
+
+-DEFINE_CONDITIONAL_DECODER_SM83(JP);
+-DEFINE_CONDITIONAL_DECODER_SM83(JR);
+-DEFINE_CONDITIONAL_DECODER_SM83(CALL);
+-DEFINE_CONDITIONAL_DECODER_SM83(RET);
++DEFINE_CONDITIONAL_DECODER_SM83(JP)
++DEFINE_CONDITIONAL_DECODER_SM83(JR)
++DEFINE_CONDITIONAL_DECODER_SM83(CALL)
++DEFINE_CONDITIONAL_DECODER_SM83(RET)
+
+ DEFINE_DECODER_SM83(JPHL, \
+ info->mnemonic = SM83_MN_JP; \
+@@ -282,10 +282,10 @@ DEFINE_DECODER_SM83(LDA_DHL, \
+ DEFINE_DECODER_SM83(INC ## REG, info->mnemonic = SM83_MN_INC; info->op1.reg = SM83_REG_ ## REG) \
+ DEFINE_DECODER_SM83(DEC ## REG, info->mnemonic = SM83_MN_DEC; info->op1.reg = SM83_REG_ ## REG)
+
+-DEFINE_INCDEC_WIDE_INSTRUCTION_SM83(BC);
+-DEFINE_INCDEC_WIDE_INSTRUCTION_SM83(DE);
+-DEFINE_INCDEC_WIDE_INSTRUCTION_SM83(HL);
+-DEFINE_INCDEC_WIDE_INSTRUCTION_SM83(SP);
++DEFINE_INCDEC_WIDE_INSTRUCTION_SM83(BC)
++DEFINE_INCDEC_WIDE_INSTRUCTION_SM83(DE)
++DEFINE_INCDEC_WIDE_INSTRUCTION_SM83(HL)
++DEFINE_INCDEC_WIDE_INSTRUCTION_SM83(SP)
+
+ DEFINE_DECODER_SM83(INC_HL,
+ info->mnemonic = SM83_MN_INC;
+@@ -310,10 +310,10 @@ DEFINE_DECODER_SM83(DAA, info->mnemonic = SM83_MN_DAA)
+ info->mnemonic = SM83_MN_PUSH; \
+ info->op1.reg = SM83_REG_ ## REG;) \
+
+-DEFINE_POPPUSH_DECODER_SM83(BC);
+-DEFINE_POPPUSH_DECODER_SM83(DE);
+-DEFINE_POPPUSH_DECODER_SM83(HL);
+-DEFINE_POPPUSH_DECODER_SM83(AF);
++DEFINE_POPPUSH_DECODER_SM83(BC)
++DEFINE_POPPUSH_DECODER_SM83(DE)
++DEFINE_POPPUSH_DECODER_SM83(HL)
++DEFINE_POPPUSH_DECODER_SM83(AF)
+
+ #define DEFINE_CB_OP_DECODER_SM83(NAME, BODY, OP) \
+ DEFINE_DECODER_SM83(NAME ## B, info->OP.reg = SM83_REG_B; BODY) \
+@@ -369,14 +369,14 @@ DEFINE_DECODER_SM83(STOP, info->mnemonic = SM83_MN_STOP; return 1)
+ #define DEFINE_RST_DECODER_SM83(VEC) \
+ DEFINE_DECODER_SM83(RST ## VEC, info->op1.immediate = 0x ## VEC;)
+
+-DEFINE_RST_DECODER_SM83(00);
+-DEFINE_RST_DECODER_SM83(08);
+-DEFINE_RST_DECODER_SM83(10);
+-DEFINE_RST_DECODER_SM83(18);
+-DEFINE_RST_DECODER_SM83(20);
+-DEFINE_RST_DECODER_SM83(28);
+-DEFINE_RST_DECODER_SM83(30);
+-DEFINE_RST_DECODER_SM83(38);
++DEFINE_RST_DECODER_SM83(00)
++DEFINE_RST_DECODER_SM83(08)
++DEFINE_RST_DECODER_SM83(10)
++DEFINE_RST_DECODER_SM83(18)
++DEFINE_RST_DECODER_SM83(20)
++DEFINE_RST_DECODER_SM83(28)
++DEFINE_RST_DECODER_SM83(30)
++DEFINE_RST_DECODER_SM83(38)
+
+ DEFINE_DECODER_SM83(CB, return 1)
+
+diff --git a/src/sm83/isa-sm83.c b/src/sm83/isa-sm83.c
+index 8599d2af2..4085b3553 100644
+--- a/src/sm83/isa-sm83.c
++++ b/src/sm83/isa-sm83.c
+@@ -44,7 +44,7 @@ static inline void SM83WriteDE(struct SM83Core* cpu, uint16_t de) {
+ BODY; \
+ }
+
+-DEFINE_INSTRUCTION_SM83(NOP,);
++DEFINE_INSTRUCTION_SM83(NOP,)
+
+ #define DEFINE_CONDITIONAL_ONLY_INSTRUCTION_SM83(NAME) \
+ DEFINE_ ## NAME ## _INSTRUCTION_SM83(C, cpu->f.c) \
+@@ -74,7 +74,7 @@ DEFINE_INSTRUCTION_SM83(JPDelay,
+ cpu->instruction = _SM83InstructionJPDelay; \
+ cpu->condition = CONDITION;)
+
+-DEFINE_CONDITIONAL_INSTRUCTION_SM83(JP);
++DEFINE_CONDITIONAL_INSTRUCTION_SM83(JP)
+
+ DEFINE_INSTRUCTION_SM83(JPHL,
+ cpu->pc = SM83ReadHL(cpu);
+@@ -93,7 +93,7 @@ DEFINE_INSTRUCTION_SM83(JRFinish,
+ cpu->instruction = _SM83InstructionJRFinish; \
+ cpu->condition = CONDITION;)
+
+-DEFINE_CONDITIONAL_INSTRUCTION_SM83(JR);
++DEFINE_CONDITIONAL_INSTRUCTION_SM83(JR)
+
+ DEFINE_INSTRUCTION_SM83(CALLUpdateSPL,
+ --cpu->index;
+@@ -235,13 +235,13 @@ DEFINE_CONDITIONAL_ONLY_INSTRUCTION_SM83(RET)
+ cpu->a = OPERAND;)
+
+ #define DEFINE_ALU_INSTRUCTION_SM83_NOHL(NAME) \
+- DEFINE_ ## NAME ## _INSTRUCTION_SM83(A, cpu->a); \
+- DEFINE_ ## NAME ## _INSTRUCTION_SM83(B, cpu->b); \
+- DEFINE_ ## NAME ## _INSTRUCTION_SM83(C, cpu->c); \
+- DEFINE_ ## NAME ## _INSTRUCTION_SM83(D, cpu->d); \
+- DEFINE_ ## NAME ## _INSTRUCTION_SM83(E, cpu->e); \
+- DEFINE_ ## NAME ## _INSTRUCTION_SM83(H, cpu->h); \
+- DEFINE_ ## NAME ## _INSTRUCTION_SM83(L, cpu->l);
++ DEFINE_ ## NAME ## _INSTRUCTION_SM83(A, cpu->a) \
++ DEFINE_ ## NAME ## _INSTRUCTION_SM83(B, cpu->b) \
++ DEFINE_ ## NAME ## _INSTRUCTION_SM83(C, cpu->c) \
++ DEFINE_ ## NAME ## _INSTRUCTION_SM83(D, cpu->d) \
++ DEFINE_ ## NAME ## _INSTRUCTION_SM83(E, cpu->e) \
++ DEFINE_ ## NAME ## _INSTRUCTION_SM83(H, cpu->h) \
++ DEFINE_ ## NAME ## _INSTRUCTION_SM83(L, cpu->l)
+
+ DEFINE_INSTRUCTION_SM83(LDHL_Bus, \
+ cpu->index = SM83ReadHL(cpu); \
+@@ -277,17 +277,17 @@ DEFINE_INSTRUCTION_SM83(LDSP_HL,
+ cpu->instruction = _SM83Instruction ## NAME ## Bus;)
+
+ #define DEFINE_ALU_INSTRUCTION_SM83(NAME) \
+- DEFINE_ ## NAME ## _INSTRUCTION_SM83(Bus, cpu->bus); \
++ DEFINE_ ## NAME ## _INSTRUCTION_SM83(Bus, cpu->bus) \
+ DEFINE_ALU_INSTRUCTION_SM83_MEM(NAME, HL) \
+ DEFINE_INSTRUCTION_SM83(NAME, \
+ cpu->executionState = SM83_CORE_READ_PC; \
+ cpu->instruction = _SM83Instruction ## NAME ## Bus;) \
+ DEFINE_ALU_INSTRUCTION_SM83_NOHL(NAME)
+
+-DEFINE_ALU_INSTRUCTION_SM83(AND);
+-DEFINE_ALU_INSTRUCTION_SM83(XOR);
+-DEFINE_ALU_INSTRUCTION_SM83(OR);
+-DEFINE_ALU_INSTRUCTION_SM83(CP);
++DEFINE_ALU_INSTRUCTION_SM83(AND)
++DEFINE_ALU_INSTRUCTION_SM83(XOR)
++DEFINE_ALU_INSTRUCTION_SM83(OR)
++DEFINE_ALU_INSTRUCTION_SM83(CP)
+
+ static void _SM83InstructionLDB_Bus(struct SM83Core*);
+ static void _SM83InstructionLDC_Bus(struct SM83Core*);
+@@ -334,20 +334,20 @@ static void _SM83InstructionLDA_Bus(struct SM83Core*);
+ cpu->a = diff; \
+ cpu->f.z = !cpu->a;)
+
+-DEFINE_ALU_INSTRUCTION_SM83(LDB_);
+-DEFINE_ALU_INSTRUCTION_SM83(LDC_);
+-DEFINE_ALU_INSTRUCTION_SM83(LDD_);
+-DEFINE_ALU_INSTRUCTION_SM83(LDE_);
+-DEFINE_ALU_INSTRUCTION_SM83(LDH_);
+-DEFINE_ALU_INSTRUCTION_SM83(LDL_);
+-DEFINE_ALU_INSTRUCTION_SM83_NOHL(LDHL_);
+-DEFINE_ALU_INSTRUCTION_SM83(LDA_);
+-DEFINE_ALU_INSTRUCTION_SM83_MEM(LDA_, BC);
+-DEFINE_ALU_INSTRUCTION_SM83_MEM(LDA_, DE);
+-DEFINE_ALU_INSTRUCTION_SM83(ADD);
+-DEFINE_ALU_INSTRUCTION_SM83(ADC);
+-DEFINE_ALU_INSTRUCTION_SM83(SUB);
+-DEFINE_ALU_INSTRUCTION_SM83(SBC);
++DEFINE_ALU_INSTRUCTION_SM83(LDB_)
++DEFINE_ALU_INSTRUCTION_SM83(LDC_)
++DEFINE_ALU_INSTRUCTION_SM83(LDD_)
++DEFINE_ALU_INSTRUCTION_SM83(LDE_)
++DEFINE_ALU_INSTRUCTION_SM83(LDH_)
++DEFINE_ALU_INSTRUCTION_SM83(LDL_)
++DEFINE_ALU_INSTRUCTION_SM83_NOHL(LDHL_)
++DEFINE_ALU_INSTRUCTION_SM83(LDA_)
++DEFINE_ALU_INSTRUCTION_SM83_MEM(LDA_, BC)
++DEFINE_ALU_INSTRUCTION_SM83_MEM(LDA_, DE)
++DEFINE_ALU_INSTRUCTION_SM83(ADD)
++DEFINE_ALU_INSTRUCTION_SM83(ADC)
++DEFINE_ALU_INSTRUCTION_SM83(SUB)
++DEFINE_ALU_INSTRUCTION_SM83(SBC)
+
+ DEFINE_INSTRUCTION_SM83(ADDSPFinish,
+ cpu->sp = cpu->index;
+@@ -534,9 +534,9 @@ DEFINE_INSTRUCTION_SM83(LDISP,
+ SM83Write ## REG (cpu, reg - 1); \
+ cpu->executionState = SM83_CORE_STALL;)
+
+-DEFINE_INCDEC_WIDE_INSTRUCTION_SM83(BC);
+-DEFINE_INCDEC_WIDE_INSTRUCTION_SM83(DE);
+-DEFINE_INCDEC_WIDE_INSTRUCTION_SM83(HL);
++DEFINE_INCDEC_WIDE_INSTRUCTION_SM83(BC)
++DEFINE_INCDEC_WIDE_INSTRUCTION_SM83(DE)
++DEFINE_INCDEC_WIDE_INSTRUCTION_SM83(HL)
+
+ #define DEFINE_ADD_HL_INSTRUCTION_SM83(REG, L, H) \
+ DEFINE_INSTRUCTION_SM83(ADDHL_ ## REG ## Finish, \
+@@ -552,10 +552,10 @@ DEFINE_INCDEC_WIDE_INSTRUCTION_SM83(HL);
+ cpu->executionState = SM83_CORE_OP2; \
+ cpu->instruction = _SM83InstructionADDHL_ ## REG ## Finish;)
+
+-DEFINE_ADD_HL_INSTRUCTION_SM83(BC, cpu->c, cpu->b);
+-DEFINE_ADD_HL_INSTRUCTION_SM83(DE, cpu->e, cpu->d);
+-DEFINE_ADD_HL_INSTRUCTION_SM83(HL, cpu->l, cpu->h);
+-DEFINE_ADD_HL_INSTRUCTION_SM83(SP, (cpu->sp & 0xFF), (cpu->sp >> 8));
++DEFINE_ADD_HL_INSTRUCTION_SM83(BC, cpu->c, cpu->b)
++DEFINE_ADD_HL_INSTRUCTION_SM83(DE, cpu->e, cpu->d)
++DEFINE_ADD_HL_INSTRUCTION_SM83(HL, cpu->l, cpu->h)
++DEFINE_ADD_HL_INSTRUCTION_SM83(SP, (cpu->sp & 0xFF), (cpu->sp >> 8))
+
+
+ #define DEFINE_INC_INSTRUCTION_SM83(NAME, OPERAND) \
+@@ -574,8 +574,8 @@ DEFINE_ADD_HL_INSTRUCTION_SM83(SP, (cpu->sp & 0xFF), (cpu->sp >> 8));
+ cpu->f.n = 1; \
+ cpu->f.z = !OPERAND;)
+
+-DEFINE_ALU_INSTRUCTION_SM83_NOHL(INC);
+-DEFINE_ALU_INSTRUCTION_SM83_NOHL(DEC);
++DEFINE_ALU_INSTRUCTION_SM83_NOHL(INC)
++DEFINE_ALU_INSTRUCTION_SM83_NOHL(DEC)
+
+ DEFINE_INSTRUCTION_SM83(INC_HLDelay,
+ int diff = cpu->bus + 1;
+@@ -680,10 +680,10 @@ DEFINE_INSTRUCTION_SM83(DAA,
+ cpu->instruction = _SM83InstructionPUSH ## REG ## Delay; \
+ cpu->executionState = SM83_CORE_MEMORY_STORE;)
+
+-DEFINE_POPPUSH_INSTRUCTION_SM83(BC, B, b, c);
+-DEFINE_POPPUSH_INSTRUCTION_SM83(DE, D, d, e);
+-DEFINE_POPPUSH_INSTRUCTION_SM83(HL, H, h, l);
+-DEFINE_POPPUSH_INSTRUCTION_SM83(AF, A, a, f.packed);
++DEFINE_POPPUSH_INSTRUCTION_SM83(BC, B, b, c)
++DEFINE_POPPUSH_INSTRUCTION_SM83(DE, D, d, e)
++DEFINE_POPPUSH_INSTRUCTION_SM83(HL, H, h, l)
++DEFINE_POPPUSH_INSTRUCTION_SM83(AF, A, a, f.packed)
+
+ #define DEFINE_CB_2_INSTRUCTION_SM83(NAME, WB, BODY) \
+ DEFINE_INSTRUCTION_SM83(NAME ## B, uint8_t reg = cpu->b; BODY; cpu->b = reg) \
+@@ -765,9 +765,9 @@ DEFINE_INSTRUCTION_SM83(RRCA_,
+ cpu->f.n = 0;
+ cpu->f.c = low;)
+
+-DEFINE_INSTRUCTION_SM83(DI, cpu->irqh.setInterrupts(cpu, false));
+-DEFINE_INSTRUCTION_SM83(EI, cpu->irqh.setInterrupts(cpu, true));
+-DEFINE_INSTRUCTION_SM83(HALT, cpu->irqh.halt(cpu));
++DEFINE_INSTRUCTION_SM83(DI, cpu->irqh.setInterrupts(cpu, false))
++DEFINE_INSTRUCTION_SM83(EI, cpu->irqh.setInterrupts(cpu, true))
++DEFINE_INSTRUCTION_SM83(HALT, cpu->irqh.halt(cpu))
+
+ #define DEFINE_RST_INSTRUCTION_SM83(VEC) \
+ DEFINE_INSTRUCTION_SM83(RST ## VEC ## UpdateSPL, \
+@@ -788,18 +788,18 @@ DEFINE_INSTRUCTION_SM83(HALT, cpu->irqh.halt(cpu));
+ cpu->executionState = SM83_CORE_OP2; \
+ cpu->instruction = _SM83InstructionRST ## VEC ## UpdateSPH;)
+
+-DEFINE_RST_INSTRUCTION_SM83(00);
+-DEFINE_RST_INSTRUCTION_SM83(08);
+-DEFINE_RST_INSTRUCTION_SM83(10);
+-DEFINE_RST_INSTRUCTION_SM83(18);
+-DEFINE_RST_INSTRUCTION_SM83(20);
+-DEFINE_RST_INSTRUCTION_SM83(28);
+-DEFINE_RST_INSTRUCTION_SM83(30);
+-DEFINE_RST_INSTRUCTION_SM83(38);
++DEFINE_RST_INSTRUCTION_SM83(00)
++DEFINE_RST_INSTRUCTION_SM83(08)
++DEFINE_RST_INSTRUCTION_SM83(10)
++DEFINE_RST_INSTRUCTION_SM83(18)
++DEFINE_RST_INSTRUCTION_SM83(20)
++DEFINE_RST_INSTRUCTION_SM83(28)
++DEFINE_RST_INSTRUCTION_SM83(30)
++DEFINE_RST_INSTRUCTION_SM83(38)
+
+-DEFINE_INSTRUCTION_SM83(ILL, cpu->irqh.hitIllegal(cpu));
++DEFINE_INSTRUCTION_SM83(ILL, cpu->irqh.hitIllegal(cpu))
+
+-DEFINE_INSTRUCTION_SM83(STOP2, cpu->irqh.stop(cpu));
++DEFINE_INSTRUCTION_SM83(STOP2, cpu->irqh.stop(cpu))
+
+ DEFINE_INSTRUCTION_SM83(STOP, \
+ cpu->executionState = SM83_CORE_READ_PC; \
+diff --git a/src/util/elf-read.c b/src/util/elf-read.c
+index 520c01ca3..138290eee 100644
+--- a/src/util/elf-read.c
++++ b/src/util/elf-read.c
+@@ -9,8 +9,8 @@
+
+ #include <mgba-util/vfs.h>
+
+-DEFINE_VECTOR(ELFProgramHeaders, Elf32_Phdr);
+-DEFINE_VECTOR(ELFSectionHeaders, Elf32_Shdr);
++DEFINE_VECTOR(ELFProgramHeaders, Elf32_Phdr)
++DEFINE_VECTOR(ELFSectionHeaders, Elf32_Shdr)
+
+ static bool _elfInit = false;
+
+diff --git a/src/util/patch-fast.c b/src/util/patch-fast.c
+index 81b3aa45a..8fcd87436 100644
+--- a/src/util/patch-fast.c
++++ b/src/util/patch-fast.c
+@@ -5,7 +5,7 @@
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ #include <mgba-util/patch/fast.h>
+
+-DEFINE_VECTOR(PatchFastExtents, struct PatchFastExtent);
++DEFINE_VECTOR(PatchFastExtents, struct PatchFastExtent)
+
+ size_t _fastOutputSize(struct Patch* patch, size_t inSize);
+ bool _fastApplyPatch(struct Patch* patch, const void* in, size_t inSize, void* out, size_t outSize);
+diff --git a/src/util/string.c b/src/util/string.c
+index 46e52fba7..69112a0cd 100644
+--- a/src/util/string.c
++++ b/src/util/string.c
+@@ -9,7 +9,7 @@
+
+ #include <string.h>
+
+-DEFINE_VECTOR(StringList, char*);
++DEFINE_VECTOR(StringList, char*)
+
+ #ifndef HAVE_STRNDUP
+ char* strndup(const char* start, size_t len) {
+--
+2.29.2
+
diff --git a/pkg/mgba/patch/0003-GBA-Cheats-Use-defines-for-action-replay-constants.patch b/pkg/mgba/patch/0003-GBA-Cheats-Use-defines-for-action-replay-constants.patch
@@ -0,0 +1,172 @@
+From b913ec4e0b373863645fc9b06e36995fe06507a6 Mon Sep 17 00:00:00 2001
+From: Michael Forney <mforney@mforney.org>
+Date: Sat, 7 Nov 2020 14:28:05 -0800
+Subject: [PATCH] GBA Cheats: Use defines for action replay constants
+
+ISO C requires that enum constants must be representable as int and
+have type int (C99 6.7.2.2p2 and 6.4.4.3p2). Some of these are
+larger than 0x7fffffff, so just use preprocessor defines instead.
+This changes the type of the constants from int to unsigned int.
+
+[0] https://port70.net/~nsz/c/c99/n1256.html#6.7.2.2p2
+[1] https://port70.net/~nsz/c/c99/n1256.html#6.4.4.3p2
+---
+ include/mgba/internal/gba/cheats.h | 128 +++++++++++++----------------
+ src/gba/cheats/parv3.c | 2 +-
+ 2 files changed, 59 insertions(+), 71 deletions(-)
+
+diff --git a/include/mgba/internal/gba/cheats.h b/include/mgba/internal/gba/cheats.h
+index fe17af1a6..19de60319 100644
+--- a/include/mgba/internal/gba/cheats.h
++++ b/include/mgba/internal/gba/cheats.h
+@@ -55,76 +55,64 @@ enum GBAGameSharkType {
+ GSA_HOOK = 0xF
+ };
+
+-enum GBAActionReplay3Condition {
+- PAR3_COND_OTHER = 0x00000000,
+- PAR3_COND_EQ = 0x08000000,
+- PAR3_COND_NE = 0x10000000,
+- PAR3_COND_LT = 0x18000000,
+- PAR3_COND_GT = 0x20000000,
+- PAR3_COND_ULT = 0x28000000,
+- PAR3_COND_UGT = 0x30000000,
+- PAR3_COND_AND = 0x38000000,
+-};
+-
+-enum GBAActionReplay3Width {
+- PAR3_WIDTH_1 = 0x00000000,
+- PAR3_WIDTH_2 = 0x02000000,
+- PAR3_WIDTH_4 = 0x04000000,
+- PAR3_WIDTH_FALSE = 0x06000000,
+-};
+-
+-enum GBAActionReplay3Action {
+- PAR3_ACTION_NEXT = 0x00000000,
+- PAR3_ACTION_NEXT_TWO = 0x40000000,
+- PAR3_ACTION_BLOCK = 0x80000000,
+- PAR3_ACTION_DISABLE = 0xC0000000,
+-};
+-
+-enum GBAActionReplay3Base {
+- PAR3_BASE_ASSIGN = 0x00000000,
+- PAR3_BASE_INDIRECT = 0x40000000,
+- PAR3_BASE_ADD = 0x80000000,
+- PAR3_BASE_OTHER = 0xC0000000,
+-
+- PAR3_BASE_ASSIGN_1 = 0x00000000,
+- PAR3_BASE_ASSIGN_2 = 0x02000000,
+- PAR3_BASE_ASSIGN_4 = 0x04000000,
+- PAR3_BASE_INDIRECT_1 = 0x40000000,
+- PAR3_BASE_INDIRECT_2 = 0x42000000,
+- PAR3_BASE_INDIRECT_4 = 0x44000000,
+- PAR3_BASE_ADD_1 = 0x80000000,
+- PAR3_BASE_ADD_2 = 0x82000000,
+- PAR3_BASE_ADD_4 = 0x84000000,
+- PAR3_BASE_HOOK = 0xC4000000,
+- PAR3_BASE_IO_2 = 0xC6000000,
+- PAR3_BASE_IO_3 = 0xC7000000,
+-};
+-
+-enum GBAActionReplay3Other {
+- PAR3_OTHER_END = 0x00000000,
+- PAR3_OTHER_SLOWDOWN = 0x08000000,
+- PAR3_OTHER_BUTTON_1 = 0x10000000,
+- PAR3_OTHER_BUTTON_2 = 0x12000000,
+- PAR3_OTHER_BUTTON_4 = 0x14000000,
+- PAR3_OTHER_PATCH_1 = 0x18000000,
+- PAR3_OTHER_PATCH_2 = 0x1A000000,
+- PAR3_OTHER_PATCH_3 = 0x1C000000,
+- PAR3_OTHER_PATCH_4 = 0x1E000000,
+- PAR3_OTHER_ENDIF = 0x40000000,
+- PAR3_OTHER_ELSE = 0x60000000,
+- PAR3_OTHER_FILL_1 = 0x80000000,
+- PAR3_OTHER_FILL_2 = 0x82000000,
+- PAR3_OTHER_FILL_4 = 0x84000000,
+-};
+-
+-enum {
+- PAR3_COND = 0x38000000,
+- PAR3_WIDTH = 0x06000000,
+- PAR3_ACTION = 0xC0000000,
+- PAR3_BASE = 0xC0000000,
+-
+- PAR3_WIDTH_BASE = 25
+-};
++#define PAR3_COND_OTHER 0x00000000
++#define PAR3_COND_EQ 0x08000000
++#define PAR3_COND_NE 0x10000000
++#define PAR3_COND_LT 0x18000000
++#define PAR3_COND_GT 0x20000000
++#define PAR3_COND_ULT 0x28000000
++#define PAR3_COND_UGT 0x30000000
++#define PAR3_COND_AND 0x38000000
++
++#define PAR3_WIDTH_1 0x00000000
++#define PAR3_WIDTH_2 0x02000000
++#define PAR3_WIDTH_4 0x04000000
++#define PAR3_WIDTH_FALSE 0x06000000
++
++#define PAR3_ACTION_NEXT 0x00000000
++#define PAR3_ACTION_NEXT_TWO 0x40000000
++#define PAR3_ACTION_BLOCK 0x80000000
++#define PAR3_ACTION_DISABLE 0xC0000000
++
++#define PAR3_BASE_ASSIGN 0x00000000
++#define PAR3_BASE_INDIRECT 0x40000000
++#define PAR3_BASE_ADD 0x80000000
++#define PAR3_BASE_OTHER 0xC0000000
++
++#define PAR3_BASE_ASSIGN_1 0x00000000
++#define PAR3_BASE_ASSIGN_2 0x02000000
++#define PAR3_BASE_ASSIGN_4 0x04000000
++#define PAR3_BASE_INDIRECT_1 0x40000000
++#define PAR3_BASE_INDIRECT_2 0x42000000
++#define PAR3_BASE_INDIRECT_4 0x44000000
++#define PAR3_BASE_ADD_1 0x80000000
++#define PAR3_BASE_ADD_2 0x82000000
++#define PAR3_BASE_ADD_4 0x84000000
++#define PAR3_BASE_HOOK 0xC4000000
++#define PAR3_BASE_IO_2 0xC6000000
++#define PAR3_BASE_IO_3 0xC7000000
++
++#define PAR3_OTHER_END 0x00000000
++#define PAR3_OTHER_SLOWDOWN 0x08000000
++#define PAR3_OTHER_BUTTON_1 0x10000000
++#define PAR3_OTHER_BUTTON_2 0x12000000
++#define PAR3_OTHER_BUTTON_4 0x14000000
++#define PAR3_OTHER_PATCH_1 0x18000000
++#define PAR3_OTHER_PATCH_2 0x1A000000
++#define PAR3_OTHER_PATCH_3 0x1C000000
++#define PAR3_OTHER_PATCH_4 0x1E000000
++#define PAR3_OTHER_ENDIF 0x40000000
++#define PAR3_OTHER_ELSE 0x60000000
++#define PAR3_OTHER_FILL_1 0x80000000
++#define PAR3_OTHER_FILL_2 0x82000000
++#define PAR3_OTHER_FILL_4 0x84000000
++
++#define PAR3_COND 0x38000000
++#define PAR3_WIDTH 0x06000000
++#define PAR3_ACTION 0xC0000000
++#define PAR3_BASE 0xC0000000
++
++#define PAR3_WIDTH_BASE 25
+
+ struct GBACheatHook {
+ uint32_t address;
+diff --git a/src/gba/cheats/parv3.c b/src/gba/cheats/parv3.c
+index 4f3a89310..731de638e 100644
+--- a/src/gba/cheats/parv3.c
++++ b/src/gba/cheats/parv3.c
+@@ -70,7 +70,7 @@ static void _parElseBlock(struct GBACheatSet* cheats) {
+ }
+
+ static bool _addPAR3Cond(struct GBACheatSet* cheats, uint32_t op1, uint32_t op2) {
+- enum GBAActionReplay3Condition condition = op1 & PAR3_COND;
++ uint32_t condition = op1 & PAR3_COND;
+ int width = 1 << ((op1 & PAR3_WIDTH) >> PAR3_WIDTH_BASE);
+ if (width > 4) {
+ // TODO: Always false conditions
+--
+2.29.2
+
diff --git a/pkg/mgba/patch/0004-All-Avoid-return-with-expression-in-void-function.patch b/pkg/mgba/patch/0004-All-Avoid-return-with-expression-in-void-function.patch
@@ -0,0 +1,70 @@
+From b58ec7875cbc169eed7fea709c95769c0318c442 Mon Sep 17 00:00:00 2001
+From: Michael Forney <mforney@mforney.org>
+Date: Sat, 7 Nov 2020 14:40:36 -0800
+Subject: [PATCH] All: Avoid return with expression in void function
+
+This is not permitted by ISO C (C99 6.8.6.4p1 [0]).
+
+[0] https://port70.net/~nsz/c/c99/n1256.html#6.8.6.4p1
+---
+ src/core/input.c | 2 +-
+ src/core/interface.c | 2 +-
+ src/gb/core.c | 2 +-
+ src/gba/core.c | 2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/src/core/input.c b/src/core/input.c
+index fab88a50e..da18e5c89 100644
+--- a/src/core/input.c
++++ b/src/core/input.c
+@@ -615,7 +615,7 @@ void mInputSetPreferredDevice(struct Configuration* config, const char* platform
+
+ char deviceId[KEY_NAME_MAX];
+ snprintf(deviceId, sizeof(deviceId), "device%i", playerId);
+- return ConfigurationSetValue(config, sectionName, deviceId, deviceName);
++ ConfigurationSetValue(config, sectionName, deviceId, deviceName);
+ }
+
+ const char* mInputGetCustomValue(const struct Configuration* config, const char* platformName, uint32_t type, const char* key, const char* profile) {
+diff --git a/src/core/interface.c b/src/core/interface.c
+index e6288e274..b808e32ba 100644
+--- a/src/core/interface.c
++++ b/src/core/interface.c
+@@ -15,7 +15,7 @@ static void _rtcGenericSample(struct mRTCSource* source) {
+ switch (rtc->override) {
+ default:
+ if (rtc->custom->sample) {
+- return rtc->custom->sample(rtc->custom);
++ rtc->custom->sample(rtc->custom);
+ }
+ break;
+ case RTC_NO_OVERRIDE:
+diff --git a/src/gb/core.c b/src/gb/core.c
+index 9f67fd19d..5bceb1fae 100644
+--- a/src/gb/core.c
++++ b/src/gb/core.c
+@@ -400,7 +400,7 @@ static void _GBCoreUnloadROM(struct mCore* core) {
+ mCheatDeviceDestroy(gbcore->cheatDevice);
+ gbcore->cheatDevice = NULL;
+ }
+- return GBUnloadROM(core->board);
++ GBUnloadROM(core->board);
+ }
+
+ static void _GBCoreChecksum(const struct mCore* core, void* data, enum mCoreChecksumType type) {
+diff --git a/src/gba/core.c b/src/gba/core.c
+index 901d25111..9444c8a5b 100644
+--- a/src/gba/core.c
++++ b/src/gba/core.c
+@@ -506,7 +506,7 @@ static void _GBACoreUnloadROM(struct mCore* core) {
+ mCheatDeviceDestroy(gbacore->cheatDevice);
+ gbacore->cheatDevice = NULL;
+ }
+- return GBAUnloadROM(core->board);
++ GBAUnloadROM(core->board);
+ }
+
+ static void _GBACoreChecksum(const struct mCore* core, void* data, enum mCoreChecksumType type) {
+--
+2.29.2
+
diff --git a/pkg/mgba/patch/0005-GBA-Memory-Change-type-of-sequence-arrays-to-prevent.patch b/pkg/mgba/patch/0005-GBA-Memory-Change-type-of-sequence-arrays-to-prevent.patch
@@ -0,0 +1,35 @@
+From 2de8da98e15392b70c468fdb5123b958b10a6187 Mon Sep 17 00:00:00 2001
+From: Michael Forney <mforney@mforney.org>
+Date: Sat, 7 Nov 2020 14:54:14 -0800
+Subject: [PATCH] GBA Memory: Change type of sequence arrays to prevent
+ overflow
+
+These arrays contain values > 0x7F, which cannot be represented in
+int8_t (or char if it is signed). Since they are only used in memcmp,
+change their type to uint8_t[].
+---
+ src/gba/vfame.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/src/gba/vfame.c b/src/gba/vfame.c
+index 0ac834cc9..67c0ed1dc 100644
+--- a/src/gba/vfame.c
++++ b/src/gba/vfame.c
+@@ -29,11 +29,11 @@ static const uint8_t VALUE_REORDERING_GEORGE[4][16] = {
+ { 5, 2, 1, 6, 7, 0, 3, 4 }
+ };
+
+-static const int8_t MODE_CHANGE_START_SEQUENCE[5] = { 0x99, 0x02, 0x05, 0x02, 0x03 };
+-static const int8_t MODE_CHANGE_END_SEQUENCE[5] = { 0x99, 0x03, 0x62, 0x02, 0x56 };
++static const uint8_t MODE_CHANGE_START_SEQUENCE[5] = { 0x99, 0x02, 0x05, 0x02, 0x03 };
++static const uint8_t MODE_CHANGE_END_SEQUENCE[5] = { 0x99, 0x03, 0x62, 0x02, 0x56 };
+
+ // A portion of the initialisation routine that gets copied into RAM - Always seems to be present at 0x15C in VFame game ROM
+-static const char INIT_SEQUENCE[16] = { 0xB4, 0x00, 0x9F, 0xE5, 0x99, 0x10, 0xA0, 0xE3, 0x00, 0x10, 0xC0, 0xE5, 0xAC, 0x00, 0x9F, 0xE5 };
++static const uint8_t INIT_SEQUENCE[16] = { 0xB4, 0x00, 0x9F, 0xE5, 0x99, 0x10, 0xA0, 0xE3, 0x00, 0x10, 0xC0, 0xE5, 0xAC, 0x00, 0x9F, 0xE5 };
+
+ static bool _isInMirroredArea(uint32_t address, size_t romSize);
+ static uint32_t _getPatternValue(uint32_t addr);
+--
+2.29.2
+
diff --git a/pkg/mgba/src b/pkg/mgba/src
@@ -0,0 +1 @@
+Subproject commit 545a76f876af47671c8089b1ee09bf1d4a55f47e
diff --git a/pkg/mgba/ver b/pkg/mgba/ver
@@ -0,0 +1 @@
+0.8.4 r0