cxNES Documentation
Version 0.3.3 Updated 2016-05-04
Website: http://perilsensitive.github.io/cxnes
cxNES is an open source, cross-platform NES/Famicom emulator. It is mainly written as a part-time hobby project to suit the needs of its author, but with accuracy, performance and portability as primary goals.
cxNES is written in C and uses SDL 2.0 for graphics, sound and input, and GTK+ for the GUI toolkit. It should have the same functionality and roughly the same look and feel on all supported platforms. Currently only Windows and Linux are supported; OS X support will be coming as soon as the author can get a Mac for development and testing. Other unix variants may work as well provided they have working SDL 2.0 and GTK+ libraries, but none have been tested.
You can contact the author at perilsensitive@gmail.com.
- iNES/NES 2.0
- UNIF
- FDS
- fwNES format, with or without header
- "Raw" format (includes gaps, start marks and checksums)
- NSF
- Any of the above in a ZIP or 7-Zip container
- Split ROMs inside a ZIP or 7-Zip container (provided split ROM checksums exist in the database)
- Standard Controllers
- Four-player adapters (NES and Famicom types)
- Arkanoid Controllers (NES and Famicom variants)
- Zapper
- Bandai Hyper Shot
- Power Pad
- Family Trainer
- Family BASIC Keyboard
- Konami Hyper Shot
- SUBOR Keyboard
- SNES Mouse
- VS. Unisystem support
- Nintendo MMC5
- Konami VRC6
- Konami VRC7
- Sunsoft 5B
- Namco 163
- Famicom Disk System
- 0, 1, 2, 3, 4, 5, 7, 9, 10, 11, 13, 14
- 15, 16, 18, 19, 21, 22, 23, 24, 25, 26, 28, 29
- 30, 31, 32, 33, 34, 36, 37, 38, 39, 41, 44, 46
- 47, 48, 49, 58, 60, 61, 62, 64, 65, 66, 67, 68
- 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 80, 82
- 85, 86, 87, 88, 89, 90, 91, 93, 94, 95, 97, 99
- 105, 107, 112, 113, 115, 118, 119, 133, 137, 138, 139, 140
- 141, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153
- 154, 155, 158, 159, 166, 167, 178, 180, 182, 184, 185, 189,
- 192, 193, 200, 201, 202, 203, 205, 206, 207, 209, 210, 211,
- 218, 225, 226, 228, 230, 231, 232, 234, 240, 241, 245, 246
- Supports IPS, UPS and BPS patch formats
- Autopatching support
- Soft-patching
- Patches may be applied via GUI or specified on the command line
- Patches may be included with ROM inside ZIP archive
- Bisquit's NTSC palette generator
- Blargg's nes_ntsc filter
- User can specify a 64 or 512 color external palette file to be used instead of the generated palette.
- Enhanced sprite limit workaround: limits sprites for scanlines where the limit appears to be exploited intentionally, otherwise does not limit sprites.
- Supports correct TV aspect ratios for NTSC and PAL consoles
- PNG screenshots
- Flexible input binding support
- Nearly all emulator actions can have custom keyboard and/or joystick mappings
- User-defined 'modifiers' useful for button combos on gamepads with few buttons (such as standard NES controllers)
- Joysticks are automatically configured when plugged in or unplugged; no need to restart the emulator.
- SDL GameController API
- Allows supported joysticks (including XInput devices) to have a common set of mappings; remapping is not required when switching between multiple supported devices.
- Additional gamepads may be added by editing a plain-text mapping database
- SDL Joystick API also supported for devices not recognized by the GameController API.
- Turbo support for controllers
- Supports dedicated turbo buttons
- Supports toggle buttons to enable/disable turbo on the standard A and B buttons.
- Savestates
- Can auto-load/save states on ROM load/unload
- Can auto-save state at a user-specified interval
- Dynamic audio resampling
- Uses Blargg's blip_buf resampler
- Cheat support (Game Genie, Pro Action Rocky, and raw formats)
- Cheats can be auto-loaded/saved on ROM load/unload
- ROM Database (optional) for handling ROMs with incorrect or missing headers.
- Can be compiled or run without the GUI
- Can specify configuration options, patches and cheats on command line
- FDS enhancements
- High-level optimizations of FDS disk I/O routines (optional)
- Automatic disk selection and change for most FDS games (optional)
- Writes to FDS images saved as IPS patches
- Windows builds can be configured to run in portable mode, storing all user data (save files, states, etc.) in the application directory.
- Overclocking support
The Windows build of cxNES stores all user data (save files, state files, cheats, etc.) in %APPDATA%\cxnes by default. To run cxNES as a portable app so that user data is stored in the same folder as cxNES itself, you can enable portable mode. This can be done by passing '--portable' on the cxNES command line, but this will only enable portable mode until you exit cxNES. To make cxNES always use portable mode, follow these steps:
-
Create a folder named 'userdata' in the same folder where you extracted cxNES.
-
If you have user data in %APPDATA%\cxnes already, you may want to copy it to userdata inside the folder where cxNES is installed.
cxNES should now always look for user data in the 'userdata' folder inside the folder where cxNES is located rather than in %APPDATA%\cxnes.
To upgrade a portable installation, you can unzip the new version of cxNES into the same folder as the old one. User data (stuff in the userdata folder) will not be touched, so you don't need to worry about wiping out your save states or save files. Alternatively, you can just extract the new version of cxNES to a new folder and copy or move the userdata folder from the old version to the new one.
Action | Binding(s) |
---|---|
Controller 1 Up | Up, Joystick 0 D-Pad Up / Left Y - |
Controller 1 Down | Down, Joystick 0 D-Pad Down / Left Y + |
Controller 1 Left | Left, Joystick 0 D-Pad Down / Left X - |
Controller 1 Right | Right, Joystick 0 D-Pad Down / Left Y + |
Controller 1 A | F, Joystick 0 A |
Controller 1 B | D, Joystick 0 X |
Controller 1 Select | S, Joystick 0 Back |
Controller 1 Start | Enter, Joystick 0 Start |
Controller 2 Up | Joystick 1 D-Pad Up / Left Y - |
Controller 2 Down | Joystick 1 D-Pad Down / Left Y + |
Controller 2 Left | Joystick 1 D-Pad Down / Left X - |
Controller 2 Right | Joystick 1 D-Pad Down / Left Y + |
Controller 2 A | Joystick 1 A |
Controller 2 B | Joystick 1 X |
Controller 2 Select | Joystick 1 Back |
Controller 2 Start | Joystick 1 Start |
Controller 3 Up | Joystick 2 D-Pad Up / Left Y - |
Controller 3 Down | Joystick 2 D-Pad Down / Left Y + |
Controller 3 Left | Joystick 2 D-Pad Down / Left X - |
Controller 3 Right | Joystick 2 D-Pad Down / Left Y + |
Controller 3 A | Joystick 2 A |
Controller 3 B | Joystick 2 X |
Controller 3 Select | Joystick 2 Back |
Controller 3 Start | Joystick 2 Start |
Controller 4 Up | Joystick 3 D-Pad Up / Left Y - |
Controller 4 Down | Joystick 3 D-Pad Down / Left Y + |
Controller 4 Left | Joystick 3 D-Pad Down / Left X - |
Controller 4 Right | Joystick 3 D-Pad Down / Left Y + |
Controller 4 A | Joystick 3 A |
Controller 4 B | Joystick 3 X |
Controller 4 Select | Joystick 3 Back |
Controller 4 Start | Joystick 3 Start |
Arkanoid Dial | Mouse |
Arkanoid Button | Mouse Button 1 |
Power Pad (Port 2) Pad 1 | U |
Power Pad (Port 2) Pad 2 | I |
Power Pad (Port 2) Pad 3 | O |
Power Pad (Port 2) Pad 4 | P |
Power Pad (Port 2) Pad 5 | J |
Power Pad (Port 2) Pad 6 | K |
Power Pad (Port 2) Pad 7 | L |
Power Pad (Port 2) Pad 8 | ; |
Power Pad (Port 2) Pad 9 | M |
Power Pad (Port 2) Pad 10 | , |
Power Pad (Port 2) Pad 11 | . |
Power Pad (Port 2) Pad 12 | / |
Zapper (Port 2) | Mouse |
Zapper Trigger (Port 2) | Mouse Button 1 (Left Button) |
VS. Light Gun | Mouse |
VS. Light Gun | Mouse Button 1 (Left Button) |
Mouse (Port 2) X/Y | Mouse |
Mouse (Port 2) Left Button | Mouse Button 1 (Left Button) |
Mouse (Port 2) Right Button | Mouse Button 3 (Right Button) |
Famicom Keyboard Toggle | Home |
Famicom Keyboard Yen Key | + |
Famicom Keyboard Stop Key | End |
Famicom Keyboard Kana Key | Left Alt |
Famicom Keyboard Grph Key | Right Alt |
Load Newest State | 0 |
Load State 1 | 1 |
Load State 2 | 2 |
Load State 3 | 3 |
Load State 4 | 4 |
Load State 5 | 5 |
Load State 6 | 6 |
Load State 7 | 7 |
Load State 8 | 8 |
Load State 9 | 9 |
Save Oldest State | Shift-0 |
Save State 1 | Shift-1 |
Save State 2 | Shift-2 |
Save State 3 | Shift-3 |
Save State 4 | Shift-4 |
Save State 5 | Shift-5 |
Save State 6 | Shift-6 |
Save State 7 | Shift-7 |
Save State 8 | Shift-8 |
Save State 9 | Shift-9 |
Soft Reset | Shift-R |
Hard Reset | Shift-T |
Toggle Fullscreen | Alt-Enter |
Toggle Menubar | Esc |
Toggle FPS Display | Ctrl-F |
Pause/Resume Emulation | Shift-P |
FDS Disk Eject/Insert | Ctrl-F10 |
FDS Disk Select | F10 |
Save Screenshot | Alt-S |
Toggle Mouse Grab | F11 |
Port 1 Device Connect | Ctrl-F6 |
Port 1 Select | F6 |
Port 2 Device Connect | Ctrl-F7 |
Port 2 Select | F7 |
Exp. Port Device Connect | Ctrl-F8 |
Exp. Port Device Select | F8 |
VS. Coin Switch | F10 |
VS. Service Switch | Ctrl-F10 |
Four-Player Mode Switch | F9 |
Alternate Speed | Tab |
Exit cxNES | Alt-X |
All other Famicom Keyboard keys are mapped to the key with the same symbol on the keycap (e.g., 'U' is mapped to 'U').
Famicom Disk System support requires a copy of the Famicom Disk System BIOS. You can configure cxNES with the location of this file via the GUI (Options -> Path Configuration -> FDS BIOS Path) or the config file (set fds_bios_path).
You can also put it in the directories listed below (which you use will depend on your platform), but you must name the file 'disksys.rom' if you want cxNES to use it automatically.
Linux:
- The same directory as the disk image being loaded
- $HOME/.local/share/cxnes
- The global data directory for cxnes (/usr/local/share/cxnes by default, or /usr/share/cxnes if you installed from a package)
Windows:
- The same directory as the disk image being loaded
- %APPDATA%\cxnes (or the userdata directory under the cxnes install directory if using portable mode)
- The data directory under the cxnes install directory
Thanks to the nesdev community for their fantastic work at reverse- engineering and documenting the NES. Without the excellent information found on the wiki, the various documents hosted on the nesdev.com website, and the forum discussions, I would have been completely lost.
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation.; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.