Free firmware · ESP32 · 4.0″ CYD

RETROCYD

Turn a Cheap Yellow Display into a pocket retro console.

Free firmware for the 4.0″ ESP32 touch board that plays NES, Game Boy, Game Boy Color, Sega Master System, Game Gear and CHIP-8 homebrew from a microSD card. Flash it straight from your browser — no toolchain, no command line.

  • NES · GB · GBC · SMS · GG · CHIP-8
  • Touch, wired or Bluetooth controller
  • Installs from your browser
The 4.0-inch ESP32 board running the RetroCYD launcher A yellow circuit board with a 480 by 320 screen. The screen shows the RetroCYD launcher: system tiles (NES, Game Boy, Game Boy Color, CHIP-8), a recently played list, and an A to Z quick-jump bar on the right edge. BOOT RST ESP32-32E · 4.0" · ST7796S · 320×480 RETROCYD microSD · 4 312 games NES 2 148 games GB 1 302 games GBC 766 games 8 CHIP-8 96 games RECENTLY PLAYED GB Astro Drift state 1 · 2 min ago NES Cave Crawler DX yesterday GBC Pixel Garden 3 days ago CH8 Rocket Hop last week ABCDEFGHIJKLMNOPQRSTUVWXYZ A PLAY B BACK DRAG TO SCROLL

Stylised illustration · 4.0″ ESP32-32E (E32R40T) running the RetroCYD launcher. Game titles shown are made-up examples.

6systems: NES, Game Boy, Game Boy Color, Master System, Game Gear, CHIP-8
~10Kfiles in a folder? Indexed in seconds, then instant
~1300free homebrew games, downloaded over Wi-Fi
4save-state slots per game, plus battery saves
3ways to play: touch, wired or Bluetooth controller

What you get

A real little console, not a tech demo

Everything below is in the firmware today. Things that aren't done yet live on the roadmap, not here.

Six systems

NES (Famicom), Game Boy, Game Boy Color, Sega Master System, Game Gear and CHIP-8 / SUPER-CHIP — all in one firmware.

Launcher for huge libraries

System tiles, a recently-played list, an A–Z quick-jump bar and touch-drag scrolling. Big folders get a sorted index on the SD card the first time (a few seconds for ~10,000 files), then open instantly. Subfolders welcome.

Flash ROM cache

Games are copied from SD into a 2 MB flash partition and run from there. A new game takes a couple of seconds (with a progress bar); relaunching the same one is instant. ZIPs with a single ROM work too.

Saves that stick

Battery saves (.sav) are written to the SD card when you open the menu, quit, and periodically while playing. Plus 4 save-state slots per game.

Menu & settings

In game: resume, save/load state, reset, screen scale, volume, quit — open it with BOOT, the on-screen MENU button, or HOME on a controller. Settings: backlight, fast display, FPS counter, touch calibration, Game Boy palette and more.

Touch or real buttons

An on-screen gamepad for quick play, a Wii Classic Controller (Pro) or NES / SNES Classic Mini controller on the I2C header, or a PS5, Xbox or Switch pad through a Bluetooth bridge board. Hot-plug, auto-detected.

Actual sound

Audio through the board's DAC and on-board amplifier to the 1.25 mm speaker connector. Add a small 8 Ω or 4 Ω speaker and you're done.

Free games over Wi-Fi

Pick your Wi-Fi in Settings and RetroCYD downloads about 1,300 free homebrew games from Homebrew Hub, the CHIP-8 Archive and SMS Power! — automatically at startup, or when you tap “Download now”. Each file is checked before it's kept. Firmware updates install over Wi-Fi too.

Web installer

Flash it from your browser

Uses ESP Web Tools and the Web Serial API. Works in desktop Chrome, Edge and Opera.

  1. Plug the board in

    Use a USB-C data cable. Many cables in drawers are charge-only and the board simply won't show up.

  2. Pick your board

    RetroCYD is built for the 4.0″ ESP32-32E (E32R40T with touch, E32N40T without). Other CYD variants use different displays and pins.

  3. Connect & choose the port

    Click the button and pick the port called something like USB-SERIAL CH340 or USB Serial. Nothing listed? You may need the CH340 driver.

  4. Install

    On a first install tick Erase device — it wipes old firmware and settings from the flash chip only. Your SD card is never touched.

  5. Done — it reboots

    Wait for the progress bar to finish (usually a minute or two). The board restarts into RetroCYD. Now set up the SD card.

