Hacking New Classic Controller Hacks

  • Thread starter Thread starter Vague Rant
  • Start date Start date
  • Views Views 250,064
  • Replies Replies 690
  • Likes Likes 42
Oh yeah, out of curiosity how complex is Madworld's use of motion to convert into a classic controller scheme? It'd be great to have an alternative control option for that game, i remember it being fun but it's heavy use of motion control made it kind of tiring to play.
MadWorld is definitely at the upper-end of complicated, with lots of unique motions the game wants you to pull off. Ordinarily, I'd say "too hard", but MadWorld is one that I've kept on my list anyway because it would be so huge for that game to have traditional controls. It's never been re-released on anything else, so motion controls (or emulating motion controls) are the only option, and I think they turned a lot of people away from a game they'd otherwise enjoy. It's definitely a bit of a holy grail title for me.

Do you know the insertion address for some game's Accelerometer data? I know this is a silly question since motion controls are super hard to implement, but I think i am getting close to getting my hack to work!
So obviously it varies from title to title, but here's an example from a recent hack, Rygar. I'll add some comments for good places to do some code insertions. This is specifically the USA version, EUR is different again.

Code:
801B7374 lwz    r6, 0x000C (r3)     read_kpad_acc   ; this is what i use for complex games
801B7378 addi   r4, r30, 12         read_kpad_acc
801B737C lwz    r5, 0x0010 (r3)     read_kpad_acc
801B7380 lwz    r0, 0x0014 (r3)     read_kpad_acc
801B7384 stfs   f4, 0x04AC (r3)     read_kpad_acc   ; the Z axis gets written here
801B7388 mr     r3, r30             read_kpad_acc
801B738C lfs    f1, 0x04A4 (r30)    read_kpad_acc   ; this reads in the X axis
801B7390 stw    r6, 0x0014 (sp)     read_kpad_acc
801B7394 stw    r5, 0x0018 (sp)     read_kpad_acc
801B7398 stw    r0, 0x001C (sp)     read_kpad_acc
801B739C bl     ->0x801B6EA8        --> calc_acc
801B73A0 lfs    f1, 0x04A8 (r30)    read_kpad_acc   ; this reads in the Y axis (good for simple games)
801B73A4 mr     r3, r30             read_kpad_acc
801B73A8 addi   r4, r30, 16         read_kpad_acc
801B73AC bl     ->0x801B6EA8        --> calc_acc
801B73B0 lfs    f1, 0x04AC (r30)    read_kpad_acc   ; this reads in the Z axis (")
801B73B4 mr     r3, r30             read_kpad_acc
801B73B8 addi   r4, r30, 20         read_kpad_acc
801B73BC bl     ->0x801B6EA8        --> calc_acc
For games with this rough format (probably about 2008 onward?), this gives you a couple of options. I mostly inject at the first instruction because it means I definitely have r0, r4, r5 and r6 available to do GPR stuff and f0, f1, f2 and f3 to do FPR stuff.

The value that's currently in f4 is the Z axis about to be written out (see comment), so you can just load some other value into f4 to replace the real accelerometer data. To replace the X and Y axes, you'll need to write to 0x???? (r30) (offset varies by SDK version but if you find something like the above, you can see the offsets the game is using). In this case, you need to write to 0x04A4 (r30) for the X axis and 0x04A8 (r30) for the Y axis.

If the game you're looking at only needs you to work with a single axis (in particular Y or Z), you can use the points where the Y and Z axes get read in from 0x04A8 (r30) and 0x04AC (r30). In this case, r0, r3 and r4 are definitely free and f1 needs to be replaced with fake data.

Any chance for a cc hack of "world of goo"? I mean yes, it's an IR pointer driven game, but I like the art style and humour of it. And since it has no shaking components in it, it should be easy to do. The IR emulation in the cc hacks is pretty on point and smooth
I never actually played World of Goo back in the day, so I'm not sure how it'd go, but IIRC they did end up porting it to a bunch of traditionally-controlled platforms, right? I think it's on Xbox and stuff now? That's a pretty good sign, sort of suggests that the controls are workable without infra-red. Hopefully something similar to other platforms would work on Wii, so I'll add it to my investigate list.



legor-batmantam.jpg


Lego Batman: The Videogame was TT Games' first foray into adapting comic book media into Lego form. In fact, Lego Batman pulls from a variety of sources, especially the Tim Burton/Joel Schumacher Batman movies and the '90s animated series. Introducing the concept of changeable suits to the series allows Batman and the whole Bat-Family to alternate abilities in the middle of a stage, meaning this entry has perhaps the greatest variety in gameplay within individual stages so far in the franchise. Other enhancements over previous games include camera control and the ability to target when using projectile weapons.

Another Lego game, another highlight for @NestorM.

USAEUR (Rev 1)

  1. Code:
    Classic Controller Support [Vague Rant]
    C2196344 00000002
    28030001 41820008
    28030002 00000000
    040B9E64 48000024
    040B9EC0 4E800020
    C201AE8C 00000034
    90010024 2C040000
    40820190 8803005C
    2C000002 40820184
    2C0F0001 40820140
    48000021 8054FB68
    00000000 00000000
    8005EA5C 3FAAAAAB
    3D4CCCCD 3F800000
    7CA802A6 7C85DA14
    80E50000 5760103A
    7CE70214 80E70000
    2C070000 4182002C
    88E709DB 88C40004
    98E40004 2C07004D
    4182000C 2C070052
    40820010 7C073000
    41820044 48000024
    80C50008 80830004
    70808000 41820020
    68C60001 90C50008
    2C060001 418200B8
    38000000 90030020
    90030024 2C060001
    4182000C 98C3005E
    4800009C 38000002
    9803005E 8065000C
    28030001 40810018
    90A1000C 7C6803A6
    4E800021 80A1000C
    9065000C 2C030001
    7FE3FB78 C0450010
    40820008 EC4200B2
    C0650014 C0030020
    C0230060 FC211024
    4800005D D0030020
    80030020 68000001
    90030020 C0030024
    C0230064 FC200850
    4800003D D0030024
    80030024 68000001
    90030024 2C070052
    40820014 C0030074
    D0030060 C0030078
    D0030064 80010024
    7C0803A6 38210020
    4E800020 FC0100FA
    C0250018 FC000800
    4180000C FC000890
    48000014 FC200850
    FC000800 41810008
    FC000890 4E800020
    60000000 00000000
    0401BD44 7FC3F378
    C201BD7C 00000012
    4E800421 2C0F0001
    40820080 4800000D
    3F000000 00000000
    7C6802A6 C0430000
    C0630004 809EFFA0
    80BEFFA4 80DEFFA8
    C03E0014 39000001
    48000021 C03E0018
    39000004 48000015
    909EFFA0 90BEFFA4
    90DEFFA8 48000034
    FC000A10 FC001040
    4D800020 FC011840
    41800008 5508083C
    7CC04039 40820008
    7CA54378 7C844378
    7CC64079 4E800020
    60000000 00000000
    C201C434 0000001F
    4800000D 00000000
    00000000 7C6802A6
    5760083C 7C630214
    2C0400FD 4082000C
    A1230000 48000014
    2C040002 408200C4
    38800001 B1230000
    71200800 41820008
    61088000 71200001
    41820008 61080008
    71204000 41820008
    61080004 71200002
    41820008 61080001
    71208000 41820008
    61080002 71200010
    41820008 61082000
    71200040 41820008
    61080800 71200008
    41820008 61084000
    71200020 41820008
    61080400 71202000
    41820008 61080200
    71200200 41820008
    61080100 71200080
    41820008 61082000
    71200004 41820008
    61080400 71200400
    41820008 61080010
    71201000 41820008
    61081000 7CE74378
    70E09FFF 00000000
  2. Code:
    Classic Controller Support [Vague Rant]
    C219636C 00000002
    28030001 41820000
    28030002 00000000
    040B9E64 48000024
    040B9EC0 4E800020
    C201AE8C 00000034
    90010024 2C040000
    40820190 8803005C
    2C000002 40820184
    2C0F0001 40820140
    48000021 8054FBA8
    00000000 00000000
    8005EA5C 3FAAAAAB
    3D4CCCCD 3F800000
    7CA802A6 7C85DA14
    80E50000 5760103A
    7CE70214 80E70000
    2C070000 4182002C
    88E709DB 88C40004
    98E40004 2C07004D
    4182000C 2C070052
    40820010 7C073000
    41820044 48000024
    80C50008 80830004
    70808000 41820020
    68C60001 90C50008
    2C060001 418200B8
    38000000 90030020
    90030024 2C060001
    4182000C 98C3005E
    4800009C 38000002
    9803005E 8065000C
    28030001 40810018
    90A1000C 7C6803A6
    4E800021 80A1000C
    9065000C 2C030001
    7FE3FB78 C0450010
    40820008 EC4200B2
    C0650014 C0030020
    C0230060 FC211024
    4800005D D0030020
    80030020 68000001
    90030020 C0030024
    C0230064 FC200850
    4800003D D0030024
    80030024 68000001
    90030024 2C070052
    40820014 C0030074
    D0030060 C0030078
    D0030064 80010024
    7C0803A6 38210020
    4E800020 FC0100FA
    C0250018 FC000800
    4180000C FC000890
    48000014 FC200850
    FC000800 41810008
    FC000890 4E800020
    60000000 00000000
    0401BD44 7FC3F378
    C201BD7C 00000012
    4E800421 2C0F0001
    40820080 4800000D
    3F000000 00000000
    7C6802A6 C0430000
    C0630004 809EFFA0
    80BEFFA4 80DEFFA8
    C03E0014 39000001
    48000021 C03E0018
    39000004 48000015
    909EFFA0 90BEFFA4
    90DEFFA8 48000034
    FC000A10 FC001040
    4D800020 FC011840
    41800008 5508083C
    7CC04039 40820008
    7CA54378 7C844378
    7CC64079 4E800020
    60000000 00000000
    C201C434 0000001F
    4800000D 00000000
    00000000 7C6802A6
    5760083C 7C630214
    2C0400FD 4082000C
    A1230000 48000014
    2C040002 408200C4
    38800001 B1230000
    71200800 41820008
    61088000 71200001
    41820008 61080008
    71204000 41820008
    61080004 71200002
    41820008 61080001
    71208000 41820008
    61080002 71200010
    41820008 61082000
    71200040 41820008
    61080800 71200008
    41820008 61084000
    71200020 41820008
    61080400 71202000
    41820008 61080200
    71200200 41820008
    61080100 71200080
    41820008 61082000
    71200004 41820008
    61080400 71200400
    41820008 61080010
    71201000 41820008
    61081000 7CE74378
    70E09FFF 00000000

Button Mapping​

Wii Remote/NunchukClassic ControllerFunction
Wiimote HomeHome
Remember that B is your A button
Open/Close Home Menu
Wiimote D-PadD-Pad
Right Stick
Menus
Navigation
Gameplay
Camera Control
Wiimote ABMenus
Confirm
Gameplay
Jump
Wiimote BY
ZR
Menus
Cancel
Gameplay
Attack
Wiimote 1LGameplay
Switch Character
(Free Play)
Wiimote 2RGameplay
Switch Character
(Free Play)
Wiimote PlusPlusGameplay
Pause
Wiimote MinusMinusNot used?
Wiimote PointerLeft StickGameplay
Aiming
Home Button Menu
Navigation
Nunchuk StickLeft StickMenus
Navigation
Gameplay
Movement
Nunchuk CXGameplay
Switch Character
(Story)
Nunchuk ZA
ZL
Gameplay
Interact
(Build, Pull Levers, etc.)

General Notes​

  • This hack will not work on EUR (Rev 0). I didn't hack that version, only the later EUR (Rev 1). If playing the EUR version game, you will need to have the later release. Thanks to @Gomza for confirming this.

  • This one definitely marks the end of doing Lego games as an easy break from more complex games, the IR pointer implementation here was probably the most difficult of any hack to date. I'll talk about it more in the Technical Notes if you like that kind of thing.

  • Besides that, these are pretty standard at this point. Same control setup from Lego Star Wars and Indiana Jones, so your Confirm/Cancel are a little iffy (Y/B) but gameplay controls how you'd expect if you've played a Lego game on any platform but the Wii.

Technical Notes​

Code breakdown:
  • C2: read Nunchuk Stick when Classic Controller is connected
  • 04 and 04 in setKpad(): disable real CC support in HBM
  • C2 in calc_dpd_variable(): IR pointer emulation with some trickiness
  • 04 and C2 in read_kpad_stick(): redirect Classic Left Stick into Nunchuk Stick, D-Pad emulation on Right Stick
  • KPADRead(): button injector, includes lag frame fix directly
Code:
; KPADRead
; drop dupe frames
; KPADRead
; 8001C434 for USA/EUR (Rev 1)
; r4 holds extType
; r7 holds wiimote bitfield
; r8 holds wiimote+nunchuk bitfield
; r9 holds classic bitfield

; magic
  bl GRAB
MAGIC:
    HELD:   .int 0
    HELD2:  .int 0
GRAB:
  mflr r3
  slwi r0, r27, 1
  add r3, r3, r0

; check dropped extension
  cmpwi r4, 0xFD
  bne- CLASSIC
  lhz r9, HELD-MAGIC(r3)
  b DROPPED_CONNECTION

CLASSIC:
  cmpwi r4, 0x2
  bne- RETURN

  li r4, 0x1            ; i'm a nunchuk
  sth r9, HELD-MAGIC(r3)

DROPPED_CONNECTION:
    CLASSIC_HOME:
      andi. r0, r9, 0x800
      beq- CLASSIC_UP
      ori r8, r8, 0x8000    ; home

    CLASSIC_UP:
      andi. r0, r9, 0x1
      beq- CLASSIC_DOWN
      ori r8, r8, 0x8       ; up (v) / left (h)

    CLASSIC_DOWN:
      andi. r0, r9, 0x4000
      beq- CLASSIC_LEFT
      ori r8, r8, 0x4       ; down (v) / right (h)

    CLASSIC_LEFT:
      andi. r0, r9, 0x2
      beq- CLASSIC_RIGHT
      ori r8, r8, 0x1       ; left (v) / down (h)

    CLASSIC_RIGHT:
      andi. r0, r9, 0x8000
      beq- CLASSIC_A
      ori r8, r8, 0x2       ; right (v) / up (h)

    CLASSIC_A:
      andi. r0, r9, 0x10
      beq- CLASSIC_B
      ori r8, r8, 0x2000    ; z

    CLASSIC_B:
      andi. r0, r9, 0x40
      beq- CLASSIC_X
      ori r8, r8, 0x800     ; a

    CLASSIC_X:
      andi. r0, r9, 0x8
      beq- CLASSIC_Y
      ori r8, r8, 0x4000    ; c

    CLASSIC_Y:
      andi. r0, r9, 0x20
      beq- CLASSIC_L
      ori r8, r8, 0x400     ; b

    CLASSIC_L:
      andi. r0, r9, 0x2000
      beq- CLASSIC_R
      ori r8, r8, 0x200     ; 1

    CLASSIC_R:
      andi. r0, r9, 0x200
      beq- CLASSIC_ZL
      ori r8, r8, 0x100     ; 2

    CLASSIC_ZL:
      andi. r0, r9, 0x80
      beq- CLASSIC_ZR
      ori r8, r8, 0x2000    ; z

    CLASSIC_ZR:
      andi. r0, r9, 0x4
      beq- CLASSIC_PLUS
      ori r8, r8, 0x400     ; b

    CLASSIC_PLUS:
      andi. r0, r9, 0x400
      beq- CLASSIC_MINUS
      ori r8, r8, 0x10      ; plus

    CLASSIC_MINUS:
      andi. r0, r9, 0x1000
      beq- CLASSIC_DONE
      ori r8, r8, 0x1000    ; minus

    CLASSIC_DONE:
      or r7, r7, r8

RETURN:
  andi. r0, r7, 0x9FFF

Before I get to the IR pointer shenanigans, this game helped me understand the lag frame issue I've been working with on the last few games. Lego Batman has a really odd quirk where the extension controller loses its connection for a couple of frames every single time you pause the game. This has nothing to do with me, it did it before I started modifying the game at all. But this allowed me to understand the situation where a controller has dropped for a few frames and what input occurs in that situation. The button injector now includes a handler for this situation (see the source above if you're interested). It works the same way Nintendo solved this issue: read in a copy of the inputs from the previous frame and use those instead.

