{"id":28757527,"url":"https://github.com/libretro/blastem","last_synced_at":"2025-06-17T03:11:02.027Z","repository":{"id":41259762,"uuid":"178939953","full_name":"libretro/blastem","owner":"libretro","description":"Upstream tracking repo of BlastEm, the fast and accurate Genesis emulator, with libretro specific changes","archived":false,"fork":false,"pushed_at":"2022-07-26T03:42:47.000Z","size":3490,"stargazers_count":48,"open_issues_count":16,"forks_count":22,"subscribers_count":13,"default_branch":"libretro","last_synced_at":"2024-06-21T11:45:26.202Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://www.retrodev.com/blastem/","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/libretro.png","metadata":{"files":{"readme":"README","changelog":"CHANGELOG","contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-04-01T20:15:03.000Z","updated_at":"2024-05-21T00:35:15.000Z","dependencies_parsed_at":"2022-08-10T05:41:21.632Z","dependency_job_id":null,"html_url":"https://github.com/libretro/blastem","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/libretro/blastem","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libretro%2Fblastem","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libretro%2Fblastem/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libretro%2Fblastem/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libretro%2Fblastem/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/libretro","download_url":"https://codeload.github.com/libretro/blastem/tar.gz/refs/heads/libretro","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libretro%2Fblastem/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260281856,"owners_count":22985633,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-17T03:11:01.809Z","updated_at":"2025-06-17T03:11:02.014Z","avatar_url":"https://github.com/libretro.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"BlastEm 0.6.0\n-------------\n\nInstallation\n------------\n\nExtract this archive to a directory of your choosing.\n\nNOTE: Prior to version 0.4.1, BlastEm was still using Unixy locations for config\nand save files. If you're upgrading from a previous version on Windows, you will\nneed to move them manually. For config files, the relevant paths are in the\nprevious paragraph. For save files, move all the directories found in \n%userprofile%\\.local\\share\\blastem to %localappdata%\\blastem\n\nUsage\n-----\n\nThis version of BlastEm has a GUI that allows access to most configuration options.\nSimply start BlastEm without passing a ROM filename on the command line to access\nthe main menu. You can also access the menu by hitting the button mapped to the ui.exit\naction (default Esc).\n\nIf Open GL is disabled or unavaible, or you explicitly request it, the old ROM-based UI\nwill be used instead. This UI does not support configuration so you will need to modify\nthe configuration file manually if you use it. See the rest of this README for instructions\non modifying the configuration file.\n\nSome operations are currently only supported through the command line. To get a\nlist of supported command line options on Linux or OSX type:\n\n    ./blastem -h\n    \nFrom within your BlastEm directory. On Windows type:\n    \n    blastem.exe -h\n    \nLock-On Support\n---------------\n\nThis version of BlastEm has some preliminary support for Sonic \u0026 Knuckles lock\non technology. This is available via both the menu and the command line. To use\nit from the menu, first load Sonic \u0026 Knuckles normally. Enter the menu (mapped\nto the Escape key by default) and select the \"Lock On\" option to select a ROM\nto lock on. The system will then reload with the combined game. To use it from\nthe command line, specify the Sonic \u0026 Knuckles ROM as the primary ROM and\nspecify the ROM to be locked on using the -o option. As an example:\n\n    ./blastem ~/romz/sonic_and_knuckles.bin -o ~/romz/sonic3.bin\n    \nPlease note that Sonic 2 lock-on does not work at this time.\n\nConfiguration\n-------------\n\nConfiguration is read from the file at $HOME/.config/blastem/blastem.cfg on\nUnix-like systems and %localappdata%\\blastem\\blastem.cfg if it exists.\nOthwerise it is read from default.cfg from the same directory as the BlastEm\nexecutable. Sections are denoted by a section name followed by an open curly \nbracket, the section's contents and a closing curly bracket. Individual\nconfiguration values are set by entering the value's name followed by a space\nor tab and followed by the desired value.\n\nBindings\n--------\n\nThe keys subsection of bindings maps keyboard keys to gamepad buttons or UI\nactions. The key name goes on the left and the action is on the right.\nMost keys are named for the character they produce when pressed. For keys that\ndon't correspond to a normal character, check the list below:\n\n  Name       | Description\n  -----------------\n  up           Up arrow\n  down         Down arrow\n  left         Left arrow\n  right        Right arrow\n  space\n  tab\n  backspace    Backspace on PC keyboards, Delete on Mac keyboards\n  esc\n  delete\n  lshift       Left shift\n  rshift       Right shift\n  lctrl        Left control\n  rctrl        Right control\n  lalt         Left alt on PC keyboards, Option on Mac keyboards\n  ralt         Right alt on PC keyboards, Option on Mac keyboards\n  home\n  end\n  pageup\n  pagedown\n  f1\n  f2\n  f3\n  f4\n  f5\n  f6\n  f7\n  f8\n  f9\n  f10\n  f11\n  f12\n  select\n  play\n  search\n  back\n\nThe pads subsection is used to map gamepads and joysticks. Gamepads that are\nrecognized, can have their buttons and axes mapped with semantic names. \nXbox 360, PS4 and PS3 style names are supported. Unrecognized gamepads can be \nmapped using numeric button and axis ids. The following button names are\nrecognized by BlastEm:\n\ta, cross\n\tb, circle\n\tx, square\n\ty, trinagle\n\tstart, options\n\tback, select, share\n\tguide\n\tleftbutton, l1\n\trightbutton, r1\n\tleftstick, l3\n\trightstick, r3\nThe following axis names are recognized by BlastEm:\n\tleftx\n\tlefty\n\trightx\n\trighty\n\tlefttrigger, l2\n\trighttrigger, r2\n\t\n\nThe mice subsection is used to map mice to emulated Mega/Sega mice. The default\nconfiguration maps both the first and second host mice to the first emulated\nmouse. This should not need modification for most users.\n\nOne special mapping deserves a mention. By default, the 'r' key is mapped to\nui.release_mouse. When operating in windowed mode the mouse has a capture\nbehavior. Mouse events are ignored until you click in the window. The mouse\nwill then be \"captured\" and the cursor will be both made invisible and locked\nto the window. The ui.release_mouse binding releases the mouse so it can be\nused normally.\n\nUI Actions\n----------\n\nThis section lists the various \"UI\" actions that can be triggered by a key or\ngamepad binding.\n\nui.release_mouse             Releases the mouse if it is currently captured\nui.plane_debug               Toggles the VDP plane debug view\nui.vram_debug                Toggles the VDP VRAM debug view\nui.cram_debug                Toggles the VDP CRAM debug view\nui.compositing_debug         Toggles the VDP compositing debug view\nui.vdp_debug_mode            Cycles the mode/palette of the VDP debug view\n                             that currently has focus\nui.enter_debugger            Enters the debugger for the main CPU of the\n\t\t\t\t\t\t\t currently emulated system\nui.screenshot                Takes an internal screenshot\nui.exit                      Returns to the menu ROM if currently in a game\n                             that was launched from the menu. Exits otherwise\nui.save_state                Saves a savestate to the quicksave slot\nui.set_speed.N               Selects a specific machine speed specified by N\n                             which should be a number between 0-9. Speeds are\n                             specified in the \"clocks\" section of the config\t\t\t\t\nui.next_speed                Selects the next machine speed\nui.prev_speed                Selects the previous machine speed\nui.toggle_fullscreen         Toggles between fullscreen and windowed mode\nui.soft_reset                Resets a portion of the emulated machine\n                             Equivalent to pushing the reset button on the\n                             emulated device\nui.reload                    Reloads the current ROM from a file and performs\n                             a hard reset of the emulated device\nui.sms_pause                 Triggers a press of the pause button when in SMS\n                             mode\nui.toggle_keyboard_captured  Toggles the capture state of the host keyboard\n                             when an emulated keyboard is present\n\t\t\nIO\n--\n\nThis section controls which peripherals are attached to the emulated console.\nIO assignments can be overridden by the ROM database when appropriate. For\ninstance, games with mouse support can automatically use the mouse and games\nthat only support 3-button pads can automatically force an appropriate pad.\nUnforunately, the ROM database is not yet exhaustive so manual configuration\nmay be needed here in some cases.\n\nVideo\n-----\n\nThe video section contains settings that affect the visual output of BlastEm.\n\n\"aspect\" is used to control the aspect ratio of the emulated display. The\ndefault of 4:3 matches that of a standard definition television.\n\n\"width\" is used to control the window width when not in fullscreen mode.\n\n\"height\" is used to control the window height when not in fullscreen mode. If\nleft unspecified, it will be calculated from \"width\" and \"aspect\".\n\n\"vertex_shader\" and \"fragment_shader\" define the GLSL shader program that\nproduces the final image for each frame. Shaders can be used to add various\nvisual effects or enhancements. Currently BlastEm only ships with the default\nshader and a \"subtle\" crt shader. If you write your own shaders, place them in \n$HOME/.config/blastem/shaders and then specify the basename of the new shader\nfiles in the \"vertex_shader\" and \"fragment_shader\" config options. Note that\nshaders are not available in the SDL fallback renderer.\n\n\"scanlines\" controls whether there is any emulation of the gaps between display\nlines that are present when driving a CRT television with a 240p signal. This\nemulation is very basic at the moment so this option is off by default.\n\n\"vsync\" controls whether the drawing of frames is synchronized to the monitor\nrefresh rate. Valid values for this setting are \"off\", \"on\" and \"tear\". The\nlatter will attempt to use the \"late tear\" option if it's available and normal\nvsync otherwise. Currently it's recommended to leave this at the default of\n\"off\" as it may not work well with the default \"audio\" sync method and the\n\"video\" sync method will automatically enable \"vsync\". See \"Sync Source and\nVSync\" for more details.\n\n\"fullscreen\" controls whether BlastEm starts in fullscreen or windowed mode.\nThis can be overridden on the command line with the -f flag. If fullscreen\nis set to \"off\", -f will turn it on. Conversely, if fullscreen is set to \"on\"\nin the config, -f will turn it off.\n\n\"gl\" controls whether OpenGL is used for rendering. The default value is on.\nIf it is set to off instead, the fallback renderer which uses SDL2's render API\nwill be used instead. This option is mostly useful for users on hardware that\nlacks OpenGL 2 support. While BlastEm will fall back automatically even if gl\nis set to on there will be a warning. Disabling gl eliminates this warning.\n\n\"scaling\" controls the type of scaling used for textures in both the GL and\nSDL renderers. Valid values are \"nearest\" and \"linear\". Note that shaders also\nimpact how pixels are scaled.\n\nThe \"ntsc\" and \"pal\" sub-sections control overscan settings for the emulated\nvideo output for NTSC and PAL consoles respectively. More details are available\nin the Overscan section.\n\nOverscan\n--------\n\nAnalog televisions generally don't display the entirety of a video frame. Some\nportion is cropped at the edges of the display. This is called overscan.\nUnfortunately, the amount of cropping performed varies considerably and is even\nadjustable on many TV sets. To deal with this, BlastEm allows overscan to be\ncustomized.\n\nOverscan values are specified in the \"ntsc\" and \"pal\" sub-sections of the\n\"video\" section of the config file. The \"overscan\" sub-section contains four\nsettings for specifying the number of pixels cropped on each side of the\ndisplay: \"top\", \"bottom\", \"left\" and \"right\".\n\nThe default settings hide the horizontal border completely for both NTSC and\nPAL consoles. For the vertical borders, the NTSC overscan settings are chosen\nto give square pixels with the default aspect ratio of 4:3. For PAL, the\ndefault settings are set so that the PAL-exclusive V30 mode will produce a\nvisible border that is the same size as what is shown in V28 mode in NTSC. This\nresults in a slightly squished picture compared to NTSC which is probably\nappropriate given that a PAL display has more lines than an NTSC one.\n\nAudio\n-----\n\nThe audio section contains settings that affect the audio output of BlastEm.\n\n\"rate\" selects the preferred sample rate for audio output. Your operating\nsystem may not accept this value in which case a different rate will be chosen.\nThis should generally be either the native sample rate of your sound card or an\nintegral divisor of it. Most modern sound cards have a native output rate that\nis a multiple of 48000 Hz so the default setting should work well for most users.\n\n\"buffer size\" controls how large of a buffer uses for audio data. Smaller values\nwill reduce latency, but too small of a value can lead to dropouts. 512 works\nwell for me, but a higher or lower value may be more appropriate for your system.\n\n\"lowpass_cutoff\" controls the cutoff, or knee, frequency of the RC-style\nlow-pass filter. The default value of 3390 Hz is supposedly what is present in\nat least some Genesis/Megadrive models. Other models reportedly use an even\nlower value.\n\n\"gain\" specifies the gain in decibels to be applied to the overall output.\n\n\"fm_gain\" specifies the gain to be applied to the emulated FM output before\nmixing with the PSG.\n\n\"psg_gain\" specifies the gain to be applied to the emulated PSG output before\nmixing with the FM chip.\n\n\"fm_dac\" controls the characteristics of the DAC in the emulated FM chip. If\nthis is set to \"linear\", then the DAC will have precise linear output similar\nto the integrated YM3438 in later Gen/MD consoles. If it is set to \"zero_offset\",\nthere will be a larger gap between -1 and 0. This is commonly referred to as the\n\"ladder effect\". This will also cause \"leakage\" on channels that are muted or\npanned to one side in a similar manner to a discrete YM2612.\n\n\nClocks\n------\n\nThe clocks section contains settings that affect how fast things run.\n\n\"m68k_divider\" describes the relationsip between the master clock (which is\n53693175 Hz for NTSC mode and 53203395 Hz for PAL mode). The default value of 7\nmatches the real hardware. Set this to a lower number to overclock the 68000\nand set it to a higher number to underclock it.\n\n\"max_cycles\" controls how often the system is forced to synchronize all\nhardware. BlastEm generally uses a sync on demand approach to synchronizing\ncomponents in the system. This can provide perfect synchronization for most\ncomponents, but since the Z80 can steal cycles from the 68000 at unpredictable\ntimes 68000/Z80 synchronization is imperfect. The default value of 3420\ncorresponds to the number of master clock cycles per line. Larger numbers may\nproduce a modest performance improvement whereas smaller numbers will improve\n68000/Z80 synchronization.\n\n\"speeds\" controls the speed of the overall emulated console at different\npresets. Preset 0 is the default speed and should normally be set to 100. The\nother presets enable the slow/turbo mode functionality.\n\nUI\n--\n\nThe UI section contains settings that affect the user interface.\n\n\"rom\" determines the path of the Genesis/Megadrive ROM that implements the UI.\nRelative paths will be loaded relative to the BlastEm executable.\n\n\"initial_path\" specifies the starting path for the ROM browser. It can contain\nthe following special variables: $HOME, $EXEDIR. Additionally, variables\ndefined in the OS environment can be used.\n\n\"remember_path\" specifies whether BlastEm should remember the last path used in\nthe file browser. When it is set to \"on\", the last path will be remembered and\nused instead of \"initial_path\" in subsequent runs. If it is set to \"off\", \n\"initial_path\" will always be used.\n\n\"screenshot_path\" specifies the directory \"internal\" screenshots will be saved\nin. It accepts the same special variables as \"initial_path\".\n\n\"screenshot_template\" specifies a template for creating screenshot filenames.\nIt is specified as a format string for the C library function strftime\n\n\"save_path\" specifies the directory that savestates, SRAM and EEPROM data will\nbe saved in for a given game. It can contain the following special variables:\n$HOME, $EXEDIR, $USERDATA, $ROMNAME. Like \"initial_path\" it can also reference\nvariables from the environment.\n\n\"extensions\" specifies the file extensions that should be displayed in the file\nbrowser.\n\n\"state_format\" specifies the preferred format for saving save states. Valid\nvalues are \"native\" (the default) and \"gst\". \"native\" save states do a better\njob of preserving the state of the emulated system, but \"gst\" save states are\ncompatible with other emulators like Kega and Gens. This setting has no effect\nfor systems other than the Genesis/Mega Drive\n\nPath Variables\n--------------\n\nThis section explains the meaning of the special path variables referenced\nin the previous section.\n\n$HOME      The home directory of the current user. On most Unix variants, it\n           will be a subdirectory of /home. On Windows it will typically be a \n           subdirectory of C:\\Users\n$EXEDIR    The directory the BlastEm executable is located in\n$USERDATA  This is an OS-specific path used for storing application specific\n           user data. On Unix variants, it will be  $HOME/.local/share/blastem\n           On Windows it will be %LOCALDATA%/blastem\n$ROMNAME   The name of the currently loaded ROM file without the extension\n\nSystem\n------\n\n\"ram_init\" determines how the RAM in the emulated system is initialized. The\ndefault value of \"zero\" will cause all RAM to be zeroed out before the system\nis started. Alternatively, \"random\" can be used to initialize RAM with values\nfrom a pseudo-random number generator. This option is mostly useful for\ndevelopers that want to debug initialization issues in their code.\n\n\"default_region\" determines the console region that will be used when region\ndetection fails and when there are multiple valid regions. The default of 'U'\nspecifies a 60Hz \"foreign\" console.\n\n\"sync_source\" controls whether BlastEm uses audio or video output to control\nexecution speed. \"video\" can provide a smoother experience when your display\nhas a similar refresh rate to the emulated system, but has some limitations\nin the current version. The default value is \"audio\".\n\n\"megawifi\" enables or disables support for MegaWiFi cart emulation. MegaWiFi\nis a cartridge that contains WiFi hardware for network functionality. Enabling\nthis means that ROMs potentially have access to your network (and the internet)\nwhich obviously has security implications. For this reason, it is disabled by\ndefault. If you wish to try out MegaWiFi emulation, set this to \"on\". Note that\nthe support for MegaWiFi hardware is preliminary in this release.\n\nDebugger\n--------\n\nBlastEm has an integrated command-line debugger loosely based on GDB's\ninterface. The interface is very rough at the moment. Available commands in the\n68K debugger are:\n    b ADDRESS            - Set a breakpoint at ADDRESS\n    d BREAKPOINT         - Delete a 68K breakpoint\n    co BREAKPOINT        - Run a list of debugger commands each time\n                           BREAKPOINT is hit\n    a ADDRESS            - Advance to address\n    n                    - Advance to next instruction\n    o                    - Advance to next instruction ignoring branches to\n                           lower addresses (good for breaking out of loops)\n    s                    - Advance to next instruction (follows bsr/jsr)\n    c                    - Continue\n    bt                   - Print a backtrace\n    p[/(x|X|d|c)] VALUE  - Print a register or memory location\n    di[/(x|X|d|c)] VALUE - Print a register or memory location each time\n                           a breakpoint is hit\n    vs                   - Print VDP sprite list\n    vr                   - Print VDP register info\n    zb ADDRESS           - Set a Z80 breakpoint\n    zp[/(x|X|d|c)] VALUE - Display a Z80 value\n    q                    - Quit BlastEm\nAvailable commands in the Z80 debugger are:\n    b  ADDRESS           - Set a breakpoint at ADDRESS\n    de BREAKPOINT        - Delete a Z80 breakpoint\n    a  ADDRESS           - Advance to address\n    n                    - Advance to next instruction\n    c                    - Continue\n    p[/(x|X|d|c)] VALUE  - Print a register or memory location\n    di[/(x|X|d|c)] VALUE - Print a register or memory location each time\n                           a breakpoint is hit\n    q                    - Quit BlastEm\n\nThe -d flag can be used to cause BlastEm to start in the debugger.\nAlternatively, you can use the ui.enter_debugger action (mapped to the 'u' key\nby default) to enter the debugger while a game is running. To debug the menu\nROM, use the -dm flag.\n\nGDB Remote Debugging\n--------------------\n\nIn addition to the native debugger, BlastEm can also act as a GDB remote\ndebugging stub. To use this, you'll want to configure your Makefile to produce\nboth an ELF executable and a raw binary. Invoke an m68k-elf targeted gdb with\nthe ELF file. Once inside the gdb session, type:\n\n    target remote | BLASTEM_PATH/blastem ROM_FILE.bin -D\n\nwhere BLASTEM_PATH is the relative or absolute path to your BlastEm\ninstallation and ROM_FILE.bin is the name of the raw binary for your program.\nBlastEm will halt at the beginning of your program's entry point and return\ncontrol to GDB. This will allow you to set breakpoints before your code runs.\n\nOn Windows, the procedure is slightly different. First run \n    blastem.exe ROM_FILE.bin -D\nThis will cause BlastEm to wait for a socket connection on port 1234. It will\nappear to be frozen until gdb connects to it. Now open the ELF file in gdb\nand type:\n\n    target remote :1234\n\nTrace points and watch points are not currently supported.\n\nIncluded Tools\n--------------\n\nBlastEm ships with a few small utilities that leverage portions of the emulator\ncode.\n    \n    dis       - 68K disassembler\n    zdis      - Z80 disassembler\n    vgmplay   - Very basic VGM player\n    stateview - GST save state viewer\n    \nSync Source and VSync\n-----\n\nThis section includes information about using VSync with BlastEm. Currently,\nthe best way to use VSync is to set the sync source to \"video\". This will force\nVSync on and use video output for controlling the speed of emulation. In this\nmode, audio will have it's rate automatically adjusted to keep pace with video.\nThe code for this is still a bit immature, so you may experience dropouts or\npitch changes in this mode.\n\nIf you experience problems, please switch back to the \"audio\" sync source,\nwhich is the default. You can also enable vsync when using the \"audio\" sync\nsource by changing the \"vsync\" setting. This will generally work okay as long\nas the emulated refresh rate is below your monitor refresh rate (even if only\nslightly), but you will occassionally get a doubled frame (or frequently if\nthe refresh rates are very different).\n\nTurbo mode will currently not work when vsync is on, regardless of which sync\nsource is used. Slow mode will work with \"audio\" sync, but not \"video\" sync.\n\n--------------\n\nMy work has been made much easier by the contributions of those in the Genesis\ncommunity past and present. I'd like to thank the people below for their help.\n\nNemesis            - His work reverse engineering and documenting the VDP and\n                     YM-2612 has saved me an immeasurable amount of time. I've\n                     found both his sprite overflow test ROM and VDP FIFO\n                     Testing ROM to be quite helpful.\n\nCharles MacDonald  - While it hasn't been updated in a while, I still find his\n                     VDP document to be my favorite reference. His Genesis\n                     hardware document has also come in handy.\n\nEke-Eke            - Eke-Eke wrote a great document on the use of I2C EEPROM in\n                     Genesis games and also left some useful very helpful \n                     comments about problematic games in Genesis Plus GX\n\t\t\t\t\t \nSauraen            - Sauraen has analyzed the YM2203 and YM2612 dies and written\n                     a VHDL operator implementation. These have been useful in\n                     improving the accuracy of my YM2612 core.\n\nAlexey Khokholov   - Alexey (aka Nuke.YKT) has analyzed the YM3438 die and written\n                     a fairly direct C implementation from that analysis. This\n                     has been a useful reference for verifying and improving my\n                     YM2612 core.\n\nBart Trzynadlowski - His documents on the Genecyst save-state format and the\n                     mapper used in Super Street Fighter 2 were definitely\n                     appreciated.\n                     \nKanedaFR           - Kaneda's SpritesMind forum is a great resource for the\n                     Sega development community.\n\t\t\t\t\t \nTitan              - Titan has created what are without a doubt the most\n                     impressive demos on the Megadrive. Additionally, I am very\n                     grateful for the documentation provided by Kabuto and the\n                     assistance of Kabuto, Sik and Jorge in getting Overdrive 2\n                     to run properly in BlastEm.\n\t\t\t\t\t \nflamewing          - flamewing created a very handy exhaustive test ROM for 68K\n                     BCD instructions and documented the proper behavior for\n                     certain BCD edge cases\n\nr57shell           - r57shell created a test ROM for 68K instruction sizes that\n                     was invaluable in fixing the remaining bugs in my 68K instruction\n                     decoder\n\nI'd also like to thank the following people who have performed compatibility\ntesting or submitted helpful bug reports\n\nmicky, Sasha, lol-frank, Sik, Tim Lawrence, ComradeOj, Vladikcomper\n\nLicense\n-------\n\nBlastEm is free software distributed under the terms of the GNU General Public\nLicense version 3 or higher. This gives you the right to redistribute and/or\nmodify the program as long as you follow the terms of the license. See the file\nCOPYING for full license details.\n\nBinary releases of BlastEm are packaged with GLEW, SDL2 and zlib which have their\nown licenses. See GLEW-LICENSE and SDL-LICENSE for details. For zlib license\ninformation, please see zlib.h in the source code release.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flibretro%2Fblastem","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flibretro%2Fblastem","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flibretro%2Fblastem/lists"}