Board Games30
Role Playing40
Resource Directory
Code Gallery3
Help & Documents13
Depot Games: FakeNES

Current Version: 0.5.8

Project Status: Completed

Highest Popularity: #4 during May 2008

Links: Web Site

Category: Emulators

Developers: Siloh

Ports: OS X, Windows

Source Code: Available

Author's Description: FakeNES is a portable, Open Source NES emulator written in C.


Name Comments Size Date Windows Binary 2,797,213 05/30/2007 12:04 PM
FakeNES-0.5.8.dmg OS X Binary 2,137,425 05/30/2007 12:01 PM
fakenes-0.5.8.tar.bz2 Source Code 274,503 05/30/2007 12:03 PM

What's New:

AUDIO: Fixed OpenAL once and for all.
AUDIO: Fixed a bug where the APU and DSP sections of the configuration file were not loaded or saved until a ROM was loaded, causing various goofs in the GUI such as channels appearing to be disabled when they really weren't.
AUDIO: Fixed a bug in the API that might cause some games with ExSound to crash with an arithmetic exception.
AUDIO: Fixed a bug that would cause some games to not have sound output from the square wave channels until a rewind or state restore.
AUDIO: Fixed the Delta-Sigma filter.
AUDIO: Quadrupled the size of the main APU queue to help prevent overflows (harmless looping around that creates audio artifacts) in some games.
CORE: Implemented a new timing system.
CORE: Added the ability to set the emulation speed based upon a percentage value, and a cooresponding GUI interface for it.
CORE: Changed the behavior of 'Soft Reset' and 'Hard Reset' to be more correct.
CODE: Implemented a new build system.
CODE: Restructured the main loop.
CODE: Restructured the main GUI loop.
CODE: Restructured the init/reset system.
CODE: Reorganized Source Code tree.
CODE: Fixed some warnings when building under GCC with -W.
DOCS: Added FAQ, which was supposed to be added earlier but wasn't for some reason.
DOCS: Updated docs.
GUI: Fixed a bug where you could close the ROM while a replay was recording or playing.
GUI: Fixed a bug where a dialog would disappear if moved off-screen.
GUI: Fixed shortcut keys not working in some dialogs.
GUI: Redid all menu shortcuts to fix several obvious conflicts.
GUI: Added a new, custom, OpenGL-compatible file selector.
GUI: Added a real-time game clock to the status display.
GUI: Added a GUI interface to configure open and save paths.
GUI: Added the ability to lock the open path so that it is not changed by the Main->Open dialog.
GUI: Added the ability to disable or set frame skip amount from the GUI.
GUI: Added the ability to disable/enable the speed cap from the GUI.
GUI: Added the ability to specify a custom autosave interval from the GUI.
GUI: Added the ability to specify a custom audio mixing frequency, audio buffer size, and audio volume level from the GUI.
GUI: Added the ability to set custom resolutions and video buffer sizes from the GUI.
GUI: Added the ability to configure parameters for some blitters.
GUI: Added configuration dialogs for the 'nes_ntsc' and 'stretched' blitters to the GUI.
GUI: Added the ability to step through the emulation one frame at a time.
GUI: Rewrote the status display and moved it upward as to not conflict with messages.
GUI: Added confirmation (of success) of save states created during gameplay.
GUI: Removed superfluous newlines in GUI log messages.
GUI: Added functionality to view the console and log (via Main->View Console and Main->View Log in the GUI, respectively).
GUI: Switched from Help->Version dialog to Main->View Console dialog for first run 'welcome message'.
GUI: Fixed a cosmetic bug where the 1024x proportionate resolution selections in the GUI were listed as 1152x instead, added 1280x960 standard resolution.
GUI: Removed an excess menu splitter in the Video->Blitter menu.
GUI: Removed the ability to disable the GUI.
GUI: General GUI fixes and improvements.
INPUT: Fixed a bug that prevented automapping of controls for players 2, 3, and 4 from working properly.
INPUT: Added autofire and turbofire.
INPUT: Added an option to merge players 3 & 4 with players 1 & 2, so that on 2-player only games a single player can have multiple input configurations.
INPUT: Added detection of modifier keys (SHIFT, ALT, CTRL, etc.) to the automapper.
INPUT: Only poll keyboard/mouse when necessary.
INPUT: Changed default keyboard configuration.
MISC: Expanded save state, replay, and cheat titles from 16 bytes maximum to 255 bytes maximum.
MISC: PCX and WAV files are now stored in the save path, using the filename of the ROM along with '_XXX' appended, where 'XXX' is a number from 0-999.
MISC: Improved logging facilities.
MISC: Removed console window under Windows.
MISC: Started logging all calls to WARN().
VIDEO: Fixed a possible crash upon exit or when changing various video options.
VIDEO: Lots of fixes for OpenGL.
VIDEO: More fixes in order to play nice with the double-buffered GUI.
VIDEO: Updated to nes_ntsc v0.2.0.
VIDEO: Improved nes_ntsc blitter interface.
VIDEO: Added more video color controls (hue, saturation, contrast, gamma) in addition to brightness, and a cooresponding GUI interface to configure all of them.
VIDEO: Moved video_create_color() to video.h and made it inline and as fast as possible.
VIDEO: Removed color LUT usage for 15- and 16-bit color modes in favor of fast inline truecolor pixel packing instead.
VIDEO: Reduced color LUT depth from 18-bit down to 15-bit since it is only used for 256 color modes now.
VIDEO: Re-merged HQ2X, HQ3X, and HQ4X in a way as to not cause pixel artifacts to form in HQ4X due to conflicts.
VIDEO: Added 400x300 as a standard resolution in the GUI.
VIDEO: Renamed 'hq' blitter interface to 'hqx', which seems to be the accepted standard.