All right, the IR pointer. Certainly, it would have been possible to just put the pointer on the Right Stick and move on, but this game added camera controls as well (on D-Pad for Wii) and I wanted those on the Right Stick. Initially, I figured I could just have the Left Stick do both simultaneously. Aiming in Lego games requires you to press and hold a button and you can't walk and aim at the same time anyway, so maybe I can just make that an "enable pointer" button? Not really. For one thing, Lego games are infamous for their poor framerates and everything in these hacks is frame-based. The aiming button is also your main attack button, so I needed to wait for you to hold the button for a while before switching to aiming mode, but "a while" is hugely variable in this game for performance reasons. Sometimes the pointer would trigger early, or late, and you'd be pointing off to the edge until it "woke up", etc.

Before I get to my solution, let's also talk about how weird the Lego games are about their pointer support. For one thing, the pointers in this game are always on, even if you're not currently pointing at the screen. Presumably related to this is a feature TT includes in their Lego games to manually adjust the pointer position if it is unchanged for a few frames. Basically, if you stop moving the pointer, either because you're being impossibly perfectly still or because you aren't pointing at the TV any more, they move the pointer to the edge of the screen. Not off the screen, just in a corner somewhere. Why not just turn the pointer off? Great question! Let's continue.

Because we're controlling the pointer with an analog stick, it's very possible to have it sit completely still: just stop touching the analog stick. Assuming you don't have any drift issues, the pointer will stop moving. It's really confusing and distracting to have the pointer moving around like it has a mind of its own, so on every frame, I jiggle the pointer on both the X and Y axes (important if you're rammed against the edge of the screen so only one "jiggle" does anything) by the smallest possible 32-bit floating point value, 0.000...1 (pretend there's 44 zeroes there). This prevents the game from messing with the pointer for as long as you're using it and is not visible in game because that's a tiny fraction of a pixel that it's moving. Once you exit aiming mode, I stop jiggling it and let the game do whatever it wants with the cursor.

Finally, let's get to how I solved managing the pointer. It basically amounts to identifying a value in memory that indicates the current pointer state and using that value to toggle whether the pointer is enabled. If the current player is throwing a Batarang (or Robinrang, whatever he ... you know what I mean) or aiming the Attract Suit's vacuum, the Left Stick takes control of the IR pointer. This required a pointer to each player's state, which I eventually found mostly through trial and error switching to target mode and using the cheat search, then working backward to find a pointer to that value since it's not constant.

This still wasn't quite enough, because for whatever reason, TT made another remarkably weird choice, and the Nunchuk Stick switches to camera control when you're using the Attract Suit. Why? No idea, that doesn't make any sense, you already established that camera control is on the D-Pad. Is this ... a mistake? Whatever. Now we need to check if the pointer is currently in Attract Suit mode and switch up the analog sticks so that now the Classic Right Stick is controlling the Nunchuk Stick so that you get to keep your Right Stick camera controls.
 
Last edited by Vague Rant,
I never actually played World of Goo back in the day, so I'm not sure how it'd go, but IIRC they did end up porting it to a bunch of traditionally-controlled platforms, right? I think it's on Xbox and stuff now? That's a pretty good sign, sort of suggests that the controls are workable without infra-red. Hopefully something similar to other platforms would work on Wii, so I'll add it to my investigate list.
I could try giving it a look, would you be able to convert the codes into IPS patches? If you dont want me to look into it, its totally fine, its a pretty simple game anyways, and i understand if you wanted to do it instead.
Post automatically merged:

@tech_A_nina I found where World of Goo's buttons are inserted. Ill whip up a quick hack soon, but we need IPS files. Hopefully Vague can help in the future! 👍
Post automatically merged:

Update, scrapping it for now. This game is giving me trouble with the IR pointer sadly.
 
Last edited by awesomeee,

Hello)) Vague Rant, In LEGO Batman EUR Rev.0 left stick dont work. Could you please look at it? Thanks in advance))​


He did not hack that revision, apologies.

I didn't hack the EUR (Rev 0) version game, only the later EUR (Rev 1). You're welcome to test whether either code works on the older revision. They might or might not, depends what changed.
 
Last edited by awesomeee,
  • Like
Reactions: Vague Rant

Hello)) Vague Rant, In LEGO Batman EUR Rev.0 left stick dont work. Could you please look at it? Thanks in advance))​

Yeah, sorry, as mentioned by awesomeee I didn't hack that revision. Sorry that it doesn't work on the first pressing, but doing Lego Batman was a pretty high-effort project so I opted to do as few versions as necessary to cover all regions. I'll consider coming back to look at Rev 0 as well, but it won't be a high priority for me. For now, I'll edit the post to note that Rev 0 specifically doesn't work.



SI_Wii_BoomStreet_enGB_image1600w.jpg


Square-Enix's Fortune Street aka Boom Street was the first entry in the (at the time) 20-year run of the Itadaki Street franchise to make it out of Japan. Created by Yuji Horii, better known as the creator of Dragon Quest, the Itadaki Street series presents a fairly traditional board game in the style of Parker Brothers/Hasbro's Monopoly. Players roll dice to travel around a city, buying up as much properly as possible, occasionally interrupted by random chance cards and (rarely) minigames. Unlike Monopoly where the goal is to bum everybody out, a game of Fortune Street ends as soon as one player has reached the financial goal of the board and returned to the bank. While it's still a bit of a time investment, most of Fortune Street is spent in the competitive portion that makes up the first half of a Monopoly session, rather than the gradual steamrolling of the second half. Am I making it clear that I'm not a big fan of Monopoly? Oh by the way, this one's got Mario and Dragon Quest characters and boards.

