Feasibility Analysis
Why ESP32-S3 Over Original ESP32
| Feature | ESP32 (LX6) | ESP32-S3 (LX7) |
|---|---|---|
| Core | Dual Xtensa LX6, 240 MHz | Dual Xtensa LX7, 240 MHz |
| SIMD / PIE | No | Yes (128-bit, 2x-10x speedup) |
| Max PSRAM | 4 MB (Quad SPI) | 16 MB (Octal SPI DDR, ~84 MB/s) |
| Native USB | No | Yes (OTG, direct USB gamepad) |
| GPIO | 34 | 45 |
The ESP32-S3 is the mandatory choice for SNES: SIMD instructions accelerate pixel manipulation, Octal PSRAM is 4x faster, and 8 MB is enough for SNES ROMs up to 6 MB + emulator buffers.
Hardware Schematic
+------------------+
| | +5V_VOUT +------+ +5V
USB-C ──────────────>│ IP5306 Module │───────────| Q2 |───── (loads)
│ (charge+boost) │ SW16 ──► | PMOS |
+--------+---------+ (gate) +------+
|
+-------+-------+
| |
+-----+-----+ +-----+-----+
| LiPo Batt | | SY8089 |
| 3.7V | | 5V -> 3.3V |
| 5000 mAh | +-----+------+
| | |
+-----------+ | 3.3V
|
+-----------+-----------+
| |
| ESP32-S3 N16R8 |
| (16MB Flash, 8MB |
| Octal PSRAM) |
| |
+--+--+--+--+--+--+--+-+
| | | | | | |
+------------+ | | | | | +----------+
| | | | | | |
+-----+-----+ +-----+--+ | +--+-----+ +----+----+
| Display | | SD Card| | | Audio | | Buttons |
| ILI9488 | | Module | | | DAC -> | | D-pad |
| 3.95" | | SPI | | | PAM8403| | A,B,X,Y |
| 8-bit par | +--------+ | | Speaker| | Start |
| (8080) | | +--------+ | Select |
+------------+ | | L, R |
| +---------+
+-----+-----+
| USB Data |
| D-/D+ |
| (native) |
+-----------+
GPIO Connections (estimate)
| Peripheral | Interface | GPIOs Required |
|---|---|---|
| Display (8-bit parallel) | 8080 parallel | ~13 (8 data + 5 control) |
| Display (SPI alternative) | SPI | ~5 (MOSI, CLK, CS, DC, RST) |
| SD Card | SPI | ~4 (MOSI, MISO, CLK, CS) |
| Buttons (12 keys: D-pad, A, B, X, Y, Start, Select, L, R) | Direct GPIO | ~12 |
| Audio DAC (I2S) | I2S | ~3 (BCLK, LRCK, DATA) |
| USB data (native) | USB | ~2 (D-, D+) |
| Total (8-bit display) | ~34 | |
| Total (SPI display) | ~26 |
The ESP32-S3 has 45 GPIOs, so both configurations are feasible.
The shipped design uses 31 GPIOs, not ~34: the audio path turned out to be
PDM (one pin, I2S_DOUT on GPIO17 — no BCLK/LRCK), and LCD_RD / LCD_BL are
hardwired on the PCB rather than driven. The authoritative pin map is
GPIO Pin Assignment.
Feasibility Assessment
Primary target: SNES
- SNES requires 65C816 CPU emulation + complex PPU (mode 7, rotation, scaling)
- ESP32-S3 with SIMD/PIE instructions provides 2-10x speedup for pixel operations
- 8 MB Octal PSRAM at ~84 MB/s handles SNES VRAM + ROM caching
- Parallel display interface is mandatory for 60 fps frame delivery
- Reference: esp-box-emu runs SNES on ESP32-S3-BOX hardware
- Some complex SNES games (SuperFX, SA-1 co-processors) may need frame skipping
Also supported: NES
- ESP32-S3 at 240 MHz with 8 MB PSRAM handles NES emulation with no issues
- Existing projects (Retro-Go, esp-box-emu) demonstrate NES at 60 fps
- NES runs comfortably even with parallel display overhead
Risks and Mitigations
| Risk | Likelihood | Mitigation |
|---|---|---|
| Insufficient SNES frame rate | Medium | Parallel display + code optimization |
| Not enough GPIOs | Low | ESP32-S3 has 45 GPIOs, ample margin |
| Excessive battery drain | Low | 5000mAh battery, ~14-16h estimated life |
| IP5306 auto-shutdown in sleep | Medium | I2C configuration or periodic pulse |
| Audio crackling / latency | Low | I2S with DMA buffer |
Conclusion
The project is feasible with SNES as the primary target. The ESP32-S3's SIMD/PIE instructions and Octal PSRAM provide the performance needed for SNES emulation. NES runs flawlessly as a bonus. The 8-bit 8080 parallel display is mandatory for SNES frame rates. The budget of ~$33-45 is modest, and all components are readily available on AliExpress.
QEMU CPU Benchmark Results
Performance measured on emulated ESP32-S3 (QEMU) with the actual hardware configuration:
- CPU: Dual-core Xtensa LX7 @ 240MHz
- PSRAM: 8MB Octal @ 80MHz
- Flash: 16MB QIO
Each core ran 300 frames after 60 warmup frames. Audio emulation included for all cores.
| Core | Platform | us/frame | FPS | vs 60fps | Status |
|---|---|---|---|---|---|
| snes9x | SNES | 1,798 | 556 | 9.3x | CPU+APU (PPU on Core 1) |
| nofrendo | NES | 1,527 | 655 | 10.9x | Full emulation |
| gnuboy | GB | 2,316 | 432 | 7.2x | Full emulation |
| gnuboy | GBC | 2,548 | 393 | 6.5x | Full emulation |
| smsplus | SMS | 2,077 | 481 | 8.0x | Full emulation |
| smsplus | GG | 2,068 | 484 | 8.1x | Full emulation |
| pce-go | PCE | 1,620 | 617 | 10.3x | Full emulation |
All 7 cores run at 6.5x to 10.9x the target 60fps. Even accounting for real-hardware PSRAM latency (~30-50% penalty) and display rendering overhead, all platforms maintain 60fps with margin. Full run details: Desktop Simulator & QEMU.
QEMU provides functional (not cycle-accurate) emulation. Real hardware performance may vary, but the relative rankings and order of magnitude are representative. The SNES PPU rendering runs on Core 1 in parallel, so the CPU-only measurement reflects the actual single-core budget.
Emulator Screenshots
Screenshots captured from the native SDL2 simulator running the same emulator cores.
SNES — Super Boss Gaiden (snes9x)

NES — The Legends of Owlia (nofrendo)

Game Boy — Blargg's CPU Tests (gnuboy)
Game Boy Color — uCity (gnuboy)

Master System — Silver Valley (smsplus)
Game Gear — Swabby (smsplus)
PC Engine — Reflectron (pce-go)

Reference Software
| Project | Platforms |
|---|---|
| Retro-Go | NES, GB, GBC, SMS, GG, PCE |
| esp-box-emu | NES, SNES, Genesis |
| Nofrendo | NES (portable emulator for ESP32) |