Rekai Nyangadzayi Musuka
5aac04faf5
I'd like to merge my affine sprite impl into main, which will require merging a lot of the rewrites I did in this branch. My plan is to merge the buggy ppu window impl to main, but keep it disabled. This is technically a regression but the current impl barely worked anyways so.... |
||
---|---|---|
.github/workflows | ||
.vscode | ||
lib | ||
src | ||
.gitignore | ||
.gitmodules | ||
README.md | ||
build.zig | ||
example.toml |
README.md
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)
- Immediate Mode GUI
- 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 ./bin/test/suite.gba
to see how badly my "cool new feature" broke everything else.
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 0.11.0-dev.368+1829b6eab
Dependencies
Dependency | Source |
---|---|
SDL.zig | https://github.com/MasterQ32/SDL.zig |
zig-clap | https://github.com/Hejsil/zig-clap |
known-folders | https://github.com/ziglibs/known-folders |
zig-toml | https://github.com/aeronavery/zig-toml |
zig-datetime | https://github.com/frmdstryr/zig-datetime |
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 submodules SDL.zig
, zig-clap
, known-folders
, zig-toml
and zig-datetime
Be sure to provide SDL2 using:
- Linux: Your distro's package manager
- MacOS: ¯\_(ツ)_/¯
- Windows:
vcpkg
(installsdl2: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 -Drelease-fast
. 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 |