USAEURJPN

  1. Code:
    Classic Controller Support [Vague Rant]
    C22BC3C8 0000001F
    90010024 2C040000
    408200E8 8803005C
    2C000002 408200DC
    9803005E 2C160001
    40820094 48000015
    802D89D0 3FAAAAAB
    3DCCCCCD 3F800000
    7CA802A6 80030004
    70008000 41820010
    38000000 90030020
    90030024 80650000
    28030001 40810018
    90A1000C 7C6803A6
    4E800021 80A1000C
    90650000 2C030001
    7FE3FB78 C0450004
    40820008 EC4200B2
    C0650008 C0030020
    C023006C FC211024
    4800002D D0030020
    C0030024 C0230070
    FC200850 48000019
    D0030024 80010024
    7C0803A6 38210020
    4E800020 FC0100FA
    C025000C FC000800
    4180000C FC000890
    48000014 FC200850
    FC000800 41810008
    FC000890 4E800020
    60000000 00000000
    C22BD330 00000019
    4E800421 2C160001
    408200B8 4800000D
    3F000000 00000000
    7CA802A6 C0450000
    C0650004 80ADAA5C
    74A08000 38600001
    41820008 80650080
    809EFFA0 80BEFFA4
    80DEFFA8 C03E000C
    2C030000 4082001C
    39000001 4800003D
    C03E0010 39000004
    48000031 4800001C
    FC200850 39000004
    48000021 C03E0010
    39000001 48000015
    909EFFA0 90BEFFA4
    90DEFFA8 48000034
    FC000A10 FC001040
    4D800020 FC011840
    41800008 5508083C
    7CC04039 40820008
    7CA54378 7C844378
    7CC64079 4E800020
    60000000 00000000
    C22BB284 00000030
    7C0802A6 4800000D
    00000000 00000000
    7D4802A6 7C0803A6
    5720083C 7D4A0214
    2C0400FD 4082000C
    A10A0000 48000014
    2C040002 40820144
    38800001 B10A0000
    818DAA5C 75808000
    39400001 41820008
    814C0080 71000800
    41820008 60E78000
    2C0A0000 40820068
    71000001 41820008
    60E70008 71004000
    41820008 60E70004
    71000002 41820008
    60E70001 71008000
    41820008 60E70002
    71000010 41820008
    60E70800 71000040
    41820008 60E70400
    71000008 41820008
    60E70100 71000020
    4182006C 60E70200
    48000064 71000001
    41820008 60E70002
    71004000 41820008
    60E70001 71000002
    41820008 60E70008
    71008000 41820008
    60E70004 71000010
    41820008 60E70100
    71000040 41820008
    60E70200 71000008
    41820008 60E70800
    71000020 41820008
    60E70400 71002000
    41820008 60E70200
    71000200 41820008
    60E70100 71000080
    41820008 60E70200
    71000004 41820008
    60E70100 71000400
    41820008 60E70010
    71001000 41820008
    60E71000 7CC63B78
    70C09FFF 00000000
  2. Code:
    Classic Controller Support [Vague Rant]
    C22BC418 0000001F
    90010024 2C040000
    408200E8 8803005C
    2C000002 408200DC
    9803005E 2C160001
    40820094 48000015
    802D8A20 3FAAAAAB
    3DCCCCCD 3F800000
    7CA802A6 80030004
    70008000 41820010
    38000000 90030020
    90030024 80650000
    28030001 40810018
    90A1000C 7C6803A6
    4E800021 80A1000C
    90650000 2C030001
    7FE3FB78 C0450004
    40820008 EC4200B2
    C0650008 C0030020
    C023006C FC211024
    4800002D D0030020
    C0030024 C0230070
    FC200850 48000019
    D0030024 80010024
    7C0803A6 38210020
    4E800020 FC0100FA
    C025000C FC000800
    4180000C FC000890
    48000014 FC200850
    FC000800 41810008
    FC000890 4E800020
    60000000 00000000
    C22BD380 00000019
    4E800421 2C160001
    408200B8 4800000D
    3F000000 00000000
    7CA802A6 C0450000
    C0650004 80ADAA5C
    74A08000 38600001
    41820008 80650080
    809EFFA0 80BEFFA4
    80DEFFA8 C03E000C
    2C030000 4082001C
    39000001 4800003D
    C03E0010 39000004
    48000031 4800001C
    FC200850 39000004
    48000021 C03E0010
    39000001 48000015
    909EFFA0 90BEFFA4
    90DEFFA8 48000034
    FC000A10 FC001040
    4D800020 FC011840
    41800008 5508083C
    7CC04039 40820008
    7CA54378 7C844378
    7CC64079 4E800020
    60000000 00000000
    C22BB2D4 00000030
    7C0802A6 4800000D
    00000000 00000000
    7D4802A6 7C0803A6
    5720083C 7D4A0214
    2C0400FD 4082000C
    A10A0000 48000014
    2C040002 40820144
    38800001 B10A0000
    818DAA5C 75808000
    39400001 41820008
    814C0080 71000800
    41820008 60E78000
    2C0A0000 40820068
    71000001 41820008
    60E70008 71004000
    41820008 60E70004
    71000002 41820008
    60E70001 71008000
    41820008 60E70002
    71000010 41820008
    60E70800 71000040
    41820008 60E70400
    71000008 41820008
    60E70100 71000020
    4182006C 60E70200
    48000064 71000001
    41820008 60E70002
    71004000 41820008
    60E70001 71000002
    41820008 60E70008
    71008000 41820008
    60E70004 71000010
    41820008 60E70100
    71000040 41820008
    60E70200 71000008
    41820008 60E70800
    71000020 41820008
    60E70400 71002000
    41820008 60E70200
    71000200 41820008
    60E70100 71000080
    41820008 60E70200
    71000004 41820008
    60E70100 71000400
    41820008 60E70010
    71001000 41820008
    60E71000 7CC63B78
    70C09FFF 00000000
  3. Code:
    Classic Controller Support [Vague Rant]
    C22BC388 0000001F
    90010024 2C040000
    408200E8 8803005C
    2C000002 408200DC
    9803005E 2C160001
    40820094 48000015
    802D8990 3FAAAAAB
    3DCCCCCD 3F800000
    7CA802A6 80030004
    70008000 41820010
    38000000 90030020
    90030024 80650000
    28030001 40810018
    90A1000C 7C6803A6
    4E800021 80A1000C
    90650000 2C030001
    7FE3FB78 C0450004
    40820008 EC4200B2
    C0650008 C0030020
    C023006C FC211024
    4800002D D0030020
    C0030024 C0230070
    FC200850 48000019
    D0030024 80010024
    7C0803A6 38210020
    4E800020 FC0100FA
    C025000C FC000800
    4180000C FC000890
    48000014 FC200850
    FC000800 41810008
    FC000890 4E800020
    60000000 00000000
    C22BD2F0 00000019
    4E800421 2C160001
    408200B8 4800000D
    3F000000 00000000
    7CA802A6 C0450000
    C0650004 80ADAA5C
    74A08000 38600001
    41820008 80650080
    809EFFA0 80BEFFA4
    80DEFFA8 C03E000C
    2C030000 4082001C
    39000001 4800003D
    C03E0010 39000004
    48000031 4800001C
    FC200850 39000004
    48000021 C03E0010
    39000001 48000015
    909EFFA0 90BEFFA4
    90DEFFA8 48000034
    FC000A10 FC001040
    4D800020 FC011840
    41800008 5508083C
    7CC04039 40820008
    7CA54378 7C844378
    7CC64079 4E800020
    60000000 00000000
    C22BB244 00000030
    7C0802A6 4800000D
    00000000 00000000
    7D4802A6 7C0803A6
    5720083C 7D4A0214
    2C0400FD 4082000C
    A10A0000 48000014
    2C040002 40820144
    38800001 B10A0000
    818DAA5C 75808000
    39400001 41820008
    814C0080 71000800
    41820008 60E78000
    2C0A0000 40820068
    71000001 41820008
    60E70008 71004000
    41820008 60E70004
    71000002 41820008
    60E70001 71008000
    41820008 60E70002
    71000010 41820008
    60E70800 71000040
    41820008 60E70400
    71000008 41820008
    60E70100 71000020
    4182006C 60E70200
    48000064 71000001
    41820008 60E70002
    71004000 41820008
    60E70001 71000002
    41820008 60E70008
    71008000 41820008
    60E70004 71000010
    41820008 60E70100
    71000040 41820008
    60E70200 71000008
    41820008 60E70800
    71000020 41820008
    60E70400 71002000
    41820008 60E70200
    71000200 41820008
    60E70100 71000080
    41820008 60E70200
    71000004 41820008
    60E70100 71000400
    41820008 60E70010
    71001000 41820008
    60E71000 7CC63B78
    70C09FFF 00000000

Button Mapping​

This one is a bit of a weird case for button mappings, because Fortune Street supports both horizontal and vertical Wiimote layouts. Rather than simulate one mode or the other, this hack checks which configuration you're using and adjusts the remapping so that the inputs are the same in either scheme. For this reason, I'm leaving out the Wiimote section of the table. It just gets confusing otherwise.

Classic ControllerFunction
Home
Vertical layout works normally
Horizontal layout uses X as A button
Open/Close Home Menu
D-Pad
Left Stick
Menus
Navigation
Gameplay
Movement
AMenus/Gameplay
Confirm
BMenus/Gameplay
Cancel
PlusNot used?
MinusGameplay
View Board
Vertical: A / Horizontal: X
L/ZL
R/ZR
Multiplayer
Auction Bids
(see General Notes)
Left StickHome Button Menu
Navigation

