Skip to main content

Feasibility Analysis

Why ESP32-S3 Over Original ESP32

FeatureESP32 (LX6)ESP32-S3 (LX7)
CoreDual Xtensa LX6, 240 MHzDual Xtensa LX7, 240 MHz
SIMD / PIENoYes (128-bit, 2x-10x speedup)
Max PSRAM4 MB (Quad SPI)16 MB (Octal SPI DDR, ~84 MB/s)
Native USBNoYes (OTG, direct USB gamepad)
GPIO3445

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)

PeripheralInterfaceGPIOs Required
Display (8-bit parallel)8080 parallel~13 (8 data + 5 control)
Display (SPI alternative)SPI~5 (MOSI, CLK, CS, DC, RST)
SD CardSPI~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.

This table is the Phase-1 estimate, not the final map

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

RiskLikelihoodMitigation
Insufficient SNES frame rateMediumParallel display + code optimization
Not enough GPIOsLowESP32-S3 has 45 GPIOs, ample margin
Excessive battery drainLow5000mAh battery, ~14-16h estimated life
IP5306 auto-shutdown in sleepMediumI2C configuration or periodic pulse
Audio crackling / latencyLowI2S 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.

CorePlatformus/frameFPSvs 60fpsStatus
snes9xSNES1,7985569.3xCPU+APU (PPU on Core 1)
nofrendoNES1,52765510.9xFull emulation
gnuboyGB2,3164327.2xFull emulation
gnuboyGBC2,5483936.5xFull emulation
smsplusSMS2,0774818.0xFull emulation
smsplusGG2,0684848.1xFull emulation
pce-goPCE1,62061710.3xFull 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 Note

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)

SNES Screenshot

NES — The Legends of Owlia (nofrendo)

NES Screenshot

Game Boy — Blargg's CPU Tests (gnuboy)

GB Screenshot

Game Boy Color — uCity (gnuboy)

GBC Screenshot

Master System — Silver Valley (smsplus)

SMS Screenshot

Game Gear — Swabby (smsplus)

GG Screenshot

PC Engine — Reflectron (pce-go)

PCE Screenshot

Reference Software

ProjectPlatforms
Retro-GoNES, GB, GBC, SMS, GG, PCE
esp-box-emuNES, SNES, Genesis
NofrendoNES (portable emulator for ESP32)