This project is a lightweight retro game launcher with built-in Game Boy, NES, SNES, ZX Spectrum,
Nintendo DS, PlayStation, and Nintendo 64 emulator cores. Drop ROMs into the games/ directory
and run one command to pick a title—no external emulators required for any of the handheld or
console cores listed above. GameCube titles still hand off to Dolphin automatically when it is
installed so you get full-speed emulation there as well.
- Rust 1.76+
- SDL2 development libraries (
libsdl2-dev,SDL2-devel, orbrew install sdl2) - Mupen64Plus core + plugins (video, audio, input, and RSP). Install the
m64pbundle on Windows/macOS or themupen64plus/mupen64plus-pluginspackages on Linux so the launcher can dynamically loadlibmupen64plusalong withmupen64plus-video-*,mupen64plus-audio-*,mupen64plus-input-*, andmupen64plus-rsp-*. - Dolphin emulator binary (optional, for full GameCube emulation—set
DOLPHIN_BINor place Dolphin on yourPATH) - Vulkan 1.1 runtime + GPU drivers (MoltenVK on macOS,
vulkan-loader/mesa-vulkan-driverson Linux, and up-to-date GPU drivers on Windows) for the built-in PlayStation core powered bytrapezoid-core. - A PlayStation BIOS (
SCPH1001.bin,SCPH5501.bin, etc.) stored atbios/ps1/or pointed to with thePS1_BIOS/PSX_BIOSenvironment variable (or--ps1-bioson the CLI). - Nothing else—every handheld plus Nintendo 64 ships in-tree or is loaded automatically at runtime, so you do not need BIOS dumps or ROM-specific patches for those systems.
cargo build --release- Place your ROMs under
games/(a sampletetris.gbis already there). - Just drop your ROMs (
.gb,.gbc,.nes,.sfc,.smc,.snes,.nds,.cue,.exe,.n64,.z64,.v64,.iso,.gcm,.gcz,.gcn,.rvz,.ciso) intogames/.
The N64 core embeds Mupen64Plus directly, so the launcher simply loads the shared libraries you already have installed. It scans the locations below automatically:
M64P_ROOT(if set) plus itslib,bin, andpluginssubdirectories- Explicit overrides:
M64P_CORE_LIB,M64P_PLUGIN_DIR,M64P_VIDEO,M64P_AUDIO,M64P_INPUT,M64P_RSP, andM64P_DATA_DIR - Standard system locations such as
/usr/lib/mupen64plus,/usr/local/lib/mupen64plus,/usr/share/mupen64plus,/opt/homebrew/Cellar/mupen64plus/*, and the defaultm64pinstallation folders on Windows (C:\Program Files\m64petc.) - Linux bonus: if none of the locations above contain the core, the launcher automatically downloads the
official
mupen64plus-bundle-linux64-2.5.9release from GitHub, extracts it under${XDG_CACHE_HOME:-~/.cache}/retro-launcher/mupen64plus/, and loads the core/plugins from there. That means a clean Linux install can boot Nintendo 64 titles with zero manual setup or environment variables.
If the launcher cannot find one of the required shared libraries it prints the exact file names it tried to
find and exits gracefully. The first launch also creates a config directory (e.g.
$XDG_CONFIG_HOME/retro-launcher/mupen64plus) where Mupen64Plus keeps its own mupen64plus.cfg. Feel free to
edit that file directly if you want to remap controller bindings or advanced video settings—the launcher will
re-use it on subsequent boots.
Launch the menu:
cargo run --releaseThe launcher scans games/, shows a numbered list, and runs whichever entry you pick. To run a ROM
directly, skip the menu:
cargo run --release -- --rom games/tetris.gbNintendo 64 titles work the same way—just point at one of the supported cartridge images:
cargo run --release -- --rom "games/Mario Kart 64.z64"PlayStation discs are identical—pass the .cue file (plus --ps1-bios ... if you have not set
PS1_BIOS/PSX_BIOS):
cargo run --release -- --rom "games/Crash Bandicoot.cue" --ps1-bios bios/ps1/scph1001.binFrame pacing: Windows default to ~60 FPS so titles run at their intended speed. Pass
--limit-fps=falseonly if you explicitly want uncapped rendering (useful for debugging).
The PlayStation 1 core embeds trapezoid-core directly, so the
launcher needs a few extra assets on disk:
- BIOS – place
SCPH1001.bin,SCPH5501.bin, or another NTSC BIOS image underbios/ps1/(filenames are matched case-insensitively), or point the launcher at a BIOS by passing--ps1-bios /path/to/SCPH1001.binor exportingPS1_BIOS=/path/to/SCPH1001.bin(PSX_BIOSis also honored). The file must exist and will be fed directly into the emulator core. - ROM formats – disc games should be launched via their
.cuesheet so the emulator can follow the referenced.bintracks; PS-EXE homebrew files (.exe) are also supported. Keep the.binpayload next to the.cuefile just like you would for other PS1 frontends. - Vulkan runtime – ensure
vulkaninfoworks (MoltenVK on macOS, up-to-date AMD/NVIDIA/Intel drivers on Windows, and thevulkan-loader/mesa-vulkan-driverspackages on Linux). - Memory cards – the core automatically reads/writes
memcard0.mcdandmemcard1.mcdin the current working directory so saves persist between runs.
Any SDL2-compatible gamepad works across every built-in core. The d-pad (or left stick) maps to the
console d-pads, A/B/X/Y map to the respective face buttons, and the shoulder buttons map to L/R. On
Nintendo 64 the right stick drives the C-buttons and the left trigger (or Back/Select) becomes the Z
trigger; PlayStation follows the same layout (A=Cross, B=Circle, X=Square, Y=Triangle) with analog
triggers feeding L2/R2, and GameCube mirrors that pattern for its C-stick and analog triggers. Start maps to START
everywhere, while Back/Select continues to feed SELECT on systems that have it. Nintendo DS titles
still require a mouse for the touchscreen, but all handheld/console buttons can be driven from the
controller.
Keyboard bindings are always active alongside controllers, so you can mix analog sticks with the key layout below without toggling any settings.
GameCube titles additionally parse the disc header on load—the launcher prints the game ID, maker,
disc, and streaming flags to the console and an overlay in the top-left corner of the window mirrors
that metadata so you can quickly confirm which image you booted. Both raw ISOs and Dolphin-style
.rvz images are supported—the latter are transparently decompressed in-memory at launch. If a
Dolphin binary is available (either via the DOLPHIN_BIN environment variable or on PATH under
names such as dolphin-emu), the launcher automatically hands the game off to Dolphin for full
emulation; otherwise it falls back to the built-in visualization stub so you still get metadata and
input plumbing even without the external core installed.
sudo pacman -S dolphin-emu
export DOLPHIN_BIN="$(command -v dolphin-emu-nogui || command -v dolphin-emu)"Leave the DOLPHIN_BIN export in your shell profile (or launch the game via DOLPHIN_BIN=... cargo run --release)
so the launcher knows which Dolphin binary to spawn. Any other platform can do the same as long as
the executable is either on PATH or the absolute path is assigned to DOLPHIN_BIN.
| System | Core delivery |
|---|---|
| Game Boy | Built-in Rust core (gameboy_core patched in-tree) |
| NES | Built-in Rust core (gc_nes_core) |
| SNES | Built-in Rust core (super-sabicom via meru-interface) |
| Nintendo DS | Built-in Rust core (desmume-rs) |
| PlayStation | Built-in trapezoid-core + Vulkan renderer (via vulkano/winit) |
| Nintendo 64 | Embedded Mupen64Plus core loaded at runtime (libmupen64plus + plugins) |
| GameCube | External Dolphin binary (auto-detected via DOLPHIN_BIN or PATH); stub visualization runs only when Dolphin is missing |
All of the built-in rows (Game Boy through PlayStation and Nintendo 64) compile directly into the launcher binary. GameCube requires the external Dolphin install described above in order to play games; without it you’ll just see the metadata overlay and placeholder graphics.
- Arrow keys: D-pad
Z: A buttonX: B buttonEnter: STARTRight Shift(orSpace/Backspace): SELECTEsc/ window close: exit
- Arrow keys: D-pad
X: A buttonZ: B buttonEnter: STARTRight Shift(orSpace/Backspace): SELECT
- Arrow keys: D-pad
X: AZ: BS: XA: YQ: LW: REnter: STARTRight Shift(orSpace/Backspace): SELECT
SNES battery-backed saves are written to a .sav file alongside the ROM.
- Arrow keys: D-pad
X: AZ: BS: XA: YQ: LW: REnter: STARTRight Shift(orLeft Shift/Space/Backspace): SELECT- Hold the left mouse button on the bottom screen to use the touchscreen stylus
- Arrow keys: D-pad
Z: Cross (X)X: CircleA: SquareS: TriangleQ: L1,W: R11: L2,2: R2Enter: STARTRight Shift(orSpace/Backspace): SELECTEsc/ window close: exit
- Arrow keys / Controller d-pad or left stick: analog stick (full range) plus the digital pad
X: A buttonZ: B buttonI/K/J/Lor controller right stick: C-Up / C-Down / C-Left / C-RightQ: L buttonW: R buttonEor either Shift key / controller Back-Select / left trigger: Z triggerEnter: STARTEsc/ window close: exitAll controller + keyboard input is routed through
mupen64plus-input-sdl, so any SDL-compatible pad is auto-detected alongside the keyboard. Editmupen64plus.cfgunder the launcher’s config directory if you want to customize bindings or sensitivity—the defaults mirror the layout above.
- Arrow keys / Controller d-pad or left stick: main stick + D-pad
X: A,Z: B,S: X,A: YEor either Shift key / controller Back-Select: ZQ: L,W: R (digital shoulders)U/O: analog L / R trigger sweep (controllers use their triggers automatically)J/L/I/K: C-stick (right stick)Enter: STARTEsc/ window close: exit
games/
tetris.gb # sample Game Boy ROM
bios/
ps1/
SCPH1001.bin # place your BIOS dump here (or point --ps1-bios / PS1_BIOS to it)
src/
...
Add more ROMs (GB/GBC/NES/SNES/NDS/PS1/N64/GameCube) to the games/ folder and rerun the launcher whenever you want to
play.