General Notes​

  • As mentioned above, this hack changes what it's actually doing depending on whether you're currently playing with the Horizontal or Vertical Wiimote layout. The most obvious difference is that Classic B/A are pressing Wiimote 1/2 in the Horizontal layout, and Wiimote B/A in the Vertical layout. Personally, I would recommend you go into the game options and switch to the Vertical layout, because the button prompts are more understandable that way (i.e. When the game says "Press A", you press A).

    • The game always boots up in Horizontal mode (expecting you to press 1/2), but once you load your save file it will switch to whichever mode you have configured in the Options. From a control perspective, nothing changes for you: just use normal B/A to Cancel/Confirm at all times and ignore the like ... two prompts at the start that say you need to press 2.

    • Any time the game is in Horizontal mode, the Wiimote's A button is mapped on Classic X. This is only really important if you open the Home Button Menu while in Horizontal mode or during multiplayer auctions (see below), because you'll need to remember to hit X instead of A in that scenario. If you configure Vertical mode in the Options, you can basically just forget about this note because as soon as your save gets loaded, the A button will switch to be mapped letter-for-letter and you don't need to think about it.

  • Multiplayer Auctions: Fortune Street supports up to four players on a single Wiimote (or with this hack, Wii U GamePad, probably--I haven't tested that). Alternatively, players can each use a separate Wiimote, if you have them available. When everybody is sharing a Wiimote, you mostly just pass it between players, but when auctioning off a property, all players are expected to crowd around the single Wiimote and press the A/1/2 buttons to place their bids. To make this a little less cramped, the Wiimote 1 button is mapped on L/ZL and Wiimote 2 is mapped on R/ZR.

    • I'm not the boss of you, but the idea here is that the player who is bidding with "Wiimote button A" should hold the controller, and the players bidding with "Wiimote button 1" and "Wiimote button 2" can use can use L/ZL and R/ZR, respectively. This way, you're not trying to get three hands onto the face of the Classic Controller/Wii U GamePad and instead you've got room to just tap a shoulder/trigger button to place your bid. It's a minor thing, but I think this might be the single biggest improvement the hack offers over the original, because Wiimotes are really not good communal controllers.

Technical Notes​

Code breakdown:
  • C2 in calc_dpd_variable(): simulate IR pointer
  • C2 in read_kpad_ext(): D-Pad emulation on the Left Stick, toggles D-Pad orientation by game setting
  • C2 in read_kpad_button(): button injector, toggles layout by game setting
Code:
; read_kpad_button
; 802BB284 for USA
; 802BB2D4 for EUR
; 802BB244 for JPN
; r4 holds extType
; r6 holds wiimote bitfield
; r7 holds wiimote+nunchuk bitfield
; r8 holds classic bitfield

; magic
  mflr r0
  bl GRAB
MAGIC:
    HELD:           .int    0
    HELD2:          .int    0
GRAB:
  mflr r10
  mtlr r0
  slwi r0, r25, 1
  add r10, r10, r0

; check dropped extension
  cmpwi r4, 0xFD
  bne- CLASSIC
  lhz r8, HELD-MAGIC(r10)
  b DROPPED_CONNECTION

CLASSIC:
  cmpwi r4, 0x2
  bne- RETURN

  li r4, 0x1            ; i'm a nunchuk
  sth r8, HELD-MAGIC(r10)

DROPPED_CONNECTION:
; check controller orientation
  lwz r12, -0x55A4(r13)
  andis. r0, r12, 0x8000
  li r10, 1
  beq- CLASSIC_HOME
  lwz r10, 0x80(r12)

    CLASSIC_HOME:
      andi. r0, r8, 0x800
      beq- CHECK_ORIENTATION
      ori r7, r7, 0x8000    ; home

    CHECK_ORIENTATION:
      cmpwi r10, 0
      bne- HORIZONTAL

        VERTICAL:

            CLASSIC_VER_UP:
              andi. r0, r8, 0x1
              beq- CLASSIC_VER_DOWN
              ori r7, r7, 0x8       ; up (v) / left (h)

            CLASSIC_VER_DOWN:
              andi. r0, r8, 0x4000
              beq- CLASSIC_VER_LEFT
              ori r7, r7, 0x4       ; down (v) / right (h)

            CLASSIC_VER_LEFT:
              andi. r0, r8, 0x2
              beq- CLASSIC_VER_RIGHT
              ori r7, r7, 0x1       ; left (v) / down (h)

            CLASSIC_VER_RIGHT:
              andi. r0, r8, 0x8000
              beq- CLASSIC_VER_A
              ori r7, r7, 0x2       ; right (v) / up (h)

            CLASSIC_VER_A:
              andi. r0, r8, 0x10
              beq- CLASSIC_VER_B
              ori r7, r7, 0x800     ; a

            CLASSIC_VER_B:
              andi. r0, r8, 0x40
              beq- CLASSIC_VER_X
              ori r7, r7, 0x400     ; b

            CLASSIC_VER_X:
              andi. r0, r8, 0x8
              beq- CLASSIC_VER_Y
              ori r7, r7, 0x100     ; 2

            CLASSIC_VER_Y:
              andi. r0, r8, 0x20
              beq- CLASSIC_L
              ori r7, r7, 0x200     ; 1
              b CLASSIC_L

        HORIZONTAL:

            CLASSIC_HOR_UP:
              andi. r0, r8, 0x1
              beq- CLASSIC_HOR_DOWN
              ori r7, r7, 0x2       ; right (v) / up (h)

            CLASSIC_HOR_DOWN:
              andi. r0, r8, 0x4000
              beq- CLASSIC_HOR_LEFT
              ori r7, r7, 0x1       ; left (v) / down (h)

            CLASSIC_HOR_LEFT:
              andi. r0, r8, 0x2
              beq- CLASSIC_HOR_RIGHT
              ori r7, r7, 0x8       ; up (v) / left (h)

            CLASSIC_HOR_RIGHT:
              andi. r0, r8, 0x8000
              beq- CLASSIC_HOR_A
              ori r7, r7, 0x4       ; down (v) / right (h)

            CLASSIC_HOR_A:
              andi. r0, r8, 0x10
              beq- CLASSIC_HOR_B
              ori r7, r7, 0x100     ; 2

            CLASSIC_HOR_B:
              andi. r0, r8, 0x40
              beq- CLASSIC_HOR_X
              ori r7, r7, 0x200     ; 1

            CLASSIC_HOR_X:
              andi. r0, r8, 0x8
              beq- CLASSIC_HOR_Y
              ori r7, r7, 0x800     ; a

            CLASSIC_HOR_Y:
              andi. r0, r8, 0x20
              beq- CLASSIC_L
              ori r7, r7, 0x400     ; b

    CLASSIC_L:
      andi. r0, r8, 0x2000
      beq- CLASSIC_R
      ori r7, r7, 0x200     ; 1

    CLASSIC_R:
      andi. r0, r8, 0x200
      beq- CLASSIC_ZL
      ori r7, r7, 0x100     ; 2

    CLASSIC_ZL:
      andi. r0, r8, 0x80
      beq- CLASSIC_ZR
      ori r7, r7, 0x200     ; 1

    CLASSIC_ZR:
      andi. r0, r8, 0x4
      beq- CLASSIC_PLUS
      ori r7, r7, 0x100     ; 2

    CLASSIC_PLUS:
      andi. r0, r8, 0x400
      beq- CLASSIC_MINUS
      ori r7, r7, 0x10      ; plus

    CLASSIC_MINUS:
      andi. r0, r8, 0x1000
      beq- CLASSIC_DONE
      ori r7, r7, 0x1000    ; minus

    CLASSIC_DONE:
      or r6, r6, r7

RETURN:
  andi. r0, r6, 0x9FFF
The only complicated part of this one is the automatic remapping based on the game setting. It took a bit of tracking down but eventually I was able to locate how the game determines which control scheme is currently active. The pointer at -0x5A44(r13) is presumably to a struct of various game configuration stuff, and 0x80 bytes into that struct is the word which determines whether we're currently in Horizontal (1) or Vertical (0) mode. I find it mildly interesting that this is inverted from the expected: Horizontal is the default setting, so ordinarily I would expect that to be the 0/off setting, but here the default value for Horizontal is 1. This isn't enough data to make this claim definitively, but I suspect the Vertical layout was originally the default and they later switched to using Horizontal as default, and that's why the bool is backward.
 
As mentioned above, this hack changes what it's actually doing depending on whether you're currently playing with the Horizontal or Vertical Wiimote layout. The most obvious difference is that Classic B/A are pressing Wiimote 1/2 in the Horizontal layout, and Wiimote B/A in the Vertical layout. Personally, I would recommend you go into the game options and switch to the Vertical layout, because the button prompts are more understandable that way (i.e. When the game says "Press A", you press A).
Wow! Thats super impressive. I thought these kinds of hack implementations were impossible since its basically context based inputs
(Like how would the hack know its horizontal mode and such)
Post automatically merged:

Re: World of goo: I tried to make a hack, but the pointer is acting weird. You should investigate it sometime. 👍
Its like ths pointer can go deep in the screen, but cant reach important gameplay areas in the upper area.
Post automatically merged:

I have a small idea for a game: could that one Despicable Me game get a CC hack? I think it does not use motion, but it uses the IR Pointer for some gameplay parts. It sadly uses the Nunchuk, so thats why it would be a lower priority. Nunchuk parts of hacks are difficult.
I might try removing the extension error when I am back from vacation. I will keep you updated 👍
 
Last edited by awesomeee,
I am completely clueless on the code side of things but wanted to try and help in some way so I've put together a spreadsheet with all the codes + links as well as what region they work for and other notes in one place. Still need to go through the thread and check the Wii U/USB Loader compatibility for them in the morning though. Outside this thread I don't know of any other CC codes besides the Riivolution Mario Galaxy and older DKCR/Kirby/NSMBW ones so if anyone knows any more it'd be a great help.
 
I am completely clueless on the code side of things but wanted to try and help in some way so I've put together a spreadsheet with all the codes + links as well as what region they work for and other notes in one place. Still need to go through the thread and check the Wii U/USB Loader compatibility for them in the morning though. Outside this thread I don't know of any other CC codes besides the Riivolution Mario Galaxy and older DKCR/Kirby/NSMBW ones so if anyone knows any more it'd be a great help.
Thank you! Any progress on the nunchuk waggle for Sonic and the black knight?

I actually made one for Wii Play, but it might not work, since the revision may not be correct. I dont know whats going on but it stopped working. I also made a Chick Chick BOOM one. Confirmed working!
Post automatically merged:

I'll cry if i look at this game for one more minute.

Chick Chick BOOM was a game. (By tons of bits)
This game needed the IR pointer, and supported multiplayer! (yay)
View attachment 478449

It is here lol

This hack will not work reliably, what do you expect? Its meant to be played with Wii Remotes (Lol)

Classic Controller Support (Awesomeee, Vague Rant)
You know the drill, Vague made the helpful PPC assemblies, thanks!


C222ED38 00000029
90010024 2C040000
40820138 8803005C
2C000002 4082012C
48000021 80210D90
3FAAAAAB 3C54FDF4
00000000 00000000
3DCCCCCD 3F800000
7CA802A6 90A1000C
5727083C 38E7000C
C0030074 FC000210
C0230078 FC200A10
C083006C FC802210
C0A30070 FCA02A10
FC00082A FC84282A
FC00202A C0450014
FC001040 4180000C
38C0012C 48000014
7CC53AAE 28060000
408100B0 38C6FFFF
7CC53B2E 38C00002
98C3005E 81850000
7D8803A6 4E800021
2C030001 7FE3FB78
80A1000C C0450004
40820008 EC4200B2
C0650008 C0030020
C0230074 C083006C
FC21202A FC211024
48000035 D0030020
C0030024 C0230078
C0830070 FC21202A
FC200850 48000019
D0030024 80010024
7C0803A6 38210020
4E800020 FC0100FA
C0250018 FC000800
4180000C FC000890
48000014 FC200850
FC000800 41810008
FC000890 4E800020
60000000 00000000
C222DBF4 00000019
2C040002 408200B8
71000800 41820008
60C68000 71000001
41820008 60C60008
71004000 41820008
60C60004 71000002
41820008 60C60001
71008000 41820008
60C60002 71000010
41820008 60C60800
71000040 41820008
60C60400 71000008
41820008 60C60100
71000020 41820008
60C60200 71002000
41820008 60C60800
71000200 41820008
60C60800 71000080
41820008 60C60800
71000004 41820008
60C60800 71000400
41820008 60C60010
71001000 41820008
60C61000 70C09FFF
60000000 00000000

For this game, i tried to make the pointer as fast/slow as i could, since you need to be precise, but i couldnt really find a good point, so I set the speed to 13. (I think)

Controls
CC Wii Remote

ZL, ZR, L, R , A A Button

B B Button

X / Y 1/2 Buttons (Not mapped?)


Left AND Right stick: IR Pointer

Not much to say really, have fun!

RE: Wii Play: Im going to put this game on the backburner for now. The hack stopped working for some odd reason. I think I might have been working on the wrong revision? Well, I might get back to it in the future.

Wii Music: I keep coming back to this game to try and implement accelerometer support, but I always fail. Now that I know how where the insertion address is for the Accelerometer assembly, I might give it one more shot, but dont expect much.
 
Last edited by awesomeee,
Sega Bass Fishing definitely sounds like a fun one to look into. It's on the more complicated end with all its different inputs, but I'll definitely put it on my list. Thanks for the walkthrough of the various motions it needs as well, that's good info for if/when I get to investigating the game.
I have an idea to hopefully solve the motion controls. You can try using Chat GPT, maybe it will give you a more complex assembly that works. I know AI can be terrible sometimes, but you should give it a shot 👍

My idea is that you talk to it a little, teach important things about the assembly etc. like go to page 7 or 8 that had the motion control guide, saying like “the idea is that inside calc_acc you load fake data”, see what it generates and teach it stuff.

Once it generates an assembly that will most likely have errors, show the AI another assembly that worked for a previous game, and it will most likely learn more. Make sure to let it know there is not an assembly that applies to multiple games, etc. I actually used AI to improve your IR pointer assembly to support both sticks! Useful
Post automatically merged:

On a more productive note, does your Nunchuk error fix also fix “Please REMOVE The extension?” Or is it different
 
Last edited by awesomeee,
Wow! Thats super impressive. I thought these kinds of hack implementations were impossible since its basically context based inputs
(Like how would the hack know its horizontal mode and such)
Yeah, it's not possible from a pure SDK perspective, it required game-specific reverse engineering to understand how that game handles the alternate control schemes in order to check and adjust based on that.

Re: World of goo: I tried to make a hack, but the pointer is acting weird. You should investigate it sometime. 👍
Its like ths pointer can go deep in the screen, but cant reach important gameplay areas in the upper area.
Ah, right, I've seen a couple of weird cases like that, where the developers don't use the normal -1 to +1 range of the pointer. My pointer setup lets you configure a maximum range, but it just sets the same maximum in all directions. If a game expects more vertical range than horizontal or whatever, that would take a more flexible solution.

I have a small idea for a game: could that one Despicable Me game get a CC hack? I think it does not use motion, but it uses the IR Pointer for some gameplay parts. It sadly uses the Nunchuk, so thats why it would be a lower priority. Nunchuk parts of hacks are difficult.
I might try removing the extension error when I am back from vacation. I will keep you updated 👍
Haha, that's funny, somebody just mentioned this game to me a few days ago--not as a potential CC hack, the game just came up in discussion. It got me thinking about whether it would be worth doing. I Googled the game's reception and it was pretty poor so I didn't end up trying, but even with the middling reception, the game still looks kind of interesting to me. I guess if there is interest, I might look into it after all.

I am completely clueless on the code side of things but wanted to try and help in some way so I've put together a spreadsheet with all the codes + links as well as what region they work for and other notes in one place. Still need to go through the thread and check the Wii U/USB Loader compatibility for them in the morning though. Outside this thread I don't know of any other CC codes besides the Riivolution Mario Galaxy and older DKCR/Kirby/NSMBW ones so if anyone knows any more it'd be a great help.
This is super awesome, thanks for doing this. I'm going to add the link to the first post, I'm sure it'll really help people. 👍

I have an idea to hopefully solve the motion controls. You can try using Chat GPT, maybe it will give you a more complex assembly that works. I know AI can be terrible sometimes, but you should give it a shot 👍

My idea is that you talk to it a little, teach important things about the assembly etc. like go to page 7 or 8 that had the motion control guide, saying like “the idea is that inside calc_acc you load fake data”, see what it generates and teach it stuff.

Once it generates an assembly that will most likely have errors, show the AI another assembly that worked for a previous game, and it will most likely learn more. Make sure to let it know there is not an assembly that applies to multiple games, etc. I actually used AI to improve your IR pointer assembly to support both sticks! Useful
I have actually asked ChatGPT about a couple of things, but mostly it hasn't managed to be helpful. It also doesn't accurately understand some PPC instructions, so frequently the code it spits out doesn't do what it claims. Glad it worked for you though, that's cool.

On a more productive note, does your Nunchuk error fix also fix “Please REMOVE The extension?” Or is it different
It should be relatively similar, except that in that case the "correct" response is extension type 0 (no extension) instead of extention type 1 (Nunchuk), so you'd be looking for something which behaves differently when it reads in anything not equal to 0.



3oys3ory.jpg


Avalanche Software's Toy Story 3 is a 3D action/adventure platformer which roughly retells the story of the third movie. Playing as Buzz, Woody and Jessie, players (1-2 simultaneously) must take advantage of each character's unique abilities to solve environmental puzzles, win minigames and ... beat up other toys, I guess. Outside of the story missions, Toy Story 3 is remembered for the sandbox-style Toy Box mode, a customizable free-roaming environment filled with NPCs and various standalone challenges, which Avalanche would soon expand into the Disney Infinity games.

USA / USA (TBSE) / EUR (En,Es) (Rev 1) / EUR (Fr,De,It,Nl) / RUSEUR (En,Es) (Rev 2) / EUR (Fr,De,It,Nl) (Rev 1) / SCN (Rev 1)

  1. Code:
    Classic Controller Support [Vague Rant]
    C206CE7C 00000005
    FC000850 75008000
    4182001C 8808FD70
    2C000002 40820010
    C0080040 D01D0038
    C008003C 00000000
    C221B36C 00000003
    8BC3005C 2C1E0002
    40820008 3BC00001
    2C000000 00000000
    C24E58C4 00000002
    2C000001 41820008
    2C000002 00000000
    C26F2B98 0000000B
    881E005C 2C000002
    40820048 48000009
    4059999A 7CA802A6
    C0050000 809E0004
    70800080 4182000C
    38000001 48000014
    881E0068 2C000000
    41820018 38000000
    D01E04D8 2C140001
    40820008 981E0068
    80C3000C 00000000
    C26F3608 0000002D
    90010024 2C040000
    40820158 8803005C
    2C000002 4082014C
    2C140001 40820108
    48000015 806EADB0
    3FAAAAAB 3D23D70A
    3F800000 7CA802A6
    88C30069 80830004
    7080B000 41820020
    38000000 90030020
    90030024 70808000
    4182000C 68C60001
    48000030 80EDCEF0
    74E08000 4082000C
    70C60001 4800001C
    88E70286 2C070000
    40820010 70801000
    41820008 68C60002
    98C30069 2C060000
    40820014 80830000
    70802000 4182007C
    38C00002 80650000
    28030001 40810018
    90A1000C 7C6803A6
    4E800021 80A1000C
    90650000 2C030001
    7FE3FB78 C0450004
    40820008 EC4200B2
    C0650008 7C641B78
    2C060002 40820008
    38840014 C0030020
    C0240060 FC211024
    48000035 D0030020
    C0030024 C0240064
    FC200850 48000021
    D0030024 38000002
    9803005E 80010024
    7C0803A6 38210020
    4E800020 FC0100FA
    C025000C FC000800
    4180000C FC000890
    48000014 FC200850
    FC000800 41810008
    FC000890 4E800020
    60000000 00000000
    046F4500 7FC3F378
    C26F4538 00000013
    4E800421 2C140001
    4082008C 881E0009
    2C000000 40820080
    4800000D 3F000000
    00000000 7CA802A6
    C0450000 C0650004
    809EFFA0 80BEFFA4
    80DEFFA8 C03E0014
    39000001 48000021
    C03E0018 39000004
    48000015 909EFFA0
    90BEFFA4 90DEFFA8
    48000034 FC000A10
    FC001040 4D800020
    FC011840 41800008
    5508083C 7CC04039
    40820008 7CA54378
    7C844378 7CC64079
    4E800020 00000000
    046F5128 60000000
    046F5278 60000000
    C26F2614 00000020
    7D2802A6 4800000D
    00000000 00000000
    7D4802A6 7D2803A6
    5729083C 7D4A4A14
    2808FFFF 4082000C
    A10A0000 48000014
    2C040002 408200C4
    38800001 B10A0000
    71090800 41820008
    60E78000 71090001
    41820008 60E70008
    71094000 41820008
    60E70004 71090002
    41820008 60E70001
    71098000 41820008
    60E70002 71090010
    41820008 60E74000
    71090040 41820008
    60E70800 71090008
    41820008 60E70080
    71090020 41820008
    60E70400 71092000
    41820008 60E71000
    71090200 41820008
    60E70100 71090080
    41820008 60E72000
    71090004 41820008
    60E70400 71090400
    41820008 60E70010
    71091000 41820008
    60E70200 7CC63B78
    70C99FFF 00000000
  2. Code:
    Classic Controller Support [Vague Rant]
    C206CE7C 00000005
    FC000850 75008000
    4182001C 8808FD70
    2C000002 40820010
    C0080040 D01D0038
    C008003C 00000000
    C221B3DC 00000003
    8BC3005C 2C1E0002
    40820008 3BC00001
    2C000000 00000000
    C24E59C0 00000002
    2C000001 41820008
    2C000002 00000000
    C26F2C98 0000000B
    881E005C 2C000002
    40820048 48000009
    4059999A 7CA802A6
    C0050000 809E0004
    70800080 4182000C
    38000001 48000014
    881E0068 2C000000
    41820018 38000000
    D01E04D8 2C140001
    40820008 981E0068
    80C3000C 00000000
    C26F3708 0000002D
    90010024 2C040000
    40820158 8803005C
    2C000002 4082014C
    2C140001 40820108
    48000015 806EAEB0
    3FAAAAAB 3D23D70A
    3F800000 7CA802A6
    88C30069 80830004
    7080B000 41820020
    38000000 90030020
    90030024 70808000
    4182000C 68C60001
    48000030 80EDCEF0
    74E08000 4082000C
    70C60001 4800001C
    88E70286 2C070000
    40820010 70801000
    41820008 68C60002
    98C30069 2C060000
    40820014 80830000
    70802000 4182007C
    38C00002 80650000
    28030001 40810018
    90A1000C 7C6803A6
    4E800021 80A1000C
    90650000 2C030001
    7FE3FB78 C0450004
    40820008 EC4200B2
    C0650008 7C641B78
    2C060002 40820008
    38840014 C0030020
    C0240060 FC211024
    48000035 D0030020
    C0030024 C0240064
    FC200850 48000021
    D0030024 38000002
    9803005E 80010024
    7C0803A6 38210020
    4E800020 FC0100FA
    C025000C FC000800
    4180000C FC000890
    48000014 FC200850
    FC000800 41810008
    FC000890 4E800020
    60000000 00000000
    046F4600 7FC3F378
    C26F4638 00000013
    4E800421 2C140001
    4082008C 881E0009
    2C000000 40820080
    4800000D 3F000000
    00000000 7CA802A6
    C0450000 C0650004
    809EFFA0 80BEFFA4
    80DEFFA8 C03E0014
    39000001 48000021
    C03E0018 39000004
    48000015 909EFFA0
    90BEFFA4 90DEFFA8
    48000034 FC000A10
    FC001040 4D800020
    FC011840 41800008
    5508083C 7CC04039
    40820008 7CA54378
    7C844378 7CC64079
    4E800020 00000000
    046F5228 60000000
    046F5378 60000000
    C26F2714 00000020
    7D2802A6 4800000D
    00000000 00000000
    7D4802A6 7D2803A6
    5729083C 7D4A4A14
    2808FFFF 4082000C
    A10A0000 48000014
    2C040002 408200C4
    38800001 B10A0000
    71090800 41820008
    60E78000 71090001
    41820008 60E70008
    71094000 41820008
    60E70004 71090002
    41820008 60E70001
    71098000 41820008
    60E70002 71090010
    41820008 60E74000
    71090040 41820008
    60E70800 71090008
    41820008 60E70080
    71090020 41820008
    60E70400 71092000
    41820008 60E71000
    71090200 41820008
    60E70100 71090080
    41820008 60E72000
    71090004 41820008
    60E70400 71090400
    41820008 60E70010
    71091000 41820008
    60E70200 7CC63B78
    70C99FFF 00000000

Button Mapping​

Wii Remote/NunchukClassic ControllerFunction
Wiimote HomeHome
Remember that B is your A button
Open/Close Home Menu
Wiimote D-PadD-Pad
Right Stick
Menus
Navigation
Gameplay
Camera Control
Wiimote ABMenus
Confirm
Gameplay
Jump
Wiimote BY
ZR
Menus
Cancel
Gameplay
Attack
Pick Up
Throw
Interact
Wiimote 1MinusGameplay
Mission Log (Toy Box)
Wiimote 2RGameplay
Help (Story)
Switch Items (Toy Box)
Wiimote PlusPlusGameplay
Pause
Wiimote MinusLGameplay
Switch Characters (Story)
Wiimote ShakeXGameplay
Charge Dash
Ground Pound (in Air)
Wiimote TiltLeft StickGameplay
Direct Paratrooper
Wiimote PointerLeft Stick
Hold ZL + Right Stick
Press L + Right Stick
Home Button Menu
Navigation
Gameplay
Aiming
Customizing (Toy Box)
Nunchuk StickLeft StickMenus
Navigation
Gameplay
Movement
Nunchuk CAGameplay
Drop
Nunchuk ZZLGameplay
Targeting Mode

General Notes​

  • Revisions, revisions everywhere. There's 8 different releases of this game, but fortunately only two major versions, requiring their own codes. You'll need to make sure you're using the appropriate code for your game release. If you're using the USA or RUS versions, you want the first code, if you're using the SCN version, you want the second code. If you're from anywhere else in Europe, you'll need to check your specific revision. If you don't know how to do this, you can probably just try them both and see which one works.

    • If you can play in English, French or Spanish, then the USA Toy Box Special Edition is the best option, as that release includes some extra customization options for the Toy Box mode which aren't included in any other version. These are not a big deal, just a few extra building designs, so don't worry too much if you have a different pressing.

  • The control scheme here is taken from the HD versions on PlayStation 3 and Xbox 360, even where this makes button prompts a little weird (the game will tell you to press Minus to switch characters, but this is L here). It's easy enough to get used to. Y/B to Cancel/Confirm is pretty common to these hacks, so it's fine at this point.

    • One minor downgrade the Wii version suffered is that due to the lack of buttons on the Wii Remote/Nunchuk, what used to be multiple buttons were combined into one: the Wiimote B button. It's doing way too much in this game. You will absolutely press B and throw a ball in an orphan's face instead of picking them up, or pick up an NPC when you're trying to customize them, etc. I can't fix this, that's just how they made the game.

  • The only major addition to the controls is the IR pointer, since that's obviously not a feature that existed on the HD versions. This required a bit of special handling for the different environments where you need to use the pointer.

    • If you hold ZL to enter targeting mode, the pointer will automatically be enabled for you until you release the button. You can move it around using the Right Stick.

    • In the Toy Box mode, tap the L button to toggle the IR pointer on and off when you wish to customize buildings and NPCs. While the Right Stick is behaving as the IR pointer, you will not be able to use the camera controls on the Right Stick. Use the D-Pad instead.

    • There are a couple of times where the game enters a first-person view and you need to point and shoot. You will need to hold the ZL button during these sequences to enable the pointer.

    • When you press the Home button, pointer control moves to the Left Stick, so that you can navigate the Home Button Menu normally. The hack doesn't actually know that the HBM opened, so pressing Home when the menu is not available will toggle the pointer state incorrectly. Double-tap the Home button to reset it if you ever get the pointer into the wrong state.

  • It's important to mention that the Toy Box mode in the Wii/PC/Mac OS versions is significantly more limited than the version on PS3 and 360. In those versions, every NPC and building is fully customizable, buildings can be repositioned, the open-world is one continuous environment with no loading screens, you can take items and vehicles across the different areas, etc. The PS3 version also includes an additional playable character not featured in any other version.

    • That said, the Wii version is still a solid game if you don't have access to the versions released on HD consoles. The story missions are basically intact, not counting the visuals, and there's still fun to be had in the more limited Toy Box, although certainly less of it.

Technical Notes​

Toy Story 3 includes a debug symbol map (yay), so we know the exact names of the functions we're patching here:

Code breakdown:
  • C2 in HandleInput(): fake the accelerometer control for the paratroopers
  • C2 in BeginInput(): read the Nunchuk even when a Classic is connected
  • C2 in CheckRequiredControllerAccessory(): you can guess this one
  • C2 in read_kpad_acc(): fake the Wiimote swings for Dash/Ground Pound--game expects 2+ frames of high movement; we're providing it exactly 2 frames of a horizontal swing at 3.4g
  • C2 in calc_dpd_variable(): all that IR pointer nonsense
  • 04 and C2 in read_kpad_ext(): redirect Classic Left Stick into Nunchuk, D-Pad emulation on the Right Stick (disabled when pointer is active)
  • 04 and 04 in KPADRead() and C2 in read_kpad_button): lag frame fix and button injector
