2022-02-11 01:21:34 +00:00
# ZBA (working title)
2022-11-01 04:01:29 +00:00
2022-10-17 20:00:54 +00:00
A Game Boy Advance Emulator written in Zig ⚡!
## Scope
2022-11-01 04:01:29 +00:00
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 ](https://github.com/mgba-emu ) or [NanoBoyAdvance ](https://github.com/nba-emu/NanoBoyAdvance ). There aren't any interesting ideas either like in [DSHBA ](https://github.com/DenSinH/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
2022-10-17 20:00:54 +00:00
2022-12-22 19:18:59 +00:00
- [x] Affine Sprites
2022-10-17 20:00:54 +00:00
- [ ] Windowing (see [this branch ](https://git.musuka.dev/paoda/zba/src/branch/window ))
- [ ] Audio Resampler (Having issues with SDL2's)
2023-02-05 01:30:05 +00:00
- [x] Immediate Mode GUI (see [this branch ](https://git.musuka.dev/paoda/zba/src/branch/imgui ))
2022-10-17 20:00:54 +00:00
- [ ] Refactoring for easy-ish perf boosts
2022-02-11 01:21:34 +00:00
2022-10-31 12:14:42 +00:00
## Usage
2022-11-01 04:01:29 +00:00
2022-10-31 12:14:42 +00:00
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 ](https://github.com/Cult-of-GBA/BIOS ) written by [fleroviux ](https://github.com/fleroviux ) and [DenSinH ](https://github.com/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.
2022-11-01 04:01:29 +00:00
## Tests
2022-11-16 14:46:41 +00:00
GBA Tests | [jsmolka ](https://github.com/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 ](https://github.com/DenSinH/ )
--- | ---
`eeprom-test` , `flash-test` | PASS
`midikey2freq` | PASS
`swi-tests-random` | FAIL
gba_tests | [destoer ](https://github.com/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 ](https://github.com/ladystarbreeze )
--- | ---
`retAddr.gba` | PASS
`helloWorld.gba` | PASS
`helloAudio.gba` | PASS
FuzzARM | [DenSinH ](https://github.com/DenSinH/ )
--- | ---
`main.gba` | PASS
arm7wrestler GBA Fixed | [destoer ](https://github.com/destoer )
--- | ---
`armwrestler-gba-fixed.gba` | PASS
2022-02-11 01:21:34 +00:00
## Resources
2022-11-01 04:01:29 +00:00
- [GBATEK ](https://problemkaputt.de/gbatek.htm )
- [TONC ](https://coranac.com/tonc/text/toc.htm )
- [ARM Architecture Reference Manual ](https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/third-party/ddi0100e_arm_arm.pdf )
- [ARM7TDMI Data Sheet ](https://www.dca.fee.unicamp.br/cursos/EA871/references/ARM/ARM7TDMIDataSheet.pdf )
2022-02-11 01:21:34 +00:00
## Compiling
2022-11-01 04:01:29 +00:00
2023-02-07 23:52:16 +00:00
Most recently built on Zig [v0.11.0-dev.1580+a5b34a61a ](https://github.com/ziglang/zig/tree/a5b34a61a )
2022-02-11 01:21:34 +00:00
### Dependencies
2022-11-01 04:01:29 +00:00
2022-11-16 14:46:41 +00:00
Dependency | Source
2022-11-24 12:22:58 +00:00
--- | ---
2022-11-16 14:46:41 +00:00
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 ](https://github.com/FlorenceOS/Florence/blob/aaa5a9e568/lib/util/bitfields.zig )
`gl.zig` | < https: // github . com / MasterQ32 / zig-opengl >
2022-03-01 02:10:32 +00:00
2023-02-05 01:30:05 +00:00
Use `git submodule update --init` from the project root to pull the git relevant git submodules
2022-03-01 02:10:32 +00:00
2022-11-01 04:01:29 +00:00
Be sure to provide SDL2 using:
2022-03-01 02:10:32 +00:00
2022-11-01 04:01:29 +00:00
- Linux: Your distro's package manager
2023-02-05 01:30:05 +00:00
- MacOS: `brew` (install [this formula ](https://formulae.brew.sh/formula/sdl2 ))
2022-11-01 04:01:29 +00:00
- Windows: [`vcpkg` ](https://github.com/Microsoft/vcpkg ) (install `sdl2:x64-windows` )
2022-03-01 02:10:32 +00:00
2022-11-01 04:01:29 +00:00
`SDL.zig` will provide a helpful compile error if the zig compiler is unable to find SDL2.
2023-02-05 01:30:05 +00:00
Once you've got all the dependencies, execute `zig build -Doptimize=ReleaseSafe` . The executable is located at `zig-out/bin/` .
2022-02-11 01:21:34 +00:00
2022-03-01 02:10:32 +00:00
## Controls
2022-11-01 04:01:29 +00:00
2022-03-01 02:10:32 +00:00
Key | Button
--- | ---
< kbd > X< / kbd > | A
< kbd > Z< / kbd > | B
2022-06-19 03:02:33 +00:00
< kbd > A< / kbd > | L
< kbd > S< / kbd > | R
2022-03-01 02:10:32 +00:00
< kbd > Return< / kbd > | Start
< kbd > RShift< / kbd > | Select
Arrow Keys | D-Pad