1. mcaboosec

    OP mcaboosec Member
    Newcomer

    Joined:
    Sep 15, 2009
    Messages:
    34
    Country:
    United States

    I originally started looking into swapping buttons when I got the MHGen hunting grip. I've always thought Nintendo's placement of the L/R and ZL/ZR is backwards from everyone else, and I don't like it. While searching for something to swap the two, I looked at the source for InputRedirection from @Stary2001. If you don't know how it works, it 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.
    His patch was pretty easy for me to read to see what was going on, and I thought, "What if we could get the values from what buttons were pressed, then modify the values before the value gets written to this redirected memory?" After some experimentation, it worked!

    I've put quite a bit of work to make this as user-friendly as possible, but be aware of a few things:
    • 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.
    • 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. Hopefully I can change that in the future - I'm open to help for this.
    • The C-stick and ZL/ZR are not mappable right now. I'm looking into hooking the IR process to achieve this.
    • The Home button and Power button are not remappable. These buttons use a separate part of the hardware, and there are no plans to make this possible.
    • While based on InputRedirection, it is not compatible. This program would overwrite any data sent by the InputRedirection desktop programs.
    • 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 I noticed that it doesn't always work when used with combos. YMMV.
    • I've just merged with Stary's latest changes, but I haven't tested the Mode3 version, as I don't have an O3DS.
    How To Use
    Code is located at my repo: https://github.com/MikahJC/ButtonSwap3DS
    You will need a working setup of the devkitARM toolchain for 3DS, follow this guide if you need help: https://www.3dbrew.org/wiki/Setting_up_Development_Environment.
    You will also need this library by @Stary2001: https://github.com/Stary2001/ScenicRoute. Clone it, then run make install in the ScenicRoute directory.
    Finally, clone the repository at https://github.com/MikahJC/ButtonSwap3DS.
    The instructions for each type of mapping are provided in the source/injected.s file. I've provided a Java program to generate 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 make.
    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:
    Code:
    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 0x800800 by 0x800FFF, giving you 0x7FF. Pad this with 3 zeroes in front (0x0007FF), and you have your data!

    2020 Update: I know I've been absent from this thread for a long time, so I want to thank @AmberLoss for putting together an FAQ here and helping others get mappings built. As of yesterday, I finished a project that should make this a lot easier to use. ButtonSwap3DS Builder is a web application that lets you configure what mappings you want and download a CIA with those mappings. This eliminates the need to set up a build environment or use tools to calculate mappings. I'm on my phone right now but I'll try to add some more info to the FAQ once I get to a real computer.

    I've attached a basic version that swaps A and B for demonstration purposes.

    Thanks and credit to @Stary2001. He wrote all of the injection code and almost all of the setup code. I just figured out how to mess with the values in-between. :)
    2/15/2017: Uploaded a new zip with the mode3 version as well.
    3/28/2017: @Vague Rant pointed out an error with the combo swap documentation. Thanks!
    4/15/2017: Changed how button pressing and un-pressing works. As @Vague Rant and @rolim91 pointed out, multiple mappings had the possibility of affecting each other, resulting in undesirable results when multiple buttons were pressed. The new system maintains a record of which buttons need to be pressed and unpressed, then applies all changes at the end of the mapping process. My initial testing shows that it is working much better, but I appreciate any feedback if there are still bugs.
     

    Attached Files:

    Last edited by mcaboosec, Feb 11, 2020
    Tyvar1, KoalaBoy, Zense and 44 others like this.
  2. Quantumcat

    Quantumcat Dead and alive
    Member

    Joined:
    Nov 23, 2014
    Messages:
    15,149
    Country:
    Australia
    Amazing. This will help lots of people - a question gets asked about this every week or so.
     
  3. gkoelho

    gkoelho GBAtemp Advanced Fan
    Member

    Joined:
    Apr 16, 2015
    Messages:
    549
    Country:
    Brazil
    I can recall a lot of people wanting this. Should be great, nice work.
     
  4. Stary2001

    Stary2001 Newbie
    Newcomer

    Joined:
    Aug 1, 2016
    Messages:
    7
    Country:
    Interesting - good work! I might look into being able to make it configurable on the 3DS itself somehow, via a background service or something. If that's doable I'll look into merging this into mainline InputRedirection, as it seems like a logical next step :)
    Also,
    I've looked into IR a bit - can we work together on this?
     
    KoalaBoy, renhei, Quantumcat and 4 others like this.
  5. Exavold

    Exavold eeh
    Member

    Joined:
    Nov 9, 2015
    Messages:
    1,014
    Country:
    France
    Does that mean that could be able to use ZL and ZR on o3DS ..?
     
  6. xtheman

    xtheman GBAtemp Guru
    Member

    Joined:
    Jan 28, 2016
    Messages:
    5,837
    Country:
    United States
     
    Exavold likes this.
  7. coinblock

    coinblock GBAtemp Regular
    Member

    Joined:
    Sep 4, 2015
    Messages:
    236
    Country:
    Does this work with AGB_FIRM? I'm guessing no?
     
  8. Alex658

    Alex658 GBAtemp Maniac
    Member

    Joined:
    Jun 4, 2010
    Messages:
    1,185
    Country:
    Venezuela
    If this is a CTR program/app you'd lose arm11 control as soon as you boot up TWL or AGB modes... Since the 3ds downclocks itself, basically.

    This is why you can't possibly use hans/ntr/etc on thosr modes.
     
  9. ChrisN8

    ChrisN8 GBAtemp Fan
    Member

    Joined:
    May 13, 2015
    Messages:
    332
    Country:
    France
    amazing ! i tried the a to b .cia and it works fine. I hope it will end in a easy remapper, New3ds have a lot of button that Nintendo doesn't even care to use them correctly...
     
    Last edited by ChrisN8, Feb 14, 2017
  10. DeoNaught

    DeoNaught I'm here to steal memes and break dreams
    Member

    Joined:
    Aug 22, 2016
    Messages:
    2,261
    Country:
    United States
  11. mcaboosec

    OP mcaboosec Member
    Newcomer

    Joined:
    Sep 15, 2009
    Messages:
    34
    Country:
    United States
    Not right now, but it's an interesting thought. I'm not sure if it would work given that the hardware is built into the N3DS, but was available to the O3DS via the circle pad pro attachment. Most games on the N3DS that use ZL and ZR also report that the CPP is attached.

    Sure! I've looked at ShinyQuagsire's writeup, but haven't had much luck trying to figure out the IR process myself.
     
    renhei, rphlfjrd and Exavold like this.
  12. martorSkul

    martorSkul Member
    Newcomer

    Joined:
    Jan 21, 2017
    Messages:
    13
    Country:
    Argentina
    I remembered when you posted looking for this and now you've made it. Really proud :lol::D
     
    Quantumcat and Exavold like this.
  13. iHateEggBreeding
    This message by iHateEggBreeding has been removed from public view by Quantumcat, Mar 7, 2019, Reason: Requested.
    Feb 15, 2017 Show
  14. martorSkul
    This message by martorSkul has been removed from public view by Quantumcat, Mar 7, 2019, Reason: Reply to deleted post.
    Feb 16, 2017 Show
  15. mcaboosec

    OP mcaboosec Member
    Newcomer

    Joined:
    Sep 15, 2009
    Messages:
    34
    Country:
    United States
    Yep, my bad. I originally only uploaded the standard version. I just attached a new zip with the mode3 cia as well.

    Ask and ye shall receive! ;)
     

    Attached Files:

  16. iAqua

    iAqua
    Member

    Joined:
    Dec 7, 2015
    Messages:
    2,848
    Country:
    United Kingdom
    I love you.
     
    mcaboosec likes this.
  17. iHateEggBreeding
    This message by iHateEggBreeding has been removed from public view by Quantumcat, Mar 7, 2019, Reason: Requested.
    Feb 16, 2017 Show
  18. Vague Rant

    Vague Rant Deceptively cute
    Member

    Joined:
    Aug 7, 2008
    Messages:
    2,243
    Country:
    Buh? What Super Mario World did you play? It's always been Y to dash and B to jump.
     
  19. BARNWEY

    BARNWEY GBAtemp Maniac
    Member

    Joined:
    Oct 11, 2016
    Messages:
    1,268
    Country:
    United States
    Good job dude! Looks interesting...
     
  20. ChrisN8

    ChrisN8 GBAtemp Fan
    Member

    Joined:
    May 13, 2015
    Messages:
    332
    Country:
    France
    So... is it possible to have a A <> Y version ?
    By the way does your App switch the button between two specifify input or can assign any input or any button ?
     
  21. Vague Rant

    Vague Rant Deceptively cute
    Member

    Joined:
    Aug 7, 2008
    Messages:
    2,243
    Country:
    @ChrisN8 It should be any combination (of the standard 3DS inputs, i.e. no ZL/ZR or C-Stick). mcaboosec posted a version a while ago that rotated A/B/Y clockwise, so that e.g. NES Virtual Console uses Y/B, and the leftover "Y" button is moved to "A".
     
  22. maxGREGSZ

    maxGREGSZ Banned
    Banned

    Joined:
    Feb 6, 2017
    Messages:
    109
    Country:
    can emulate the circle pad pro would be use for for fps
     
  23. ChrisN8

    ChrisN8 GBAtemp Fan
    Member

    Joined:
    May 13, 2015
    Messages:
    332
    Country:
    France
    that's interesting, clockwise means that A input will be on B button ? I need to have the A input on Y button.
     
    Last edited by ChrisN8, Feb 16, 2017
Draft saved Draft deleted
Loading...

Hide similar threads Similar threads with keywords - ButtonSwap3DS, buttons, [WIP]