6 ms·
I wrote a GameBoy emulator for my hobby OS (2022)
- codyd51 3y agoHi HN, author here! The GameBoy emulator written up in this post runs on axle, which is a message-passing microkernel-based OS I’ve been working on for a very long time. dang suggested that I put together a Show HN for axle, which I’d love to do once I have a bit more time to get things into a working-out-of-the-box state! axle is a really fun project for me, and serves as the testing grounds for all kinds of technical experiments. The bore-you-with-features spiel goes something like: x86_64, SMP, UEFI bootloader, TTF rendering, compositing window manager, TCP/IP stack, AHCI driver, custom assembler/linker, and, of course, a GameBoy Emulator! When working on axle, the level of yak shaving can get pretty extreme. For example, when I got around to writing axle’s first network card driver, I was puzzled when my driver could transmit packets fine, but failed to receive any packets. I dug around for quite a while before considering that it might be a QEMU bug, and tracked it all the way to macOS’s incomplete implementation of poll(), which QEMU was relying on! I ended up writing a patch for QEMU to work around it, and, several layers up, was finally able to progress on the network card driver and network stack. This was back in 2021, but I wrote up the journey recently here: https://axleos.com/adding-vmnet-support-to-qemu/ https://axleos.com/adding-vmnet-support-to-qemu/ axle was mostly C-based for a lot of its history, which can get pretty gnarly both in kernel-space and when trying to write higher-level productivity software in userspace. Recently, I’ve been writing a lot more of in Rust, but for the past couple of years that’s been confined to userspace only. When adding SMP support to the kernel, though, I added Rust to the kernel too. It’s really nice. One other fun thing I’ve been working on semi-recently is a homegrown IDE with an assembler/ELF-linker that runs under axle. I found the linker pretty difficult to get right, because a lot of the ELF data need to know the size and locations of other bits of data in the binary, and it’s tough to shake everything into place in a way that has serial data dependencies! It’s immensely gratifying, though, to write some assembly, generate an ELF at runtime, and execute it. I also added some process-monitoring hooks into the kernel while working on this, so the IDE application can monitor the output of the assembler/linker, and show the output of the generated program, all within the GUI. I uploaded a quick demo video of this IDE here: https://www.youtube.com/watch?v=YG9XyzSBUNg https://www.youtube.com/watch?v=YG9XyzSBUNg. This whole shebang (IDE + assembler + linker/ELF binary-packer) is written in Rust. Thanks for reading — I hope you enjoy the post, and let me know if you have any questions!
- sen 3y agoDespite it being so far behind my skill-set it’s not even funny, I absolutely love reading about custom made OSes, so I’m definitely keen to read a write-up on yours.
- chucksmash 3y agoIf you are interested in it, you should dive in. Every OS ever written was written by someone for whom it was beyond their skillset at one point, everybody has to learn.
- p1necone 3y agoWriting an OS sounds like a herculean task, but (depending on feature set) it can actually be a fairly simple thing to get started on.
- keyle 3y agoA lot to digest there. Awesome stuff. Well done!
- qingcharles 3y agoIt's funny - I remember doing pretty much the same thing. I wrote my own GUI OS from scratch in x86 based partially on the following book, in about 1998: https://www.amazon.com/Developing-32-Bit-Operating-System-Cd-Rom/dp/0672306557 https://www.amazon.com/Developing-32-Bit-Operating-System-Cd... And then wrote my own Game Gear emulator for it one night, just for shits and giggles, like you did. It was also my first attempt at writing a whole system emulator, and the GG, like the GB, was incredibly well understood even back then. For anyone interested in emulation I think it is a great little project to write a video game emulator. It is enormously fun to watch one of your favorite video games boot up in code that you wrote. And it is fun (for me) to try and debug all the little glitches where you've made errors or omissions in your emulator.
- bluedino 3y agoSAMS used to come out with some great books.
- legendofbrando 3y agoThis is light years beyond any coding ability I have and was deeply enjoyable to read.
- Gunax 3y agoAbout 10 years ago I tried to write a gameboy emulator based on a pdf document i found on the internet somewhere. I ended up finding the documentation wrong in a handful of places, which made the project tedious. Did you find that document reliable?
- throwaway202351 3y agoNot OP, but if you mean that ~200 page doc, it's pretty good but has some issues and inaccuracies some places, but it might just be me. Some things like how carries are supposed to work in some edge cases, for example, but I think it was written under the assumption that the reader would be familiar with a standard Z80 chip. Something else I noticed was that there were some specs that I guess the gameboy follows, but not exactly. For example with swapping pages, it's supposed to take up to (I forget the actual numbers) 50 cycles, but the actual gameboy always finishes in exactly 38 cycles, and some games are written for that. In the end, what worked for me was finding a working emulator that would output the registers' states every operation, and then making sure mine would match up with it.
- grishka 3y agoA few months ago I also built a GameBoy emulator with the intent of educating myself. It's in Java and uses Swing for the GUI. It also supports sound but its implementation is definitely not ideal. While most of the games I tested are playable, I couldn't get SBC and ADC instructions to work correctly for all cases. I especially have no idea whatsoever how they're supposed to affect the carry flags. Test ROMs aren't very helpful either because the ones I used just ran the instruction with all possible combinations of input parameters, checksummed the results, compared the checksum to the expected value, and said "duh, your thing is wrong". And Googling around wasn't any more helpful. Since most of my childhood games ran fine anyway, I gave up. I'd still like to fix it eventually though. That said, writing a video game system emulator is a tedious but rewarding experience. You just move bytes around and do an unhealthy amount of bit operations, and a game comes out. IMO every software developer should try writing an emulator at some point.
- trollied 3y agoThis should help you: http://www.6502.org/tutorials/vflag.html http://www.6502.org/tutorials/vflag.html
- circuit10 3y agoThat’s for the 6502, the Game Boy uses a Z80 variant
- flatiron 3y agoImagine a 6502 game boy? 3 hours of battery but those spirits would fly. Also imagine a PPU similar to NES. Would have been tons of ports. I’m actually not sure why they didn’t go this route. They didn’t use stock 6502 so repackaging would have been fine.
- circuit10 3y agoIsn’t the 6502 slower?
- 3y ago
- Andrex 3y agoI always upvote everything GB-related on HN. Keep it coming! GB Studio, upvote. Cool people writing their own emus, upvote. Analogue Pocket, upvote. My sincere wish is that one day Nintendo somehow, someway, open up legitimate Game Boy publishing for third-parties again. Release the patents, allow developers the use of the Nintendo logo in the one very very specific place it's necessary to allow GB games to boot, etc. Maybe open sourcing schematics and internal docs. But that's as likely as them releasing a (new) Mario game on PC... For me, the GB is that perfect middle ground between too arcane/simple and too modern/complex (both the design of the games and in the programming required). If the platform were opened, it would be kind of a "forever console." It would obviously not compete with new systems or anything like that, so it would always be pretty niche. It would be a fantastic educational tool to get kids into programming and game design at various levels. Maybe in another 20-30 years...
- thebrid 3y agoYou might be in luck here! In the US, patents last for only 20 years. Since, the Game Boy was released in 1989, any patents are long since expired. Using the Nintendo logo might (NB: Not a Lawyer!) be permissible if it's required for software to run on the hardware. This was a big part of the Sega v. Accolade case.[1] There are still new games being released on cartridge for the original Game Boy. The most recent I'm aware of is Ruby & Rusty last year.[2] [1] https://en.wikipedia.org/wiki/Sega_v._Accolade https://en.wikipedia.org/wiki/Sega_v._Accolade [2] https://www.bitmapsoft.co.uk/product/ruby-rusty-save-the-crows/ https://www.bitmapsoft.co.uk/product/ruby-rusty-save-the-cro...
- DotaFan 3y agoCongratz OP, you persistence is admirable.
- auselen 3y agoAnyone has a project for converting GB roms to something intermediate like llvm-ir or directly to another isa?
- vrglvrglvrgl 3y ago[dead]
- anthk 3y agoThere's a GB emu for Emacs too.