
Why did I spend 1.5 months creating a Gameboy emulator? (2017) - tosh
http://blog.rekawek.eu/2017/02/09/coffee-gb/
======
anyfoo
Game Boy emulators are always great for educational or experimental projects,
because the Game Boy platform is surprisingly simple, which leads to a very
quick payoff, and yet very "real" in that the Game Boy was a great commercial
success with thousands of software titles available, so you have plenty of
software available to try in your project and actually make use of that
payoff.

One example to illustrate how simple the Game Boy is: There is no operating
system at all, only a 256 byte boot ROM whose sole purpose is to display the
Nintendo logo from the cartridge and halt if it does not checksum correctly
(for both cartridge integrity and legal reasons).

This entertaining 33c3 talk manages to describe the Game Boy hardware
practically in its entirety (and with some previously unknown details,
actually):
[https://www.youtube.com/watch?v=HyzD8pNlpwI](https://www.youtube.com/watch?v=HyzD8pNlpwI)

~~~
byuu
The Game Boy is only simple in the early stages of emulator development.

You find quickly that it is full of excruciatingly complex edge cases that
aren't documented, and aren't well understood by anyone.

We're still making significant progress to this day on it.

And even in the early stages, the Z80-like Sharp LR35902 is quite a hassle. If
you want an educational project, consider an NES emulator instead. Still has
lots of edge cases, but the documentation and reverse engineering work is far
ahead of the Game Boy.

Some reading if you like:

[https://mgba.io/2017/05/29/holy-grail-bugs/#pinball-
fantasie...](https://mgba.io/2017/05/29/holy-grail-bugs/#pinball-fantasies)

[https://mgba.io/2018/03/09/holy-grail-bugs-revisited/#the-
ph...](https://mgba.io/2018/03/09/holy-grail-bugs-revisited/#the-phantom-of-
pinball-fantasies)

~~~
anyfoo
Sorry, I should have clarified: The Game Boy is very simple in concept and on
a sufficiently high level. But this is exactly what allows you to get payoff
quickly, and why I like it for educational and experimental projects.
Especially earlier games like Tetris don't significantly rely on many edge
cases and implementation details, so even a quick and dirty implementation
runs them reasonably well.

Once you want to do "serious" emulation that runs a wide variety of games and
accurately reproduces them in every spect, things become much less simple and
might also lead you to completely abandon initial approaches, e.g. because
your straightforward but non-cycle accurate CPU main loop doesn't cut it
anymore.

Compare this however with a more modern system that has an MMU, where you have
a long, long road of busywork ahead before you can even get past any
reasonable definition of "booting", whereas for the Game Boy even a shoddy
first draft implementation might at least get you into a game's initial menu
screen, completely with working buttons and all.

And strictly spoken, a conceptually more complex system will have more edge
cases and implementation details to deal with, albeit I think that it often
also means that those implementation details are less exploited, as developers
stay on a higher level and are less trying to squeeze out every last bit of
the "simplistic" hardware.

~~~
anyfoo
And the simple front with the fractal complexity below it also make this more
fun and educational: You can start off easy while still getting good results,
and go arbitrarily deep in perfecting your emulator, choosing from an
apparently still unexhausted variety of interesting problems to solve.

Your links are a good example, I love reading about the complex implementation
details in emulators of superficially simple hardware.

------
t0mek
Hi, it's the blog author here.

I just wanted to write I'm really happy that this post showed up on the HN
front page. It's been more than a year since I wrote the post and from the
time perspective I think it was the most rewarding project I've ever done. It
doesn't matter that there's a plenty of more mature, accurate, user-friendly
emulators - the "journey" was a reward in itself. If you're thinking about
creating your own emulator, I highly recommend it.

~~~
khedoros1
I wrote my own GBC emu about a year after you, and an NES emulator, working on
and off, from about 2008-2014, doing bits at a time. It's amazingly gratifying
when more and more games start working in it.

I'm going into Game Boy Advance now. Even just efficiently decoding ARM
opcodes is an adventure on its own. Different timings and bus widths in
different parts of the memory map....but a large enough map that you don't
have to worry about banking at all. Although I suspect that it's fast enough
that it might start making sense to look at dynarec/jit techniques.

------
nathell
So much of the fun rings true.

I'm reminded of the days I was writing a Z-machine emulator in Haskell [1],
ostensibly as a uni class project but also as a way to teach myself Haskell
and have fun; I had the infrastructure in place and was trying to run Zork,
implementing opcodes, one by one, when finally I saw the familiar message "You
are standing in an open field west of a white house, with a boarded front
door. There is a small mailbox here." The sense of accomplishment was
rewarding and elating.

2004\. Good times.

[1]: [https://github.com/nathell/haze](https://github.com/nathell/haze)

------
kleiba
_" [...] every time I had a few minutes during the day and basically every
evening I felt an irresistable urge to move the emulation a bit forward
[...]"_

Ahh, memories of the good old days... before I got married...

 _" [...] if I have 5 minutes of a spare time, I was trying to fix this weird
GPU or sound bug. I guess it’s not too healthy (especially if you have a
family) [...]"_

Oh, crap, this guy apparently has family, too! Shame on me! :-)

~~~
sundvor
_" Ahh, memories of the good old days... before I got married..."_

Just wait until you have a baby... ;)

~~~
kleiba
Done. And you're right: it didn't exactly help...

------
netrap
Always impressed by people who complete things. I've had terrible luck
actually FINISHING a project. I guess maybe it's ADD... or my interest in
rather boring device drivers and the like. I've been able to modify large
projects with many thousands of lines, but when it comes to write one from
scratch it really is a lot of work. Props!

~~~
wvenable
I've noticed that sometimes when I code for fun there is some tricky puzzle to
solve. Once I've solved the puzzle, the fun is gone, and actually finishing
the project is a lot more like work than fun.

I think I'd probably finish a lot more projects if I wasn't a professional
software developer -- I don't want to work in my free time as well.

~~~
gowld
do you think you don't have enough free time to do boring part hobby work, or
that you don't have enough reason?

There so many things I would do before I'd do something unrewarding.

~~~
wvenable
I was thinking about that in response to the other reply below. I think it's
definitely based on _value_ ; at some point you realize that you'd be happier
doing something else. At work, you don't have the same calculation because it
has to be done and personal rewards are not the only motivation.

I've also found that how intellectually rewarding my day job is (and how much
agency I have) has a direct affect on my hobby development. I have a lot of
creative freedom and interesting projects at work right now so I care less
about coding in my spare time. I only have so much free intellectual energy to
devote to something.

