Categories
Emulators
  • Github CLI
  • SSH
  • HTTPS
Clone Repo

ZBA (working title)

A Game Boy Advance Emulator written in Zig ⚡!

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

ZBA supports both a CLI and a GUI. If running from the terminal, try using zba --help to see what you can do. If you want to use the GUI, feel free to just run zba without any arguments.

ZBA does not feature any BIOS HLE, so providing one will be necessary if a ROM makes use of it. Need one? 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.

Compiling

Most recently built on Zig v0.11.0

Dependencies

DependencySource
known-foldershttps://github.com/ziglibs/known-folders
nfd-zighttps://github.com/fabioarnold/nfd-zig
SDL.zighttps://github.com/MasterQ32/SDL.zig
tomlzhttps://github.com/mattyhall/tomlz
zba-gdbstubhttps://github.com/paoda/zba-gdbstub
zba-utilhttps://git.musuka.dev/paoda/zba-util
zguihttps://github.com/michal-z/zig-gamedev/tree/main/libs/zgui
zig-claphttps://github.com/Hejsil/zig-clap
zig-datetimehttps://github.com/frmdstryr/zig-datetime
bitfield.zighttps://github.com/FlorenceOS/Florence
gl.zighttps://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 will be under zig-out/bin and the shared libraries (if enabled) under zig-out/lib. If working with shared libraries on windows, be sure to add all artifacts to the same directory. On Unix, you’ll want to make use of LD_PRELOAD.

Controls

KeyButtonKeyButton
ALSR
XAZB
ReturnStartRShiftSelect
Arrow KeysD-Pad

Tests

GBA Testsjsmolkagba_testsdestoer
arm.gba, thumb.gbaPASScond_invalid.gbaPASS
memory.gba, bios.gbaPASSdma_priority.gbaPASS
flash64.gba, flash128.gbaPASShello_world.gbaPASS
sram.gbaPASSif_ack.gbaPASS
none.gbaPASSline_timing.gbaFAIL
hello.gba, shades.gba, stripes.gbaPASSlyc_midline.gbaFAIL
nes.gbaPASSwindow_midframe.gbaFAIL
GBARomsDenSinHGBA Test Collectionladystarbreeze
eeprom-test, flash-testPASSretAddr.gbaPASS
midikey2freqPASShelloWorld.gbaPASS
swi-tests-randomFAILhelloAudio.gbaPASS
FuzzARMDenSinHarm7wrestler GBA Fixeddestoer
main.gbaPASSarmwrestler-gba-fixed.gbaPASS

Resources

About
Game Boy Advance Emulator. Yes, I'm awful with project names.
Owner
paoda (User)
Last Commit
2024-09-09
Latest Release
Latest Release Date
Created
2022-03-01