Open source NES emulator for bare ESP32

NES on a bare ESP32. This should not run this well.

NESpresso32 turns a bare ESP32-WROOM-32 into a tiny VGA NES console. ROMs live in flash, games launch from a lightweight browser, and everything runs without PSRAM.

The fun part is not that it runs. It is how much had to be stripped, inlined, and tuned to make it possible.

  • VGA OVER GPIO
  • FLASH ROMS
  • OSD BROWSER
  • NO PSRAM

Latest release on GitHub

NESpresso32 pixel-art console mug logo
SYSTEM ESP32-WROOM-32
VIDEO VGA OVER GPIO
STORAGE FLASH ROMS
LIMIT NO PSRAM

Why it is interesting

The chip is the boss fight.

Every convenience has a cost: memory, cycles, timing, or stability. NESpresso32 is built around removing those costs one by one.

The project is a small act of engineering stubbornness. Not a polished product, not a black box, but a real open-source build where the fun is seeing how much can be squeezed out of hardware that should probably be doing something easier.

What makes it special

Six small choices that make the whole thing believable

Read the deeper writeup →
  • 01 VGA without a video chip

    GPIO lines carry RGB and sync directly, with I2S doing the timing work.

  • 02 ROMs become firmware

    The build pipeline converts legal .nes files into flash-resident data.

  • 03 The browser is part of the machine

    The launcher is drawn into the same constrained video path as the emulator.

  • 04 Hot paths are treated like hardware

    Pixel writes, memory reads, and common CPU work are measured and stripped down.

  • 05 The current input path is simple

    An OKY0272 4x4 keypad keeps control scanning predictable and easy to wire.

  • 06 No PSRAM escape hatch

    The emulator has to fit the ordinary module, which keeps the design honest.

Boot feel

A tiny console boot ritual

The firmware does not just start. It arrives: a quick CRT flash, a pixel logo, ready states, and a small PRESS START / A moment before the browser.

The preview keeps that ritual light. It is not pretending to be gameplay; it is a little sign that the project has care in the parts you see and the timing work you do not.

Read the ROM pipeline

Start here

Build it like a real little machine

The landing gives you the shape. The docs carry the details, caveats, and exact wiring.

  1. CloneGet the source from GitHub.
  2. Add ROMsUse homebrew or ROMs you have the right to use.
  3. Wire hardwareVGA, passive buzzer, and OKY0272 keypad.
  4. FlashBuild and upload with PlatformIO.
shell
$ git clone https://github.com/Danilop95/NESpresso32 $ pio run -t upload

Project alive

Open-source, changing, buildable.

Latest release on GitHub GitHub release data is unavailable during this build.

Frequently asked questions

Common questions about NESpresso32

What is NESpresso32?
NESpresso32 is an open-source NES emulator that runs on a bare ESP32-WROOM-32 development board. It outputs video through a VGA connector wired to GPIO pins, stores games in SPI flash, and does not require PSRAM.
Is NESpresso32 an ESP32 NES emulator?
Yes. NESpresso32 is a NES emulator specifically built for the ESP32-WROOM-32. It uses the Xtensa LX6 cores to run a 6502 CPU emulator alongside a PPU renderer and an I2S-driven VGA signal generator.
Does NESpresso32 need PSRAM?
No. NESpresso32 runs entirely on a standard ESP32-WROOM-32 without PSRAM. ROM data is embedded in SPI flash and loaded into DRAM at startup. All emulation runs from DRAM.
Does NESpresso32 output VGA?
Yes. NESpresso32 generates a VGA signal using the ESP32 I2S peripheral to drive GPIO25 (Red), GPIO26 (Green), and GPIO27 (Blue) through 330 ohm resistors, with HSYNC on GPIO23 and VSYNC on GPIO22.