[Release] Pokemon Pinball Ruby & Sapphire EZ Flash Omega DE Rumble Patch

Phrankles

Active Member
OP
Newcomer
Joined
Sep 22, 2021
Messages
26
Trophies
0
Age
28
XP
51
Country
United States
After learning more about the GBA than I ever wanted, I have finally successfully patched the rumble function of the EZFlash Omega DE into Pokemon Pinball Ruby & Sapphire, replacing the Gameboy Player rumble function. Simply apply the attached IPS patch in Lunar Patcher and rumble will be automatically enabled, no settings required. The hack and patch were developed with the No-Intro ROM, unsure if this is different from a standard rip but here are the hashes:

Rom: Pokemon Pinball - Ruby & Sapphire (USA) Database: No-Intro: Game Boy Advance (v. 20210227-023848)
File/ROM SHA-1: 9FEC81CE2C5DF589E0371A0BF2F92A5FE8DB730B
File/ROM CRC32: B992A3C0

compare these to your rom via: http://www.romhacking.net/hash/ to ensure compatibility

Edit: @djedditt has produced a much better rumble patch that works on all rumble flashcarts and does not cause the graphical issues and kyogre whirlpool problem that my patch introduces. Please use their far superior implementation.
 

Attachments

  • Pokemon Pinball - Ruby & Sapphire (USA) OmegaDE Rumble.zip
    320 bytes · Views: 35
Last edited by Phrankles,

cearp

瓜老外
Developer
Joined
May 26, 2008
Messages
8,518
Trophies
1
XP
7,349
Country
Tuvalu
Nice work! If there's any advice or stuff you learned, please share so other people can benefit :)
(For example, for doing this to the other regions/languages of this game)
 

Phrankles

Active Member
OP
Newcomer
Joined
Sep 22, 2021
Messages
26
Trophies
0
Age
28
XP
51
Country
United States
Nice work! If there's any advice or stuff you learned, please share so other people can benefit :)
(For example, for doing this to the other regions/languages of this game)
I figured there would be some sort of variable/register that stored information about the rumble signal to be sent, so I sat down in mGBA with the memory inspector open and start hunting down anything that changed when a rumble happens. mGBA supports Game Boy Player features so I can enable the original function to see what it does. Sure enough I found two bytes of memory with the value 0xFFFF that is set to a different value only when a rumble happens. This are is likely used as a register to be read by the GBP software in order to produce actual rumble signal. This gave me a memory address to set a breakpoint on (specifically a modification break, it halts the execution when a specific memory address is altered). Unfortunately, I don't believe mGBA supports breakpoints like this so we now move over to no$gba debug version and enter the breakpoint. Now the game will break on rumble, bam we have now have the address of the rumble function in the return register. From there it is just a matter of hooking the rumble function to call the EZFlash provided function (stick their function somewhere in memory and replace the opcode at the address of the rumble function with a bl with the correct offset to the EZFlash function) and bam, rumble in GBP game.
 
Last edited by Phrankles,

Phrankles

Active Member
OP
Newcomer
Joined
Sep 22, 2021
Messages
26
Trophies
0
Age
28
XP
51
Country
United States
I figured there would be some sort of variable/register that stored information about the rumble signal to be sent, so I sat down in mGBA with the memory inspector open and start hunting down anything that changed when a rumble happens. mGBA supports Game Boy Player features so I can enable the original function to see what it does. Sure enough I found two bytes of memory with the value 0xFFFF that is set to a different value only when a rumble happens. This are is likely used as a register to be read by the GBP software in order to produce actual rumble signal. This gave me a memory address to set a breakpoint on (specifically a modification break, it halts the execution when a specific memory address is altered). Unfortunately, I don't believe mGBA supports breakpoints like this so we now move over to no$gba debug version and enter the breakpoint. Now the game will break on rumble, bam we have now have the address of the rumble function in the return register. From there it is just a matter of hooking the rumble function to call the EZFlash provided function (stick their function somewhere in memory and replace the opcode at the address of the rumble function with a bl with the correct offset to the EZFlash function) and bam, rumble in GBP game.
this reply was a mistake plz ignore/delete
 

cearp

瓜老外
Developer
Joined
May 26, 2008
Messages
8,518
Trophies
1
XP
7,349
Country
Tuvalu
I figured there would be some sort of variable/register that stored information about the rumble signal to be sent, so I sat down in mGBA with the memory inspector open and start hunting down anything that changed when a rumble happens. mGBA supports Game Boy Player features so I can enable the original function to see what it does. Sure enough I found two bytes of memory with the value 0xFFFF that is set to a different value only when a rumble happens. This are is likely used as a register to be read by the GBP software in order to produce actual rumble signal. This gave me a memory address to set a breakpoint on (specifically a modification break, it halts the execution when a specific memory address is altered). Unfortunately, I don't believe mGBA supports breakpoints like this so we now move over to no$gba debug version and enter the breakpoint. Now the game will break on rumble, bam we have now have the address of the rumble function in the return register. From there it is just a matter of hooking the rumble function to call the EZFlash provided function (stick their function somewhere in memory and replace the opcode at the address of the rumble function with a bl with the correct offset to the EZFlash function) and bam, rumble in GBP game.
thanks for the info, it doesn't seem too complex!
one thing I have a question about I guess: "stick their function somewhere in memory"
how did you get their function into memory?
after you placed it in some blank space in the rom, did you write an additional function to load their function into memory -- what did you hook into to do that? is that copy into memory happening every frame/loop, or only under some circumstances?