Code:
; read_kpad_button
; 806F2614 for USA/USA (SE)/EUR (En,Es) (Rev 1)/EUR (Fr,De,It,Nl)/RUS
; 806F2714 for EUR (En,Es) (Rev 2)/EUR (Fr,De,It,Nl) (Rev 1)/SCN (Rev 1)
; r4 holds extType
; r6 holds wiimote bitfield
; r7 holds wiimote+nunchuk bitfield
; r8 holds classic bitfield

; magic
  mflr r9
  bl GRAB
MAGIC:
    HELD:           .int    0
    HELD2:          .int    0
GRAB:
  mflr r10
  mtlr r9
  slwi r9, r25, 1
  add r10, r10, r9

; check dropped extension
  cmplwi r8, 0xFFFF
  bne- CLASSIC
  lhz r8, HELD-MAGIC(r10)
  b DROPPED_CONNECTION

CLASSIC:
  cmpwi r4, 0x2
  bne- RETURN

  li r4, 0x1            ; i'm a nunchuk
  sth r8, HELD-MAGIC(r10)

DROPPED_CONNECTION:
    CLASSIC_HOME:
      andi. r9, r8, 0x800
      beq- CLASSIC_UP
      ori r7, r7, 0x8000    ; home

    CLASSIC_UP:
      andi. r9, r8, 0x1
      beq- CLASSIC_DOWN
      ori r7, r7, 0x8       ; up (v) / left (h)

    CLASSIC_DOWN:
      andi. r9, r8, 0x4000
      beq- CLASSIC_LEFT
      ori r7, r7, 0x4       ; down (v) / right (h)

    CLASSIC_LEFT:
      andi. r9, r8, 0x2
      beq- CLASSIC_RIGHT
      ori r7, r7, 0x1       ; left (v) / down (h)

    CLASSIC_RIGHT:
      andi. r9, r8, 0x8000
      beq- CLASSIC_A
      ori r7, r7, 0x2       ; right (v) / up (h)

    CLASSIC_A:
      andi. r9, r8, 0x10
      beq- CLASSIC_B
      ori r7, r7, 0x4000    ; c

    CLASSIC_B:
      andi. r9, r8, 0x40
      beq- CLASSIC_X
      ori r7, r7, 0x800     ; a

    CLASSIC_X:
      andi. r9, r8, 0x8
      beq- CLASSIC_Y
      ori r7, r7, 0x80      ; shake

    CLASSIC_Y:
      andi. r9, r8, 0x20
      beq- CLASSIC_L
      ori r7, r7, 0x400     ; b

    CLASSIC_L:
      andi. r9, r8, 0x2000
      beq- CLASSIC_R
      ori r7, r7, 0x1000    ; minus

    CLASSIC_R:
      andi. r9, r8, 0x200
      beq- CLASSIC_ZL
      ori r7, r7, 0x100     ; 2

    CLASSIC_ZL:
      andi. r9, r8, 0x80
      beq- CLASSIC_ZR
      ori r7, r7, 0x2000    ; z

    CLASSIC_ZR:
      andi. r9, r8, 0x4
      beq- CLASSIC_PLUS
      ori r7, r7, 0x400     ; b

    CLASSIC_PLUS:
      andi. r9, r8, 0x400
      beq- CLASSIC_MINUS
      ori r7, r7, 0x10      ; plus

    CLASSIC_MINUS:
      andi. r9, r8, 0x1000
      beq- CLASSIC_DONE
      ori r7, r7, 0x200     ; 1

    CLASSIC_DONE:
      or r6, r6, r7