AUDIO: Fixed all while() loops in the APU to never be truely infinite (thus preventing hard lock-ups), removed a previous hack that was added to get around such a thing.
AUDIO: Implemented a new ExSound API.
AUDIO: Added full save state support to VRC6 Sound and MMC5 Sound.
AUDIO: Rreduced default audio buffer length from 6 to 4 frames to reduce latency.
AUDIO: Added in mixing of MMC5's digital audio channel (untested).
CODE: Moved a bunch of code out of 'gui.c' and into the GUI header files.
CODE: Various code edits.
DOCS: Updated docs.
GUI: Added a GUI menu to configure the audio buffer length.
GUI: Added a GUI menu to configure video buffer size.
GUI: Enabled double buffered GUI while in OpenGL mode.
GUI: Added custom drawing code for the 'sl_radiobox' object.
GUI: Cleaned up the Help->About dialog and added 'loomsoft' under 'Special thanks to'.
GUI: Added more splitters to the Audio and Video menus to better group submenus.
GUI: Added a 'Close' button to the Help->Shortcuts dialog.
GUI: Hide some menus when their respective features aren't available for whatever reason.
GUI: Made 'sl_frame' object behave properly in a double buffered environment.
GUI: Removed extended video resolutions, since if anyone wants to actually use any of the obscure things, they can set them manually via the configuration file.
INPUT: Overhauled input system and input configuration system.
MISC: Fixed a cosmetic bug where the 'enabled' flag of CPU patches were written to the *.fpt file with the value of '2' instead of '1' when enabled.
VIDEO: Added (buggy) OpenGL support.
VIDEO: Added support for a screen buffer smaller or larger than the actual screen (it will be scaled to fit).
VIDEO: Set all bitmaps to NULL after destroying them in video_exit(), fixes various problems.
VIDEO: Improved the operation of video_blit().
VIDEO: Improved efficiency of HQ4X slightly by removing extra assertions.
VIDEO: Added size checking to the 'Normal' and 'Stretched' blitters.
VIDEO: Changed blitter error message.

