NXEmu is an open-source Nintendo Switch Emulator written in C++ for Windows. It is still in the very early stage and not usable for people to play games yet. I started working on NXEmu in 2018 which I have been working on NXEmu by myself ever since and it has slowly kept progressing. Now that showing it is showing some graphics, I thought it was a good time to show what I have done so far.
Is NXEmu OpenSource?
Yes, it is released under a gpl2 license. For the first release I am not even giving out any biniares just a link to github with all my code so far.
What does this version currently do?
Not much, it has been a lot of work just to get to this point and all I have been able to get it to do so far is show the logo in sonic mania. I never thought it would take so long to just get this done, but I just kept working on it.
It is just an interpreter at this time and is extremely slow.
What are my current goals
My main goal I am focused on is getting Super Mario Odyssey to be playable on my computer using my own emulator. I have given thought to lots of other things I would like to see done and have listed that below. The current version I consider is at the 0.1 level and getting Super Mario Odyssey playable is the the 0.5 target.
I have given some thought of a roadmap and how I would keep progressing, this is a rough idea how I would keep progressing from where it is now to a fully functional emulator. Will I exactly match the milestones, probably not, but it does give me a good direction and target to hit.
- 0.1 Sonic Mania showing graphics
- 0.2 Booting faster (Recompiler)
- 0.3 Sonic Mania can get in game, starting to be playable (Controller, Audio)
- 0.4 Super Mario Odyssey can get in to game
- 0.5 Super Mario Odyssey and sonic playable/working well
- 0.6 Vulkan Render
- 0.7 Zelda Breath of the Wild
- 0.8 Pokemon Sword/Shield, Pokemon Lets go
- 0.9 Super Mario Kart (32bit)
- 1.0 Get 10-20 Triple A games fully playable
Compatibility is terrible, NXEmu only loads xci files and I have only been testing with Sonic Mania so I do not expect anything else to do anything.
Performance is also terrible, it takes 10 minutes to just show the logo with sonic mania.
Why create my own emu, instead of help an existing emulator
This is a question I am sure people will ask or think about so I thought I should answer it. It is often thought that the more people that just work on one project the better that project it is. This is not always true. There are things I want to try that may end up being better, they could be worse. They will surely be worse at the start like building my own interpreter. These need time to mature and improve to really see the results and being in someone else emulator it would never get the chance.
It could also just be an old man programmer wanting things to match my coding style and ways. I have avoided using the latest c++ features and am sticking with c11 as the highest c++ level, with most of the code written with c98 as the main format.
I like trying to keep everything clean and simple. This I could never do if I wanted to hijack another group’s emulator.
With being open source I do not think anything is lost, anything I do come up with that is better can be looked at and taken to different emulators.
What is next
Now that it is showing some graphics in sonic mania, I need it to get it to run faster. With it taking so long to show the logo, I need to build a recompiler and get things running faster before I look at more features.
Some of the things I want to look at with improving performance . I want to do my own disassembler where I do not have to use capstone, where it is not constantly allocating memory with disasm. Memory management should also be redone. This will make the interpreter faster, but it also needs a recompiler to actual boot at a reasonable speed.