and I had the same experience doing a little reverse engineering gba games, mgba for searching memory, and then doing the rest in no$gba. It would be cool if no$gba could do it all!
bgb is great for gb games, no need for two separate tools.
 

Phrankles

Active Member
OP
Newcomer
Joined
Sep 22, 2021
Messages
26
Trophies
0
Age
28
XP
51
Country
United States
thanks for the info, it doesn't seem too complex!
one thing I have a question about I guess: "stick their function somewhere in memory"
how did you get their function into memory?
after you placed it in some blank space in the rom, did you write an additional function to load their function into memory -- what did you hook into to do that? is that copy into memory happening every frame/loop, or only under some circumstances?

and I had the same experience doing a little reverse engineering gba games, mgba for searching memory, and then doing the rest in no$gba. It would be cool if no$gba could do it all!
bgb is great for gb games, no need for two separate tools.
They have a (very hard to read) tutorial available that has a little snippet of assembly and instruction on how to use devkitpro to assemble it. This was pretty much the only part of the tutorial that was useful but alas, it assembles to the rumble function you need in a bin file. This is just a bunch of hex. Then open the rom in a hex editor, find an empty space in the ROM large enough for the function and literally overwrite that address in ROM, keeping track of the address because this is now where we need to jump to call the function.
 
  • Like
Reactions: cearp

Baggins

Well-Known Member
Member
Joined
Jan 27, 2017
Messages
279
Trophies
0
Age
41
XP
240
Country
United States
After learning more about the GBA than I ever wanted, I have finally successfully patched the rumble function of the EZFlash Omega DE into Pokemon Pinball Ruby & Sapphire, replacing the Gameboy Player rumble function. Simply apply the attached IPS patch in Lunar Patcher and rumble will be automatically enabled, no settings required. The hack and patch were developed with the No-Intro ROM, unsure if this is different from a standard rip but here are the hashes:

Rom: Pokemon Pinball - Ruby & Sapphire (USA) Database: No-Intro: Game Boy Advance (v. 20210227-023848)
File/ROM SHA-1: 9FEC81CE2C5DF589E0371A0BF2F92A5FE8DB730B
File/ROM CRC32: B992A3C0

compare these to your rom via: http://www.romhacking.net/hash/ to ensure compatibility
This is great!!! Can you make one more improvement to it?

Can you fix the options menu in the hack to add a working 'off-on' option to make work correctly? Someone did that for the Mario & Luigi hack and it really makes things feel more 'complete'.
 
Last edited by Baggins,

Phrankles

Active Member
OP
Newcomer
Joined
Sep 22, 2021
Messages
26
Trophies
0
Age
28
XP
51
Country
United States
This is great!!! Can you make one more improvement to it?

Can you fix the options menu in the hack to add a working 'off-on' option to make work correctly? Someone did that for the Mario & Luigi hack and it really makes things feel more 'complete'.
I may implement this eventually, but I definitely wouldn't hold my breath. I'm a bit of a pinball freak and I LOVE haptic feedback, so I was highly motivated to get it on, not so much in enabling the menu to turn it back off. One option is to have two copies of the rom, a clean one in the root folder and the patched version in a seperate "RUMBLE" folder. I know its not as ideal as having the settings within the ROM itself, but it works to save battery if that's the concern.

edit: typo
 
Last edited by Phrankles,

Baggins

Well-Known Member
Member
Joined
Jan 27, 2017
Messages
279
Trophies
0
Age
41
XP
240
Country
United States
It's not so much because I want to 'turn it off'... But because completionist/archival stuff it looks better when all things function.

At least someone else is working on a a version that will address that issue, and also try to be closer to how the original gamecube functionality worked as far as 'timings of rumble' and stuff. Yours is a fun work around until then.
 
  • Like
Reactions: djedditt

shenhan

New Member
Newbie
Joined
Sep 30, 2021
Messages
4
Trophies
0
Age
33
XP
22
Country
United States
I don't know what I'm doing wrong but it isn't working.
SHA-1 is A16BECB36240DBE7E74F6CAAE7FF6DEF8EF40554 after patching. I'm not sure if I messed it up.
 

Phrankles

Active Member
OP
Newcomer
Joined
Sep 22, 2021
Messages
26
Trophies
0
Age
28
XP
51
Country
United States
I don't know what I'm doing wrong but it isn't working.
SHA-1 is A16BECB36240DBE7E74F6CAAE7FF6DEF8EF40554 after patching. I'm not sure if I messed it up.
The SHA-1 I provided needs to match the source ROM, not the patched ROM.
 

Phrankles