“Failed to connect”? Hold BOOT while you click Connect, release once it starts. More fixes in Troubleshooting.

RETROCYD INSTALLER

Checking firmware…
1. Choose your board
Version
…
Built
…
Commit
…

Optional · Bluetooth

Play with a PS5, Xbox or Switch controller

Add a second ESP32 board for a few euros as a Bluetooth receiver. It connects to your controller and passes the buttons to the CYD like a wired Wii Classic controller, so the CYD gives the games all its RAM as before.

Wiring the Bluetooth bridge to the CYD Four wires connect an ESP32 dev board to the CYD. The bridge's VIN (5 volt) pin goes to the 5V pin of the CYD's serial header. The bridge's GND goes to GND on the CYD's I2C header, IO26 goes to SDA (IO32) and IO25 goes to SCL (IO25). The 3V3 pin of the I2C header and the serial header's GND, TX and RX pins stay unconnected. BLUETOOTH BRIDGE ESP32 dev board (WROOM-32) ESP32 WROOM-32 USB-C · only for flashing CYD 4.0″ 4-pin headers on the back SERIAL I2C VIN / 5VGNDIO26IO25 5V GNDSDA · IO32SCL · IO25 GND · not usedTX · not usedRX · not used 3V3 leave free 5 V FROM USB 3.3 V SIGNALS ON BOTH BOARDS
Connect by the labels printed on your boards: the bridge pins may be marked D25/D26 or G25/G26, and VIN may be marked 5V. Leave the I2C header's 3V3 pin free.
Power comes from the CYD

The bridge takes 5 V from the CYD's 4-pin serial header, which carries the power of the CYD's USB-C port. Don't use the 3V3 pin instead: the CYD's small 3.3 V regulator already powers the CYD and its backlight, and the extra load could overheat it and reset the CYD. On battery, the serial header has no 5 V. In that case, power the bridge from its own USB-C port with a power bank, and don't connect the 5V wire. Use one power source for the bridge, not both.

  1. Get an ESP32 dev board

    Any ESP32-WROOM-32 board: “ESP32 DevKit”, “NodeMCU-32S”, CH340 or CP2102, USB-C or micro-USB. Not an ESP32-S3 or C3: they lack the Classic Bluetooth that PlayStation and Switch controllers use.

  2. Flash the bridge first

    Plug the bridge board (not the CYD) into your computer and install with the button on the right. Tick Erase device. Then unplug it.

  3. Wire it to the CYD

    Four wires, as in the picture: 5V from the serial header, plus GND, SDA and SCL from the I2C header. A wired Wii controller can't be connected at the same time.

  4. Pair your controller

    Power the CYD over USB. The bridge searches by itself; on most boards its blue LED blinks. Put the controller in pairing mode. On a PS5 or PS4 pad, hold Create (or Share) and PS until the light flashes. Next time, just press PS.

  5. Play

    PAD appears in the top-right corner of the CYD. Circle = A, Cross = B, Options = START, Create = SELECT, PS = menu.

Xbox, Switch Pro and 8BitDo pairing, the full button table and troubleshooting are in the guide.

BRIDGE INSTALLER

Checking firmware…
Connect the bridge board, not your CYD

Both are ESP32 boards, so the installer can't tell them apart. If you flash this onto the CYD by mistake, just install RetroCYD again above.

Firmware
BlueRetro v25.04
Build
Wii extension
Licence
Apache-2.0

The bridge runs BlueRetro by Jacques Gagnon, unmodified. RetroCYD isn't affiliated with BlueRetro.

After flashing

From flashed to playing

Four steps. The full details are in the guide.

  1. Format a microSD

    FAT32. Cards up to 32 GB work out of the box; bigger cards must be reformatted to FAT32.

  2. Boot once with it

    RetroCYD creates /roms/nes, /roms/gb, /roms/gbc, /roms/chip8 and /saves for you.

  3. Add free games

    Drop homebrew ROMs (or ZIPs) into the right folder. Not sure where to get them legally? We made a list.

  4. Play

    Tap a system tile, pick a game. BOOT, on-screen MENU or HOME opens the in-game menu.

Compatibility

