Skip to content

L=A Update: It's been done, and here's how you do it.

Posted on:February 1, 2017
2 minute read

This is a conclusion to my other two posts. If it can be called a conclusion: I wasn’t on the right track. Or any track at all, really. I knew what HID was, so that’s a start.

Someone much more knowledgeable than me has set up a button swapping tool based off of InputRedirection, which is in turn based off of NTR’s memory patching code. Modifying the injected code to model L=A was simple.

// A ==> B
MOV R3, #0x2 // R3 Button mask
MOV R4, #0x3 // R4 EOR mask
AND R5, R6, R3 // Extract desired values

// 1:1 Swap (A<==>B)
//CMP R0, R3 // See if either are pressed: 1:1 swap
//EORNE R2, R2, R4 // If so, EOR temp HID Register: 1:1 swap

// X:1 Replace (L+B==>R)
CMP R5, #0 // See if all are pressed: X:1 Replace
EOREQ R2, R2, R4 // If so, EOR temp HID Register: X:1 Replace

// Y ==> A
MOV R3, #0x1

MOV R4, #0x80
LSL R4, R4, #4
ADD R4, R4, #1

AND R5, R6, R3

CMP R5, #0
EOREQ R2, R2, R4

// B ==> Y
MOV R3, #0x800

MOV R4, #0x80
LSL R4, R4, #4
ADD R4, R4, #2

AND R5, R6, R3

CMP R5, #0
EOREQ R2, R2, R4
// A ==> L
MOV R3, #0x80
LSL R3, R3, #2

MOV R4, #0x80
LSL R4, R4, #2
ADD R4, R4, #1

AND R5, R6, R3

CMP R5, #0
EOREQ R2, R2, R4
  1. Build with make, and you’ll find the .3ds/.cia/.zip in the injector/output/ folder.