------
jbschirtzinger
I think most projects where a person is trying to learn something such that it
builds on something else are often not understood by a person who is not on
the same path. In the end, the tapestry formed is only understood by the one
doing the journey and then in hindsight it all makes perfect sense.

~~~
duxup
I'm actually cleaning up my GitHub repos at this very moment. So much basic
stuff not really useful to anyone, things that other people clearly have done
many times better. Old messy code, new messy code .... but to me they're
experiences and represent invaluable learning that I've done.

I look at some repo that is a mess, but I remember making widget X work and
how great that felt.

When someone says they created something I always think about what they must
have learned to do that something, and not so much about the actual something.

I get a bit frustrated when folks critique something about "Yeah but this
other thing" and so forth. For me that's almost never the point...

------
Andrex
Kinda-related, but a few months back I started working on a Web wrapper[0] for
a specific GameBoy ROM, Little Sound Dj (LSDj.) See it in action here: [1]

I was able to get the project up and running using a third-party JavaScript
emulator[2], but the library was basically abandoned years ago and the sound
in modern browsers is very... odd. Unfortunately, sound is crucially important
to music creation software like LSDj.

I'm also mystified that there doesn't seem to be a .SAV format that's cross-
compatible between emulators, which is required for basically the entire
purpose of the app. (Users would work on a project online on any device, then
transfer the .SAV to real hardware for recording the tune.)

If anyone has advice on these topics I'd love to talk!

