Snes9x: the portable SNES emulator and its libretro core
Snes9x - Portable Super Nintendo Entertainment System (TM) emulator
At a glance
- What is it?
- Snes9x is the official source repository for a long-running Super Nintendo emulator, distributed both as standalone builds and as a libretro core. Here is what the repository actually documents, what it leaves out, and who should build from source.
- Who is it for?
- Adopt Snes9x if you want a C++ SNES emulator you can build yourself and run as a standalone binary or as a libretro core, and if you are willing to read the repository rather than a manual. Do not adopt it if you need documented install steps, a supported API surface, or a maintenance contract; the README points to the Wiki for everything beyond the CI badges.
- Can I use it commercially?
- Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
- Is it still maintained?
- Yes. The repository last received commits 2 days ago.
- What is it written in?
- Mainly C++, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 23, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
What Snes9x solves, and for whom
Snes9x emulates the Super Nintendo Entertainment System in portable C++. The README describes it as the official source code repository for the Snes9x project, which matters: this is the upstream tree, not a fork or a repackaging. The audience is narrow and specific. It is for people who want a SNES emulator they can compile for a desktop or embed as a libretro core, and for developers who need to read or modify emulation code. The repository root is a flat list of hardware components, with cpu.cpp and cpuops.cpp for the 65c816, apu/ for the audio subsystem, dsp1.cpp through dsp4.cpp for the co-processors, and bsx.cpp for the Satellaview. That layout tells you the project is organised around the console's silicon rather than around a plugin architecture. If you want a double-clickable application and nothing else, the source tree is the wrong entry point; the README points to nightly builds instead.
How the emulator is put together
The top-level files map closely onto SNES hardware. 65c816.h and cpumacro.h describe the CPU, dma.cpp handles direct memory access, gfx.cpp covers graphics, and the dsp, c4 and fx files cover the various on-cartridge coprocessors. A filter/ directory holds the video filters, and external/ holds bundled third-party code, which is the usual reason a repository carries .gitmodules at its root. The build definitions are appveyor.yml for Windows and .cirrus.yml for everything else, and those two files decide which targets exist. The README lists the resulting targets: standalone builds for Windows, Linux in both GTK and X11 variants, FreeBSD with X11, and macOS, plus a libretro core compiled for Linux on amd64, i386, armhf, armv7-neon-hf and arm64, Android on arm and arm64, Emscripten, macOS on amd64, and the Nintendo Wii, Switch, GameCube and PSP. That breadth is the project's main claim: one C++ codebase, many hosts. It also explains why the repository is large and why the platform-specific code is not all in one place.
Installing Snes9x from source and running a first ROM
The README does not contain build instructions. It says to check the Wiki for additional information, so the commands below are the generic shape of a CMake build and should be confirmed against the Wiki page for your platform before you rely on them. Clone the repository with its submodules, because external/ is populated through .gitmodules.
Why the build step is the real adoption cost
The gap between the README and a working binary is the whole story of adopting this project. Everything a new user needs to know about configuring a build, choosing between the GTK and X11 Linux frontends, or producing the libretro core instead of the standalone binary lives in the Wiki, not in the repository. The CI configuration files are the authoritative description of what actually compiles, and they are written for continuous integration rather than for a person at a terminal. That is a defensible choice for a project this old, but it means the repository alone is not a quickstart. A second constraint is the platform matrix itself. The libretro core covers Android, Wii, Switch, GameCube and PSP, while the standalone builds are desktop-only in the README's table. If your target is a console or a phone, you are building the core and then loading it into a libretro frontend, which is a different workflow from running the standalone application. The README does not explain that distinction; you have to infer it from the two tables.
Where Snes9x is the wrong tool
There is no documented public API, no library versioning scheme, and no stability promise in the README. If you want to embed SNES emulation inside your own application with a supported interface, this repository does not offer one; you would be linking against internal code that changes between releases. The release history illustrates the cadence: 1.62.2 and 1.62.3 landed three days apart in March 2023, and 1.63 followed in July 2024. Releases are infrequent and grouped, so a bug you hit may sit unfixed for a long stretch. The README also does not document save-state compatibility across versions, controller mapping, or rollback, which are exactly the details that bite users of a long-lived emulator. Finally, the licence situation deserves a direct look. The repository metadata reports the licence as NOASSERTION, meaning no recognised SPDX identifier was detected, even though a LICENSE file exists at the root. Read that file rather than assuming a standard open source licence applies. Nothing here is legal advice, but a project with bundled third-party code in external/ commonly carries mixed terms.
Snes9x against a hardware-accurate emulator
The natural alternative is a cycle-accurate emulator, and the difference is architectural rather than cosmetic. Snes9x is organised for portability: the files are split by chip function, the build targets span a dozen hosts, and the libretro core is compiled for ARM, PowerPC-based consoles and Emscripten. A cycle-accurate emulator instead models the console's timing at the clock level, which buys accuracy on edge-case titles at the cost of a much heavier CPU budget and a far smaller platform list. Neither approach is strictly better. If you want to run SNES software on a Wii, a PSP or inside a browser tab, the portability-first design is the only one that gets you there. If you are chasing a timing bug in a specific cartridge, the accuracy-first design is the one that can express it. Snes9x's own coprocessor files, dsp1.cpp through dsp4.cpp plus c4.cpp and fxemu.cpp, show that it models special chips individually rather than emulating the bus generically.
Maintenance, releases and what to verify first
The repository is not archived, and the last push was on 2026-09-21, which is recent. That is the only maintenance signal available in the README and the repository metadata, and it should not be read as a support commitment. Releases are tagged rather than continuous: 1.63 in July 2024, 1.62.3 in March 2023. Upgrading means rebuilding from a new tag and, if you use the libretro core, replacing the core file in your frontend. The README does not document a save-state migration path, so treat state files as version-bound until you confirm otherwise. On licensing, the practical step is to open the LICENSE file at the repository root and read it in full, including how it interacts with the contents of external/; the NOASSERTION metadata is a signal to look, not an answer. Before you commit to a build target, open the Wiki page for your platform and compare it against .cirrus.yml or appveyor.yml, since those files define what the project actually tests.
Editorial conclusion
Adopt Snes9x if you want a C++ SNES emulator you can build yourself and run as a standalone binary or as a libretro core, and if you are willing to read the repository rather than a manual. Do not adopt it if you need documented install steps, a supported API surface, or a maintenance contract; the README points to the Wiki for everything beyond the CI badges. Before committing, check the LICENSE file in the repository root, since the project metadata reports NOASSERTION rather than a recognised identifier, and open the Wiki to confirm which build target matches your machine.
Frequently asked questions
Can Snes9x run on my phone?
The README lists a libretro core built for Android on arm and arm64, so phone support exists through a libretro frontend rather than as a standalone application. The standalone builds in the README's table cover Windows, Linux, FreeBSD and macOS only.
How do I install Snes9x?
The README does not give install steps and instead points to the project Wiki for additional information. Nightly builds are available from continuous integration, with Windows builds on AppVeyor and the other targets on Cirrus CI.
How do I use Snes9x on Android?
The README lists libretro core builds for Android on arm and arm64, which means using Snes9x on Android means loading that core into a libretro frontend. The repository does not contain an Android application of its own.
How do I use Snes9x on the Wii?
The README lists a libretro core build for the Nintendo Wii, so the Wii path is the libretro core rather than the standalone emulator. The standalone builds in the README cover desktop operating systems only.
Community notes