AUDIO: Overhauled entire audio system almost completely.
AUDIO: Added auto-detection of sound system sampling rate and sample depth on first run.
AUDIO: Added a master volume control with GUI interface.
AUDIO: Added support for recording audio to WAV files.
AUDIO: Improved OpenAL support (still not correct).
AUDIO: Renamed 'Pseudo Stereo' to 'Virtual Stereo', per Astxist's suggestion.
AUDIO: Changed default audio mixing mode to Virtual Stereo Mode 2.
AUDIO: Separated APU updates from resets, allowing APU parameters to be updated without adversely affecting gameplay.
AUDIO: Disabled reinitialization of the audio system during a hard reset, since there is no longer any need for it, and it might've been causing problems.
CODE: General code clean-ups.
CODE: Split platform-specific initialization code into it's own file.
CODE: Merged pAPU with APU.
CODE: Merged HQ2X, HQ3X, and HQ4X into a single file.
CORE: Quick and dirty clean-up of the CPU interface.
CODE: Added support for linking against Allegro statically under Mingw32.
CODE: Implemented separate directories for optimized, debug, and static builds under Mingw32.
CODE: Added 'VERBOSE' makefile macro that passes -Q to gcc when defined (DJGPP/Mingw32).
CODE: Now linking against ALUT when FakeNES is built with OpenAL support.
CODE: Reorganized input handling code.
CODE: Updated copyright messages.
CODE: Removed Clarified Artistic License notice from file headers.
CODE: Removed 'build.h' since DJGPP is no longer a primary development platform anyway.
GUI: Fixed a crash in the Cheat Manager.
GUI: Fixed a bug in the input configuration dialog.
GUI: Added an entry to the Video menu to enable/disable page buffering.
GUI: Updated and cleaned up the Help->Shortcuts dialog.
GUI: Moved a few menus around.
GUI: Reorganized Video menu a bit.
INPUT: Made all input Unicode-compatible.
MISC: Added real-time game rewinding (activated by holding down the backslash key on US keyboards).
MISC: More reliable FPS reporting.
MISC: Fixed a problem with the generic mouse pointer used by the color themes.
MISC: Removed resync, since it is no longer required.
MISC: Increased default maximum frame skip setting from 3 to 4 to improve performance on slow machines.
VIDEO: Fixed a possible crash when the screen resolution was not sufficient for the selected blitter.
VIDEO: Added support for multiple video filters of the same type.
VIDEO: Reduced edge clipping from 12 to 8 pixels, which still seems sufficient enough to hide most scrolling artifacts.
VIDEO: Added check for VRAM-based destination bitmap before attempting page buffering.
VIDEO: Disabled page buffering by default, since it causes a significant speed hit.
VIDEO: Disabled the drawing of message history when the chat box is not open.

Due to recent changes, the FakeNES Save State (FNSS) file format (used by both save states and replays in FakeNES) has been updated to version 1.01. Older state files *should* continue to load, but as always I make no guarantees.

AUDIO: Hard Sync option will now honor the current CPU usage setting.
CODE: Moved GUI configuration saving code to gui_exit().
CODE: Improved error handling in blitters.
CODE: Minor clean ups and improved error handling in the MMC emulations.
CODE: Greatly reduced redundancy in theme handling code.
CODE: Made all MMC interfaces static.
CODE: Fixed a GCC warning about a 'possibly uninitialized' variable in 'papu.c'.
CODE: Replaced all references to 'state' with 'save state'.
GUI: Added support for generic themes.
GUI: Added 5 new color themes (Xodiac, Monochrome, Essence, Voodoo, Hugs and Kisses).
GUI: Added custom drawing code for 'sl_checkbox' object.
GUI: Fixed a cosmetic bug where save state loading and saving menu items in the GUI had the wrong function keys assigned.
GUI: Considerable menu reorganizations.
GUI: Added a recent files menu.
GUI: Increased maximum number of replays to 10 (up from 5).
GUI: General clean-ups.
MISC: Fixed a bug where the FPS counters were never cleared when frame skipping was disabled, causing them to accumulate indefinitely.
MISC: Changed default debug and optimization flags when building under DJGPP/Mingw32
MISC: Minor cosmetic improvements to the build process.
MISC: Added a soft reset feature.
VIDEO: Implemented new blitter architecture.
VIDEO: Re-added ability to flip PPU mirroring (this ability was previously assigned to a shortcut key that was removed in a recent version).
VIDEO: Removed 'first_blit_line' and 'last_blit_line' (since they don't work with the new blitter setup).
VIDEO: Removed color (de)emphasis overlays (color math will be re-added later as a native part of the PPU emulation).
VIDEO: Added optional horizontal and vertical edge clipping to help hide scrolling.

CODE: Switched to zlib/libpng license.
GUI: Cleaned up input configuration dialog a bit.
INPUT: Added ability to calibrate joystick devices.
VIDEO: Added Blargg's 'nes_ntsc' as a selectable blitter (palettes are not supported).
VIDEO: Removed support for image offset/zooming (as these features were never used anyway).
VIDEO: Renamed 'light_adjustment' to 'brightness' and changed it's absolute range from 63 to 100.

CODE: Cleaned up timing code slightly.
GUI: Removed all remaining hacks leftover from the old GUI menu code.
MISC: Added quick save/quick load feature which uses it's own independant state slot. Note that quicksave files have an extension of .fsv.
MISC: Cleaned up ROM loading code.
MISC: Made most code that deals with ROM filenames Unicode safe.
MISC: Changed behavior upon task switch while running in windowed modes from 'SWITCH_PAUSE' to 'SWITCH_BACKGROUND'.
MISC: Added callbacks to stop and later resume audio playback when a task switch occurs while running in fullscreen mode.
MISC: Added region auto-detection for PAL (E) games (currently it defaults to NTSC for all others). Note that this feature must be enabled from the System->Region menu by setting Region to 'Automatic'.
NET: Initial work on new NetPlay engine.

AUDIO: Temporarily disabled OpenAL by default - There is nothing wrong with the code but OpenAL implementations don't like buffers as small as FakeNES uses, and thus produce silence. That will be fixed when the audio system is overhauled.
CORE: Fixed a runtime assertion error by adding a check for the existence of CHR-ROM before attempting to build a CRC32 of it.
GUI: Fixed a bug that caused some GUI fonts to get screwed up after a moveable dialog was drawn.
NET: Temporarily disabled all references to NetPlay, since it was never implemented in the first place.

I'd just like to clear up a few things first:

- You will notice that we completely skipped the 0.4.x line. That is because there was a period of around 2 years when there was no release of FakeNES. The developers lives where in shambles and FakeNES was even cancelled not once, but twice during that time. As far as we are concerned, *officially* there was no 0.4.x line. However, remnants of it can still be found in the GUI theme that was designed for it ("Zero 4") and the various Work In Progress (WIP) builds that were released by ipher.

- The recent January 13th WIP was actually supposed to be 0.5.0. However, the version number had been screwed up (I think it was tagged as 0.4.0 or something) by accident and I decided to just make it a normal WIP release.

- We have now branched FakeNES into 3 different types of releases. Intermediary WIPs are those that are released by ipher, they can be released at any time from the contents of CVS and should be regarded as unstable. They can easily be identified because they are named after the date on which they were released. Official WIPs are those released by us on occasion. These are now being officially tagged with version numbers (not only upon release, but also in the CVS repoistory). These should be considered more stable the intermediary WIPs, but still unstable in general. Finally, every great now and then there will be stable releases. From now on, all stable releases will have even major and minor version numbers (e.g, 0.6.0 will be stable, but 0.6.1 will not, and any 0.5.x release will not, since the major version number is an odd number, it represents a development tree).

- The new 0.5.x series represents the rebirth of FakeNES. Expect many problems to follow. =o)

