3DS Homebrew | |
---|---|
Introduction • Homebrew Development • Glossary • Flashcart FAQ | |
Lists | All Homebrew • Applications • Games • Emulators • Demos • CFWs • Exploits • Development libraries & tools • PC Utilities |
This page contains general information for 3DS Homebrew developers.
If you have any questions, you can come to GBAtemp's main homebrew development and help thread. It contains shared sources, examples and libraries.
Select target format and click 'Convert'. 3DS conversion takes a few seconds. 📱 Can I use 3DS converter on iPhone or iPad? Yes, you can convert 3DS files from iPhone, iPad and other mobile devices, because AnyConv 3DS Converter is a multi-platform web service. .cia is a format that you need to play with firmware hacks. You install the game and the files you install it from is.cia.3ds is the raw decrypted ROM. I think flashcarts can play this as well as emulators, but custom firmware like Luma3DS can't play.3ds directly.
You can find all known resources (hardware registers, syscalls, utilities) to develop your homebrew on 3dbrew.
To develop 3DS homebrew you need a development environment consisting of tools, scripts and libraries which will be detailed below. The sources are compiled to binary using GNU GCC-ARM or devkitPro with devkitARM. The available tools and SDK work on Windows 32/64bit and Linux.
The languages used to write homebrew are C, C++ and occasionally ASM. There are various online tutorials and books available to learn these languages.
Alternatively, you can also write homebrew in Lua by using Lua Player Plus.
- 1Install devkitARM
- 2Compiling sources
- 2.1Troubleshooting
- 4Editor setup
- 63ds/cia homebrew
- 8Using git
Install devkitARM
Windows
Use the automated-installer. Install in C:devkitPro and it will install all the latest versions of the required programs (you can disable devkitPSP, but be sure to enable libctru in devkitARM menu). It will create the environment variables automatically.
Linux / Mac OSX
1) Open a terminal and execute these commands:
Install libraries
You may want to install various libraries/tools if your project requires them.
Compiling sources
If you simply want to compile a homebrew project without (or after) editing it, you can use the make
utility from the command prompt/terminal.
1) Windows: Open a Command Prompt (Run -> cmd); Linux/Mac OSX: Open a Terminal from your applications
2) Navigate to the project directory (change to the correct path)
3) Run make
If you ever want to remove the compiled files, you can use this command:
This is often needed when re-compiling a project.
Troubleshooting
It is possible that sometimes your project will not compile. This can have various causes, for example missing libraries. In order to find out the problem, look into the output for the lines that start with 'error:
'; those will tell you what the problem is. You can ignore the warnings, they do not cause the compilation to fail.
If the output is big, you can filter it:
If you can't figure out what's wrong, feel free to make a post on the forums about it. Make sure to post all of the error output.
Windows Tip: To copy from your command prompt, right click and choose Mark. Then select the text to copy and press the Enter key.
Common errors
- cannot find 3dsx_crt0.o: No such file or directory
- In your makefile, find
-mfloat-abi=softfp
and change it to-mfloat-abi=hard
. You shouldn't ever usesoftfp
for 3DS homebrew.
- (name) uses VFP register arguments but (name2) does not
- Part of your project or the libraries you use were compiled with
-mfloat-abi=softfp
while other parts were compiled with-mfloat-abi=hard
. Make sure to use-mfloat-abi=hard
everywhere. You may have to manually recompile the libraries you use, if needed.
- (command) is not recognized as an internal or external command...
- Your PATH environment variable is not set up correctly. It should contain the msys folder in your devkitPro installation path (eg.
C:devkitPromsys
). Edit your PATH environment variable and make sure it includes this directory. If the command ispython
, make sure the python install directory (eg.C:PythonXX
, where XX is the version you installed) is in your PATH as well.
- unknown field 'rmdir_r' specified in initializer
- Your devkitARM is out of date. Rerun the installer or script.
- make[1]: *** No rule to make target `/c/Users/***/path/to'. Stop.
- Move the project to a folder with no spaces anywhere in its path
SMDH
Every homebrew application has an smdh file, containing additional information:
- Icon
- Name of the application (Short description)
- Description of the application (Long description)
- Name of the author (Publisher)
This information is used in The Homebrew Launcher (3DSX), and in the home menu (3DS/CIA).
The icon is a simple 48x48px png file. You can place this png in your project folder (the same folder as your Makefile is in) and name it icon.png. If no icon.png is present, a default icon from the ctrulib folder will be used.
The other data can be set in the Makefile directly:
The SMDH file is automatically created when building the project (unless you explicitly set NO_SMDH in the Makefile).
You can also manually build the SMDH using bannertool by steveice10:
Editor setup
This section explains how to set up various editors to edit and compile (existing) homebrew projects. If you want to start a new homebrew project, you should preferably copy an example project and edit the sources.
Note that this section lists only the more advanced editors which have features such as code auto-completion. You can use any text editor to edit the source files and compile as detailed above. You should however use a proper code editor (aka not notepad). Some examples are Notepad++, Sublime Text, vim, and Emacs.
Programmer's Notepad
The Programmer's Notepad is (optionally) installed by the devkitPro installer.
1) File -> New -> Project
Give it a name and save anywhere.
2) Right click the project -> Add Files
Now navigate to the example you want and add the files from that folder (eg. Makefile, readme.md, ...)
3) Right click the project -> Add Magic Folder
Navigate to the example directory again and add the source folder within. Repeat this for any other folders in the example (if any).
4) You can build the project using Tools -> Make
Make sure the project you want to build is the active project (Right click project -> active project)
Visual Studio 2015 (community)
When installing Visual Studio, make sure to install the Visual C++ packages!
1) File -> New -> Project From Existing Code...
2) In the dropdown, choose Visual C++ and click Next
3) Under Project file location, navigate to the folder with all sources. Enter a name for the project and click next.
4) Use external build system, Next
5) Build command line:
Clean command line:
Leave the rest blank. Click Finish.
6) Right click project (in the solution explorer) -> properties
7) Under VC++ directories -> General -> Include directories, add the devkitARM and ctrulib include directories (change if needed):
Make sure not to remove anything already in the box! You can add any other include folder that the project may need as well. In the end it'll read something like:
Click OK
8) (Optional) Right click project -> Add -> Existing Item
Choose the Makefile and any other files you want to add, then click Add. This step isn't required, but allows you to edit the Makefile etc. from the editor.
Alternatively, you can use 'Show All Files' under the 'Project' menu (on the top) to display all files and folders as they are on the file system.
9) You can now build the project (Right click -> Build)
Eclipse CDT
Tested with the standalone Eclipse Mars CDT on Linux. Instructions may be slightly different for other cases. Another alternate guide can also be found here.
1) File -> New -> Makefile Project with Existing Code
2) Under Existing Code Location, navigate to the folder containing the code.
You can leave both C and C++ checked, even if the project only contains one.
Under Toolchain for Indexer Settings, choose a valid Toolchain (eg. Linux GCC)
3) Right click the Project in the project explorer and choose properties.
4) Go to C/C++ Build -> Environment.
Here you need to add the DEVKITPRO and DEVKITARM variables, with their correct paths, eg.
Name | Value |
---|---|
DEVKITPRO | /opt/devkitPro |
DEVKITARM | /opt/devkitPro/devkitARM |
Make sure to change the values to the paths on your system.
5) This step isn't needed to build, but it will make Eclipse recognize the external libraries when editing code.Go to C/C++ General -> Paths & Symbols -> Includes
Under 'GNU C' (or 'GNU C++', or both, depending on what files your project has), add the following include directories:
Again, change the paths if needed. When finished, click OK.
6) You can now build the project. Right click project -> Build project
Code::Blocks
This premade project can be used as a base https://github.com/TricksterGuy/3ds-template
1) Open the project within Code::Blocks
2) Choose File > Save project as template, and choose a name for the template
3) When creating a new project, choose File > New > From template...
4) In the dialog select the template you created in 2)
5) Choose a directory to put the project
6) To build the 3dsx file choose target 3dsx and click the build (gear) button
7) To build and run your homebrew in citra choose the citra target and hit the build button (only works if citra is installed and in your PATH).
3dsx homebrew
Homebrew in this format is the most common, and can be played with ninjhax/ironhax/tubehax. No additional steps have to be taken to create this kind of homebrew; it is the default format produced when using make
.
Homebrew examples: https://github.com/devkitPro/3ds-examples
3ds/cia homebrew
If you don't need Kernel access, prefer developing homebrew in 3dsx format.
After building the project (see above), you should have an .elf file. You can convert this into a .3ds/.cia file with makerom:
- Download makerom (and compile it with
make
if needed) - Add the folder where you placed the makerom executable to your PATH environment variable
To create a .3ds or .cia file, you need some additional files in your project:
- An RSF file - Contains various info such as permissions etc. (TODO: Make guide on how to create these)
- An icon.bin - The icon and information for the home menu. This is equivalent to the compiled SMDH file, so you can just use that one.
- A banner.bin - The banner for the top screen
You should preferably put them in your project folder (or a subfolder).
Banner
Homebrew in 3DS or CIA format requires a banner, which appears on the top screen in the Home menu.
The banner consists of an image and an audio file. The image should be a 256x128px png file. This image may contain transparent parts. The audio file is a 16bit wav file.
You can create the banner.bin using bannertool by Steveice10:
Convert .elf to .3ds
Run the following commands:
For example:
Please note that the first command will alter the ELF file, so you may want to back it up first.
Convert .elf to .cia
CIA files are generic data containers that can be installed on a 3DS. In order to do this you need to have a 3DS below 9.2.
The process of building a CIA is similar to building a .3DS file:
Note that the used RSF file is not the same one as the one used for building .3DS files.
Releasing
When you are ready to release your homebrew application, create a new thread in the Homebrew Development section. In this thread, you can describe your project.
Make sure to attach (or link to an uploaded version of) the relevant files for your homebrew. This will usually be the 3DSX and SMDH files that have been compiled. You can also include the ELF file, which will allow people to repack it with makerom to a 3DS (and CIA) file. The ELF file can also be used on 3DS Emulators (currently two available: Citra and 3DMoo).
If your project is open source, you can upload the code to GitHub. Alternatively, you can simply provide the source as a separate download, or include it with the compiled files.
Using git
Convert 3ds To Cia Osx Iso
git is a distributed version control system. This allows you to put your code into a repository, which can then be shared with others. The main advantage is that you can keep track of your (and others') changes and even revert them if needed.
You can find instructions on the git website on how to install git on your system.
After git is installed on your system, you need to setup your username and email address. This allows git to identify who made the changes. If you have a GitHub account, use the same username and email as there!
Open a command prompt (Windows) or Terminal (Linux/OSX) and use the following commands:
Getting started
1) If you have not yet done so, create a file named README.md
in your project folder. You can use this file to add a description and information of your project. This description will be shown when people view your repository on GitHub. You can use markdown to add formatting such as bold and headings.
2) Open a command prompt (Windows) or Terminal (Linux/OSX).
3) Navigate to your project folder
4) Initialize it as a git repository
5) Add your existing code to the repository (note: the .
is part of the command)
6) Do the initial commit
How To Convert 3ds To Cia
Committing
When you make changes to your code, they need to be committed in order to 'save' them to your git repository. When and how often you commit is up to you, but try to do at most one major change per commit.
1) Make the repository aware of your changes
2) Add them to a commit
Add your project to GitHub
GitHub is a popular host for online git repositories.
1) Create a GitHub repository.
Make sure to name the repository after your project and optionally give it a description. Make sure the checkbox to create a README is not checked. The .gitignore
and license
should also be set to None
2) Open a command prompt (Windows) or Terminal (Linux/OSX) and navigate to your project folder.
3) Add GitHub as a remote host (change the URL):
4) From now on, you can push
your changes to GitHub with the following command:
This pushes the master
branch to the remote called origin
, which we setup as GitHub.
You don't have to push after every commit, but your changes will only show up on GitHub after you push.
Tags
Tags are a way on git to mark specific commits as special. For example, you could use them to track your major releases.
1) Create the tag
For example:
To tag an older commit, specify the sha1 hash of the commit:
2) If you are using GitHub, you must manually push the tag:
For support (in English) with GodMode9, as well as help with scripting and to get updates and info, join GodMode9 on Discord.
Required Reading
GodMode9 is a full access file browser for the Nintendo 3DS console, giving you access to your SD card, the FAT partitions inside your SysNAND and EmuNAND, and basically anything else. Among other functionality, you can copy, delete, rename files, and create folders.
Note that if you have any payload files other than GodMode9.firm
in the /luma/payloads/
folder on your SD card, holding (Start) on boot will display a “chainloader menu” where you will have to use the D-Pad and the (A) button to select “GodMode9” for these instructions.
GodMode9 is powerful software that has the capability to modify essentially anything on your console. Though many of these modifications are locked behind a permissions system, and it is impossible to accidentally perform dangerous actions without deliberately unlocking permissions, you should still follow instructions carefully and keep backups just in case.
Convert 3ds To Cia File
Updating GodMode9
Some of the instructions below are only applicable to the latest version of GodMode9, and as such you should follow this section to update your copy before continuing. Overwrite any existing files.
What You Need
- The v1.9.2pre1 release of GodMode9
Instructions
- Power off your device
- Insert your SD card into your computer
- Copy
GodMode9.firm
from the GodMode9.zip
to the/luma/payloads/
folder on your SD card - Copy the
gm9
folder from the GodMode9.zip
to the root of your SD card - Reinsert your SD card into your device
Creating a NAND Backup
- Launch GodMode9 by holding (Start) during boot
- Press (Home) to bring up the action menu
- Select “Scripts…”
- Select “GM9Megascript”
- Select “Backup Options”
- Select “SysNAND Backup”
- Press (A) to confirm
- This process will take some time
- If you get an error, make sure that you have at least 1.3GB of free space on your SD card
- Press (A) to continue
- Press (B) to return to the main menu
- Select “Exit”
- Press (A) to relock write permissions if prompted
- Hold (R) and press (B) at the same time to eject your SD card
- Insert your SD card into your computer
- Copy
<date>_<serialnumber>_sysnand_###.bin
andessential.exefs
from the/gm9/out/
folder on your SD card to a safe location on your computer- Make backups in multiple locations (such as online file storage)
- These backups will save you from a brick and/or help you recover files from the NAND image if anything goes wrong in the future
- Delete
<date>_<serialnumber>_sysnand_###.bin
and<date>_<serialnumber>_sysnand_###.bin.sha
from the/gm9/out/
folder on your SD card after copying it - Reinsert your SD card into your device
- If your SD card was not detected, hold (R) and press (B) at the same time to remount it
Restoring a NAND Backup
- Launch GodMode9 by holding (Start) during boot
- Hold (R) and press (B) at the same time to eject your SD card
- Insert your SD card into your computer
- Copy
<date>_<serialnumber>_sysnand_###.bin
from your computer to the/gm9/out/
folder on your SD card - Reinsert your SD card into your device
- Press (Home) to bring up the action menu
- Select “Scripts…”
- Select “GM9Megascript”
- Select “Restore Options”
- Select “SysNAND Restore (safe)”
- Select your NAND backup
- Press (A) to unlock SysNAND (lvl3) writing, then input the key combo given
- This will not overwrite your boot9strap installation
- This process will take some time
- Press (A) to continue
- Press (B) to return to the main menu
- Select “Exit”
- Press (A) to relock write permissions if prompted
Injecting any .CIA app into Health & Safety
For organizational purposes, copy the .cia
file you wish to inject to the /cias/
folder on your SD card
Note that it is not possible to inject files into Health & Safety that are larger than it (including games and other large applications)
- Launch GodMode9 by holding (Start) during boot
- Navigate to
[0:] SDCARD
->cias
- Press (A) on your
.cia
to select it, then select “CIA image options…”, then select “Mount image to drive” - Press (A) on the
.app
file, then select “NCCH image options”, then select “Inject to H&S” - Press (A) to unlock SysNAND (lvl1) writing, then input the key combo given
- Press (A) to continue
- Press (A) to relock write permissions if prompted
Restoring Health & Safety after injecting a .CIA app
This will only work if the Health & Safety injection was performed by GodMode9 (not Decrypt9 or Hourglass9).
- Launch GodMode9 by holding (Start) during boot
- Press (Home) to bring up the action menu
- Select “More…”
- Select “Restore H&S”
- Press (A) to unlock SysNAND (lvl1) writing, then input the key combo given
- Press (A) to relock write permissions if prompted
Dumping a Game Cartridge
Insert the game cartridge you intend to dump into your device
- 3DS game cartridges will be dumped to an installable
.cia
format - NDS game cartridges will be dumped to a non-installable
.nds
format compatible with flashcarts and emulators
- Launch GodMode9 by holding (Start) during boot
- Navigate to
[C:] GAMECART
- Follow the steps applicable to your game cartridge:
- 3DS Game Cartridge: Press (A) on
[TitleID].trim.3ds
to select it, then select “NCSD image options…”, then select “Build CIA from file” - NDS Game Cartridge: Press (A) on
[TitleID].trim.nds
to select it, then select “Copy to 0:/gm9/out”
- 3DS Game Cartridge: Press (A) on
- Your installable
.cia
or non-installable.nds
formatted file will be outputted to the/gm9/out/
folder on your SD card
Dumping a Title
- Launch GodMode9 by holding (Start) during boot
- Hover over the drive applicable to the type of title you wish to dump:
- User Installed Title:
[A:] SYSNAND SD
- System Title:
[1:] SYSNAND CTRNAND
- User Installed Title:
- Hold (R) and press (A) at the same time to open the drive options
- Select “Search for titles”
- Press (A) to continue
- Press (A) on the
.tmd
file to select it, then select “TMD file options…”, then select “Build CIA (standard)” - Your installable
.cia
formatted file will be outputted to the/gm9/out/
folder on your SD card
Converting a .3DS to .CIA
- For organizational purposes, copy each
.3ds
file you wish to convert to the/cias/
folder on your SD card- Note that if you wish to convert a
.3ds
file that is already on a flashcart, you should follow Dumping a Game Cartridge
- Note that if you wish to convert a
- Launch GodMode9 by holding (Start) during boot
- Navigate to
[0:] SDCARD
->cias
- Press (A) on your
.3ds
file to select it, then select “NCSD image options…”, then select “Build CIA from file” - Your installable
.cia
formatted file will be outputted to the/gm9/out/
folder on your SD card
Backup GBA VC Saves
The game will be outputted to the /gm9/out/
folder on your SD card with the name <TitleID>.gbavc.sav
.
To identify a <TitleID>.gbavc.sav
file’s Title ID, you can get a listing of all games on the system and their corresponding Title IDs by hovering over [A:] SYSNAND SD
, holding (R) and pressing (A) at the same time, then selecting “Search for titles”.
- Do the following process for each GBA VC game that you want to backup the save for:
- Launch the GBA VC game
- Exit the GBA VC game
- Boot your device while holding (Start) to launch the Luma3DS chainloader menu
- Launch GodMode9 by pressing (A)
- Navigate to
[S:] SYSNAND VIRTUAL
- Press (A) on
agbsave.bin
to select it - Select “AGBSAVE options…”
- Select “Dump GBA VC save”
- Press (A) to continue
- Press (Start) to reboot your device
Restore GBA VC Saves
To identify a <TitleID>.gbavc.sav
file’s Title ID, you can get a listing of all games on the system and their corresponding Title IDs by hovering over [A:] SYSNAND SD
, holding (R) and pressing (A) at the same time, then selecting “Search for titles”.
- Do the following process for each GBA VC game that you want to restore the save for:
- Launch the GBA VC game
- Exit the GBA VC game
- Boot your device while holding (Start) to launch the Luma3DS chainloader menu
- Launch GodMode9 by pressing (A)
- Navigate to
[0:] SDCARD
->gm9
- Press (Y) on the
<TitleID>.gbavc.sav
file you wish to restore to copy it - Press (B) to return to the main menu
- Navigate to
[S:] SYSNAND VIRTUAL
- Press (A) on
agbsave.bin
to select it - Select “AGBSAVE options…”
- Select “Inject GBA VC save”
- Press (A) to continue
- Press (Start) to reboot your device
- Launch the GBA VC game
- Exit the GBA VC game
Format an SD card
Note that this will erase the contents of your SD card!
- Launch GodMode9 by holding (Start) during boot
- Press (Home) to bring up the action menu
- Select “More…”
- Select “SD format menu”
- Select any EmuNAND options you wish to use
- Most users will want to select “No EmuNAND”
- Select “Auto”
- Press (A) to accept the label
GM9SD
- Optionally, you may input a custom name for the SD card
- When prompted, input the key combo given to confirm
Encrypting / Decrypting a .CIA file
For organizational purposes, copy each .cia
file you wish to encrypt / decrypt to the /cias/
folder on your SD card
- Launch GodMode9 by holding (Start) during boot
- Navigate to
[0:] SDCARD
->cias
- Press (A) on the
.cia
file to select it, then select “CIA image options…” - Select the option to perform the desired function:
- Encrypt to 0:/gm9/out: Create an encrypted copy of the selected
.cia
file in the/gm9/out/
folder on your SD card - Decrypt to 0:/gm9/out: Create a decrypted copy of the selected
.cia
file in the/gm9/out/
folder on your SD card - Encrypt inplace: Replace the selected
.cia
file with an encrypted version - Decrypt inplace: Replace the selected
.cia
file with a decrypted version
- Encrypt to 0:/gm9/out: Create an encrypted copy of the selected
- Your encrypted / decrypted
.cia
will be outputted to the desired location
Removing an NNID without formatting your device
- Launch GodMode9 by holding (Start) during boot
- Press (Home) to bring up the action menu
- Select “Scripts…”
- Select “GM9Megascript”
- Select “Scripts from Plailect’s Guide”
- Select “Remove NNID”
- Press (A) to continue
- Press (A) to unlock SysNAND (lvl1) writing, then input the key combo given
- Press (A) to continue
- Press (B) to return to the main menu
- Select “Exit”
- Press (A) to relock write permissions if prompted
- Press (Start) to reboot your device