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.