This Game Boy emulator is entirely written in Java using GenDES.


  • Very lightweight (less than 70 KB for the applet version).
  • Very fast while being accurate (even if video timings are still not correct).
  • Accurate sound generation. As the current implementation uses integration, there cannot be any undersampling artifacts and the processing time is roughly constant and quite low.
  • Simple and optimized video generation. This is a brute force implementation but it is generally faster and much simpler than implementations that use caching for the tile maps. Also, this allows to easily implement per-pixel effects in a future release.
  • Debugging features: a memory editor and a disassembler are available.

Keys for the main window

The following keys work in the main window for all versions (applet or standalone application).

Game Boy buttons:
  • [Up arrow]: Up
  • [Down arrow]: Down
  • [Left arrow]: Left
  • [Right arrow]: Right
  • [E]: A button
  • [R]: B button
  • [D]: Start button
  • [F]: Select button


  • [-]: zoom out
  • [+]: zoom in
  • [*]: change zoom mode


Applet as a standalone application

You can download the applet with the following link:

Click here to download the applet

Under Windows, you can generally run it by double clicking on the .jar file.

To load a cartridge backup, you can drag and drop the file on the screen window.

Applet as a Java Web Start application

You can launch the GenDES based Game Boy emulator as a Java Web Start application by clicking on the following link:

Click here to launch the Java Web Start Application

Standalone application with debugging features

You can download the application with the following link:

Click here to download the stand alone application

It is meant to be a fully featured application but currently many things are still not implemented. It is functional though.

To load a cartridge backup, you can drag and drop the file on the screen window.

Cartridge compatibility

The current implementation (version 0.4) supports most Game Boy and Game Boy Color games.

About every incompatibilities come from the video timings which must be cycle accurate to run all games and demos. These timings must be found by reverse engineering which is very time consuming. But other open source emulators could also be used to find them. Most incompatibilities manifest themselves by:

  • A corrupted display. Because to perform some graphic effects, a lot of games and demos play with the video registers in a way they were not designed for. For example, the current implementation does not support per pixel register update.
  • A hang or a crash. This is because a lot of games expect a very precise order for video events. Most of the time, the game is waiting an event by reading a video register. But with the current implementation, the event happens a very few cycles sooner or later than a real Game Boy so that the game misses the event transition.

Bugs and missing features


  • A hang happens if the emulation is started before powering on the Game Boy.


  • Video timings are not correct. This leads to hangs, crashes or various graphic artifacts with some games.
  • HDMA timings are probably not correct.


  • Some sound glitches can be heard. This is because the current implementation generates sound faster that the sound card consumes it. As a result, we need to drop a frame from time to time. To avoid this, the sound output from the Game Boy must be resampled to fit the real world hardware sound output. We cannot use the sound as the system clock to avoid glitches (this is done this way in most emulators) because GenDES is designed to run simultaneously several devices in the same system.

Communication between 2 Game Boys

  • GenDES allows to simulate simultaneously as many devices as desired but the current implementation of the emulator does not support communication between 2 Game Boys.


  • The disassembler window does not support edition. Writing assembly instructions was planified but it is not finished currently.
  • The hardware window, which should display registers value, is not finished.