AUDIO: Added audio Delta-Sigma filter.
AUDIO: Fixed pseudo stereo mode 2 by disabling noise cycling.
CODE: Changed default minimum CPU requirement on DJGPP and Mingw32 compiled builds to i586 (Pentium class), up from i486.
CODE: Makefile improvements, including automagic dependancy list generation.
CODE: Centralized all save data functions into 'save.c' and 'save.h'.
CODE: Split 'misc.h' into 'common.h' and 'types.h'.
CODE: Renamed 'crc32.c' and 'crc32.h' to 'crc.c' and 'crc.h', respectively, to allow for future additions to the CRC generation API.
CODE: Fixed version number to read 0.5.1 instead of 0.4.0 - it was broken in the January 13th WIP release, which was supposed to be 0.5.0. x_x
CORE: Removed x86 optimized core since it's benefits these days are questionable compared to the overhead it induces.
GUI: GUI overhaul, partial Unicode support, and more.
GUI: Added GUI toggle for Zapper emulation.
GUI: Changed default GUI theme to 'Panta'.
GUI: Changed display method for backgrounds less than 200 pixels high from stretched to centered.
GUI: Fixed background drawing in color depths higher than 8 bits-per-pixel.
INPUT: Added support for using the mouse as an input device.
MISC: Added a CPU usage option and subsequently a GUI menu with which to configure it.
VIDEO: Added support for 24-bit video modes (fullscreen and windowed).
VIDEO: Removed outdated 2xSOE blitters.
VIDEO: Overhauled all remaining blitters and combined multiple blitter variants together.
VIDEO: Added new DES and DESii blitters.
VIDEO: Added makeshift support for HQ2X, HQ3X, and HQ4X.
VIDEO: Changed default display mode under windowed environments from fullscreen to windowed; use a platform-specific driver or the 'Force Fullscreen' option to override.

Note: NetPlay is incomplete and replays are semi-broken in this release.
Trying to use NetPlay in this will get you nothing!

This version is experimental. I am releasing it for Christmas so that I can
worry about more important things, such as (eventually) finishing NetPlay.

Miscellaneous changes:
Input 'Start' and 'Select' buttons configuration reversed fix.
Increased chat message buffer size from 4 to 10 lines.

