[q00.gb] – a gameboy emulator, written in C++, with SDL. Pretty accurate, with sound, palettes, savestates, debugging functionality, xbox and playstation controller support, and some other quirks 🙂
Around 7 weeks ago, I wanted to start developing an emulator. But I had absolutely no idea about emulators. I have been using them for years, but never had any idea how they work at all, it was always some kind of magic to me.
So I thought about systems, that could be simple enough for a beginner, and still be something that I care about. That’s why I chose the Nintendo GameBoy, a handheld that got for christmas in 1990, at the age of 5, bundled with Tetris. In the coming years I got a few more games, some that were really something special for me, and that made me spend hours over hours on my Gameboy, at home or in holidays, including:
- Mystic Quest (Final Fantasy Adventure [alt. title])
- Super Mario Land
- Kirby’s Dream Land
- Pinball – Revenge of the Gator
I started researching, and since there are quite a few emulators out there for the Gameboy, it is a well documented machine.
A few of the resources I used throughout the whole development process are:
- GBDev Wiki
- izik’s GB opcode & timing table
- The ultimate Gameboy Talk (CCC talk)
- EmuDev reddit
- EmuDev discord
Research brought me some basic information about the system in general:
// Main RAM: 8K Byte // Video RAM: 8K Byte // Resolution: 160x144 (20x18 tiles) // Max # of Sprites: 40 // Max # of Sprites/line: 10 // Clock speed: 4.194304 MHz
After reading a bit more, and talking to a few guys, I had a rough plan, what needs to be developed:
CPU – (the heart of the emulator)
PPU – (this is what actually displays stuff on our screen)
MMU – (handle memory reads and writes)
SPU/APU – (for me, an emulator without sound is pointless, so of course we need to process sound)
The first step was very clear, I needed to implement a proper functioning, emulated CPU first.