Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

887 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

icon

GameBeanAdvance

WIP Gameboy Advance Emulator written in D. Passes 2020/2020 mGBA timing tests, and fourth software-based emulator to pass the AGS Aging Cartridge test. Currently working on improving GBA accuracy.

Demo Videos (Turn audio up)

aging.mp4
Superstar.Saga.mov
Pokemon.Emerald.mov

Usage

Emulator main project is in src/emu.

Build

Requirements

  • Dlang + DUB
  • Python3/PyPy3 (packages: ply)

Standard Build

Optionally add -b release --compiler=ldc2 for optimized build.

dub build

Profiling

Build with support for gperftools_d. This requires the LDC2 compiler.

dub build -c gperf --compiler=ldc2 -b release-debug

Then, run with the CPUPROFILE=/tmp/prof.out environment var to write a profile log.

Finally, convert the log to human readable graph:

pprof --pdf gamebean-emu /tmp/prof.out > ~/Downloads/gamebean_profile.pdf

Run

Specify path to rom. You can also optionally use -s to specify window scaling (default = 1). Note that you must have a gba_bios.bin located in the same directory as the executable. You can acquire a substitute BIOS (see Cult of GBA), or you can dump the official BIOS from a GBA.

./gamebean-emu [rom]

GDB stub

Use the optional gdbstub integration:

git submodule update --init --recursive
dub build -c gdbstub
./gamebean-emu [rom] --gdb 127.0.0.1:5555

Then connect with lldb:

lldb -O "gdb-remote 127.0.0.1:5555"

Tests

To run the tests, run dub test. This will test the ARM CPU by running it through the GBA files located in /tests/asm/bin/. If the cpu states after every cycle matches the expected states found in the log files in /tests/asm/log, then the tests will pass. These roms are written in ARM assembly and are located in /tests/asm/src. These tests have their own makefile that produces a .gba file as well as a log file. Logfile production requires having an editted version of NanoBoyAdvance, and having the command NanoBoyAdvance added to PATH.

Relevant Resources

ARM Technical Reference Manual: https://static.docs.arm.com/ddi0029/g/DDI0029.pdf

ARM Architectural Reference Manual: https://cs.nyu.edu/courses/spring18/CSCI-GA.2130-001/ARM/arm_arm.pdf

GBATEK: https://problemkaputt.de/gbatek.htm

Patater GBA ASM Guide: https://patater.com/gbaguy/gbaasm.htm

Tonc: https://www.coranac.com/tonc/text/

Special Thanks

  • nocash, for the excellent documentation about the GBA's internals on GBATEK
  • fleroviux, for sharing research on GBA timing, as well letting me take inspiration NanoBoyAdvance for my frontend design.
  • DenSinH, whose code (DSHBA) I referenced while adding shaders to my emu
  • Near and Talarubi, who created the aforementioned shaders.

About

highly accurate GBA emulator, built from scratch

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages