5bfe51e670
* Introduce firmware-related structs * Fix some indents * Move the generated firmware identifier to a constant * Document the WifiAccessPoint constructors * Add some constants * Remove a stray comment * Implement Firmware::UserData * Add Firmware::Mask * Document Firmware::Buffer * Add a Firmware constructor that uses a FileHandle * Set the default username in UserData * Update the UserData checksum * Forgot to include Platform.h * Remove some redundant assignments in the default Firmware constructor * const-ify CRC16 * Replace the plain Firmware buffer with a Firmware object - Remove some functions that were reimplemented in the Firmware constructors * Fix some crashes due to undefined behavior * Fix the user data initialization - Initialize both user data objects to default - Set both user data objects to the same touch screen calibration * Follow the DS logic in determining which user data section is current * Remove an unneeded include * Remove another unneeded include * Initialize FirmwareMask in Firmware::Firmware * Use the DEFAULT_SSID constant * Add SPI_Firmware::InstallFirmware and SPI_Firmware::RemoveFirmware * Move a logging call to after the file is written * Add a SaveManager for the firmware * Touch up the SPI_Firmware::Firmware declaration * Move all firmware loading and customization to the frontend * Call Platform::WriteFirmware when it's time to write the firmware back to disk * Fix some missing stuff * Remove the Get* functions from SPI_Firmware in favor of GetFirmware() * Implement SPI_Firmware::DeInit in terms of RemoveFirmware * Add Firmware::UpdateChecksums * Fix an incorrect length * Update all checksums in the firmware after setting touch screen calibration data * Use the Firmware object's Position methods * Remove register fields from the Firmware object * Install the firmware before seeing if direct boot is necessary * Install the firmware before calling NDS::Reset in LoadROM * Slight cleanup in ROMManager * Fix the default access point name * Shorten the various getters in Firmware * Add qualifiers for certain uses of firmware types - GCC can get picky if -fpermissive isn't defined * Add an InstallFirmware overload that takes a unique_ptr * Log when firmware is added or removed * Don't clear the firmware in SPI_Firmware::Init - The original code didn't, it just set the pointer to nullptr * Fix a typo * Write back the full firmware if it's not generated * Move the FreeBIOS to an external file * Load wfcsettings.bin into the correct part of the generated firmware blob * Load BIOS files in the frontend, not in the core * Fix logging the firmware ID * Add some utility functions * Mark Firmware's constructors as explicit * Remove obsolete ConfigEntry values * Include <locale> explicitly in ROMManager * Fix up some includes * Add Firmware::IsBootable() * Add a newline to a log entry - Whoops * Log the number of bytes written out in SaveManager * Mark FirmwareHeader's constructor as explicit * Clean up GenerateDefaultFirmware and LoadFirmwareFromFile - Now they return a pair instead of two by-ref values * Refactor SaveManager a little bit - Manage its buffers as unique_ptrs to mitigate leaks - Reallocate the internal buffer if SetPath is asked to reload the file (and the new length is different) * Remove some stray parens * Fix some firmware-related bugs I introduced - Firmware settings are now properly saved to disk (beforehand I misunderstood when the firmware blob was written) - Firmware is no longer overwritten by contents of wfcsettings.bin * Slight cleanup |
||
---|---|---|
.github | ||
cmake | ||
freebios | ||
res | ||
src | ||
tools | ||
.gitignore | ||
CMakeLists.txt | ||
CONTRIBUTING.md | ||
LICENSE | ||
README.md |
README.md
melonDS
DS emulator, sortaThe goal is to do things right and fast, akin to blargSNES (but hopefully better). But also to, you know, have a fun challenge :)
How to use
Firmware boot (not direct boot) requires a BIOS/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.
Possible firmware sizes
- 128KB: DSi/3DS DS-mode firmware (reduced size due to lacking bootcode)
- 256KB: regular DS firmware
- 512KB: iQue DS firmware
DS BIOS dumps from a DSi or 3DS can be used with no compatibility issues. DSi BIOS dumps (in DSi mode) are not compatible. Or maybe they are. I don't know.
As for the rest, the interface should be pretty straightforward. If you have a question, don't hesitate to ask, though!
How to build
Linux
-
Install dependencies:
- Ubuntu 22.04:
sudo apt install cmake extra-cmake-modules libcurl4-gnutls-dev libpcap0.8-dev libsdl2-dev qtbase5-dev qtbase5-private-dev qtmultimedia5-dev libslirp-dev libarchive-dev libzstd-dev
- Older Ubuntu:
sudo apt install cmake extra-cmake-modules libcurl4-gnutls-dev libpcap0.8-dev libsdl2-dev qt5-default qtbase5-private-dev qtmultimedia5-dev libslirp-dev libarchive-dev libzstd-dev
- Arch Linux:
sudo pacman -S base-devel cmake extra-cmake-modules git libpcap sdl2 qt5-base qt5-multimedia libslirp libarchive zstd
- Ubuntu 22.04:
-
Download the melonDS repository and prepare:
git clone https://github.com/melonDS-emu/melonDS cd melonDS
-
Compile:
cmake -B build cmake --build build -j$(nproc --all)
Windows
- Install MSYS2
- Open the MSYS2 MinGW 64-bit terminal
- Update the packages using
pacman -Syu
and reopen the terminal if it asks you to - Install git to clone the repository
pacman -S git
- Download the melonDS repository and prepare:
git clone https://github.com/melonDS-emu/melonDS cd melonDS
Dynamic builds (with DLLs)
- Install dependencies:
pacman -S mingw-w64-x86_64-{cmake,SDL2,toolchain,qt5-base,qt5-svg,qt5-multimedia,qt5-tools,libslirp,libarchive,zstd}
- Compile:
cmake -B build cmake --build build cd build ../tools/msys-dist.sh
If everything went well, melonDS and the libraries it needs should now be in the dist
folder.
Static builds (without DLLs, standalone executable)
- Install dependencies:
pacman -S mingw-w64-x86_64-{cmake,SDL2,toolchain,qt5-static,libslirp,libarchive,zstd}
- Compile:
cmake -B build -DBUILD_STATIC=ON -DCMAKE_PREFIX_PATH=/mingw64/qt5-static cmake --build build
If everything went well, melonDS should now be in the build
folder.
macOS
- Install the Homebrew Package Manager
- Install dependencies:
brew install git pkg-config cmake sdl2 qt@6 libslirp libarchive zstd
- Download the melonDS repository and prepare:
git clone https://github.com/melonDS-emu/melonDS cd melonDS
- Compile:
cmake -B build -DCMAKE_PREFIX_PATH="$(brew --prefix qt@6);$(brew --prefix libarchive)" -DUSE_QT6=ON cmake --build build -j$(sysctl -n hw.logicalcpu)
If everything went well, melonDS.app should now be in the build
directory.
Self-contained app bundle
If you want an app bundle that can be distributed to other computers without needing to install dependencies through Homebrew, you can additionally run ../tools/mac-bundle.rb melonDS.app
after the build is completed, or add -DMACOS_BUNDLE_LIBS=ON
to the first CMake command.
TODO LIST
- better DSi emulation
- better OpenGL rendering
- netplay
- the impossible quest of pixel-perfect 3D graphics
- support for rendering screens to separate windows
- emulating some fancy addons
- other non-core shit (debugger, graphics viewers, etc)
TODO LIST FOR LATER (low priority)
- big-endian compatibility (Wii, etc)
- LCD refresh time (used by some games for blending effects)
- any feature you can eventually ask for that isn't outright stupid
Credits
- Martin for GBAtek, a good piece of documentation
- Cydrak for the extra 3D GPU research
- limittox for the icon
- All of you comrades who have been testing melonDS, reporting issues, suggesting shit, etc
Licenses
melonDS is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
External
- Images used in the Input Config Dialog - see
src/frontend/qt_sdl/InputConfig/resources/LICENSE.md