DGen/SDL - Multi‐platform Genesis/Mega Drive Emulator


DGen/SDL is a free, open source emulator for Sega Genesis/Mega Drive systems. DGen was originally written by Dave, then ported to SDL by Joe Groff and Phil K. Hornung in 1998.

Unfortunately, the project was abandoned at least since 2005 and much of its history gone with its original home page.

In 2008, tamentis decided to try to relive DGen/SDL by registering this project on SourceForge and made the source code of the last official release (version 1.23) available through CVS. He also created DGen's logo.

In August 2011, suddenly remembering Streets of Rage, I struggled to find a Mega Drive (Genesis) emulator able to run it on my current setup (Linux/x86_64), as most of them either targeted Windows, were completely written in x86 assembly, or just didn't work for some reason.

Because DGen was my emulator of choice since 2002, I resolved to have a look at the code and make it 64‐bit‐safe myself (only one month later, I found out that some people on some forums already created patches for this purpose). After that and some additional bugfixing, I noticed that tamentis was looking for a new maintainer, so I offered my help along with a bunch of patches and got the position.

DGen isn't the best Mega Drive/Genesis emulator out there, but it works and it's probably the most portable. It's also perfect for command‐line freaks.




You can fetch the last release here:

If you prefer bleeding edge code or want to improve DGen/SDL, use the main git repository instead:


For bugs and feature requests, please use the SourceForge Tracker. Otherwise by e-mail or on IRC. We can be reached on Freenode, in #DGen.

We also have a Twitter account @dgen_emulator .


Documentation can be found in the source tarballs, it's also provided below for reference but may not be as up‐to‐date.


