The parent link is Super Mario Bros running fullscreen. It runs best in FF4, the audio in Chrome can be a little choppy. It will suck in FF3.6 and everything else, probably. It uses the (very) experiemental Web Audio API in webkit and the Audio Data API in FF4; it has a fallback to standard HTML5 Audio(), which has known performance issues everywhere.
Nice work! As it stands, you seem to be doing pure interpretation for the CPU; have you considered dynamic recompilation? You can see this in practice for the 6502 here: https://github.com/daeken/Dyna6502Asm
In essence, you accumulate instructions in basic blocks and turn them into functions, which are then 'executed' (meaning turned into function objects) and then cached. In your case it becomes a little more complex as you do cycle timing, interrupts, etc, but there's no reason you can't bake this into your basic block functions. This drastically increases the performance of CPU emulation, while maintaining the same high quality.
If you're interested in doing this and/or have any questions, feel free to contact me.
Ah, my apologies -- thought that the OP was the original creator.
So, in effect what you do is take your code from `GameBoyCore.prototype.executeIteration' and roll that into your dynarec'd function on a per-instruction basis. The simpler you can make it, the better for performance; you have the benefit of knowing how long each instruction will take to execute at dynarec-time, so you can do some fun optimizations there.
Dynarec'ing cycle-accurate code is hard, but it's a lot of fun and damn efficient if you get it right.
HTML5 audio in Chrome is not at a point where it can be used for game sound effects yet. Rewinding and restarting a sound doesn't work consistently, and creating new Audio() objects too quickly crashes the tab. FF4 is great, though. Star my Chromium bug reports if you want this fixed. http://bit.ly/g9KJNzhttp://bit.ly/hSXvOj
Without criticism of this particular project or site intended, I am surprised at the number of these emulation sites running commercial ROMs popping up without action being taken by Nintendo et al. Someone's going to have an example made out of them.
grantg, if you're just trying to show off an emulator but aren't ready to be the example, may I suggest finding a free Gameboy game to show off instead? I know there are actually-free games for many other consoles, I presume there are for the gameboy as well.
Try going to about:flags and enabling web audio (if you have that option.). Doing so will allow you to use native audio instead of data uri generation in real time. Kind of like mozAudio, but for webkit.
I took it down because the others posting about potential problems are right, so in order to use the emulator go to http://www.grantgalitz.org/gameboy/ and load in your OWN ROM files. Before I was providing the for you, but due to legalities, I am forcing you to provide your own. I didn't get a takedown notice, but I definitely don't want to get one, sorry for the inconvenience. :P
Too bad webkit browsers don't allow to turn off image smoothing like Firefox does, which makes true pixel art impossible. I'd love to see support for nearest-neighbor resampling included in the future versions of Chrome/Safari.
I removed these pages because others here were right, in that I shouldn't be providing the ROMs, but the users themselves instead providing them. You can still use the emulator, just go to http://www.grantgalitz.org/gameboy/ and load in your own ROM files.
A Hacker News user created some cool tech and opened it up. How is this not something interesting to hackers? Not to mention that the rules say that you should simply flag articles you don't believe belong, not complain about it.