A little late (okay, a lot late), mGBA 0.8.0 is finally available as a stable release. This is a major feature release and includes some highly anticipated features. Notably, the high-resolution OpenGL renderer for GBA games, BattleChip Gate support, interframe blending, and much more. Additionally, it includes over 50 bug fixes and hundreds of other changes. A preview of the features follows after the cut, along with a full list of changes.

High-resolution OpenGL renderer

The most anticipated feature of mGBA 0.8.0 is the high-resolution OpenGL renderer. With this enabled the GBA screen is rendered on the GPU instead of the usual software rendering, which allows scaling up beyond the usual 240×160 resolution without thrashing the CPU. With a good GPU it can even render at 4K resolution. This lets rotation and scaling effects look much cleaner and allows the “mode 7” effect to be even more impressive.

The high-resolution OpenGL renderer is available on Windows, Linux, macOS, and Switch. Enable it under the Enhancements pane in Settings. Performance improvements and bug fixes are expected in future releases.

BattleChip Gate

The BattleChip Gate (and associated Progress Gate and Beast Link Gate) are long unemulated peripherals for the GBA. They hook up to MegaMan Battle Network 4, 5 and 6 respectively and allow access to the Operation Battle minigame, as well as using chips in-game. Apart from use in multiplayer, these peripherals are fully supported in mGBA 0.8.0. Just open the BattleChip Gate dialog, under Emulation, before the title screen comes up to use them. If inserted too late the game may not recognize it and you’ll need to reset.

The first time the BattleChip Gate screen is opened it will prompt to download all of the BattleChip icons. This is optional, but recommended. After opening the dialog you can select a deck of chips you want to use and simply click on them to insert them.

Interframe blending

A common effect on the GBA is to do every-other frame flickering. While this is not a new effect by any stretch of the imagination—games have been doing this for decades—it only works well on screens with ghosting. On old console games this targeted phosphor fading on CRTs, whereas on the GBA it targets the LCD panel’s ghosting. However, most modern LCDs have a much better response time, and sometimes the framerate isn’t perfect, leading to visible flickering. As such, a long-standing request for mGBA has been interframe blending. While ghosting has been possible for some time now with shaders, it was never single-frame and baked into the frontends. In mGBA 0.8.0 every official port received a single-frame interframe blending feature. Some examples of the effects of this feature are seen below.

In this example, Golden Sun jitters the world map to provide a temporal anti-aliasing effect.

Many games flicker parts of the screen to create a semi-transparency effect. Here F-Zero: Maximum Velocity flickers the minimap.

Frame inspector

The new frame inspector feature in mGBA 0.8.0 allows for advanced dissection of rendered frames. By replaying the rendering of a single frame with settings tweaked it lets users figure out which component of a screen is rendered where on the screen, disable specific layers, or even select sprites. Disabling scanline effects also lets users see tricks that a game employs for more advanced scenes. These tweaked versions of a frame can be exported to a PNG if desired.

The frame inspector showing off a highlighted sprite and several HUD sprites disabled.

Currently only GBA games are supported in the frame inspector. GB/C games and more tweaking features will be added in later versions of mGBA.

And more…

Some smaller and experimental features were also added in 0.8.0:

mGBA now has Discord Rich Presence integration for displaying the current game you’re playing. Turn it on in the Interface panel in settings.

A work-in-progress “XQ” audio feature that works with most GBA games is included in the Enhancements pane in settings. It’s a very early WIP and not production ready but may work decently with some games. It also does not work yet with A/V recording due to implementation limitations.

Support for loading a few additional cheat code file formats. However, VBA .clt files are still not supported at this time.

Several smaller debugging features, such as an improved map viewer, an improved sprite viewer, and memory range dumping.

Changes from 0.7.3

Features

Improved logging configuration

One-Player BattleChip/Progress/Beast Link Gate support

Add Game Boy Color palettes for original Game Boy games

Debugger: Add unary operators and memory dereferencing

GB: Expose platform information to CLI debugger

Support Discord Rich Presence

Debugger: Add tracing to file

Enhanced map viewer, supporting bitmapped GBA modes and more displayed info

OpenGL renderer with high-resolution upscaling support

Experimental high level “XQ” audio for most GBA games

Interframe blending for games that use flicker effects

Frame inspector for dissecting and debugging rendering

Switch: Option to use built-in brightness sensor for Boktai