What runs — and what can't

NES

Nintendo Entertainment System / Famicom. Full speed with automatic frame-skip. Mappers 0–4, 7, 9–11, 66 and 71 (NROM, MMC1, UxROM, CNROM, MMC3, AxROM, MMC2/4 and more).

/roms/nes · .nes .zip
Game Boy

The original monochrome handheld, with selectable palettes.

/roms/gb · .gb .gbc .zip
Game Boy Color

Colour games and dual-mode cartridges.

/roms/gbc · .gbc .gb .zip
CHIP-8

CHIP-8 and SUPER-CHIP programs. Runs trivially fast.

/roms/chip8 · .ch8 .c8 .sc8 .zip
Master System

Sega's 8-bit console (Mark III). Full speed, Sega mapper with battery saves, and the older TMS9918 picture modes some homebrew uses. Button 1 / 2 are B / A, START is PAUSE.

/roms/sms · .sms .zip
Game Gear

Sega's colour handheld: the Master System hardware with a 160×144 screen and 4096 colours.

/roms/gg · .gg .zip

Not possible on this hardware

The board has one ESP32 (dual-core Xtensa LX6, 240 MHz) with 520 KB of internal RAM, no PSRAM, 4 MB of flash, and a display that is fed pixel-by-pixel over SPI. That's plenty for 8-bit machines and nowhere near enough for these:

  • SNESThree processors to emulate at once (65816 CPU, picture processor, SPC700 sound) — far too much work for full speed — and many ROMs are bigger than the 2 MB cache.
  • GBAA 32-bit ARM with ~384 KB of RAM/VRAM to emulate, and ROMs up to 32 MB — far past the 2 MB cache and the RAM budget.
  • Genesis / Mega DriveA 68000 plus a Z80 and a demanding video chip is too much for one ESP32 without PSRAM, and the larger ROMs (up to 4 MB) exceed the cache.
  • N64 · PS13D consoles with megabytes of RAM and CD- or cartridge-sized data. Orders of magnitude beyond a microcontroller.

Honesty box

“Is this actually possible?”

Yes — with realistic expectations. Here's how it feels in practice.

NES — game speedtarget 60 Hz

The emulator aims for full speed and skips displayed frames, not game frames. Settings › Show FPS shows the real game speed and CPU load on your board.

NES / Game Boy — displayed frames~30–60 fps

Depends on screen scale and the “fast display” setting.

Game Boy / Color — game speedtarget 60 Hz
Master System / Game Gear — game speedtarget 60 Hz
CHIP-8 / SUPER-CHIPtrivially fast
  • Touch: the E32R40T panel is resistive and single-touch — fine for menus, puzzle and turn-based games. For platformers and shooters, plug in a wired controller or use a Bluetooth pad.
  • ROM size: max 2 MB. Typical homebrew is far smaller; the few 4 MB and 8 MB Game Boy Color titles won't fit.
  • Master System: 60 Hz only. A few European homebrew games ask for a 50 Hz console; most let you continue anyway.
  • Game switching: a couple of seconds to copy a new ROM into flash; relaunching the same game is instant.

Why frame-skip? Back-of-the-envelope SPI math

Every pixel travels to the ST7796S as 16 bits over SPI. Raw transfer ceilings (before any emulation work):

PicturePixels40 MHz80 MHz*
Game Boy 160×14423,040≈108 fps≈217 fps
Game Boy ×2 → 320×28892,160≈27 fps≈54 fps
NES 256×24061,440≈41 fps≈81 fps
Full screen 480×320153,600≈16 fps≈33 fps

* “Fast display” in Settings overclocks the display SPI from 40 to 80 MHz. Many panels handle it; if you see glitches, switch it off. As long as the CPU keeps up, the game itself runs at its real speed and only the number of frames shown changes.

These are worst cases with every pixel changing. RetroCYD only sends the rows that changed, starts sending while the frame is still being emulated, and while the picture scrolls updates every other line per frame (Settings › Smooth motion), which halves the data.

Next up

Roadmap

Ideas we're working towards. None of these are in the firmware yet — no promises on dates.

  • Planned
    Sega Master System / Game GearTwo more 8-bit systems that suit this hardware.
  • Planned
    More NES mappersSupport for more of the less common cartridge boards.

Keep reading

Go deeper