nuPSX is an experimental PlayStation 1 emulator and debugger written in Zig, built as a learning exercise to explore Zig's capabilities and PSX hardware architecture. While I'm super proud of how far it has come, this is by no means an emulator that most would consider usable and complete. If you've come here for learning about emulation, this is probably a good project to dig into. If you are looking for the emulator to play games, better to check out DuckStation.
State
Can boot and play lots of commercial games (notably Crash Bandicoot and MGS) and homebrew demos. Some things are still missing or incomplete. Tested 2D games are mostly fine, 3D games may have minor graphical glitches. Sound system lacks certain effects but is functional enough to play music and most of sound effects in tested games.
| Game | Status | Issues |
|---|---|---|
| Ape Escape | π¨ InGame | Requires analog controller |
| Battle Arena Toshinden | π© Playable | |
| Castlevania Symphony of the Night | π¨ InGame | Broken shading |
| Colin McRae Rally | π© Playable | |
| Colin McRae Rally 2.0 | π© Playable | |
| Colony Wars | π© Playable | |
| Crash Bandicoot | π© Playable | |
| Crash Bandicoot 2 | π© Playable | |
| Crash Bandicoot 3 | π© Playable | |
| Crash Bash | π© Playable | |
| Crash Team Racing | π© Playable | |
| Dino Crisis | π¨ InGame | Sound glitches |
| Doom | π© Playable | |
| Driver | π© Playable | |
| Earthworm Jim 2 | π© Playable | |
| Final Fantasy VII | π© Playable | |
| Frogger | π© Playable | |
| Gran Turismo | π© Playable | |
| Gran Turismo 2 | π© Playable | |
| Grand Theft Auto | π© Playable | |
| Legacy of Kain: Soul Reaver | π¨ InGame | Sound issues |
| Medal of Honor | π© Playable | |
| MediEvil | π© Playable | |
| Metal Gear Solid | π© Playable | |
| Mortal Kombat 2 | π© Playable | |
| Mortal Kombat 4 | π© Playable | |
| Quake II | π© Playable | |
| Rayman | π§ Intro | Stuck at Ubisoft logo screen |
| Rayman 2 | π© Playable | |
| Resident Evil 2 | π© Playable | |
| Ridge Racer | π© Playable | |
| Silent Hill | π© Playable | |
| Spider Man 2 | π© Playable | |
| Spyro the Dragon | π© Playable | No background music |
| Spyro - Year of the Dragon | π© Playable | |
| Star Ocean - The Second Story | π© Playable | |
| Tekken 3 | π¨ InGame | Freezes after first round |
| Tom and Jerry in House Trap | π© Playable | |
| Tomb Raider | π¨ InGame | No background sounds |
| Tomb Raider III | π¨ InGame | Incorrect shading |
| Tony Hawk's Pro Skater 2 | π© Playable | Broken geometry |
| Vagrant Story | π¨ InGame | Sound effects pitch |
| Wipeout | π© Playable | |
| Wipeout 3 | π© Playable | |
| Xenogears | π¨ InGame | No FMVs (just sound), graphical glitches |
π₯ Nothing - Doesn't boot or crashes the emulator
π§ Intro - Boots into the title screen or main menu but doesn't get past it
π¨ InGame - Boots into the game but has major issues
π© Playable - Boots into the game with minor or no issues
Download
Below are links to the latest prebuilt binaries. I don't have enough computers so not all of them are tested.
- nupsx-aarch64-linux-gnu.zip
- nupsx-x86_64-linux-gnu.zip
- nupsx-macos.dmg (universal)
- nupsx-aarch64-macos.zip
- nupsx-x86_64-macos.zip
- nupsx-x86_64-windows.zip
Note for macOS users: macOS will quarantine downloaded binaries by default. If you get a warning that the app is damaged or cannot be opened, remove the quarantine attribute with:
xattr -d com.apple.quarantine nupsx
Build & Run
git clone https://github.com/maxpoletaev/nupsx.git
cd nupsx
zig build --release=safe
./zig-out/bin/nupsx --bios SCPH1001.bin
Command Line Options
nuPSX - A PlayStation emulator
Usage: nupsx --bios <path> [options]
Options:
--bios <path> Path to BIOS file (required)
--exe <path> Path to executable file to run
--cdrom <path> Path to CD-ROM image file (.cue)
--memcard <path> Path to memory card image (default: ~/.nupsx/memcard.mcd)
--debug Enable debug user interface
--disasm Enable disassembly output
--breakpoint <addr> Set a breakpoint at the specified address (hexadecimal)
--uncapped Run the emulator without frame rate limiting
--no-shader Disable the CRT/NTSC shader
--upscale <n> Internal resolution scale, 1-4 (default: 1)
-h, --help Show this help message
Controls
[ Q ] [ O ]
_/[ E ]\_ ββ _/[ U ]\_
/ \--------------/ \
| [W] | | [I] |
| [A] [D] | | [J] [L] |
| [S] | SHFT ENTRβ© | [K] |
|\_________/--------------\_________/|
| / \ |
| / \ |
\____/ \____/
β = W β³ = I [START] = Enter
β = A β» = J [SELECT] = R-Shift
β = S Γ = K [L1] = E [R1] = U
β = D β― = L [L2] = Q [R2] = O
Dependencies
nuPSX relies on zig-gamedev libraries for graphics, audio and ImGui bindings.
Credits
Most of the knowledge comes from PSX-SPX Playstation Specifications by Martin "nocash" Korth.
Also special thanks to folks in EmuDev Discord for sharing tons of undocumented knowledge and getting me unstuck countless times.
Readings:
- PlayStation Emulation blog post series by James Groth
- PlayStation Emulation Guide (PDF) by Lionel "simias" Flandrin
- The PS1 GPU texture pipeline and how to emulate it reddit post by an unknown author
Tests and Demos:
- https://psx.amidog.se/doku.php
- https://github.com/PeterLemon/PSX
- https://github.com/JaCzekanski/ps1-tests
Referenced Projects:





