NES EMULATOR
FuNes
FuNes is an experimental NES (Nintendo Entertainment System) emulator written in Haskell. It focuses on being a research/learning implementation rather than a production-quality emulator: it supports NTSC timing, audio (imperfect), and at least the NROM mapper, and is built with Haskell Stack and SDL2.

WHY IT MATTERS
Why this project exists
FuNes is an experiment to explore implementing an NES emulator in a functional programming language (Haskell). The author states the goal is research and learning—testing how functional techniques (monads, CPS) apply to virtual machines and emulator components—rather than producing a daily-driver emulator.
BEST FOR
Key practical facts
Runs NES ROMs (expects .nes files). Implemented in Haskell, uses Stack to build and SDL2 for rendering/sound/input. Supports NTSC timing, basic audio, and NROM mapper. Project is explicitly experimental and not fully accurate (author reports AccuracyCoin/nestest testing with a CPU test score documented in the README).
The people behind FuNes
History & status
FuNes is maintained in a public GitHub repository by the account Arthi-chaud. The repository shows active source and documentation (including a generated Haddock-like site listing module documentation). The README warns the emulator is for research purposes and not intended as a mature daily emulator; it lists implemented subsystems (CPU, PPU, APU, Bus) and testing methodology. The README contains a published test result (AccuracyCoin / nestest CPU testing) with a score and a dated test result entry. The codebase and documentation are available under a BSD-3-Clause license. No official binary releases or platform-specific installers are bundled in the repository's releases area; the recommended installation method is to build from source with Haskell Stack.
What FuNes supports
- NES (.nes ROM files)
- NTSC timing
- Audio (imperfect)
- Mapper: NROM
Download and availability
OFFICIAL DOWNLOADS
Get FuNes
Official source and any published release assets are hosted on the project's GitHub repository. The README recommends building from source with Stack; there are no bundled commercial games, BIOS, or firmware included.
Get FuNes ↗DOCUMENTATION
Official documentation
Read the official configuration, compatibility, and troubleshooting material before changing advanced options.
Read official documentation ↗FuNes setup guide
Setup note: Practical setup guidance — FuNes is intended to be built from source. The repository uses Haskell Stack and depends on SDL2 for graphics, input and audio. The guide below follows the project's README and documentation.
- 1) Prerequisites: Install Haskell Stack (stack) and a system SDL2 development library for your OS. On Linux, install your distribution's libsdl2-dev (or SDL2 via package manager). On macOS, install SDL2 via Homebrew (brew install sdl2). On Windows, ensure you have Stack and an SDL2 development package available and configured for MinGW/MSYS or the toolchain Stack uses.
- 2) Clone the repository: Clone FuNes from the official GitHub: clone the Arthi-chaud/FuNes repository to a working directory using git clone.
- 3) Build with Stack: From the repository root run: stack build. The project provides stack.yaml / package configuration; Stack will resolve Haskell dependencies and build the executable. If Stack prompts for a resolver or GHC, allow it to download the required GHC toolchain.
- 4) Run the emulator: After building you can run the emulator using: stack run — ./path/to/your_rom.nes. Alternatively, stack install will produce an installed binary (noted by the README as funes-exe) in your local Stack bin directory.
- 5) Controller & input: The README maps keyboard keys to NES controls: A -> A; B -> S or Z; Start -> Enter; Select -> Space; D-Pad -> arrow keys. Press Q or Esc to quit. If you have an SDL2-supported gamepad, SDL2 may map it automatically, but check the docs or test in your environment.
- 6) Testing & accuracy expectations: The project uses nestest and AccuracyCoin ROMs for CPU correctness testing. The README documents a test score (e.g. Score: 83 / 131 with results dated in the README). The author warns accuracy is not complete — expect some games or mappers to fail or exhibit incorrect behavior. Only NROM mapper is explicitly listed as implemented.
- 7) Platform notes: FuNes is platform-agnostic in source but requires Stack and SDL2. It should build on Linux and macOS where Stack and SDL2 are available; Windows support depends on supplying compatible SDL2 development libraries and the Stack toolchain. There are no official packaged native installers provided in the repository; building from source is the documented path.
- 8) Advanced / development notes: The source is organized into modules (CPU, PPU, APU, Bus). The author mentions using continuity-passing style monads and multi-threading for rendering and sound filtering. If you plan to extend or test the emulator, examine the examples and test directory in the repo and reuse the nestest tracing approach described in the README.
Software reminder: FuNes does not include any commercial game ROMs, console BIOS, or firmware. Use only legally obtained ROMs for testing. Building the project requires network access for Stack to download the GHC toolchain and Haskell dependencies unless already cached.
Sources and further reading
Detailed guides and tutorials
Explore step-by-step guides for FuNes as they are published.
Retro Replay Retro Gaming History, Reviews & Emulation
