This is a prototype gameboy emulator in a very early stage. Progress is slow/nonexistent. Built for education first and performance second. As such accuracy or emulating every part of the console is of no concern currently.
Graphics are done via the FNA library.
- pull this repository via git or download as zip
- follow the steps to include FNA into the project file and copy the .dll files into the output
- you can download the native libs here, the link in the wiki is broken
- Game Boy CPU Instruction Table including some short but helpful explanations: (https://meganesulli.com/generate-gb-opcodes/)
- Game Boy CPU Instruction Table again followed by some basic informations on registers and flags: (https://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html)
- mirror to blarggs test roms: (https://gbdev.gg8.se/files/roms/blargg-gb-tests/)
- excellent documentation of the hardware and how it interacts: (https://problemkaputt.de/pandocs.htm)
- implementation of the graphics: (http://www.codeslinger.co.uk/pages/projects/gameboy/graphics.html)
- there are many more resources. will append as I find and use them
- BGB is accurate so it can to be used for debugging purposes
This is an overview on what's been implemented and what's still left:
- properly mapped memory
- basic rom loading setup
- flags and registers
- cpu loop, instruction fetching, decoding and executing (last two are done at once)
- basic support for interrupts
- basic rendering pipeline (implemented, not working yet)
- testing pipeline. a modified cpu can be injected with opcodes to test flags and registers
- fully implement all opcodes
- render tilemaps and sprite sheets for debugging purposes
- use Dear ImGUI for options and other UI
- memory bank switching
- get through blarggs test roms
- rendering results visible on screen (currently there's nothing visible on screen yet...)
- make sure timings and interrupts work properly...
- play tetris...
- sound (out of scope for the near future)
- replace fixed setting of cycles with dynamically setting it (accessing memory takes 1 cycle per byte, pushing/popping from SP takes 1 cycle per byte, fetching takes 1 byte per fetch)