My first attempt at a Gameboy Advance Emulator
Go to file
Rekai Nyangadzayi Musuka 9844d657b0 fix: implement Ace Lightning (2002) obscure behaviour 2023-04-01 01:23:18 -05:00
.github/workflows ci: update github actions config 2023-03-11 00:09:14 -06:00
assets chore: add screenshot to README.md 2023-03-10 19:37:28 -06:00
lib chore: update zgui 2023-03-26 23:23:34 -05:00
src fix: implement Ace Lightning (2002) obscure behaviour 2023-04-01 01:23:18 -05:00
.gitignore feat: add imgui support using zgui 2023-02-23 17:27:42 -06:00
.gitmodules chore: introduce zba-util 2023-03-10 00:05:31 -06:00
README.md chore: update to 0.11.0-dev.2168+322ace70f 2023-03-26 23:23:34 -05:00
build.zig fix: reimplement grabbing ROM title if provided via cmd arg 2023-03-27 16:22:07 -05:00
example.toml chore(config): change defaults in config.toml 2022-10-21 06:01:22 -03:00

README.md

ZBA (working title)

A Game Boy Advance Emulator written in Zig !

ZBA running リズム天国

Scope

I'm hardly the first to write a Game Boy Advance Emulator nor will I be the last. This project isn't going to compete with the GOATs like mGBA or NanoBoyAdvance. There aren't any interesting ideas either like in DSHBA.

This is a simple (read: incomplete) for-fun long-term project. I hope to get "mostly there", which to me means that I'm not missing any major hardware features and the set of possible improvements would be in memory timing or in UI/UX. With respect to that goal, here's what's outstanding:

TODO

  • Affine Sprites
  • Windowing (see this branch)
  • Audio Resampler (Having issues with SDL2's)
  • Refactoring for easy-ish perf boosts

Usage

As it currently exists, ZBA is run from the terminal. In your console of choice, type ./zba --help to see what you can do.

I typically find myself typing ./zba -b ./bin/bios.bin and then going to File -> Insert ROM to load the title of my choice.

Need a BIOS? Why not try using the open-source Cult-Of-GBA BIOS written by fleroviux and DenSinH?

Finally it's worth noting that ZBA uses a TOML config file it'll store in your OS's data directory. See example.toml to learn about the defaults and what exactly you can mess around with.

Tests

GBA Tests jsmolka
arm.gba, thumb.gba PASS
memory.gba, bios.gba PASS
flash64.gba, flash128.gba PASS
sram.gba PASS
none.gba PASS
hello.gba, shades.gba, stripes.gba PASS
nes.gba PASS
GBARoms DenSinH
eeprom-test, flash-test PASS
midikey2freq PASS
swi-tests-random FAIL
gba_tests destoer
cond_invalid.gba PASS
dma_priority.gba PASS
hello_world.gba PASS
if_ack.gba PASS
line_timing.gba FAIL
lyc_midline.gba FAIL
window_midframe.gba FAIL
GBA Test Collection ladystarbreeze
retAddr.gba PASS
helloWorld.gba PASS
helloAudio.gba PASS
FuzzARM DenSinH
main.gba PASS
arm7wrestler GBA Fixed destoer
armwrestler-gba-fixed.gba PASS

Resources

Compiling

Most recently built on Zig v0.11.0-dev.2168+322ace70f

Dependencies

Dependency Source
SDL.zig https://github.com/MasterQ32/SDL.zig
known-folders https://github.com/ziglibs/known-folders
nfd-zig https://github.com/fabioarnold/nfd-zig
zgui https://github.com/michal-z/zig-gamedev/tree/main/libs/zgui
zig-clap https://github.com/Hejsil/zig-clap
zig-datetime https://github.com/frmdstryr/zig-datetime
zig-toml https://github.com/aeronavery/zig-toml
bitfields.zig https://github.com/FlorenceOS/Florence
gl.zig https://github.com/MasterQ32/zig-opengl

Use git submodule update --init from the project root to pull the git relevant git submodules

Be sure to provide SDL2 using:

  • Linux: Your distro's package manager
  • macOS: ¯\_(ツ)_/¯ (try this formula?)
  • Windows: vcpkg (install sdl2:x64-windows)

SDL.zig will provide a helpful compile error if the zig compiler is unable to find SDL2.

Once you've got all the dependencies, execute zig build -Doptimize=ReleaseSafe. The executable is located at zig-out/bin/.

Controls

Key Button
X A
Z B
A L
S R
Return Start
RShift Select
Arrow Keys D-Pad