[0] [https://littlewebdj.com/](https://littlewebdj.com/)

[1]
[https://twitter.com/andrewrabon/status/966551415358451712](https://twitter.com/andrewrabon/status/966551415358451712)

[2] [https://github.com/taisel/GameBoy-
Online](https://github.com/taisel/GameBoy-Online)

~~~
nategri
Re: Sound quality: I wonder if you might have more success compiling a more
well-known C (or similar) based emulator down to webasm and running it that
way.

~~~
Andrex
WebASM is definitely the way to go today. Just wish I had the low-level know-
how.

Maybe I should take on the task myself like the OP did...

------
kodablah
> So why did I spend all this time trying to write it? I treated it as a
> programming riddle [...] Maybe because of these results I got quite addicted
> to the project itself [...] I guess it’s not too healthy (especially if you
> have a family), but it also doesn’t happen that often.

I can empathize, I think lots of us have GH profiles littered with projects
we've hit real finish lines on but may not be useful to others. But I actually
think it's healthy, especially if you have a family (assuming it's only your
spare time). It provides sanity and brain maintenance simultaneously. Even
better if you have an employer that doesn't track your every hour and
recognizes the value of these kinds of things on down time.

> Right now I don’t have any obvious ways to move the app forward, so the
> addiction dissipated ;)

Run through
[https://github.com/konsoletyper/teavm](https://github.com/konsoletyper/teavm)
to WASM and abstract graphics calls and what not :-)

~~~
ashleyn
In "science projects" like these, you pay in time to recieve experience. By
day I do Javascript at work, but my work on a passion project resulted in a
wealth of OpenGL and C++ experience. Enough that when I was tapped to do work
on our C backend, I hit the ground running quick.

------
djhworld
Doing it 1.5 months is impressive, it took me almost 6! [1]

I agree with the post that it was a very rewarding (if frustrating) project.
But once you see that Nintendo logo come down the screen for the first time
it's almost like magic.

[1]
[https://github.com/djhworld/gomeboycolor](https://github.com/djhworld/gomeboycolor)

------
middleclick
I don't know where to start with writing an emulator. Any ideas?

~~~
leggomylibro
Ditto - I've been wanting to do one on a small ARM Cortex-M core, but it's
bewildering to even think about where to start.

It seems like people have put together a lot of good documentation for old
systems though, which could at least be a good place to start reading:

[https://problemkaputt.de/gbatek.htm](https://problemkaputt.de/gbatek.htm)

~~~
pjmlp
Try this Assembly tutorial

[https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/](https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/)

It has enough for doing 2D games bare metal on ARM.

And then you can jump into PiFox.

[https://www.raspberrypi.org/blog/pifox-bare-metal-arm-
assemb...](https://www.raspberrypi.org/blog/pifox-bare-metal-arm-assembly-
language-star-fox/)

~~~
leggomylibro
Well I've already gotten simple 2D games working in bare-metal ARM with OLED
and TFT displays, it's more the emulation aspect of things that is
intimidating.

ARM Cortex-M cores are also a bit different from the Application-class
processors used in boards like the Raspberry Pi. They are closer to an Arduino
than a "real computer".

~~~
pjmlp
Yeah, I guess I misunderstood you.

That is how we did 8 and 16 bit coding on home micros back in the day. :)

My favourite SOC is the ESP32, but I guess it already has too much hardware to
emulate and isn't an ARM anyway.

~~~
leggomylibro
Haha, no worries - embedded stuff sometimes feels so confusing that I think I
misunderstand myself most of the time.

Yeah, I've wanted to learn more about the ESP32 - it seems like people have
done some really cool stuff with it and it looks like you get a lot of power
and connectivity.

But I'll bet you can empathize with not having enough hours in the day!

~~~
pjmlp
Yup, my github repo is full of useless, unfinished stuff. :)

------
sgt
This blog made my morning. Started reading about this Gameboy emulator -
really cool project. Then read through a few of his other posts including the
one about resurrecting a Macintosh Plus:
[http://blog.rekawek.eu/2016/12/08/mac-
plus/](http://blog.rekawek.eu/2016/12/08/mac-plus/) Hoping he'll post more
soon.

------
ixtli
> It was also very addicting - every time I had a few minutes during the day
> and basically every evening I felt an irresistable urge to move the
> emulation a bit forward - fix this strange GPU bug, pass one more
> compatibility test or implement one more missing feature.

This resonated strongly with me. I did a study of architectures in college
where i built a bunch of emulators of real and made up chips and fiddling with
the details of an emulator is incredibly engrossing.

------
chaseha
Wario Land 3 was a great game. Hmm, makes me want to find that old GBC I have
lying around somewhere

~~~
qop
Have you played wario land 4?

WL4 is my favorite hand-held platformer of all time. Love that game!

I've played 3 too, but it just didn't get me.

------
djmips
"First I implemented all the Gameboy CPU opcodes. It’s not exactly the Z80,
but it’s pretty close" \- The CPU is close to 8080 which the Z80 is derived
from, so hence the Z80 similarity. However all the main Z80 enhancements are
missing. A+B-B=A

~~~
flohofwoe
The Gameboy CPU looks more like a stripped-down Z80 to me, it doesn't have the
ED, DD and FD extended instruction ranges of the Z80 (most of those aren't
that useful anyway), and the shadow register set is also missing, but the
complete CB instruction range exists (bit twiddling and additional
shift/rotate instructions). Also the relative jump instructions of the Z80 are
there which are redundant NOPs in the 8080 instruction set.

~~~
djmips
I think the missing IX and IY are definitive Z80 instructions. The 'Ultimate
Gameboy talk' has a nice Venn diagram and they tend to agree that the GB is
missing the 'interesting' instructions from the Z80. However the added shifts
etc from Z80 are quite useful. But on the continuum between 8080 to Z80 the
GB80 is closer to 8080

------
apple4ever
I love emulators like this person too. My dream has been to write a TI-85
emulator. I know there is a few out there, but none for the Mac. I used that
calculator a ton in HS, and that's where my love for the Z80 came from.

------
aquova
I've been heavily thinking about making an emulator for a while now, maybe
seeing some of the sources here will motivate me to go through with it.

------
KennyCason
Having written most of a Gameboy emulator I can acknowledge how fun/tedious
they are to write. I now feel motivated to go finish it. :)

------
avilopro
you are amazing for doing that, you did it because there would be many a
people who would appreciate such thing, for that we thank you.

------
baxtr
Is there a good one that works on a smartphone?

------
sytelus
TLDR; for the question in title:

 _I treated it as a programming riddle (or a series of riddles), quite similar
to those you can find on the Project Euler._

------
avilopro
because you are amazing for doing that homeboy! get it

------
qop
Most hackers worth a shit know the answer to the question without even any
context.

It's like a lust to solve a problem. Idk maybe it IS add, I'm there too, but
sometimes there are software problems that just completely captivate me in a
way that nothing else does.

Time melts away, and I'm just typing.

Y'all know that feeling, that 6am,"oh shit I work in three hours but I was
hacking on this project all night and it almost works if I could just get this
thing over here to- Oh, work, real world.... Right."

That mental mode of concentration is elusive and indeed a bit habit forming.
There are moments where I'll be washing my car or cleaning the house and I
have that "I should be in vim right now" thought and the world just seems
grayer and dumber until I survive past it and sit back at my keyboard again.

Said like that, that is weirdly analogous to when I used to drink.

Is programming a drug? Are some addictions healthy?

~~~
tw1010
It's funny how incredibly highly the money and success narrative is emphasized
in the news, and the drug-like high aspect of the work is rarely mentioned.
The truth is that a lot of us would do it (and do do it) for free, and the
high demand aspect of it is to a large extent just a blessing on the side.

~~~
qop
I started for the glory. Refurbishing keygens and writing ddos perl scripts
for irssi.

But the more I learned, the bigger the problems I want to solve, (and create,
in some cases) and that drove me to become more dedicated to the discipline of
it all.

I'm blessed to have the opportunity to do contracts or work a 9-5 with my
skillset, and I can basically live whatever lifestyle I can afford that way.

But yeah, even if I was getting paid 1/5 of what I have now, as long as I can
spend my days browsing through disassembly, outsmarting someone, I'd still
show up.

------
Endy
Next, the OP should try out a real challenge - take the crown of link
emulation away from TGB-Dual.