Ports: Ability to enable or disable all SGB features (closes #1205)

Ports: Ability to crop SGB borders off screen (closes #1204)

Cheats: Add support for loading Libretro-style cht files

GBA Cheats: Add support for loading EZ Flash-style cht files

Support for unlicensed Wisdom Tree Game Boy mapper

Qt: Add export button for tile view (closes #1507)

Qt: Add recent game list clearing (closes #1380)

GB: Yanking gamepak now supported

Qt: Memory range dumping (closes #1298)

Emulation fixes

GB: Fix using boot ROM with MMM01 games

GB Audio: Only reset channel 3 sample in DMG mode

GB Audio: Sample inactive channels (fixes #1455, mgba.io/i/1456)

GB Audio: Fix channel 4 volume (fixes #1529)

GB I/O: Filter IE top bits properly (fixes #1329)

GB Memory: Better emulate 0xFEA0 region on DMG, MGB and AGB

GB Video: Delay LYC STAT check (fixes #1331)

GB Video: Fix window being enabled mid-scanline (fixes #1328)

GB Video: Fix mode 0 window edge case (fixes #1519)

GB Video: Fix color scaling in AGB mode

GBA: All IRQs have 7 cycle delay (fixes #539, mgba.io/i/1208)

GBA: Reset now reloads multiboot ROMs

GBA BIOS: Fix multiboot entry point (fixes Magic Floor)

Other fixes

Core: Improved lockstep driver reliability (Le Hoang Quyen)

FFmpeg: Drain recording buffers

GB: Fix reading ROM immediately after unmapping BIOS

GB SIO: Fix lockstep failing games aren’t reloaded

GBA Cheats: Fix value incrementing in CB slide codes (fixes #1501)

Libretro: Fix crash changing allowing opposing directions (hhromic)

Qt: Fix some Qt display driver race conditions

Qt: Fix menu bar staying hidden in full screen (fixes #317)

Qt: Only show emulator restart warning once per settings saving

Qt: Fix LibraryController initialization (fixes #1324)

Shaders: Fix gba-color shader resolution (fixes #1435)

Switch: Fix audio when video rate desyncs (fixes #1532)

Miscellaneous

CMake: Don’t use libzip on embedded platforms (fixes #1527)

Core: Add keysRead callback

Core: Create game-related paths if they don’t exist (fixes #1446)

Core: Add more memory search ops (closes #1510)

Debugger: Make tracing compatible with breakpoints/watchpoints

Debugger: Print breakpoint/watchpoint number when inserting

Feature: Switch from ImageMagick to FFmpeg for GIF generation

FFmpeg: Support audio-only recording

GB Memory: Support running from blocked memory

GBA BIOS: Add timings for HLE BIOS math functions (fixes #1396)

GBA BIOS: Fix clobbered registers in CpuSet (fixes #1531)

GBA Savedata: EEPROM performance fixes

GBA Savedata: Automatically map 1Mbit Flash files as 1Mbit Flash

Debugger: Add breakpoint and watchpoint listing

mGUI: Remember name and position of last loaded game

OpenGL: Only resize textures when needed

Qt: Don’t unload ROM immediately if it crashes

Qt: Support switching webcams

Qt: Cap window size on start to monitor size

Qt: Open a message box for Qt frontend errors

Qt: Increase maximum magnifications and scaling

Qt: Add native FPS button to settings view

Qt: Improve sync code

Qt: Add option to pause on minimizing window (closes #1379)

Qt: Scale pixel color values to full range (fixes #1511)

Qt: Remove What’s This icon from dialogs

Qt: Printer quality of life improvements (fixes #1540)

Qt: Add copy and QoL improvements to graphic views (closes #1541)

Qt: Show list of all sprites in sprite view

Qt: Add option for disabling OSD messages

Qt, OpenGL: Disable integer scaling for dimensions that don’t fit

SM83: Support PC-relative opcode decoding

Switch: Dynamic display resizing

Switch: Support file associations

Vita: L2/R2 and L3/R3 can now be mapped on PSTV (fixes #1292)

Changes from 0.8 beta 1

Emulation fixes

ARM: Fix STR writeback pipeline stage

ARM: Partially fix LDM/STM writeback with empty register list

ARM: Fix stepping when events are pending

GBA DMA: Fix case where DMAs could get misaligned (fixes #1092)

GBA Memory: Fix open bus from IWRAM (fixes #1575)

GBA Timers: Improve timer startup emulation

GBA Video: Fix OpenGL renderer 512x512 backgrounds (fixes #1572)

GBA Video: Fix BLDY for semitransparent sprite on non-target-2 backgrounds

GBA Video: Fix effects blending improperly in some non-last windows

GBA Video: Copy higher priority target 1 flag

Other fixes

3DS: Fix screen darkening (fixes #1562)

Core: Fix uninitialized memory issues with graphics caches

Core: Return null for out of bounds cached tile VRAM querying

GBA Video: Fix OpenGL fragment data binding

GBA Video: Fix mosaic in modes 1-5 in OpenGL (fixes #1620)

Debugger: Fix tracing skipping instructions (fixes #1614)

OpenGL: Only invalidate texture if dimensions change (fixes #1612)

Qt: Fix fast forward mute being reset (fixes #1574)

Qt: Fix scrollbar arrows in memory view (fixes #1558)

Qt: Fix several cases where shader selections don’t get saved

Qt: Fix division by zero error in invalid TilePainter state

Qt: Fix “restart needed” dialog after first config (fixes #1601)

Qt: Fix undesired screen filtering when paused (fixes #1602)

Qt: Fix sprite view using wrong base address (fixes #1603)

Qt: Fix inability to clear default keybindings

Qt: Release held actions if they get rebound

Qt: Fix crash double-clicking menus in shortcut settings (fixes #1627)

Qt: Fix record A/V window not updating resolution (fixes #1626)

Vita: Fix analog controls (fixes #1554)

Wii: Fix game fast-forwarding after slowing down

Wii: Improve audio buffering (fixes #1617)

Miscellaneous

GB Memory: Support manual SRAM editing (fixes #1580)

GBA: Trim non-movie ROMs to 32 MiB if applicable

GBA Audio: Redo channel 4 batching for GBA only

GBA I/O: Stop logging several harmless invalid register reads

GBA Video: Changing OpenGL scaling no longer requires restart

Debugger: Separate aliases from main commands

Debugger: Print break-/watchpoint ID when breaking in CLI

Debugger: Minor interface cleanup

SDL: Use controller GUID instead of name

SM83: Rename LR35902 to SM83

Tools: Allow using threaded renderer in perf.py

Tools: Clean up unused argument in mgba-perf

Downloads

Get it now in the Downloads section. Binaries are available for Windows, Ubuntu, macOS, Nintendo Switch, 3DS, Wii, and PlayStation Vita, and the source code is available for all other platforms.

If you enjoy using mGBA and wish to give back, there is a list of ways to donate on the donations page, including an mGBA Patreon.