RETURN:
  andi. r9, r6, 0x9FFF
 
Last edited by Vague Rant,
Haha, that's funny, somebody just mentioned this game to me a few days ago--not as a potential CC hack, the game just came up in discussion. It got me thinking about whether it would be worth doing. I Googled the game's reception and it was pretty poor so I didn't end up trying, but even with the middling reception, the game still looks kind of interesting to me. I guess if there is interest, I might look into it after all.
No worries. The game isnt actually very good honestly. It is very wacky. It wouldnt be very productive honestly lol

On a more positive note its pretty funny how now there are two people making classic controller hacks, one making serious hacks, and one making silly ones.

I think my next game will be Max and The Magic Marker. I really liked the game as a kid. Ill keep you guys updated! Of course I might scrap the idea if its too complicated. We could try a collab hack with the game if you wanted, lol.
 
Last edited by awesomeee,
Toy story 3 working perfect on wii u.

I have a request, can you do Red Steel?
Nice, thanks again for testing. Red Steel, I know barely anything about, I'm not sure how specific the gestures are to trigger the sword fighting moves. Reading up on it, it does seem to use some fairly unique motions like underhand and overhand throws on the Nunchuk. Seems like it would be a tough one, but it certainly would be interesting. It was so hyped before its launch and then so derided on release, and at least some of that was down to people not liking the controls.

No worries. The game isnt actually very good honestly. It is very wacky. It wouldnt be very productive honestly lol
Well, too bad.



SI_NDS_DespicableMe_enGB_image1600w.jpg


