What's new



Project Page: https://github.com/fleroviux/NanoBoyAdvance
Project Name: NanoBoyAdvance


I've just released version 1.2 of my Game Boy Advance emulator (this is the second official release).
The emulator has been around for a few years but only recently I felt comfortable actually releasing anything.

This emulator focuses on being lightweight, accurate and somewhat efficient while keeping the code readable.

Emulation right now is quite accurate, passing all known CPU tests and many other tests.
I've put a lot of effort particularly in accurate timing emulation, including the GamePak prefetch buffer.
The emulator also is relatively fast (though not as ludicrously fast as mGBA or VBA).

There still are a few games with known issues that I will work on for the next release :p


Last edited:


[MENTION=29958]NES_player4LIFE[/MENTION] thanks for the sticky!

I just released version 1.3 of my GBA emulator.
Notably this is the only software emulator to fully pass the AGS aging cartridge (a hardware test cartridge from Nintendo),
and overall was the first emulator to fully pass it before the Mister FPGA GBA core managed to pass it as well.
With the update the emulator also moved even more towards accurate timing emulation.
It can now handle hardware events on the bus cycle level and DMAs can overtake the bus on any bus cycle (mid-instruction).


- ARM: handle CMP, CMN, TST and TEQ with rD = 15
- ARM: handle mode switches when the register bank does not change.
- ARM: removed errorneous user-mode switch from LDRT/STRT opcodes.
- DMA: allow DMAs to take priority over the CPU in the middle of an instruction
- DMA: delay DMA startup by two cycles and account for 2I internal cycles
- DMA: force ROM accesses to increment source address mode
- DMA: respect source address mode setting for FIFO DMA
- DMA: force FIFO DMA to use word sized accesses
- DMA: handle manual disable (via enable flag) more gracefully
- Timer: respect cascade flag in sample rate calculation
- APU: emulate DAC enable bits (fixes #64)
- PPU: match WIN0/1 trigger logic to hardware (thanks @destoer)
- PPU: fix H-blank IRQ timing (once again)
- PPU: better handle internal affine registers when multiple BG modes are used in a single frame.
- PPU: handle invalid BG modes 6 and 7 (thanks @LadyStarbreeze)
- PPU: update internal affine & mosaic registers at the start of H-blank, not at the end.
- MMIO: do not fallthrough on SOUNDBIAS writes (fixes #125)
- Keypad: implemented keypad IRQ (thanks @destoer)
- Serial: implemented a serial IRQ stub
- SDL: always call glewInit() (fixes #129 )
- SDL: use binary directory as current working directory


NanoBoyAdvance 1.4 is released:


  • Audio: added a high-quality software/HLE mixer for the MusicPlayer2000 sound engine
  • Platform: added a new Qt frontend with OpenGL post-processing options
  • PPU: render sprites one scanline ahead (fixes #130)
  • PPU: fix an off-by-one in the OBJ draw loop
  • PPU: apply OAM draw limit only on OAM (instead of pixel) boundaries for now
  • PPU: fix Mode4 transparency (fixes #169)
  • PPU: emulate BG enable delay (fixes #94)
  • PPU: update internal (affine) X/Y registers only if the BG is enabled (fixes #177)
  • Memory: handle 16-bit KEYCNT writes (fixes #152)
  • Memory: HALTCNT and POSTFLG should only be writable from BIOS code
  • Memory: mask top two bits of the IE register
  • DMA: each DMA channel should have its own memory data register (MDR)
  • CPU: rework IRQ signal propagation delay
  • CPU: improve IRQ exception timing
  • CPU: emulate user-mode LDM bus conflict
  • CPU: handle invalid CPU modes
  • CPU: emulate MSR user-mode restrictions
  • CPU: boot into supervisor mode instead of system mode
  • CPU: handle rD=r15 edge-case in CMP/CMN/TST and TEQ
  • CPU: Thumb ALU shifts now mask the shift amount
  • CPU: fix unsigned multiply-long timing
  • EEPROM: fix address masking



NanoBoyAdvance 1.5 is released:

  • ARM: force CPSR/SPSR bit 4 to one (fixes Banjo-Kazooie: Grunty's Revenge)
  • Bus: Game Pak access sometimes incurs a one-cycle penalty when prefetch is active
  • Bus: HALT incurs a two-cycle penalty
  • DMA: make access pattern (more) accurate for `ROM to ROM` and other weird DMAs.
  • DMA: move the second internal cycle at the end of the transfer
  • DMA: handle more changes to the control register during a transfer
  • IRQ: rework interrupt delay emulation (once again)
  • Timer: writing to the control register takes one cycle to apply
  • PPU: apply horizontal sprite mosaic as a post-process
  • APU: model FIFO as a buffer of seven (not eight) 32-bit words (thanks Gericom) (fixes #101)
  • APU: high bits of SOUND2CNT_L should return zero
  • Input: make KEYINPUT updates atomic to avoid incorrect game resets (from the Key IRQ)
  • UI: maintain a list of recently opened files for quick loading
  • UI: allow loading ROMs via process arguments
  • UI: add shortcuts for fullscreen and window scale
  • UI: implement a workaround for the broken menu bar during fullscreen on Windows
  • UI: hide the FPS counter by default and add an option to unhide it
  • OpenGL: fix a black screen issue on some Intel integrated GPUs
  • macOS: build NanoBoyAdvance as an App Bundle (thanks nadiaholmquist)


NanoBoyAdvance 1.6 is released:

  • UI: implement game controller selection and remapping
  • UI: enable loading ROMs from archives (Zip, 7z, RAR4)
  • UI: enable loading ROMs via Drag & Drop onto the main window
  • UI: fix occasional crashes when loading a ROM while the emulator is running
  • UI: fix screen clearing and stop audio if ROM could not be loaded
  • UI: unpause the emulator if a ROM is loaded
  • UI: add an option to unlock the aspect ratio
  • Core: implement Solar Sensor emulation (for Boktai I and II)
  • Core: implement experimental save state support
  • Save Memory: automatically detect EEPROM save sizes (closes #219)
  • ARM: fix switch between FIQ and non-user/system modes
  • PPU: delay H-blank IRQs by four cycles (fixes #89, fixes #175)
  • PPU: disable VRAM mirror at 06018000h in bitmap modes (fixes #102)
  • PPU: latch BGX/Y writes at the beginning of each scanline (fixes #176)
  • PPU: delay scanline rendering by 32 cycles (fixes #93)
  • PPU: properly initialise WIN0/1 state after reset (fixes #223)
  • PPU: 2D OBJs should wraparound horizontally (fixes #224)
  • PPU: move rendering to a secondary thread for better performance
  • PPU: improve DMA3 video transfer timing
  • PPU: respect WININ/WINOUT if Alpha OBJ does not have a blend source
  • IRQ: add 16-bit IO access handlers to avoid scheduling multiple events
  • IRQ: assign (preliminary) priorities to events for IRQ raise and acknowledge/disable events
  • Timer: be explicit about IO write event order
  • RTC: enable 24h-mode by default (fixes #136)
  • RTC: multiple small fixes and accuracy improvements