Build system & code changes:
Added CPU_TYPE and CPU_ARCH and improved some behavior.
Separated blitters into individual header files.

GUI changes:
Added numbers to the items in Video > Blitter menu.
Overhauled dithering functions.

Video output changes:
(Super) 2xSCL crash in high resolutions fix.
Added 32-bit support.
Added color indexing for all non-32-bit modes.
Made all blitters work in any supported color depth.
Renamed interpolated blitter to interpolated 2x.
Added interpolated 3x blitter.

This release is dedicated to those who fell in the 9/11 attacks.

Note: NetPlay is incomplete and replays are semi-broken in this release.
Trying to use NetPlay in this will get you nothing!

Mac OS X is officially supported by this release, in addition to Windows
9x/NT/Me/2k/XP, 32-bit DOS, Linux, FreeBSD, QNX, and BeOS.

Miscellaneous changes:
Infamous ROM load memory protection crash bug fix.
Overhauled CPU emulation core.
Added x86 assembly optimized CPU core components.
Fixed branch wrap detection bug.
Added CRC calculation for PRG ROM, CHR ROM, and ROM trainers.
Added support for CPU memory space patching (raw or Game Genie w/ GUI).
Added slow (half FPS) mode.
Corrected mirroring of uneven size ROMs.
Added save state support (may not work for all supported games).
Added automatic machine state saving accurate up to every frame.
Added support for replays (currently buggy).
Altered memory map for performance.
Added exit confirmation when ROM loaded.
Significant improvements to the timing system.

Configuration changes:
Added configurable save state and Save RAM (SRAM) output path.
Configuration file and log file are now stored with the executable.
Changed Win32 configuration file to 'fakenesw.cfg'
Fixed several input configuration bugs.

Build system & code changes:
Updated and added copyright messages.
USE_CONSOLE changed to ALLEGRO_USE_CONSOLE to solve compilation problems (Mac OS X).
Encapsulated datafile 'fakenes.dat' into build.
Replaced all references to `NULL' with `NIL' to avoid compiler conflicts.
Added object file suffixes to the build system (all platforms).
Changed binary installation location from '/usr/bin' to /'usr/local/bin' (POSIX)
Allegro compatibility fixes.
Cleaned-up, overhauled, and optimized most GUI-related code.
Added code to prevent registering conflicting digital directions in input.
Added ability to use `usleep' instead of `yield_timeslice' in speed throttling.

GUI changes:
Repaired all key mappings.
Various GUI dialog enhancements and fixes.
Added GUI patch manager with Game Genie support only.
Added platform-specific video driver selection menus.
Added multiple message system and input chat capabilities.
Added input configuration dialog.
Fixed various bugs related to repeated initialization of the GUI.
Added GUI messages (log file) viewer.
Added GUI toggle for the 'swap_channels' configuration file setting.
Added GUI audio mixing speed selection menu.
Added fast (passive) automatic blitter selection.
Fixed default palette not being selected at startup.
Improved operation of Video > Palette menu items.

Video output changes:
Added 15- and 16-bit color depth support.
Added 25% and 50% scanlines (currently very slow).
Added several new resolutions, including 512x480 (for windowed mode).
Added Super 2xSOE and Super 2xSCL anti-aliasing blitters.
Added simple interpolated blitter.
Fixed behavior of the 'last_blit_line' configuration file setting.
Added keys to adjust light (palette intensity) from inside the emulation.

PPU rendering changes:
Minor optimizations to background rendering.

Memory mapper support changes:
Cleaned up and extended IRQ interface.
Improved IRQ support in MMC3, MMC5, and Bandai mappers.
Fixed MMC5 IRQ generation (greatly improves many games).
Added MMC5 WRAM automatic size detection.
Minor corrections of MMC3 behavior when no CHR-ROM is present.

Audio rendering & output changes:
Changed default sampling rate to 96 kHz and buffer length to 6.

FakeNES Panta
FakeNES Panta
Public Opinion
Overall Rating: 9.0
  • 9Slick interface, interpolation of the GFX when played fullscreen, and looking smooth too. Supports my USB gamepad, and well nothing to complain about. Only reason it didn't get a 10 is the NetPlay thing. But I know it's coming, so it's cool :)
  • 8Sllooooww, but if you have fast CPU it should not be a problem to you.
  • 10One of the best emulators for Linux right now. On a technical note, the emulator's timing code is by far the most stable of any emulator Ive ever used.
The Developer
Siloh (View Profile)