0.9.5 / 04-11-2022
MelonDS
Accuracy
Performance
Features
MelonDS is a work-in-progress Nintendo DS emulator aiming for better performance while being able to to emulate Wi-Fi and local multiplayer capabilities. It has many quality of life features such as save states, Joystic support, screen positioning, RTC, microphone and much more..! It's developed by a former contributor of DeSmuME and even has libretro core available. There's also active development of an Android port.
It also requires DS BIOS/firmware copies
bios7.bin, 16KB: ARM7 BIOS
bios9.bin, 4KB: ARM9 BIOS
firmware.bin, 128/256/512KB: firmware
Please note firmware boot requires a firmware dump from an original DS or DS Lite. DS firmwares dumped from a DSi or 3DS aren't bootable and only contain configuration data, thus they are only suitable when booting games directly.
--
Windows: None Reported
Mac: Install the appropriate libraries beforehand with the Homebrew Package Manager.
In Terminal, type "brew install qt5 sdl2 libslirp"
Most Recent Changes
--0.9.5--
As of today, the melonDS project is 6 years old. For this occasion, we present you this special version of the melonDS logo, recolored to the same pretty sky-blue color as 6 itself.
We wanted to have Peach bake a cake shaped like this, but Bowser kidnapped her again. We aren't great bakers at the melonDS HQ, so... yeah.
Regardless, these 6 years are a great success. Back in 2016, when I started working on melonDS, I was mostly just making it to have fun and pass time until my job started. I had absolutely no idea the project would go on for so long, and be as much of a success as it has been. So, first of all, I want to thank all the comrades who have helped make this possible. The melonDS team and other contributors. nocash and his great documentation. Everybody else who has been involved in reverse-engineering the DS/DSi hardware, cracking the DSi security, etc... And of course, everybody who has been using melonDS, testing games in it, reporting issues, suggesting improvements, etc...
Thank you all. melonDS is a team effort, and you deserve your part of the birthday cake.
Improved local multiplayer
This is a big change. If you know melonDS, you know that local multiplayer has always been finicky. You had to disable your framerate limiters, sacrifice some goats to the wifi deities, and hope everything would work without disconnecting. Well, this is past now! melonDS 0.9.5 is the result of the first season of the local multiplayer saga, and I dare say that the result is pretty good.
As an example: there was no way to get Mario Kart DS multiplayer to stay connected for more than a few seconds, before. Now? It's smooth as butter. Many games have been tested and most of them work absolutely fine, atleast in two-player mode. It is also possible to go for three players and more, but more atypical multiplayer settings might run into problems, or suffer from decreased performance. Oh and if you have an original DS firmware, it's also possible to use download play and Pictochat.
However, it is worth noting that I've had to completely rework the way local multiplayer communication and sync were handled. The new method requires all participating melonDS instances to be running on the same machine, so it isn't possible to play over LAN. Not that it has ever worked well tbh. But, essentially, the new IPC communication layer has extra smarts to avoid lag as much as possible, which are made possible by the use of shared memory -- these would be much more difficult, if not impossible, to replicate with BSD sockets over the network.
The melonDS UI has also been revamped to make the multiplayer experience smoother. It is possible to launch new isntances of melonDS easily from the emulator's System menu (opening them just by opening the melonDS executable should also work). Certain parts of the emulator's configuration will be unique to each instance, for example it is possible to configure each instance to use a different joystick, to select which instances can output sound, and so on.
There are a couple shortcomings to this. First one, some emulator settings (like BIOS/firmware files) are shared across all instances, but if you modify them, they may not reflect to instances which are already opened. These settings should be easily identifiable as I made them editable from the first melonDS instance only. Also, keyboard input, due to how it works, won't be suitable for playing a multiplayer game with a friend -- you will need joysticks for that.
However, we have big plans for this. There will be a second season to the local multiplayer saga, where we will implement netplay. This will make it possible to play with your friends over LAN, or even over the internet. The downside is that it will require each participating machine to run every participating melonDS instance, but we're confident that any decent computer can handle this. Besides, this is the cost to keeping a multiplayer game in sync. Due to how tight the local multiplayer timings are, there's no way Nintendo's wifi protocol would ever work over the internet.
The improvements to local multiplayer include improvements to wifi emulation itself, which may also improve stability in WFC games.
DSi camera support
melonDS had basic DSi camera emulation since version 0.9.1, but it wasn't very useful as it was just feeding a fixed stripe pattern as camera input. You guess this doesn't help sell our DSi emulation, seeing as cameras are the number one feature of that console, and the main reason some games support it at all instead of just sticking to the original DS.
melonDS 0.9.5 has actual DSi camera support now. That is, you can configure camera input to be sourced either from physical cameras on your computer, or from a fixed image file. Camera emulation has also been improved, which means that for example it is possible to take pictures in the DSi camera app, and they will be saved to your emulated SD card if you have one. Not the most useful thing, but this should also mean better camera support in DSi games.
Revamped OpenGL context handling
The way melonDS handled OpenGL contexts in the Qt frontend was weird. It was responsible for a number of problems, such as for example the inability to support proper vsync.
This is past now. Generic has been porting Stenzek's OpenGL context code from DuckStation to melonDS. This reworks the way OpenGL contexts are handled to be more sane and less prone to problems. This also means that we now have an actual, proper vsync setting.
DSi DSP support
Well, technically, we've had support for that since melonDS 0.9.3. It just didn't work due to a bunch of issues with it. Now it does.
Don't get overly excited over this, though. While I have verified that it atleast works to some extent, teakra (the DSP interpreter) is slow enough that melonDS will likely fall to a single-digit framerate when the DSP is used. That's an improvement over just freezing, but certainly nowhere near playable. We will work on a DSP JIT to alleviate this.
CLI improvements courtesy patataofcourse
The command line interface (CLI) of melonDS has been revamped. Most notably:
• It is possible to boot melonDS with no game loaded, or to load a game without booting, with the -b (or --boot) switch (values: always/never/auto)
• the -f (or --fullscreen) switch lets you start the emulator in fullscreen
• when loading an archive via the CLI, it is possible to specify which file to load from the archive
• the CLI help (invoked by the --help option) will show all the possible CLI arguments and values
Change Log
• remove incorrect color profile from PNG icons (Nadia)
• DLDI fixes for the Smash demo (Arisotura)
• fix gaps in I/O handling (Arisotura)
• fix invalid savemem commands, fixes Dementium (Arisotura)
• FreeBIOS: add VRAM-compatible LZ77 decompress function, fixes Yoshi's Island (Arisotura)
• default firmware: in DSi mode, emulate DWM-W015 wifi board instead of DWM-W024 (Arisotura)
• default firmware: save WFC settings to separate file (Arisotura)
• disable firmware overrides UI when firmware override isn't checked (Nadia)
• 2D: more accurate fade/blending (Arisotura)
• DSi: add support for GXFIFO NDMA (Arisotura)
• DSi: add mainRAM mirror at 0x0C000000 (Arisotura)
• add 3DS 5:3 aspect ratio, refactor aspect ratio code (Nadia)
• OpenGL: fix 16x resolution on macOS (Nadia)
• fix triggers being recognized as negative analog stick values during mapping (Nadia)
• fix joystick mapping buttons on macOS (Nadia)
• DSi: preliminary implementation of SNDEXCNT (Generic)
• DSi: fix SD inserted/removed IRQ bits (Generic)
• DSi: implement 8/16bit access to AES registers (Generic)
• DSi: fix SCFG_MC cart-inserted bit (Generic)
• JIT: invalidate blocks in ARM7 VRAM/WRAM when it is remapped (Generic)
• fix ROM banner reading when the ROM has no banner (Rayyan, Arisotura)
• fix UTF16 ROM title handling in the ROM info dialog (Rayyan)
• wifi: improvements to wifi emulation (Arisotura)
• wifi: shared-memory based sync/comm mechanism for local wifi (Arisotura)
• proper support for multiple melonDS instances for multiplayer (Arisotura)
• DSi: actual, proper camera support (Arisotura)
• DSi: fix DSP enough that it will actually work (Arisotura)
• fix OpenGL context handling (Stenzek, Generic, Nadia)
• force-align all memory accesses (instead of just CPU memory accesses) (Arisotura)
• better CLI parameter handling (patataofcourse)
• fix bugs in DSi direct boot (Arisotura)
--0.9.4--
I know this has been a long wait, but finally, here it is: melonDS 0.9.4 is out.
It has been numbered this way because 1.0 is going to be a milestone release: we want to get local multiplayer stable for 1.0.
Anyway, what's new in melonDS 0.9.4? A bunch of improvements that should make things easier for the average end user.
Most notably, in DS mode, melonDS no longer requires you to obtain BIOS/firmware files. You can always supply these if you have them around, for a more accurate experience, but if you don't, melonDS will default to using DraStic's FreeBIOS clones. Similarly, a barebones firmware with default configuration data will be generated.
However, for now, DSi mode still requires you to provide BIOS/firmware/NAND dumps. We are studying ways to get around this requirement, but it's going to take us some work.
There is also a new dialog for firmware settings, which allows you to override the firmware settings with your own. This is intended for when using the default internal firmware, but it can also override the settings in an external firmware, and it even works in DSi mode.
DLDI support has also been upgraded: it is now possible to have melonDS generate a SD image for DLDI on its own, and it is also possible to have said SD image synced to a folder on your computer. This means that you can place files in that folder and they will show up in the emulated DLDI SD card, and conversely, any changes made to the emulated SD card will be reflected to the folder on your hard drive.
While this has been tested extensively, we still recommend that you keep a backup of any folder you intend to use with this, just in case. You can also set your DLDI SD card to be read-only if you don't need it to be writable.
All of this is also supported for the DSi SD card in DSi mode.
Support for ARM9 PU exceptions in interpreter mode has been added. For commercial games, this doesn't mean a lot, other than making certain crashes work like on hardware. But this may definitely come in handy for homebrew developers, as that means exception handlers will work as they should.
We have added a much requested feature: custom paths for saves, savestates and cheat files. The default behavior is that melonDS will place these files alongside your ROMs as it has always done, but you can specify paths where you want these files to be placed if you don't want them to pollute your ROM directory.
In the same vein, the File menu has been revamped to hopefully make the process of loading ROMs more intuitive. This post already talks about it in detail, so read it if you have any doubts.
Generic has been working on properly supporting wifi power saving. This is probably not perfect yet, but it should fix the weird issues you can encounter in Pokémon games when communications are enabled.
We also have some new fun features: Github user 2jun0 made a RAM search dialog, which may come in handy to those who want to make cheat codes. Rayyan also made a new dialog for changing the emulated battery level, which may come in handy to homebrew developers and such, and he's been remaking the input config dialog to be all fancy.
Change Log
Redesign of the Input dialog (Rayyan)
Use DraStic open-source DS BIOS replacement (Swordfish90, asiekierka)
Generate non-bootable firmware replacement (Swordfish90, asiekierka, others)
Support for syncing DLDI/DSi SD image to a folder (Arisotura)
ARM9 PU (code/data abort) support in interpreter mode (Arisotura)
Fix ADPCM decoding bug resulting in potential crackling (Arisotura)
Block sound DMA from reading the ARM7 BIOS (Arisotura)
Smarter SDL initialization (andrigamerita, Nadia, Arisotura)
Properly center the main window on macOS (Nadia)
Don't try to render if the emulator is inactive (Nadia)
Fix potential issues with DSi title importing (Nadia, Epicpkmn11)
Custom path support (Arisotura)
Fix nifi socket init on BSD and macOS (Nadia)
Add support for zero addresses in AR codes 3xxxxxxx to Axxxxxxx (Arisotura)
Lower window refresh rate if running too fast (RSDuck)
Wifi power-saving support (RSDuck)
Allow swap-screen hotkey to swap between displaying only top screen and only bottom screen (ZackWeinstein)
Add RAM search dialog (2jun0)
Add power management dialog for setting battery parameters (Rayyan)
--0.9.3--
Fix macOS right modifier detection (Nadia)
• Fill most gaps in ROMList (Arisotura)
• Fix touchscreen code in non-hybrid layout mode (Arisotura)
• GBACart: simulate open-bus decay roughly (Arisotura)
• Frontend: handle tablet and touch events (Generic aka RSDuck)
• Implement NO$GBA debug registers (BlueTheDuck)
• Make Setup Cheats option reappear on macOS (Nadia)
• Add frame step hotkey (Yukitty, additional fixes by Gal20)
• Add DSP code (PoroCYon, purringChaos)
• Save window state (Arisotura)
• JIT optimisations and fixes (Generic aka RSDuck)
• Add ROM info dialog (WaluigiWare64)
• Allow using DSi footer within NAND images (MightyMax)
• More accurate NWRAM implementation (MightyMax)
• Only open microphone if necessary (Arisotura)
• Fix undo load savestate loading (Generic aka RSDuck)
• Fix pause when inactive (Generic aka RSDuck)
• Add audio interpolation (Arisotura)
• Add SOUNDBIAS and optional 10bit audio (Nadia)
• Patch touchscreen calibration data in DSi mode (Arisotura)
• Add DSi title manager (Arisotura)
• Fix threaded rasteriser deadlock when VCount is moved (Generic aka RSDuck)
• Add preliminary DSi-mode direct boot (MightyMax, Arisotura)
• More accurate DMA timings (Arisotura)
--0.9.2--
• fix JIT on ARM Macs
• add proper Mac builds
• GX: optimize single-param commands
• add recent-files menu (abcdjdj)
• add support for loading files from archives
• fix JIT bugs
• fix wifi bugs
• improve performance of save-memory writeback
• add hotkey for swapping screens
• 3D/GL: attempt fixing various bugs
• fix OpenGL scaling on hiDPI displays
• rework GPU2D for easier integration of full GL rendering
• rework NDSCart and GBACart to make it easier to implement new cart types
• add support for NAND save memory (WarioWare DIY, Jam with the Band)
• fix bugs in DSi I2C and SD/MMC interfaces
• new screen modes
--0.9.1--
add fullscreen hotkey
remove hardcoded F11-debug key (oops)
fix some gaps in the IO handlers
add ability to run unlaunch'd DSi NANDs
add preliminary camera support (feeds fixed stripe pattern)
fix potential bugs with tight timers (fixes ZXDS)
SPU: small optimization to the mixer
better framerate limiter
fix several JIT issues
GPU: lay bases for EVIL PLANS
GPU: emulate separate scroll register for 3D layer scrolling
some corrections to the ROM savetype list
a bunch of misc fixes, as usual
--0.9--
merge in experimental DSi support
2D: delay palette lookup for sprites
2D: some attempts at fixing mosaic
CP15: only update PU regions when actually needed
2D: fix sprite Y-flip
3D/GL: fix transparency bugs
add warning against hacked firmwares
fix libpcap bug (i404788)
better file handling code (Nadia)
GBA slot and solar sensor support (rzumer)
add support for AR cheat codes
fix handling of ROMs with encrypted secure area
3D: change clipping to be closer to hardware
3D: implement DISP_1DOT_DEPTH
3D: more accurate viewport transform
build fixes (Nadia)
add JIT recompiler (RSDuck)
new Qt UI
SPU: only start channels when they can actually run
2D: allow writes to DISPCNT/masterbright/capture/dispFIFO regardless of POWCNT
SPU: don't process channels with len<4
3D/GL: cleaner polygon generation code
3D/GL: add attempt at reducing warping on quads/etc
3D: add missing variables to savestates
wifi: avoid potential out-of-bounds writes with invalid RX buffer setups
3D/GL: fix issues with framebuffer handling
make MAC randomization optional
make software renderer the default
add basic DLDI
--0.8.3--
fix ARM 'shift by register' operands (fixes Mario Party DS 'Stick and Spin' minigame)
remove glBindImageTexture() (not needed and requires GL 4.2)
fix input bugs when using Ctrl/Alt/Shift keys for buttons
fix possible crashes when exiting (again. heh)
2D: support forcedblank+masterbrightness
2D: fill gaps in implementation (mode6 on sub GPU, mode7, 'prohibited' modes/sizes for OBJ and largeBG)
build fixes
fix division edge case (xperia64)
new FPS limiter, audio sync, vsync for OpenGL
add warning message if romlist.bin is not found (Zettymaster)
--0.8.2--
fix GL renderer not working at all on certain setups (RSDuck)
add 32bit writes to certain IO ports (fixes some freezes)
OpenGL: disable vsync under Windows
fix bug when mapping a joystick axis but no button
set kMaxIterationCycles to 64 (old value 16)
fix potential crash when pressing Escape with menus opened
OpenGL: remove shitty hack
OpenGL: better lines
fix potential crash when closing emu
--0.8.1--
fix potential issue generating the config file path under Linux
fix 3D/2D blending bugs under OpenGL
fix potential crash under the software renderer when display capture is used
basic, optional OSD system
add support for setting key mappings to none
add fast-forward and pause/reset hotkeys
fix crash when closing an input config dialog during the joystick mapping process
fix bugs when changing video settings with no game loaded
faster IRQ checks
faster VRAM reads
3D/OpenGL: preliminary edge marking
3D/OpenGL: fix fog alpha
2D: render sprites one scanline in advance (iCarly - Groovy Foodie)
3D/software: fix rendering of line polygons
3D/OpenGL: add proper-ish support for line polygons
support multiple joysticks
add support for mapping keys with modifiers
add support for mapping joystick axes alongside buttons, remove hardcoded axis 0/1 mapping
overall better input/hotkey code
--0.8--
fix CP15 init during direct boot
do not apply delays to cart transfers when the WR bit is set
misc fixes
OpenGL renderer and upscaling
--0.7.4--
fix potential spurious sounds when starting melonDS
fix crash when using microphone with a WAV that has multiple channels
small optimizations and tweaks
wifi: add wifi settings dialog, with libpcap adapter list
wifi: first version of indirect (non-libpcap) mode
move most of the config settings to a platform-specific array (really just making it easier to port melonDS)
--0.7.3--
fix STRD_POST (fixes Just Sing - Vol 2 music)
add support for POWCNT1 (fixes Imagine - Teacher)
2D: fix fade effects to semitransp sprites and 3D layer (fixes Devil Survivor)
3D: truncate W to 24 bits before viewport transform. do not render polygons with any W=0.
attempt at fixing hiDPI under Windows
fix input config dialog crashes under Linux
add support for hotplugging joysticks
make 'savefile relocation when using savestates' disabled by default
remember whether main window is maximized
add menu for setting main window to an integer size
init save memory to 0xFF instead of 0x00
romlist.bin: index games by serial rather than CRC. updated romlist.
add support for 128K EEPROM (Pokémon Mystery Dungeon - Explorers of Sky)
make nocashprint also work in ARM mode
GX: always latch rendering engine registers, even when not flushing
GX: fix polygon timings when polygon is rejected by culling/clipping
rewrite main emu loop to use absolute timestamps
--0.7.2--
microphone input (physical mic, noise, wav)
nocash-style console printing
send console output to cmd under Windows
corrections to romlist.bin
2D: fix blending for semitransp sprites and 3D layer when windows are used (bypasses window 'color effect enable' check)
3D: fix 'equal' depth test margin in Z-buffering mode, fixes Puzzlers World 2
SPU: add support for channel repeat mode 3 (behaves same as 1)
SPU: always clear channel buffers, even when running ch0-7 in mode 3 (fixes American Girl - Kit Mystery Challenge!)
libui/windows: cache ideal size for uiButton. fixes lag in input config dialog
close/open lid, sleep mode
hotkey system
audio settings dialog, with volume slider and microphone settings
libui/gtk: remember last directory in which a ROM was opened
libui/gtk: attempts at fixing input config dialog crashes
framerate limiter toggle (abcdjdj)
add Linux libpcap library names (dogtopus)
betterer readme (Aqueminivan)
GX: set busy flag immediately when putting things in the FIFO, fixing possible race condition
GX: revise timing for SWAP_BUFFERS command
add flatpak manifest (cpba)
--0.7.1--
fix glitched lines in 3D
fix backwards windows
more accurate GX timings
more accurate DMA and memory timings
check for config/etc files in melonDS's directory explicitly
allow joystick axis events even when no dpad buttons are mapped
detect savemem type from database instead of huge messy fucky code
--0.7--
fix possible crashes when exiting
wifi: add basic access point melonAP (very beta)
fix SMULWx/SMLAWx opcodes, fixes Sims 2 music
add support for loading BIOS/firmware files and config file from AppData or ~/.config/melonds or from the executable directory (hcorion)
add 32-bit IPCSYNC reads/writes (Dirbaio)
add savestates
3D: (hopefully) fix bug in shadow/AA interaction (visible in the MKDS character select preview, bottom border of the platform thing)
--0.6--
don't fail completely if SDL haptic init fails (bentley)
fail gracefully when ROM loading fails
support Unicode filenames under Windows
FPS counter is back (sorry!)
allow Windows file picker to navigate through shortcuts (instead of trying to load the shortcut as a ROM)
screen layout/sizing/scaling modes, screen gap, rotation
toggle for screen linear filtering
add support for 8bit GXSTAT accesses
reset IE/IF properly
fix sound capture/playback for things like surround
--0.6b--
fix screen option menu init
add icon
add resampler with small tolerance to prevent sound clicks/pops at fullspeed
--0.5--
new UI, more stable, less windows all over the place
wxWidgets ditched, lost some weight
2D: allow reading BLDALPHA
GPU: fix potential issues with VCount write
implement 8bit accesses to some registers
2D: mosaic (not quite right for rotscaled sprites)
3D: fix culling
allow 128KB firmwares from DSi/3DS
3D: more accurate fog
3D: more accurate polygon edges (but not perfect)
3D: antialiasing
3D: misc optimizations
--0.4--
implement access modes for certain IO registers that were unhandled
actually implement RCNT instead of hardcoding it
wifi: emulation of multiplayer cmd/reply/ack transfers
wifi: more accurate RFSTATUS/RFPINS
wifi: some games can go into multiplayer now (Pictochat, NSMB, Pokémon known working)
improved savemem detect heuristic
implement firmware write, fix SPI bugs
accurate emulation of 'main memory display FIFO'
2D: fix render/capture order
2D: implement mode6 large BG
2D: fix bitmap BG sizes
2D: fix rotscaled bitmap sprites
3D: fix missing term in MatrixTranslate
3D: fix toon highlight mode
3D: fix boxtest bug
3D: accurate viewport transform
3D: polygon Y-sorting
3D: more accurate interpolation, still not perfect
3D: more accurate Z and W transforms, fix some cases of Z-fighting
3D: separate polygonID attributes for opaque and translucent pixels
3D: start documenting and implementing depth test edge cases
emulate delays for SPI transfers and div/sqrt
misc bugfixes/additions as usual
--0.3--
set POSTFLG when booting games directly, fixes Pokémon games and likely others
fix bug with cart DMA, booting a game from the firmware should be stable now
better emulation of cart transfer delays
better save type heuristics
support for writing to VCount
2D: fix display capture blending modes
2D: implement X-flip for bitmap sprites (oops)
3D: fix mode3 (vertex) texcoord generation (Eledees no longer looks like your TV decoder broke)
3D: fix Z-buffering
3D: attempt at fixing culling, works better
3D: latch all rendering-related registers upon VBlank
3D: delay rendering start a bit, for games that run late
3D: optional threaded renderer
3D: change renderer to work per-scanline; accurate stencil buffer
3D: fix alpha calculation when alphablending is disabled via DISP3DCNT
3D: fog and edge marking
wifi: more functionality emulated, attempt at sending/receiving data
misc bugfixes and optimizations
better framerate limiter
--0.2--
preliminary sound
various compatibility improvements and fixes
various little speedups too
cart transfer delays emulated
RTC uses system time
wifi stub -- games requiring wifi functionality shouldn't hang anymore
2D: windows
2D: various fixes to display capture
3D: toon/highlight shading, shadows, polygonID
3D: box test, pos test, vec test
--0.1--
First release.