Despicable Me: The Game is a platform shooter and puzzler developed by Vicious Cycle and Monkey Bar Games, released as a tie-in to the 2010 film. If Despicable Me lore is important (it isn't), then this game presumably takes place either before or during the movie, as Gru is still on his "steal the moon" kick, with that forming the main plot of the game. There are three main types of gameplay on offer: standard platform/shooting areas, Minion puzzle areas and on-rails aerial shooter levels. The game received a pretty middling reception, mostly being described as average and having an inconsistent level of difficulty. The puzzle sections were looked upon most kindly, with the player using an expanding variety of guns which affect Minions in different ways. Fans should have a decent time, with new voice acting from Steve Carell (Gru) and Rub Huebel (the anchorman).

Highlight for @awesomeee who asked about this game.

USAEUR

  1. Code:
    Classic Controller Support [Vague Rant]
    C20457F8 00000003
    80010010 2C000002
    40820008 38000001
    60000000 00000000
    C2580508 0000002B
    90010024 2C040000
    40820148 8803005C
    2C000002 4082013C
    9803005E 2C160001
    408200F8 4800001D
    80625299 80537E90
    3FAAAAAB 3DCCCCCD
    3F800000 3F800000
    7CA802A6 80C30068
    80830004 70802000
    40820014 70808000
    41820018 68C60001
    90C30068 38000000
    90030020 90030024
    70C00001 40820014
    80850000 88840000
    2C040001 40820094
    80650004 28030001
    40810030 90A1000C
    7C6803A6 4E800021
    80A1000C 90650004
    2C030001 40820014
    C0050010 C0250008
    FC000824 D0050014
    2C030001 7FE3FB78
    C0450008 40820008
    EC4200B2 C065000C
    C0030020 C0230060
    FC211024 C0450010
    48000041 D0030020
    C0030024 C0230064
    FC200850 C0450014
    EC2100B2 48000025
    D0030024 38000000
    90030060 90030064
    80010024 7C0803A6
    38210020 4E800020
    FC0100FA FC001000
    4180000C FC001090
    48000014 FC401050
    FC001000 41810008
    FC001090 4E800020
    60000000 00000000
    04581458 7FC3F378
    C2581490 00000012
    4E800421 2C160001
    40820080 4800000D
    3F000000 00000000
    7CA802A6 C0450000
    C0650004 809EFFA0
    80BEFFA4 80DEFFA8
    C03E0014 39000001
    48000021 C03E0018
    39000004 48000015
    909EFFA0 90BEFFA4
    90DEFFA8 48000034
    FC000A10 FC001040
    4D800020 FC011840
    41800008 5508083C
    7CC04039 40820008
    7CA54378 7C844378
    7CC64079 4E800020
    60000000 00000000
    045827F0 60000000
    04582990 60000000
    C257F3C4 00000020
    7C0802A6 4800000D
    00000000 00000000
    7D4802A6 7C0803A6
    5720083C 7D4A0214
    2808FFFF 4082000C
    A10A0000 4800000C
    2C040002 408200C4
    38800001 B10A0000
    71000800 41820008
    60E78000 71000001
    41820008 60E70008
    71004000 41820008
    60E70004 71000002
    41820008 60E70001
    71008000 41820008
    60E70002 71000010
    41820008 60E70800
    71000040 41820008
    60E70800 71000008
    41820008 60E74000
    71000020 41820008
    60E70400 71002000
    41820008 60E70001
    71000200 41820008
    60E70002 71000080
    41820008 60E74000
    71000004 41820008
    60E72000 71000400
    41820008 60E70010
    71001000 41820008
    60E70200 7CC63B78
    70C09FFF 00000000
  2. Code:
    Classic Controller Support [Vague Rant]
    C2045C70 00000003
    80010010 2C000002
    40820008 38000001
    60000000 00000000
    C2582018 00000026
    90010024 2C040000
    40820124 8803005C
    2C000002 40820118
    9803005E 2C160001
    408200D0 48000019
    80627959 80539940
    3FAAAAAB 3DCCCCCD
    3F800000 7CA802A6
    80C30068 80830004
    70802000 40820014
    70808000 41820018
    68C60001 90C30068
    38000000 90030020
    90030024 70C00001
    40820014 80850000
    88840000 2C040001
    40820070 80650004
    28030001 40810018
    90A1000C 7C6803A6
    4E800021 80A1000C
    90650004 2C030001
    7FE3FB78 C0450008
    40820008 EC4200B2
    C065000C C0030020
    C0230060 FC211024
    48000039 D0030020
    C0030024 C0230064
    FC200850 48000025
    D0030024 38000000
    90030060 90030064
    80010024 7C0803A6
    38210020 4E800020
    FC0100FA C0250010
    FC000800 4180000C
    FC000890 48000014
    FC200850 FC000800
    41810008 FC000890
    4E800020 00000000
    04582F68 7FC3F378
    C2582FA0 00000012
    4E800421 2C160001
    40820080 4800000D
    3F000000 00000000
    7CA802A6 C0450000
    C0650004 809EFFA0
    80BEFFA4 80DEFFA8
    C03E0014 39000001
    48000021 C03E0018
    39000004 48000015
    909EFFA0 90BEFFA4
    90DEFFA8 48000034
    FC000A10 FC001040
    4D800020 FC011840
    41800008 5508083C
    7CC04039 40820008
    7CA54378 7C844378
    7CC64079 4E800020
    60000000 00000000
    04584300 60000000
    045844A0 60000000
    C2580ED4 00000020
    7C0802A6 4800000D
    00000000 00000000
    7D4802A6 7C0803A6
    5720083C 7D4A0214
    2808FFFF 4082000C
    A10A0000 4800000C
    2C040002 408200C4
    38800001 B10A0000
    71000800 41820008
    60E78000 71000001
    41820008 60E70008
    71004000 41820008
    60E70004 71000002
    41820008 60E70001
    71008000 41820008
    60E70002 71000010
    41820008 60E70800
    71000040 41820008
    60E70800 71000008
    41820008 60E74000
    71000020 41820008
    60E70400 71002000
    41820008 60E70001
    71000200 41820008
    60E70002 71000080
    41820008 60E74000
    71000004 41820008
    60E72000 71000400
    41820008 60E70010
    71001000 41820008
    60E70200 7CC63B78
    70C09FFF 00000000

Button Mapping​

Wii Remote/NunchukClassic ControllerFunction
Wiimote HomeHomeOpen/Close Home Menu
Wiimote D-PadD-Pad
Right Stick
L/R
(Left/Right)
Menus
Navigation
Gameplay
Select Weapon/Formation
Bank Left/Right (Flying)
Wiimote AB
A
Menus
Confirm
Gameplay
Jump
180 Spin (Flying)
Wiimote BYMenus
Cancel
Gameplay
Shoot
Wiimote 1MinusGameplay
Puzzle Camera
Wiimote 2Not mappedNot used
Wiimote PlusPlusGameplay
Pause
Wiimote MinusNot mappedNot used
Wiimote PointerLeft StickHome Button Menu
Navigation
Gameplay
Aiming (Formations)
Nunchuk StickLeft StickMenus
Navigation
Gameplay
Movement
Nunchuk CX
ZL
Gameplay
Despicable Action
Disband Formations
Brake (Flying)
Nunchuk ZZRGameplay
Formation Mode
Boost (Flying)

General Notes​

  • Controls here are mostly adapted from the PS2 version, with the only notable addition being D-Pad emulation on the Right Stick. This allows you to select Weapons/Minion Formations without having to take your thumb off the Left Stick, if you feel like it. Confirm/Cancel are sort of weird, with Y to Cancel and B/A to Confirm. This means the HBM works normally (since it doesn't use the B button), but in-game menu navigation is kind of weird until you get used to Y/B.

  • This shouldn't matter in gameplay because I worked around it in the pointer implementation, but the pointer is suuuuper busted in the USA release. The devs seem to have mixed up their axes, so the pointer range gets adjusted on the vertical axis when widescreen is enabled, when it ... no, that's not right. It's called widescreen because it's wider, not because it's taller. The pointer boundaries will seem a little bit weird inside the Home Button Menu because I tuned it to handle the gameplay.

    • This bug was fixed for the EUR release, which had another two months in the oven, so I didn't have to do anything special there. In theory, if you have the choice, you might want to play the EUR version in case any other improvements were made in that time, but I'm only aware of the corrected IR pointer handling myself.

  • This isn't strictly relevant, but just from context, I'm pretty sure the PSP was the lead platform here, then PS2 second and Wii last. The game only uses buttons a PSP has, the engine the game runs on was created by Vicious Cycle (the PSP studio) and the widescreen support is a bit jank because I think it was bolted on to the 4:3 PlayStation 2 port.

Technical Notes​

Despicable Me includes an unstripped ELF binary, which again means we know exactly what functions we're patching.

Code breakdown:
  • C2 in PlatformPreUpdate(): bypass Nunchuk error
  • C2 in calc_dpd_variable(): simulate IR pointer; USA version has shenanigans to work around original bug
  • 04 and C2 in read_kpad_ext(): redirect Classic Left into Nunchuk Stick, emulate D-Pad on Right Stick
  • 04 and04 in KPADRead(), C2 in read_kpad_button(): dropped connection fix, button injector
Code:
; KPADRead
; USA
; 045827F0 60000000
; 04582990 60000000

; EUR
; 04584300 60000000
; 045844A0 60000000

; read_kpad_button
; 8057F3C4 for USA
; 80580ED4 for EUR
; r4 holds extType
; r6 holds wiimote bitfield
; r7 holds wiimote+nunchuk bitfield
; r8 holds classic bitfield

; magic
  mflr r0
  bl GRAB
MAGIC:
    HELD:           .int    0
    HELD2:          .int    0
GRAB:
  mflr r10
  mtlr r0
  slwi r0, r25, 1
  add r10, r10, r0

; check dropped extension
  cmplwi r8, 0xFFFF
  bne- CLASSIC
  lhz r8, HELD-MAGIC(r10)
  b DROPPED_CONNECTION

CLASSIC:
  cmpwi r4, 0x2
  bne- RETURN

DROPPED_CONNECTION:
  li r4, 0x1            ; i'm a nunchuk
  sth r8, HELD-MAGIC(r10)

    CLASSIC_HOME:
      andi. r0, r8, 0x800
      beq- CLASSIC_UP
      ori r7, r7, 0x8000    ; home

    CLASSIC_UP:
      andi. r0, r8, 0x1
      beq- CLASSIC_DOWN
      ori r7, r7, 0x8       ; up (v) / left (h)

    CLASSIC_DOWN:
      andi. r0, r8, 0x4000
      beq- CLASSIC_LEFT
      ori r7, r7, 0x4       ; down (v) / right (h)

    CLASSIC_LEFT:
      andi. r0, r8, 0x2
      beq- CLASSIC_RIGHT
      ori r7, r7, 0x1       ; left (v) / down (h)

    CLASSIC_RIGHT:
      andi. r0, r8, 0x8000
      beq- CLASSIC_A
      ori r7, r7, 0x2       ; right (v) / up (h)

    CLASSIC_A:
      andi. r0, r8, 0x10
      beq- CLASSIC_B
      ori r7, r7, 0x800     ; a

    CLASSIC_B:
      andi. r0, r8, 0x40
      beq- CLASSIC_X
      ori r7, r7, 0x800     ; a

    CLASSIC_X:
      andi. r0, r8, 0x8
      beq- CLASSIC_Y
      ori r7, r7, 0x4000    ; c

    CLASSIC_Y:
      andi. r0, r8, 0x20
      beq- CLASSIC_L
      ori r7, r7, 0x400     ; b

    CLASSIC_L:
      andi. r0, r8, 0x2000
      beq- CLASSIC_R
      ori r7, r7, 0x1       ; left (v) / down (h)

    CLASSIC_R:
      andi. r0, r8, 0x200
      beq- CLASSIC_ZL
      ori r7, r7, 0x2       ; right (v) / up (h)

    CLASSIC_ZL:
      andi. r0, r8, 0x80
      beq- CLASSIC_ZR
      ori r7, r7, 0x4000    ; c

    CLASSIC_ZR:
      andi. r0, r8, 0x4
      beq- CLASSIC_PLUS
      ori r7, r7, 0x2000    ; z

    CLASSIC_PLUS:
      andi. r0, r8, 0x400
      beq- CLASSIC_MINUS
      ori r7, r7, 0x10      ; plus

    CLASSIC_MINUS:
      andi. r0, r8, 0x1000
      beq- CLASSIC_DONE
      ori r7, r7, 0x200     ; 1

    CLASSIC_DONE:
      or r6, r6, r7

RETURN:
  andi. r0, r6, 0x9FFF

The ELF meant this came together pretty quickly initially, because I was working on the EUR version, but then I came to the US version and its buggy pointer which required additional work to work around it on my end. Having the ELF also allowed me to automate toggling the pointer, with it only being enabled when the game is actually looking for pointer input (while positioning Formations). This was necessary because the Nunchuk Stick becomes a Formation toggle when the IR pointer is active. Since the IR pointer is on the Left Stick as well, I had to make sure they played nice, handing control back and forth between IR and analog stick. The Formation toggling is still available on both the D-Pad and Right Stick during these sections.
 
OMG! Thank you! That was super impressive how you did the hack that fast.
Post automatically merged:

@Vague Rant Re: Sonic Riders: That game will be suuper hard. I dont know if this is helpful or not, but I found a webpage that has useful controller values. It even contains GCN ones. Although some data in the page is for Mario Kart Wii. Hopefully it can help! https://mariokartwii.com/showthread.php?tid=44
It might be like KPADStatus or read_kpad_ext where you need to do all this breakpoint stuff to get the GCN inputs for the analog sticks. And you might need to change the bitfield..? Who knows
Post automatically merged:

I found where the buttons are injected in Max and the magic marker, and other KPAD stuff. It uses WPADProbe since select_1obj_continue isnt there. The WPADProbe Callstack thing that you are looking for should be LR = 8044e0f8 for NTSC. If you want to do the collab code you could start by attempting to remove the extension error, and I can modify the button assembly to have better controls. Thanks in advance!
read_kpad_stick: 8044d780
read_kpad_dpd: 8044cfa0
read_kpad_button: 8044b9e0
read_kpad_acc: 8044be10
calc_acc: 8044ba80
calc_dpd_variable: 8044c9d0

PS: Sorry if I said that weirdly. I am not trying to push you or anything. 👍
 
Last edited by awesomeee,
  • Like
Reactions: Vague Rant
Speaking of solo Wiimote, I considered pulling a Donkey Kong and doing a double CC hack allowing both control schemes to be emulated, but I don't think it's really warranted for this game. Where Donkey Kong is a 2D platformer and some players will prefer to play with traditional controls, there's no real benefit to the Wiimote control scheme here. It's just the same thing condensed down to fewer buttons and missing analogue movement controls. If you want to play on the D-Pad, you'll have to stick to using an actual physical Wiimote, sorry.
Hmm, would pulling a DK be something like writing something in the PPC assembly that once you press + and - it swaps to a new button layout? Thats very interesting. I was considering enhancing the ASM to do that, but its a maybe
 
Last edited by awesomeee,
Hi @Vague Rant . Is there a way to speed up screen cursor ? For example in Toy Story 3 in third person shooting mode, in my opinion the cursor move (and the camera turning) too slowly with right stick. However thanks for all your great hacks.
 
  • Like
Reactions: Vague Rant
I found where the buttons are injected in Max and the magic marker, and other KPAD stuff. It uses WPADProbe since select_1obj_continue isnt there. The WPADProbe Callstack thing that you are looking for should be LR = 8044e0f8 for NTSC. If you want to do the collab code you could start by attempting to remove the extension error, and I can modify the button assembly to have better controls. Thanks in advance!
read_kpad_stick: 8044d780
read_kpad_dpd: 8044cfa0
read_kpad_button: 8044b9e0
read_kpad_acc: 8044be10
calc_acc: 8044ba80
calc_dpd_variable: 8044c9d0

PS: Sorry if I said that weirdly. I am not trying to push you or anything. 👍
Nice work. I'll absolutely take a look at this to see if I can bypass the extension error. 👍

Hmm, would pulling a DK be something like writing something in the PPC assembly that once you press + and - it swaps to a new button layout? Thats very interesting. I was considering enhancing the ASM to do that, but its a maybe
Yeah, that's the basic idea. For Donkey Kong, I was able to track down WPADSetExtensionCallback(), which sets which function should run when the extension gets changed. Knowing which function runs on change allowed me to patch it to alternate whether it read Classic Controller (2) as Nunchuk (1) or Wiimote (0) each time + and - are pressed together. I'm not sure how specific that was to DKCR, some games might manage extension changes manually rather than via the callback. Unfortunately it's not something that can easily be generalized, because the functions games run when extension controllers change aren't from the SDK, they're game-specific.

Hi @Vague Rant . Is there a way to speed up screen cursor ? For example in Toy Story 3 in third person shooting mode, in my opinion the cursor move (and the camera turning) too slowly with right stick. However thanks for all your great hacks.
Absolutely, to change the pointer speed you want to change the value that's (always? almost always?) right after 3FAAAAAB in any of these hacks. For Toy Story 3, you can Ctrl+F for this line:
Code:
3FAAAAAB 3D23D70A
Those are two floating point numbers (decimals). Specifically, the left one is 1.333333... (it's the aspect ratio float for the pointer) and the right one is 0.04, the pointer speed. 0.05 is what I've gone with for most of my recent hacks, which is 3D4CCCCD. I went slightly slower for Toy Story because I found it somewhat difficult using the customization mode in the Toy Box at full speed, but if you want it to feel like the other hacks, 0.05 will get you there.

If you want to set any other custom speed, you can enter any decimal number you want into this Hex Float Converter to get the hexadecimal value to paste over the old value.



mater_perspective_questionmark.png


When people talk about Pixar's Cars video game trilogy, they fall into one of two camps: those who think it's Cars, Cars 2 and Cars 3, and the real ones who know it's Cars, Cars: Mater-National Championship and Cars Race-O-Rama. These games are open sandbox-style racing games in the Cars universe. The first two entries were primarily developed by Rainbow Studios (Motocross Madness, MX vs. ATV, Monster Jam). These games' hub worlds--Radiator Springs and other Cars locales--are broken up into various race courses as well as a handful of brief minigames. Mater-National hews very closely to the original game, with new tracks and minigames but very similar gameplay to the original.

USAEUR

  1. Code:
    Classic Controller Support [Vague Rant]
    C21EAB84 00000002
    28000001 41820008
    28000002 00000000
    C21EB1D4 00000002
    28000001 41820008
    28000002 00000000
    C22F1E84 0000000D
    8803005C 2C000002
    40820058 48000011
    00000000 C059999A
    BF800000 7CA802A6
    C0050008 80830004
    70800080 41820008
    C0050004 D00304A8
    C0050000 80830000
    70800040 41820018
    C0050008 80030060
    74008000 41820008
    FC000050 D0030068
    C02304A4 00000000
    C22F2A6C 0000001F
    90010024 2C040000
    408200E8 8803005C
    2C000002 408200DC
    9803005E 2C0F0001
    40820094 48000015
    8035A0A8 3FAAAAAB
    3D4CCCCD 3F800000
    7CA802A6 80030004
    70008000 41820010
    38000000 90030020
    90030024 80650000
    28030001 40810018
    90A1000C 7C6803A6
    4E800021 80A1000C
    90650000 2C030001
    7FE3FB78 C0450004
    40820008 EC4200B2
    C0650008 C0030020
    C0230060 FC211024
    4800002D D0030020
    C0030024 C0230064
    FC200850 48000019
    D0030024 80010024
    7C0803A6 38210020
    4E800020 FC0100FA
    C025000C FC000800
    4180000C FC000890
    48000014 FC200850
    FC000800 41810008
    FC000890 4E800020
    60000000 00000000
    042F3740 7FC3F378
    042F3E18 60000000
    C22F3E1C 00000031
    48000015 00000000
    00000000 4D475F52
    52520000 7CA802A6
    5760083C 7C650214
    2809FFFF 4082000C
    A1230000 4800000C
    2C040002 40820148
    810D901C 75008000
    41820040 81080388
    75008000 41820034
    8108004C 75008000
    41820028 8008FFA0
    80850008 7C002000
    40820018 8008FFA4
    8085000C 7C002000
    40820008 38A00001
    38800001 39000000
    B1230000 71200800
    41820008 61088000
    71200001 41820008
    61080208 71204000
    41820008 61080004
    71200002 41820008
    61080001 71208000
    41820008 61080002
    71200010 41820008
    61080800 71200040
    41820008 61080400
    71200008 41820008
    61080004 71200020
    41820008 61080100
    2C050001 40820038
    71202000 41820008
    61084000 71200200
    41820008 61080800
    71200080 41820008
    61082000 71200004
    4182003C 61080400
    48000034 71202000
    41820008 61084000
    71200200 41820008
    61080040 71200080
    41820008 61080080
    71200004 41820008
    61082000 71200400
    41820008 61080010
    71201000 41820008
    61081000 7CE74378
    70E09FFF 00000000
  2. Code:
    Classic Controller Support [Vague Rant]
    C21EAAA8 00000002
    28000001 41820008
    28000002 00000000
    C21EB0F8 00000002
    28000001 41820008
    28000002 00000000
    C22F1FB4 0000000D
    8803005C 2C000002
    40820058 48000011
    00000000 C059999A
    BF800000 7CA802A6
    C0050008 80830004
    70800080 41820008
    C0050004 D00304A8
    C0050000 80830000
    70800040 41820018
    C0050008 80030060
    74008000 41820008
    FC000050 D0030068
    C02304A4 00000000
    C22F2B9C 0000001F
    90010024 2C040000
    408200E8 8803005C
    2C000002 408200DC
    9803005E 2C0F0001
    40820094 48000015
    8035A1D8 3FAAAAAB
    3D4CCCCD 3F800000
    7CA802A6 80030004
    70008000 41820010
    38000000 90030020
    90030024 80650000
    28030001 40810018
    90A1000C 7C6803A6
    4E800021 80A1000C
    90650000 2C030001
    7FE3FB78 C0450004
    40820008 EC4200B2
    C0650008 C0030020
    C0230060 FC211024
    4800002D D0030020
    C0030024 C0230064
    FC200850 48000019
    D0030024 80010024
    7C0803A6 38210020
    4E800020 FC0100FA
    C025000C FC000800
    4180000C FC000890
    48000014 FC200850
    FC000800 41810008
    FC000890 4E800020
    60000000 00000000
    042F3870 7FC3F378
    042F3F48 60000000
    C22F3F4C 00000031
    48000015 00000000
    00000000 4D475F52
    52520000 7CA802A6
    5760083C 7C650214
    2809FFFF 4082000C
    A1230000 4800000C
    2C040002 40820148
    810D901C 75008000
    41820040 81080388
    75008000 41820034
    8108004C 75008000
    41820028 8008FFA0
    80850008 7C002000
    40820018 8008FFA4
    8085000C 7C002000
    40820008 38A00001
    38800001 39000000
    B1230000 71200800
    41820008 61088000
    71200001 41820008
    61080208 71204000
    41820008 61080004
    71200002 41820008
    61080001 71208000
    41820008 61080002
    71200010 41820008
    61080800 71200040
    41820008 61080400
    71200008 41820008
    61080004 71200020
    41820008 61080100
    2C050001 40820038
    71202000 41820008
    61084000 71200200
    41820008 61080800
    71200080 41820008
    61082000 71200004
    4182003C 61080400
    48000034 71202000
    41820008 61084000
    71200200 41820008
    61080040 71200080
    41820008 61080080
    71200004 41820008
    61082000 71200400
    41820008 61080010
    71201000 41820008
    61081000 7CE74378
    70E09FFF 00000000

Button Mapping​

The following is the normal button mapping. This layout changes when you enter the Ramone's Rhythm Rumble minigame, see General Notes for details.

Wii Remote/NunchukClassic ControllerFunction
Wiimote HomeHomeOpen/Close Home Menu
Wiimote D-PadD-Pad
X (Down)
Menus
Navigation
Gameplay
E-Brake
Wiimote AAMenus
Confirm
Gameplay
Accelerate
Wiimote BBMenus
Cancel
Gameplay
Brake/Reverse
Wiimote 1D-Pad UpGameplay
Ping (Metal Detector)
Wiimote 2YGameplay
Switch Camera
Wiimote PlusPlusGameplay
Pause
Wiimote MinusMinusGameplay
Open Map (Overworld)
Wiimote ShakeZLGameplay
Jump
Wiimote PointerLeft StickHome Button Menu
Navigation
Nunchuk StickLeft StickMenus
Navigation
Gameplay
Steering
Nunchuk CLGameplay
Tilt Vehicle
Dig (Metal Detector)
Nunchuk ZZRGameplay
Nitro
Nunchuk TiltRGameplay
Powerslide

General Notes​

  • This game got three separate EUR releases: EUR (En,Es), EUR (Fr,Nl) and EUR (De,It). The EUR code above works for all three.

  • As mentioned in the Button Mapping section above, the control mapping changes when you enter the Ramone's Rhythm Rumble minigame. On all other platforms, this is played with the bumper and trigger buttons. This wasn't possible on Wii Remote & Nunchuk for obvious reasons, so the controls are remapped and ... really hard to use, and would have been even more so when remapped again onto a Classic Controller. Instead, the layout gets swapped around so that the Ramone minigame is played using the bumpers/triggers as originally intended.

    • This worked out really well. Honestly, I think people might have figured this out without me even explaining it, because it feels extremely natural just using the shoulder buttons. The on-screen button prompts are still in the same stacked top/bottom layout as they were on other consoles, so anybody who's played a video game before will probably just assume that's how it works.

  • The button mapping here is mostly based on the traditionally-controlled versions on PlayStation 2 and Xbox 360 (the PS3 version uses Sixaxis motion controls). I did take some minor liberties with the layout: the face buttons are rotated to have sensible Nintendo-style Confirm/Cancel, and the Jump move was mapped on ZL, which was reserved for Metal Detector pings on the other versions. This is a button you press like ... four times in the entire game. In the other ports, jumping is done by flicking the Left Stick. It would have required extra work to hack that feature back in and I think it works way better on a button anyway, especially when the button is so useless otherwise. Pings are moved to D-Pad Up to make room for Jump on ZL.

  • I know I skipped over the original Cars. It was already released on GameCube with traditional controls, so if you want to play Cars 1 with Classic Controller support, you can play that one via Nintendont. The Wii version did have some graphical enhancements, so I might come back to Cars 1 at some point, but Mater-National isn't otherwise playable with a Classic Controller on Wii at all, so here we are.

  • This is my 50th Classic Controller hack. I didn't plan this as the 50th or anything, I just realized I must be getting close and it turned out I was. Not very interesting note: I'm not even a fan of the Cars movies, I just think these games are really solid open-world arcade racers that just happen to have animated talking cars.

Technical Notes​

Code breakdown:
  • C2 and C2: read Classic as Nunchuk and bypass Nunchuk error
  • C2 in read_kpad_acc(): fake accelerometer for Shake (Jump) and Nunchuk Tilt (Powerslide); the Nunchuk tilt matches the direction of the analog stick
  • C2 in calc_dpd_variable(): simulate IR pointer
  • 04 in read_kpad_stick(): redirect Classic Left into Nunchuk Stick
  • 04 andC2 in KPADRead(): dropped connection fix, button injector
Code:
; KPADRead
; 802F3E1C for USA
; 802F3F4C for EUR (Fr,Nl)
; r4 holds extType
; r7 holds wiimote bitfield
; r8 holds wiimote+nunchuk bitfield
; r9 holds classic bitfield

; magic
  bl GRAB
MAGIC:
    HELD:   .double 0
    RAMONE: .string "MG_RRR\0"
GRAB:
  mflr r5
  slwi r0, r27, 1
  add r3, r5, r0

; check dropped extension
  cmplwi r9, 0xFFFF
  bne- CLASSIC
  lhz r9, HELD-MAGIC(r3)
  b DROPPED_CONNECTION

CLASSIC:
  cmpwi r4, 0x2
  bne- RETURN

DROPPED_CONNECTION:
; ramone mode check
  lwz r8, -0x6FE4(r13)
  andis. r0, r8, 0x8000
  beq- NORMAL
  lwz r8, 0x388(r8)
  andis. r0, r8, 0x8000
  beq- NORMAL
  lwz r8, 0x4C(r8)
  andis. r0, r8, 0x8000
  beq- NORMAL
  lwz r0, -0x60(r8)
  lwz r4, RAMONE-MAGIC(r5)
  cmpw r0, r4
  bne- NORMAL
  lwz r0, -0x5C(r8)
  lwz r4, RAMONE-MAGIC+4(r5)
  cmpw r0, r4
  bne- NORMAL

  li r5, 0x1   ; ramone mode engaged

NORMAL:
  li r4, 0x1            ; i'm a nunchuk
  li r8, 0x0            ; blank out nunchuk
  sth r9, HELD-MAGIC(r3)

    CLASSIC_HOME:
      andi. r0, r9, 0x800
      beq- CLASSIC_UP
      ori r8, r8, 0x8000    ; home

    CLASSIC_UP:
      andi. r0, r9, 0x1
      beq- CLASSIC_DOWN
      ori r8, r8, 0x208     ; 1 and up (v) / left (h)

    CLASSIC_DOWN:
      andi. r0, r9, 0x4000
      beq- CLASSIC_LEFT
      ori r8, r8, 0x4       ; down (v) / right (h)

    CLASSIC_LEFT:
      andi. r0, r9, 0x2
      beq- CLASSIC_RIGHT
      ori r8, r8, 0x1       ; left (v) / down (h)

    CLASSIC_RIGHT:
      andi. r0, r9, 0x8000
      beq- CLASSIC_A
      ori r8, r8, 0x2       ; right (v) / up (h)

    CLASSIC_A:
      andi. r0, r9, 0x10
      beq- CLASSIC_B
      ori r8, r8, 0x800     ; a

    CLASSIC_B:
      andi. r0, r9, 0x40
      beq- CLASSIC_X
      ori r8, r8, 0x400     ; b

    CLASSIC_X:
      andi. r0, r9, 0x8
      beq- CLASSIC_Y
      ori r8, r8, 0x4       ; down (v) / right (h)

    CLASSIC_Y:
      andi. r0, r9, 0x20
      beq- RAMONE_CHECK
      ori r8, r8, 0x100     ; 2

    RAMONE_CHECK:
      cmpwi r5, 0x1
      bne- CLASSIC_L

        RAMONE_L:
          andi. r0, r9, 0x2000
          beq- RAMONE_R
          ori r8, r8, 0x4000    ; c

        RAMONE_R:
          andi. r0, r9, 0x200
          beq- RAMONE_ZL
          ori r8, r8, 0x800     ; a

        RAMONE_ZL:
          andi. r0, r9, 0x80
          beq- RAMONE_ZR
          ori r8, r8, 0x2000    ; z

        RAMONE_ZR:
          andi. r0, r9, 0x4
          beq- CLASSIC_PLUS
          ori r8, r8, 0x400     ; b
          b CLASSIC_PLUS

    CLASSIC_L:
      andi. r0, r9, 0x2000
      beq- CLASSIC_R
      ori r8, r8, 0x4000    ; c

    CLASSIC_R:
      andi. r0, r9, 0x200
      beq- CLASSIC_ZL
      ori r8, r8, 0x40      ; nunchuk tilt

    CLASSIC_ZL:
      andi. r0, r9, 0x80
      beq- CLASSIC_ZR
      ori r8, r8, 0x80      ; wiimote shake

    CLASSIC_ZR:
      andi. r0, r9, 0x4
      beq- CLASSIC_PLUS
      ori r8, r8, 0x2000    ; z

    CLASSIC_PLUS:
      andi. r0, r9, 0x400
      beq- CLASSIC_MINUS
      ori r8, r8, 0x10      ; plus

    CLASSIC_MINUS:
      andi. r0, r9, 0x1000
      beq- RETURN
      ori r8, r8, 0x1000    ; minus

RETURN:
  or r7, r7, r8
  andi. r0, r7, 0x9FFF
 
Sounds good! Ill modify your Rhythm Heaven ASM soon and give it better mappings 👍
Post automatically merged:

Hello @Vague Rant ! Here is the modifed ASM that has some example mappings for Max. Make sure to add the extension data stuff 👍
Make sure to change any values aswell if some are incorrect.
; read_kpad_button ; r4 holds extType ; r6 holds wiimote bitfield ; r7 holds wiimote+nunchuk bitfield ; r8 holds classic bitfield CLASSIC: cmpwi r4, 0x2 bne- RETURN CLASSIC_HOME: andi. r0, r8, 0x800 beq- CLASSIC_UP ori r6, r6, 0x8000 ; home CLASSIC_UP: andi. r0, r8, 0x1 beq- CLASSIC_DOWN ori r6, r6, 0x8 ; up CLASSIC_DOWN: andi. r0, r8, 0x4000 beq- CLASSIC_LEFT ori r6, r6, 0x4 ; down CLASSIC_LEFT: andi. r0, r8, 0x2 beq- CLASSIC_RIGHT ori r6, r6, 0x1 ; left CLASSIC_RIGHT: andi. r0, r8, 0x8000 beq- CLASSIC_A ori r6, r6, 0x2 ; right CLASSIC_A: andi. r0, r8, 0x10 beq- CLASSIC_B ori r6, r6, 0x2000 ; Z (Jump) CLASSIC_B: andi. r0, r8, 0x40 beq- CLASSIC_X ori r6, r6, 0x2000 ; Z (Jump) CLASSIC_X: andi. r0, r8, 0x8 beq- CLASSIC_Y ori r6, r6, 0x4000 ; Nunchuk C (Push and Pull objects) CLASSIC_Y: andi. r0, r8, 0x20 beq- CLASSIC_L ori r6, r6, 0x80 | 0x400 ; wiimote shake + B (Erases ALL Ink) CLASSIC_L: andi. r0, r8, 0x2000 beq- CLASSIC_R ori r6, r6, 0x800 ; a (Remap to whatever you think would be good) CLASSIC_R: andi. r0, r8, 0x200 beq- CLASSIC_ZL ori r6, r6, 0x400 ; b (Remap to whatever you think would be good) CLASSIC_ZL: andi. r0, r8, 0x80 beq- CLASSIC_ZR ori r6, r6, 0x400 ; B (Erase Ink) CLASSIC_ZR: andi. r0, r8, 0x4 beq- CLASSIC_PLUS ori r6, r6, 0x800 ; A (Draw Ink) CLASSIC_PLUS: andi. r0, r8, 0x400 beq- CLASSIC_MINUS ori r6, r6, 0x10 ; plus CLASSIC_MINUS: andi. r0, r8, 0x1000 beq- RETURN ori r6, r6, 0x1000 ; minus RETURN: andi. r0, r6, 0x9FFF
 
Last edited by awesomeee,
  • Like
Reactions: Vague Rant
Since you've done Mater-National i assume you're also going to do Race-o-rama right? I've wanted to try that one for a while.
 

Site & Scene News

Popular threads in this forum