From GameBrew - a wiki dedicated to Video Game Homebrew.
|This application has been obsoleted by one or more applications that serve the same purpose, but are more stable or maintained.|
ButtonSwap3DS is a 3DS homebrew application for button mapping based on InputRedirection by Kazo, which hooks into the HID process (which is responsible for user input), and redirects where the values for user input are read from in memory through Arm assembly.
Update from developer 2020:
You can use the online tool ButtonSwap3DS Builder to configure the mappings you want and download a CIA with those mappings. It is a more user-friendly version improved upon ButtonSwap3DS, but instead of building your own from source it generates the remappings for you.
Once you have your CIA file for your remappings, install it on your 3DS with CIA manager.
Attached file from the download link is a basic version that swaps A and B for demonstration purposes.
The instructions for each type of mapping are provided in the source/injected.s file. A Java program to is available for generating the correct button masks and coordinate values. When you have saved your mappings into this file, you will need to compile it. To build, change to the ButtonSwap3DS directory in a terminal, then run
This is the data that defines which buttons will activate the remapping and which buttons will be pressed as a result. Either use the provided program, or manually calculate the mask using this table. For example, this code would swap A and B:
ldr r4, =0x1 ldr r5, =0x2 bl .button ldr r4, =0x2 ldr r5, =0x1 bl .button
The next two data fields are six-digit numbers. The first 3 digits are the Y coordinate data, and the last 3 digits are the X coordinate data.
The data that will be sent as the touchscreen. Use the provided tool to generate this data.
Data that will be sent as the c-pad. This data is a bit harder to calculate.
The default value for the C-pad is
0x800800. To calculate this value, you will need to use the developer mode on your calculator. Xor
0x800800 by the value you want the C-pad to have.
For example, if you want to have the C-pad pushed to the right, you would xor
0x800FFF, giving you
Pad this with 3 zeroes in front (
0x0007FF), and you have your data.
You cannot reconfigure this on the 3DS. Every time you want to change your button mappings, you need to edit the injected file and recompile the program.
To reset swap, simply reboot your 3DS and it will return to the original settings.
Buttons that do not work with ButtonSwap:
- C-pad is only partially supported (any button can pretend they're the C-pad, but the original C-pad can't be modified).
- ZL/ZR aren't supported at all
- Home and Power buttons are impossible to remap.
Q. My build environment is set up, but now I'm lost!
You can use @danger229's ButtonSwap3dsMaker instead, it's very user-friendly and will help you modify all the files you have to (you need to have ButtonSwap's build environment set up for it to work, though, so it's not a workaround).
Q. I've got the CIA file, now what?
You need to transfer your file to your 3DS and install the CIA. Many apps can help you with that, one of most common being FBI. Once it's installed, just run the application when you want to use the mappings.
Q. Can a button be disabled?
Yes it can. Just map r5 as 0x0 if you're doing the mapping yourself.
The screen says something about NTR-mode3, what does that mean?
If you don't know what it is, you're not using NTR-mode3 and just need to press START.
What is mode3? ButtonSwap isn't working with some games!
Mode3 is another word for the extended memory mode that O3DS has. If a game makes your 3DS' screen go black once you exit it, you're probably playing a mode3 game. ButtonSwap currently does not work with mode3 games, and sadly there are no devs around to fix it (N3DS players don't have to worry about all that, they don't have an extended memory mode).
Q. I want to switch different mappings, is that possible?
You'll need to have two (or more) different ButtonSwap apps, and you'll need to reboot your 3DS every time you want to switch between them. But yes, it's possible. Just tell the person doing your mappings that you want to do that. If you're the one doing them, remember to make sure your different mappings' UniqueIds are different (edit meta/cia.rsf and meta/cia_mode3.rsf).
Q. Can we have this new feature that I've just thought of?
There currently are no devs working on ButtonSwap, so not unless you (or someone you convince) do it.
Q. I'm in the middle of homebrewing and...
You can try to use ButtonSwap during the process but it probably won't work, sorry.
Q. Do I need anything on my 3DS for ButtonSwap to work?
Not really. All you need is a way to get the .cia file into your 3DS, and a way to install CIA files.
If you have FBI, you already have both.
Q. Can I have another way of installing this, like a .3dsx file?
Impossible, sorry. It has to be a .cia file.
Q. Does this work with VC or DS games?
It works with VC games (NES, GB, SNES etc), it doesn't work with GBA and DS/i games since they reboot the console on a different mode (thanks @Feffe for the info).
It can still be a bit buggy. It is designed to un-press any buttons that were pressed if you use touchscreen or C-pad mappings, but it doesn't always work when used with combos. YMMV.
This code works at almost the lowest level possible-assembly code; it is really hard to debug. As long as you don't touch the other functions (.single, .combo, .touch, .cpad), the worst that can happen is your console will get bad input data and be uncontrollable. Just reboot and try a different configuration.
Memory patching code taken from BootNTR.
Shinyquagsire for his writeup on redirecting input over WiFi.
Stary & Kazo for InputRedirector, upon which almost all of this is based.
Thanks to AmberLoss for putting together the FAQ and helping others get mappings built.