Skip to content
The Legend of Zelda gameplay on NES
Gameplay from The Legend of Zelda on NES. Image from the Retro Replay media library.

Anemoia-ESP32

NES EMULATOR

Anemoia-ESP32

Anemoia-ESP32 is an open-source NES emulator port written in C++ that runs directly on dual-core ESP32 microcontrollers. It targets standalone handhelds or board-based builds with either SPI TFT displays or composite video output, supports audio output and save states, and implements several common NES mappers to run a large portion of the library without PS

NESPRIMARY SYSTEM
History documentedPROJECT BEGAN
Open sourcePROJECT MODEL

WHY IT MATTERS

Why this project matters

Anemoia-ESP32 demonstrates that a relatively inexpensive dual-core ESP32 can run many NES titles at native ~60 FPS with audio and save-state support. It is a focused, performance-driven rewrite of an NES emulator specifically optimized for embedded hardware (TFT or composite video), useful for hobbyists building handhelds or bespoke retro devices.

BEST FOR

Best use case

Builds where a single-purpose, lightweight NES experience is desired on bare ESP32 hardware: small handheld consoles, composite-output CRT projects, or SPI-TFT-based standalone devices where low hardware requirements (no PSRAM) and real-time performance are priorities.

The Legend of Zelda gameplay on NES
Gameplay from The Legend of Zelda on NES.

The people behind Anemoia-ESP32

History & status

Anemoia-ESP32 is a rewrite and ESP32 port of the Anemoia NES emulator and is actively maintained in the project's public GitHub repository. The codebase is hosted under Shim06 with a visible commit history and issues. The README documents performance goals (≈60.098 FPS NTSC), implemented mappers (0,1,2,3,4,69) and practical hardware targets (dual-core ESP32, 1 MB flash minimum, no PSRAM required). Community posts and coverage (Hackaday and several hobby sites) report recent activity and demonstrations on the ESP32 platform. The project is distributed under GPLv3; releases and a Web Flash interface are provided from the repository. If you need an exact creation year or timeline of forks/major releases, consult the repository's commit history for precise dates.

What Anemoia-ESP32 supports

  • ESP32 (dual-core) microcontrollers (e.g. ESP32-DevKitC, ESP32-WROOM-32)
  • SPI TFT displays (ST7789, ILI9341)
  • Composite video output (RCA)
  • MicroSD card storage for ROMs
  • Audio amplifier / speaker via configurable audio pin
  • NES/SNES/PS1 controllers via supported input hardware (per README)

Download and availability

OFFICIAL DOWNLOADS

Get Anemoia-ESP32

Official source and builds are distributed from the project's GitHub repository and its Releases page. The repository also exposes a 'Web Flash' page (hosted by the project) for flashing builds directly to a connected ESP32. Do not expect commercial game ROMs or any BIOS/firmware to be included with the download.

Get Anemoia-ESP32 ↗

DOCUMENTATION

Official documentation

Read the official configuration, compatibility, and troubleshooting material before changing advanced options.

Read official documentation ↗
Broken or missing download? Emulator projects move and official links sometimes change. Please contact Retro Replay so the source can be verified and updated.

Anemoia-ESP32 setup guide

Setup note: Practical setup summary — verified from the project README and repository: you can either use the project's Web Flash option to flash a ready build to an ESP32 or build and upload from source. Hardware choices change configuration (SPI TFT vs composite). The guide below follows the README’s documented options and configuration flags; follow the repository docs for the latest exact commands and pin mappings.

  1. Step 1 — Prepare hardware: Required: a dual-core ESP32 module (e.g. DevKitC or WROOM-32) with at least 1 MB flash, a 240×320 SPI TFT (ST7789 recommended for full-speed), or else components for composite video (RCA jack, 1 kΩ resistor, 10 nF capacitor). Also a MicroSD card module, audio amplifier (e.g. PAM8403), speaker, and buttons or a supported controller. Verify the wiring guidelines in config.h and the README before connecting power.
  2. Step 2 — Use Web Flash (fastest verified path): The project provides a Web Flash page (linked from the README). Connect your ESP32 via USB, open the project's Web Flash URL, select a release or build artifact and follow the on-page instructions to flash the firmware. This method eliminates local toolchain setup but will flash the specific build the page provides — consult the Releases tab for additional build options.
  3. Step 3 — Build from source (alternative): Clone the GitHub repository to your work machine. The repository includes platform configuration files and an Arduino/ESP-IDF-compatible project layout. Choose your toolchain (Arduino IDE/PlatformIO or esp-idf) per the repository documentation. Edit config.h to enable your display type or to enable composite video (uncomment #define COMPOSITE_VIDEO) and set AUDIO_PIN and VIDEO_STANDARD as needed. Build and upload using your chosen toolchain; follow the repository's 'How to Build and Upload' section for exact commands and required libraries.
  4. Step 4 — Configure composite video (if used): To use composite video, enable COMPOSITE_VIDEO in config.h. Wire GPIO25 to video RCA output, GPIO18 (or configured AUDIO_PIN) to audio with a 1 kΩ resistor and 10 nF capacitor to ground as shown in the README. Note that composite output disables the SPI display pipeline; the project README documents this mutual exclusivity.
  5. Step 5 — ROM storage and backends: The emulator supports multiple ROM backends (MicroSD or embedded flash LRU cache/partition). Prepare a FAT-formatted microSD card and copy your own legally-obtained NES ROM files. The README recommends using NesCartDB to confirm the iNES mapper number; Anemoia-ESP32 implements mappers 0,1,2,3,4,and 69 (repository notes this covers roughly 79% of the NES catalog). If a game fails, check mapper compatibility before debugging.
  6. Step 6 — After flashing and first boot: On first boot open the project's menu (documented in README) to configure controls, display mode, and audio. Save states are supported — see the README for save location details. If you have controller wiring or nonstandard pins, update config.h to match your hardware and rebuild or reflash.
  7. Step 7 — Troubleshooting & performance tuning: If a game runs slow on an SPI display, the README notes that ST7789 at 80MHz SPI can render without frame skip, while slower displays (ILI9341 at 40MHz) may require 1 frame skip. For audio issues ensure AUDIO_PIN matches your wiring and amplifier is powered. Open an issue on the project GitHub if you encounter reproducible compatibility bugs.

Software reminder: This project is GPLv3-licensed open-source software. The repository does not include NES game ROMs or any commercial firmware — you must provide your legally obtained ROM files. Follow licensing terms in the repository when redistributing any modified firmware.

Sources and further reading

Detailed guides and tutorials

Explore step-by-step guides for Anemoia-ESP32 as they are published.