DGEN(1)                   BSD General Commands Manual                  DGEN(1)

     dgen — Sega Genesis/Mega Drive emulator

     dgen [-Pfhmv] [-R (J|U|E)] [-H HZ] [-D DEMONAME] [-d DEMONAME] [-n USEC]
          [-p CODE,CODE...] [-r RCFILE] [-X XFACT] [-Y YFACT] [-S FACT]
          [-g (0|1)] [-G XxY] [-s SLOT] [romname [...]]

     The ROM image in the file romname is executed, as emulated on a Sega Gen‐
     esis or Mega Drive running in 60Hz NTSC mode (unless the -P option is
     specified, in which case 50Hz PAL mode is used).  romname should be in
     raw binary or SMD format, and may be compressed with gzip(1), zip(1), or

     When romname isn't specified, DGen starts without a ROM. It can be loaded
     later from the prompt. When more than a single romname is specified, they
     are executed sequentially.

     The options are as follows:

     -H HZ       Use a custom frame rate, can be used to accelerate or slow
                 down emulation.

     -P          Emulate 50Hz PAL mode (as used in European models of the Mega

     -R (J|U|E)  Emulator region. Without this option, DGen uses the first
                 region mentioned in the ROM header. It should be combined
                 with -P for PAL mode. See below.

                 (none)      Autodetect (NTSC, 60Hz)

                 -P          Autodetect (PAL, 50Hz)

                 -R J        Japan (NTSC, 60Hz)

                 -R J -P     Japan (PAL, 50Hz)

                 -R E        Europe (NTSC, 60Hz, music will certainly play too

                 -R E -P     Europe (PAL, 50Hz)

                 -R U        America (NTSC, 60Hz)

                 -R U -P     Same as -R E -P

     -f          Run fullscreen, if possible.

     -h          Show a brief synopsis of all options.

     -m          MinGW only. This option prevents DGen from detaching from its
                 control console.

     -v          Show the version number, and exit.

                 Play back a demo recorded with the -d option.

     -d DEMONAME
                 Record a demo of the program running, which can be later
                 replayed with the -D switch.

     -n USEC     Sleep for a number of microseconds after every frame, to give
                 time to other processes.

     -p CODE,CODE...
                 Modify the ROM image in memory, using Game Genie or Hex style
                 codes. Game Genie codes are of the form ABCD-EFGH and Hex
                 codes are in the form 123456:ABCD.  To specify more than one
                 code, separate them with commas (do not use spaces).

     -r RCFILE   Parse another rc file after $HOME/.dgen/dgenrc. Values in the
                 specified file override those in the preceding files.

     -X XFACT    Scale the window XFACT times in the X direction. XFACT must
                 be a positive integer.

     -Y YFACT    Scale the window YFACT times in the Y direction. YFACT must
                 be a positive integer.

     -S FACT     Scale the window FACT times in both directions. FACT must be
                 a positive integer.

     -g (0|1)    Enable/disable OpenGL (if compiled-in).

     -G XxY      Desired window size (e.g. 640x480, 800x600, etc.)

     -s SLOT     Load the saved state from the given slot at startup (0-9)

     A minimalist interactive prompt inspired from vi(1) can be used to per‐
     form various operations described below. It is triggered by pressing
     colon (:), the default key. Command-line editing, history and completion
     are supported.

     {quit, exit, q}
           Quit, or load the next romname from command-line, if any.

     {load, open, plug, o} filename
           Load a given ROM filename.

     {unload, close, unplug}
           Unload the current ROM.

     config_load filename
           Load configuration from file filename.

     config_save filename
           Save current configuration to file filename.

           Genesis reset.

     {ctv_push, ctv_pop, ctv_none}
           Manage the stack of Crap TV filters (if compiled-in).

     calibrate number
           Interactive calibration of the specified gamepad (1 or 2). If
           number isn't specified, default to 1.

     unbind binding [...]
           Remove specified bindings (variables prefixed with "bind_").  See
           dgenrc(5) for more information about them.

     vgmdump start filename

     vgmdump stop
           Manages VGM dumping/logging. If the second argument is start VGM
           dumping will be started at the path specified by the third argu‐
           ment.  If the second argument is stop VGM dumping will be stopped
           and the dump finalized.

     All configuration variables from dgenrc(5) can be displayed and modified
     interactively, with immediate effect.

     {int_name, bool_name, key_name, joy_name, ...} {value}
           Affect value to variable name.

     {int_name, bool_name, key_name, joy_name, ...}
           Display current value for variable name.

     $HOME/.dgen/dgenrc        Contains user settings for the emulator.
     $HOME/.dgen/   Generated file containing saved user settings.
     $HOME/.dgen/saves/*       Save states generated by the emulator.
     $HOME/.dgen/ram/*         Battery-backup RAM images, generated by the
                               emulator for ROMs with save RAM.
                               Screenshots are generated there.
     $HOME/.dgen/roms/*        ROMs default search path.
     $HOME/.dgen/demos/*       Demos default search path.

     gzip(1), bzip2(1), zip(1), dgenrc(5)

     This manual page was written by Joe Groff ⟨⟩.
     Updated by zamaz ⟨⟩.

     There are known emulation bugs, see BUGS in DGen source package.

     Report bugs to ⟨⟩.

BSD                              July 26, 2014                             BSD


DGENRC(5)                   BSD File Formats Manual                  DGENRC(5)

     dgenrc — file containing settings for dgen(1)


     The file $HOME/.dgen/dgenrc is parsed by dgen(1) when the emuator is
     started. It is used to set controller keys, as well as other characteris‐
     tics of the emulation. The contents of this file may be overriden with
     the contents of another similarly-formatted file, via the -r commandline

     Each rc file consists of an unlimited number of lines, which each have
     the format 'fieldname = value'. A line may also be a comment, if it
     begins with the hash mark (#) character.

     Each fieldname is prepended by a name, which identifies the type of this

     key_*   A key value. May be set to a key identifier listed in the KEY
             IDENTIFIERS section below.

     joy_*   A joystick/joypad value. May be set to a joystick identifier
             listed in the JOYSTICK IDENTIFIERS section below.

     mou_*   A mouse action. May be set to a mouse identifier listed in the
             MOUSE IDENTIFIERS section below.

     bool_*  A boolean value. "false", "no", and "0" values are taken as
             false, while "true", "yes", and any number except 0 are taken as

     int_*   An integer value, greater than or equal to 0.

     str_*   A string value, can be empty.

     Some fields take special value sets, which are addressed in their respec‐
     tive sections. None of the field names or values are case-sensitive.

     The fields fall under a few basic groups. They are listed below, with
     their default values in brackets ([]):

     All of them can be modified interactively from the prompt, as described
     in dgen(1).

     key_pad1_up [up]

     key_pad1_down [down]

     key_pad1_left [left]

     key_pad1_right [right]

     key_pad1_a [a]

     key_pad1_b [s]

     key_pad1_c [d]

     key_pad1_x [q]

     key_pad1_y [w]

     key_pad1_z [e]

     key_pad1_mode [backspace]

     key_pad1_start [return]
           Map keys to the first Genesis controller. Each of these fields has
           a corresponding "key_pad2" field, to map to the second controller.

     joy_pad1_up [joystick0-axis1-min]

     joy_pad1_down [joystick0-axis1-max]

     joy_pad1_left [joystick0-axis0-min]

     joy_pad1_right [joystick0-axis0-max]

     joy_pad1_a [joystick0-button0]

     joy_pad1_b [joystick0-button3]

     joy_pad1_c [joystick0-button1]

     joy_pad1_x [joystick0-button6]

     joy_pad1_y [joystick0-button4]

     joy_pad1_z [joystick0-button5]

     joy_pad1_mode [joystick0-button9]

     joy_pad1_start [joystick0-button8]
           Map joystick/joypad buttons to the first Genesis controller. Each
           of these fields has a corresponding "joy_pad2" field, to map to the
           second controller.

     bool_joystick [true]
           Use joysticks to emulate the controllers. Note that the keyboard
           keys will still work if this value is set. This field is only
           available if you have joystick support enabled.

     int_mouse_delay [50]
           Number of milliseconds to wait after the last mouse motion event to
           release buttons bound to such events.

     bind_{keysym} action

     bind_{joypad} action

     bind_{mouse} action
           Defines a new keyboard, joystick/joypad or mouse binding to an
           arbitrary action. These variables use the keysym format as defined
           in KEY IDENTIFIERS, the joypad format as defined in JOYSTICK
           IDENTIFIERS, or the mouse format as defined in MOUSE IDENTIFIERS.
           When action is prefixed with "key_", "joy_" or "mou_", it becomes
           an alias to the corresponding variable in CONTROLLERS.  Otherwise,
           it is interpreted as if entered at the prompt, and can be used to
           modify variables or execute commands (see dgenrc(5) for more infor‐
           mation).  No bindings are defined by default.

     bind_"{keysym|joypad|mouse} [{keysym|joypad|mouse} [...]]" action
           Alternate syntax that supports combining several identifiers to
           perform action.  Controller types can be mixed. Identifiers are
           separated by spaces. To avoid syntax errors, spaces must be prop‐
           erly escaped or quoted.

     bool_sound [true]
           Enable the sound subsystem.

     int_soundrate [44100]
           Sound frequency to play at, in hertz (Hz).

     int_soundsegs [8]
           Number of sound segments to use for sound buffering. Lower values
           guarantee low latency. Increment this only if the sound becomes

     int_soundsamples [0]
           Size of the system sound buffer, in samples (samples are the sound
           unit, sound rate is how many of them are played every second).
           Specifying 0 automatically choses the safest value. If you experi‐
           ence sound issues int_soundsegs is unable to solve, try to change
           this. Increasing it will cause noticeable audio lag (it is unfortu‐
           nately often required on slower machines).

     int_volume [100]
           Volume level, in percent. Values above 100 cause distorsion.

     key_volume_inc [=]

     key_volume_dec [-]

     joy_volume_inc []

     joy_volume_dec []

     mou_volume_inc []

     mou_volume_dec []
           Bindings for volume control.

     bool_mjazz [false]
           MJazz option - puts 2 more FM chips in the Megadrive for a sort of
           22 channel sound boost. Can sound good. Slows things down a lot.

     int_depth [0]
           Color depth (bits per pixel). Allowed values are 0 (automatic), 8,
           15, 16, 24 and 32. Ignored in OpenGL mode.

     int_width [-1]

     int_height [-1]
           Desired window width and height.

     bool_opengl [true]
           Use the OpenGL renderer, if it is available.

     bool_opengl_stretch [true]
           Let OpenGL stretch the screen.

     bool_opengl_linear [true]
           Use GL_LINEAR for textures filtering instead of GL_NEAREST.

     bool_opengl_32bit [true]
           Use 32 bit textures. They require more memory but are usually
           faster than 16 bit textures.

     bool_opengl_square [false]
           Use square textures. Wastes a lot of memory but may solve OpenGL
           initialization failures.

     bool_fullscreen [false]
           Try to run fullscreen, if possible.

     int_scale [-1]

     int_scale_x [-1]

     int_scale_y [-1]
           Amount by which to scale the rendered screen from the default reso‐
           lution. See scaling filters.

     bool_aspect [true]
           Retain original aspect ratio when resizing window.

     key_fullscreen_toggle [alt-enter]

     joy_fullscreen_toggle []

     mou_fullscreen_toggle []
           Button to toggle fullscreen mode (this may do nothing if SDL
           doesn't support fullscreen toggling on your platform.)

     int_info_height [-1]
           Height of the text area at the bottom of the screen, in pixels.
           This also affects the font size. Values smaller than the minimum
           font size make DGen redirect text to stdout instead. The default
           value of -1 makes DGen choose the proper height.

     bool_fps [false]
           Display the current number of frames per second.

     bool_buttons [false]
           Display pressed buttons. Can be used to help configuring them.

     bool_swab [false]
           Swap bytes in the video output. Sometimes useful when video output
           is located on a different system. This is implemented as a CTV fil‐
           ter which must be compiled-in to work.

     bool_doublebuffer [true]
           Toggle double buffering. Enabling this should prevent screen tear‐
           ing from happening. Disabling this may improve the number of dis‐
           played frames per second on some systems.

     bool_screen_thread [false]
           When enabled, a separate thread is created to offload the display‐
           ing of frames. This is only useful on slower machines where flip‐
           ping video buffers takes time, especially when V-sync is enabled
           and doing so blocks until the next frame without consuming CPU time
           (sometimes the case when bool_doublebuffer is enabled). This cur‐
           rently has no effect when OpenGL is enabled and only works if
           multi-threading support is compiled-in.

     key_slot_X [X]

     joy_slot_X []

     mou_slot_X []
           Sets the current save-state slot to number X.

     key_slot_next [f8]

     joy_slot_next []

     mou_slot_next []
           Switch to the next save-slot.

     key_slot_prev [f7]

     joy_slot_prev []

     mou_slot_prev []
           Switch to the previous save-slot.

     key_save [f2]

     joy_save []

     mou_save []
           Saves state to the current slot.

     key_load [f3]

     joy_load []

     mou_load []
           Loads state from the current slot.

     key_fix_checksum [f1]

     joy_fix_checksum []

     mou_fix_checksum []
           Fixes the checksum value. Some older games will freeze with a red
           screen if the ROM has been hacked or modified with Game Genie
           codes. If it does, pressing this, and resetting should fix the

     key_quit [escape]

     joy_quit []

     mou_quit []
           Exit DGen or switch to the next ROM on the command-line.

     key_craptv_toggle [f5]

     joy_craptv_toggle []

     mou_craptv_toggle []
           Toggles Crap-TV image filters. These filters aren't available in 8
           bpp mode.

     key_scaling_toggle [f6]

     joy_scaling_toggle []

     mou_scaling_toggle []
           Toggles scaling algorithms. See scaling_startup below.

     key_reset [tab]

     joy_reset []

     mou_reset []
           Restart the Genesis emulation.

     key_cpu_toggle [f11]

     joy_cpu_toggle []

     mou_cpu_toggle []
           Switch CPU emulators. The x86 assembly CPU emulator StarScream is
           fast, but has glitches which affect a few games. Switching to the
           slower Musashi core will fix these problems, at a speed penalty.

     key_z80_toggle [f10]

     joy_z80_toggle []

     mou_z80_toggle []
           Switch Z80 emulators. MZ80 is a bit faster than CZ80, particularly
           in its assembly version (only available for x86), but CZ80 works
           with more games. This key can also disable Z80 emulation.

     key_stop [z]

     joy_stop []

     mou_stop []
           Pause emulation, so you can concentrate on real life for a few sec‐
           onds. :)

     key_game_genie [f9]

     joy_game_genie []

     mou_game_genie []
           Enter a Game Genie or Hex code. This key also works in stopped

     key_screenshot [f12]

     joy_screenshot []

     mou_screenshot []
           Take a screenshot. Not available in 8 bpp mode.

     key_prompt [:]

     joy_prompt []

     mou_prompt []
           Pause emulation and display interactive prompt. Also works in
           stopped mode.

     key_debug_enter [`]

     joy_debug_enter []

     mou_debug_enter []
           Break into the debugger. Only meaningful if debugger support is

     int_hz [60]
           Video refresh rate. The default is 60 as in NTSC consoles.

     bool_pal [false]
           When true, a PAL console is emulated. This should be used in combi‐
           nation with int_hz above for 50Hz emulation.

     region [' ']
           U for America (NTSC), E for Europe (PAL), J for Japan (NTSC), X for
           Japan (PAL), or empty space for autodetection (the default).  Over‐
           rides bool_pal and int_hz.

     str_region_order [JUEX]
           Regions DGen is allowed to emulate when autodetection is enabled,
           ordered by preference.

     emu_m68k_startup [musa]
           Useful when both Musashi and StarScream are compiled-in. This
           option selects the default emulator to use ("musa" for Musashi,
           "star" for StarScream, "none" for neither). See key_cpu_toggle.

     emu_z80_startup [cz80]
           Useful when both CZ80 and MZ80 are compiled-in. This option selects
           the default emulator to use ("cz80", "mz80" or "none", if you want
           to disable it altogether). See key_z80_toggle.

     bool_autoload [false]
           Automatically load the saved state from slot 0 when DGen starts.

     bool_autosave [false]
           Automatically save the saved state to slot 0 upon exit. Setting
           both of these fields true, you can exit DGen, and automatically
           start a game where you left off when you start it again.

     bool_autoconf [true]
           Automatically dump the current configuration to before
           exiting. This file is always loaded before dgenrc at startup.

     bool_frameskip [true]
           Automatically skip frames, when it is necessary to maintain proper
           emulation speed. You may want to disable sound or set int_nice to a
           nonzero value when setting this to false.

     int_nice [0]
           If set to a non-zero value, DGen will call usleep(3) with the spec‐
           ified parameter after rendering each frame. This will slow the pro‐
           gram down (if it is running too fast on your computer), and allow
           the operating system to reclaim some CPU time.

     ctv_craptv_startup [off]
           CTV filter to use by default. Available filters are "blur", "scan‐
           line", "interlace" and "swab".

     scaling_startup [stretch]
           Scaler to use when display resolution is larger than original
           screen.  Available filters are "stretch", "scale", "hqx", "hqx
           stretch", "scale2x", "scale2x stretch" and "none".

     bool_show_carthead [false]
           Show cartridge header info at startup.

     bool_raw_screenshots [false]
           Generate unfiltered screenshots.

     str_rom_path ["roms"]
           Directory where DGen should look for ROMs by default. It's relative
           to DGen's home directory, unless an absolute path is provided.

     bool_vdp_hide_plane_a [false]

     bool_vdp_hide_plane_b [false]

     bool_vdp_hide_plane_w [false]

     bool_vdp_hide_sprites [false]
           Hide various planes during frame rendering. Require VDP debugging
           to be compiled-in.

     bool_vdp_sprites_boxing [false]

     int_vdp_sprites_boxing_fg [0xffff00] (yellow)

     int_vdp_sprites_boxing_bg [0x00ff00] (green)
           Toggle sprites boxing and configure its colors. Require VDP debug‐
           ging to be compiled-in. "fg" is for sprites with the high priority
           bit set, "bg" is for the others. Color format is 0xRRGGBB.

     See the file "sample.dgenrc" in the DGen/SDL distribution.

     A key identifier can have the prefixes "shift-", "ctrl-", "alt-" and
     "meta-", or any combination thereof, to require that the specified modi‐
     fier be pressed in combination with the key. For example, the identifier
     "alt-enter" would correspond to holding down the Alt key while pressing

     The "shift-" modifier only works with keys that don't generate symbols
     (such as arrow keys). Otherwise their UTF-8 representation must be used

     The numbers "0" through "9" ("kp_0" through "kp_9" for the numeric key‐
     pad), letters "A" through "Z", and function keys "F1" through "F12" map
     to their key equivalents.  In addition, the following identifiers map to
     their similarly-labeled key counterparts. Identifiers on the same line
     map to the same key:

           capslock        caps_lock
           lshift          shift_l
           rshift          shift_r
           lctrl           ctrl_l
           lmeta           meta_l
           lalt            alt_l
           ralt            alt_r
           rmeta           meta_r
           rctrl           ctrl_r
           return          enter

           scrollock       scroll_lock
           numlock         num_lock

           page_up         pageup
           page_down       pagedown

           kp_pageup       kp_page_up
           kp_pagedown     kp_page_down
           kp_delete       kp_period


     Like key identifiers, joystick (or joypad) identifiers describe a joy‐
     stick event. Each detected joystick is numbered starting from 0. Three
     different event types are supported.

     Buttons: joystickX-buttonY
           For joystick/joypad number X, button number Y. "button" can be
           abbreviated as "b".

     Axes: joystickX-axisY-min, joystickX-axisY-max
           For joystick/joypad number X, axis number Y, and its position,
           which is either "min" (also "n", "negative") or "max" (also "p",
           "positive"). "axis" can be abbreviated as "a".

     Hats: joystickX-hatY-{direction}
           For joystick/joypad number X, hat number Y and direction. "hat" can
           be abbreviated as "h". Possible directions are "up", "right",
           "down", "left".

     These identifiers describe a mouse event. Each detected mouse is numbered
     starting from 0. Two different event types are supported.

     Buttons: mouseX-buttonY
           For mouse number X, button number Y. "button" can be abbreviated as

     Motions: mouseX-{direction}
           For mouse number X and direction. Possible directions are "up",
           "right", "down", "left".


     This manual page was written by Joe Groff ⟨⟩.
     Updated by zamaz ⟨⟩.

BSD                              July 26, 2014                             BSD