I’ve recently been working on a Gameboy Color emulator in Rust[1], mostly as a learning project, and it has been an absolute blast! I’ve never enjoyed working on a project this much to be honest - it’s very satisfying to gradually see your emulator run games developed for another system, especially if it’s a system you’ve personally used in the past.
In my opinion, the best way to learn how an emulator works is to start writing one. /r/emudev and the emudev Discord (see subreddit sidebar) are a great place to start. The Discord in particular is great: it’s split into channels for each system, and there are a ton of pointers to resources for all systems in the main channel.
As far as consoles go, the typical recommendation is to start with CHIP-8. It’s a straightforward system with a very simple design, which makes it relatively easy to emulate.
Pretty sure the word "emulation" doesn't apply. The Z-Machine never had hardware to be emulated, only a virtual machine to be implemented. Ditto CHIP-8 though.
For emulating a real system, the Gigatron would be relatively simple. The hard part would be the display because it is bit-banged into NTSC.
I agree for older machines this is a great approach. A lot of the challenge is being organized and persistent, powering through all the opcodes and making sure they're accurately implemented. I made a Sega Master System emulator many years ago and it was a fun project.
I do wonder how one takes on modern machines though. It seems like it'd be a completely different ball of wax.
Modern game consoles have a lot of common library / OS system calls that instead of emulating you re-create those calls and make your own implementation with the expected return values. The low level stuff and shader translation aspects are very complicated though.
Oh definitely, writing an emulator for a modern system is an entirely different ballgame. I truly respect the dedication and skill of the people behind large emulator projects like PCSX2 and Dolphin.
> it’s very satisfying to gradually see your emulator run
This does sound like fun. I feel like I’ve had a similar experience in porting and refactoring legacy code, and each successive step forward unlocks more and more cool stuff
I wrote up a series [0] documenting a CHIP-8 emulator I wrote that I hope explains how to get something like this working from the ground up, albeit for a much simpler system.
If you want to get into writing emulators yourself, I'd recommend starting with the CHIP-8. I just wrote one in C# and it was pretty easy, still need to properly handle input and rendering though (I'm currently saving the display output to a bitmap after every draw call)
I am super impressed by the content of this post, but I bet there is also a lot that is going over my head that I am not even aware of.