Nintendulator is an open source Win32 NES emulator written in C++ (plus some assembly optimization). The original goal was to emulate the NES down to its hardware quirks; though it's fallen behind over the years, recent builds have caught up once again and can emulate certain behaviors most other emulators neglect to handle. However, this emulation precision comes at a price - a 1500MHz (estimated) or faster CPU is required to emulate at full speed.
Supported file formats include .NES, UNIF, FDS (fwNES format), and NSF. Mappers are handled using external DLLs, complete with extra sound channels for most games which provide them. Other notable features include writing to FDS images (by storing the differences in separate files), Game Genie support (limited to 3 codes), customizeable controllers (including 4 player), input movie recording and playback (with re-recording), AVI capturing, and a debugger. Additionally, savestates and battery-backed RAM are saved within the current user's profile rather than in the application's own directory, allowing Nintendulator to function properly on Windows 7 and Vista without requiring the program to be run as an administrator.
A discussion regarding $2004 read behavior (and inconsistent emulation thereof) revealed a few minor bugs in my own implementation; these should now be fixed.
As predicted, the process of converting the mapper DLL code from C to C++ introduced at least one bug, causing Namco 106 (iNES mapper 19) sound to break. The latest build includes mapper DLLs which fix this problem.
With rather inconvenient timing, information regarding the inner workings of MMC5 PCM sound were posted yesterday, 1 day after the release of Nintendulator 0.970. Support for this feature (though it is not known to be used by any games) has been added.
Additionally, limited support for NES 2.0 format ROM images has finally been added - for now, this consists solely of handling images with more than 4MB of PRG ROM and 2MB or more CHR ROM.
An even better way to welcome the new year would be to release a new version of Nintendulator. Thus, it has been done.
What better way to welcome the new year than with a simple cosmetic bugfix?
The FPS counter in the titlebar should no longer display negative numbers when the framerate drops too low.
Nintendulator's mapper DLL code has been upgraded from C to C++, effectively completing the task from March 19.
Several mapper bugs have been fixed in the process, though it is entirely possible that some other bugs may have been introduced as well, so keep an eye out for problems.
The code for handling different controller types (gamepad, Zapper, Power Pad, Four Score, etc.) has been rewritten to take advantage of C++ language features. Initial tests suggest it is working properly, though there may yet be bugs lurking within it.
The savestate format has also been updated - it would seem that controller state data was never being stored correctly, and the actual controller state block was missing some important data.
Nintendulator's code has been upgraded from C to C++ in order to make use of namespaces for a much needed improvement in maintainability.
No actual functionality should have changed as a result of this.
Fixed a rather glaring bug (pointed out by a user) which caused read/write breakpoints to not trigger on unindexed accesses (e.g. LDA $2002 or STA $4015).
The aforementioned "Detail" section has been implemented - simply hover the cursor over a nametable tile, sprite, pattern table tile, or palette entry, and it will bedisplayed magnified and with appropriate details. Right-clicking on an object will cause its details to remain displayed when you move the mouse over an empty area.
The PPU Debugger now displays sprites, arranged in a 16 by 4 grid.
A "Detail" section has also been added - while it currently does nothing, it will eventually be made to display details about whatever the mouse cursor is currently pointing at (in similar fashion to rveach's modified Nintendulator debugger).
Some minor fixes to the Debugger - pressing the various "Controls" buttons will no longer result in a crash when no ROM is loaded.
A few bugs in Nintendulator's NSF player (and the Winamp plugin) have been fixed.
Various dialogs within the emulator (particularly the debugger and the NSF player controller) should now properly respond to keyboard input.
Nintendulator now stores its savestates, SRAM/FDS data, and debug dumps within the current user account's Application Data folder instead of the "Saves" subdirectory of its installation folder. The first time you run this build, there will be a short delay as your savestates are moved to this new location.
This should improve compatibility with Windows Vista and allow Nintendulator to be installed within the Program Files folder without needing to run as an Administrator.
Breakpoints can now be toggled on and off simply by double-clicking on them in the Breakpoint list.
No code changes, but the mapper DLLs are now licensed under the BSD license and their sources are now available on SourceForge.
Fixed a minor typo which prevented breakpoints from being listed properly when closing and reopening the CPU debugger window.
Adding execution breakpoints has just gotten a whole lot easier - just double-click an instruction in the Trace listing and it'll open the Add Breakpoint dialog with the address filled in for you.
Today's build adds some minor tweaks to PPU and APU timing to match certain behaviors observed on the real hardware.
Those of you familiar with Blargg's emulator test ROMs will now observe that it passes nearly all of them (aside from power-on palette and MMC3A/MMC3B behavior).
Today's build adds dialog boxes for recording movies (to allow users to specify a description for the movie, as well as configure controllers more easily) as well as playing them back.
Fixed a rather glaring bug with sprite overflow.
This build adds a few special changes. To start off, the debugger menu options now actually make sense, having been updated to match the debugger changes I made over the past months, and the debugger windows now automatically position themselves when they open.
Additionally, I've made some changes to APU DMA fetches - as a result, they should now (correctly) interfere with reading from the controller ports and video memory.
Last, but not least, I've enabled Nintendulator's experimental cycle-accurate sprite emulation code (and fixed a few bugs in the process). This code has been present for quite a long time, but I had neglected to enable it in fear of breaking emulation (though not enabling it sort of prevents it from being tested, rather defeating the purpose). Hopefully, with more people (i.e. almost everybody, excluding those who compiled it themselves) messing around with it, any remaining bugs will be eliminated and the old sprite code can permanently go away.
Note that this increases the minimum system requirements significantly, though a modern system (less than 3-4 years old) should still be able to handle it fine.
Cleaned up and reorganized some of the build files to speed up compilation - no actual code changes in today's snapshot.
As promised, opcode and interrupt breakpoints have been implemented.
Support for execution breakpoints has been readded, along with brand new support for memory read/write breakpoints. Opcode breakpoints (i.e. break when a specific opcode is encountered) and interrupt breakpoints (NMI and IRQ, as well as BRK, which is logically equivalent to opcode 00) are planned - they will be implemented at a later date.
Note that this new breakpoint support has not been fully tested - if you encounter any problems, please contact me via e-mail (address here).
After being left untouched for months, I've updated Nintendulator's debugger. Window positioning isn't yet done intelligently, but the new debugger should be a significant improvement over the old one.
Note that this build currently does not support breakpoints - they will be readded in a future build, potentially with additional options.
It seems that nVidia GeForce 8 series video chipsets do some strange things at 320x240 (such as stretching the image and heavily filtering it), so fullscreen now uses 640x480 instead.
The introduction of software 2X stretching for this fix also greatly simplified the process of implementing a Scanlines option, intended for Windowed 2X and Fullscreen modes.
2007 was an "off" year - after leaving the NESdev community, it was a long time before I did anything with Nintendulator.
Fullscreen emulation is mostly complete now - the only thing that remains to be added is preservation of window size and position prior to switching to fullscreen.
The RP2C04-0004 palette has been extracted, thus completing the VS Unisystem palette set in Nintendulator.
Kevin Horton has extracted accurate palettes from the RP2C04-0002 and RP2C04-0003, allowing me to add 100% accurate palettes for VS (2) and VS (3). All that remains now is the 4th VS palette.
The remaining VS Unisystem palettes have been filled with placeholders containing most of the correct colors (based on translation tables found in several games which feature support for all 4 VS palettes as well as the standard NES palette). However, some VS games may still have color problems.
In addition, I have reordered the palette configuration values slightly - as such, the values for "Custom palette" and "VS (1)" have been swapped.
The PAL palette now features a Saturation adjustment, though it currently does nothing (as the PAL palette is still hardcoded).
Nintendulator's NTSC palette generator has been updated with more accurate values, as well as a few bug fixes. Hue adjustment now ranges from -30 to +30, rather than from 300 to 360 (settings will be automatically adjusted on program startup), and Saturation is now properly set for each color.
A minor fix has been applied to the NSF player's BIOS, allowing it to properly handle NSFs whose init routines loop forever.
Today's beta introduces preliminary Fullscreen support. Further work is required, though, in order to prevent Mouse clicks (from Zapper input, for example) from causing the main application window to lose focus.
POV hat support has also been improved, allowing them to be used in two different ways. The standard mapping (which was supported first) is to treat each POV hat as up to 8 mutually exclusive buttons. An additional mapping has now been added to treat them as a pair of axes (technically as 4 overlapping buttons) to make them usable for controller D-pads.
A new option has been added to the Input Configuration dialog to allow using this new mapping. The option is not preserved, so it needs to be re-checked each time you reconfigure your controllers, but it only applies to the configuration process - it is possible to use both POV hat mappings simultaneously, but they need to be configured separately.
The first 0.965 beta build is now available, featuring an overhauled DirectInput interface, including proper axis/button names as well as POV hat support.
Nintendulator 0.960 is now officially released.
After performing numerous tests with my CopyNES and TV tuner card, I've derived much more accurate coefficients for the PPU's Colour Emphasis bits.
A few major bugs (dealing with recording movies from savestates) have been fixed, and a few new mappers have been added.
After some consideration, I realized that there's no point in including separate downloads for the beta mapper DLLs when the beta emulator binaries always include them.
Partial VS Unisystem support has been readded to Nintendulator, in the form of a new mapper DLL - VS.DLL. Mappers 99 and 151 have been removed from iNES.DLL as a result.
Automatic VS palette detection will likely not be implemented, and it'll be a while before the VS palettes are added.
Nintendulator has been modified to support Unicode; separate downloads are now available for ANSI (Windows 9x/ME) and Unicode (Windows NT/2K/XP) binaries.
After trying for perfection for too long (and never reaching it), I've decided to formally release Nintendulator 0.950.
In an attempt to get rid of annoying bugs which caused movies to desynchronize, Nintendulator is now multithreaded. This means that opening menus and moving windows around will no longer cause emulation to pause. Best of all, the change was successful in fixing the aforementioned movie bugs!
Just posting an update on Nintendulator 0.950 development.
Frameskipping code has been vastly improved, and audio data is properly saved in savestates now. Also, slowdown and frame-advance options have been added, allowing users to record movies with extreme precision. Unless some major bugs or feature requests come up, I should be ready to officially release soon.
Development on Nintendulator 0.950 has been progressing nicely. Among the many new features added are movie recording/playback (with savestate support), an iNES header editor, AVI capturing, and more.
Nintendulator now has a proper homepage. New material will be added as it is deemed necessary.
The current source and binary snapshots for Nintendulator 0.950 are officially available here.
Here you may download various versions of Nintendulator and other related applications.
This is a snapshot of my latest development code. Though this has features not present in the current release below, it may also have significant bugs, so download it at your own risk!
This is NOT a release!
This is the latest officially released version of Nintendulator. You are highly recommended to use this version instead of the latest build above unless you require any of the new functionality added since the last release.
These are old releases of Nintendulator, archived here for posterity. Where present, mapper DLL binaries are also included with the corresponding emulator releases.
These mappers are supported in the latest released version of Nintendulator. Mappers listed in bold are only available at the listed compatibility level in the latest beta build (strike indicates mappers whose compatibility has changed in the latest beta build).