Creating a Game Boy Emulator - Part 0
September 18, 2026
When I was a kid I used to have a Game Boy (and later a Game Boy Color), and it was one of my favorite gaming consoles. I spent countless hours playing Link’s Awakening, one of my favorite games in the Zelda franchise.
I no longer have the Game Boy, but it is not hard to find a way to play it. You can either pay for an official Nintendo subscription and play it on their online platform (if you have the Nintendo Switch console), or simply download on of many emulators (and a ROM) online. There are plenty of emulators available for this platform.
So, why am I writing another one? For a couple of reason, the main one being “to have fun”, and writing an emulators can be a lot of fun. You rediscover the design choices and challenges of the original project, while wrestling with your self-imposed constraints. You learn a lot from someone’s else work, but have to throw your own decisions (and watch them stab you back in the future). And, at the end, you have the pleasure of playing your game (for the obvious case of writing a video game emulator) in your own system.
To make a little more interesting I decided to build it from scratch with the rp2350 microcontroller as the target. If you are not familiar, this is a microcontroller from the same Raspberry company that makes the Pi computer boards, but the rp2350 is a bare-bone microcontroller, and we are expected to write code that runs on bare metal, so no OS help here. On paper the specs of the microcontroller should be more than enough for a basic version of the emulator (520 KB SRAM, 150 MHz clock, dual core, 4MB flash in the Pico2 board, but you are free to hook up any FLASH you want if you build your own board). But I’ll be honest here and say that I’ve only made a back-of-the-envelope calculations, so we might encounter some bumps on the road. For example, I have no idea if we will be able to recreate all the audio channels seamlessly without the aid of an external audio chip (I have zero experience with digital audio).
As for the language I’m using for this project, as I’ll be writing bare metal code on a system with limited resources, languages like Python, even on their minimal version for microcontrollers are not a good choice. We need something that gives us a closer control of the hardware (and I’ve not been very happy with Python lately). Pico offers an official SDK for C and C++, with all the bells and whistles, so of course I’ll be using Go via the TinyGo toolchain. I have professed my deep joy of writing code in Go before, so it makes much sense to go ahead and use this most wonderful language where it really belongs: close to the hardware, with minimal overhead (and garbage collector :D ).
Goals
A birds-eye view of my goals here are:
- Run a basic system with Video and controller IO on a PC
- Test case: run the original Tetris
- Run the same system, but now on the rp2350 + screen
- Support extended cartridge capabilities (RAM, game save)
- Repeat, but for Game Boy Color
- Sound
- Dedicated PCB + housing
As you can see, sound is down there at the bottom of the list. I honestly have no idea on what is waiting my on the sound system, but I’m curious.
I’ll do my very first tests and run my first versions on a PC instead, to make my life easier, but all the code has to be written with the microcontroller specs in mind from the beginning.
I hope this will be a fun journey.
Content
Follow my progress from:
- Part 1 - General System Design (coming next)