Active Member
OP
Newcomer
Joined
Sep 22, 2021
Messages
26
Trophies
0
Age
28
XP
51
Country
United States
Yeah. The source rom SHA-1 matches before patching. I also tried using the online patcher on romhacking.net, still no rumble.
Have you played a game? The rumble options in the menu will still be greyed out but it should just work in game.
 

shenhan

New Member
Newbie
Joined
Sep 30, 2021
Messages
4
Trophies
0
Age
33
XP
22
Country
United States
Have you played a game? The rumble options in the menu will still be greyed out but it should just work in game.

Yes. I played a few rounds just to make sure I'm not missing anything since I just got this cart. It's really strange. I've also test Drill Dozer, Mario & Luigi and Mario Advanced 4. Those are all working fine.
 

ThatBassoonist

New Member
Newbie
Joined
Aug 5, 2021
Messages
3
Trophies
0
Age
30
XP
30
Country
United States
Thanks for making this! I've always wanted to try Pokemon Pinball R/S with rumble. I noticed some issues while playing and wanted to see if anyone can confirm them on their patched ROM.

1. There are minor graphical glitches on the bumpers when the ball makes contact and on the flippers in bonus games when hitting the ball.

2. In Kyogre's bonus game on the Sapphire table the ball does not interact with whirlpools. Instead of being trapped when entering a whirlpool the ball continues through it.
 
  • Like
Reactions: cearp
General chit-chat
Help Users
  • El_Doot @ El_Doot:
    by 1
    Gift
  • Julie_Pilgrim @ Julie_Pilgrim:
    funnily enough when i was telling my openly femboy furry bf and my friend(we talk about femboys sometimes) they said "nope we don't wanna hear that that's disgusting"
    Gift
  • Julie_Pilgrim @ Julie_Pilgrim:
    why is cheeto dust of all things
    the subject that crosses the line
    Gift
  • RichardTheKing @ RichardTheKing:
    Wait, Switch Online now has Super Mario 64, right?
    Gift
  • Julie_Pilgrim @ Julie_Pilgrim:
    i really hate to say this but
    Gift
  • Julie_Pilgrim @ Julie_Pilgrim:
    i dont think it does
    Gift
  • RichardTheKing @ RichardTheKing:
    Huh, makes sense; they did sell that through the 3D All-Stars collection.
    Gift
  • RichardTheKing @ RichardTheKing:
    Which, last I heard was removed from the eShop...so they might as well offer it again, I guess...
    Gift
  • RichardTheKing @ RichardTheKing:
    Will they use the same Shindou-translated ROM, or the original English ROM?
    Gift
  • Julie_Pilgrim @ Julie_Pilgrim:
    googling it, it seems that mario 64 is on the service
    Gift
  • Julie_Pilgrim @ Julie_Pilgrim:
    in japan they use the shindou version apparently but in the states and elsewhere they use the original rom
    Gift
  • Julie_Pilgrim @ Julie_Pilgrim:
    oh boy oh boy oh boy i sure do love living in japan and being a mario fan, i just got the new expansion pack, i cant wait to do some bljs!
    +1
    Gift
  • RichardTheKing @ RichardTheKing:
    From what I've heard about the Expansion Pack, the emulator used has some noticeable input delay and/or lag...would BLJs even be possible?
    Gift
  • RichardTheKing @ RichardTheKing:
    Apparently Nintendo adapted the 3D All-Stars emulator, instead of their old Virtual Console emulator - or, if nothing else, copying what fans have done.
    Gift
  • Julie_Pilgrim @ Julie_Pilgrim:
    from what i can seem to gather there's some issues but nothing dramatic enough to severely impact what you're playing
    Gift
  • Julie_Pilgrim @ Julie_Pilgrim:
    honestly the whole expansion pack confuses me since i thought the nes/snes games were just a neat little bonus
    Gift
  • El_Doot @ El_Doot:
    wait julie your bf is a femboy holy shit im jealous
    +1
    Gift
  • AkiraKurusu @ AkiraKurusu:
    So many planes flying overhead, and they sound close...
    Gift
  • DJPlace @ DJPlace:
    do you need friends to play the games online for the switch exapsion pack i know snes and nes do.
    Gift
  • Julie_Pilgrim @ Julie_Pilgrim:
    @El_Doot well hey hot people do get more benefits in life
    Gift
  • J @ Jephter:
    Please I need help with this. I just homebrew my old 3ds console and downloaded a CIA file, but after surfing through for only 10 sec or less this appears. please can someone help me? Thank you in advance.
    Gift
  • Veho @ Veho:
    Start a new thread in the 3DS board, the chat box is not the best place to ask for such advice.
    Gift
  • Gift
  • RichardTheKing @ RichardTheKing:
    A week ago I got a payment request, through PayPal, from "[email protected]", who wanted US$64.
    Scam? Cancelled it anyway.
    Gift
  • RichardTheKing @ RichardTheKing:
    The note added to it simply said "Lucky Charms?", too.
    Gift
    RichardTheKing @ RichardTheKing: The note added to it simply said "Lucky Charms?", too.