News: 11 March 2016 - Forum Rules
Current Moderators - DarkSol, KingMike, MathOnNapkins, Azkadellia, Danke

Author Topic: TMNT of Rage - The Final Shell Shock (A Streets of Rage 2 Hacking Progress Blog)  (Read 10771 times)


  • Newbie
  • *
  • Posts: 2
    • View Profile
Hey, kmilloz.  Dha Lau Hoo actually already created that tutorial, which you'll find here.  That's how I was able to get my turtle portraits into the game.

You might find one or two of these useful, too, though:
1) sor2palette.bin
2) sor2portraits.bin
3) sor2tilespritemap.bin

These are .bin files I created while working through the tutorial, but it's been a good year or so since I've done anything with them, so use at your own risk.

-----Epilogue – After the Release-----
A Brief History Lesson…

Romhacking has been a fun process.  With each iteration I’ve developed, I’ve realized that there’s a few more things I can likely figure out and do.  And so, just like my NBA Jam TE series, one TMNT mod became another, and another, and another, each one improving more over the last, till I finally made it through The Final Shell Shock.

Hopefully, you’ve some of these mods enjoyable too.  In the meantime, let’s get back to a little unfinished business…

Adding an Intro Screen

I’m not the biggest fan of intro screens added to romhacks.  Unless they blend with the original spirit and style of the game, my thoughts are to leave them out.  I tried to keep that in mind when creating my NBA Jam TE mods by incorporating logos and fonts that clearly synched up with the game.  With TMNT Final, given I was looking for the arcade Ninja Turtles feel, I couldn’t help but slip in an old-school “Winners Don’t Do Drugs!” logo.

Other than TLP not being terribly friendly with the colors (TileMolester was again worse!), the screen itself was fairly easy to drop in using AddIntroGen.  But… buyer beware… this utility is a general Genesis / Mega Drive tool not optimized for any specific game.  In using it, I found myself with two problems.

Of lesser concern, the intro only added code that exited the intro screen when pressing Start.  My preference was that it should also simply fade out to the next screen after a certain period of time, much like the SNES tutorials allow for that system.  A minor inconvenience, which I actually solved via writing some ASM (which ultimately conflicted; we’ll get to that in a bit).

Of much greater concern, something in the AddIntroGen code that the utility added reset the difficulty, lives, and stage select to values of 1 upon exiting to attract mode.  At the same time, it cleared all the values in RAM that created the high score table.  While none of that is detrimental to gameplay (settings can be changed in options), it doesn’t exactly make the game look polished at issuance.

My goal was to fix both issues.  Starting with trace logs to find where the Start button press occurred and next with research and chats on a Sega development Discord, I finally learned the value of ASM versus hex and grabbed an assembler.   I also learned a bit about the DBF function and how much time it could potentially save writing that versus commands to push 60+ bytes of data into RAM one byte at a time via the same MOVE command over and over again.  The end result was a fix to the high score table plus the default lives and difficulty values… but when incorporating those fixes with my additional code to move from the intro screen after a delay, those value were again lost in RAM.

(Oddly enough, the DBF function worked in one emulator and not another, so I ended up going the byte-by-byte route…)

I never did revise the Start button bit, as the integrity of the high score table was the more mission critical item.  For those who are curious, here is my code and some of the trace log (I ended up going with my option 3 to favor fixing the high score table over adding the intro screen delay):

Code: [Select]
;BTST is the Start button.
;BNE causes the jump to $000208, the initialization.
32:F8CC  08 00  BTST    #7,D0                   
32:F8D0  66 0C  BNE     #$0C [32:F8DE]           
;Initialize the game
00:0208  4A B9  TST.L   ($00A10008)             
00:020E  66 06  BNE     #$06 [00:0216]           
00:0216  66 7C  BNE     #$7C [00:0294]           
00:0294  60 6C  BRA     #$6C [00:0302]           
00:0302  4A 79  TST.W   ($00C00004)             
00:0308  30 39  MOVE.W  ($00C00004),D0           
00:030E  08 00  BTST    #1,D0                   
00:0312  66 F4  BNE     #$F4 [00:0308]           
00:0314  4E B9  JSR     ($000015F4)             

;OPTION 1 - hijack start button press and add delay (does not recover hi score table)
org $32F8CC
4E F9 00 33 87 80 JMP ($00338780) - putting this at end of rom will cause the hi score table to revert to broken
org $338780
0C 42 00 60 CMPI.W #$0060,D2
66 06 BNE #$06
4E F9 00 00 02 08 JMP ($00000208)
52 42 ADDQ.W #1,D2
08 00 00 07 BTST #7,D0
67 06 BEQ #$06
4E F9 00 00 02 08 JMP ($00000208)
4E F9 00 32 F8 D2 JMP ($0032F8D2)

;OPTION 2 - remove start button press and go with delay only (does not recover hi score table)
org $32F8CC
4E F9 00 33 87 80 JMP ($00338780)
0C 42 00 60 CMPI.W #$0060,D2
66 06 BNE #$06
4E F9 00 00 02 08 JMP ($00000208)
52 42 ADDQ.W #1,D2
4E F9 00 32 F8 D2 JMP ($0032F8D2)

org $005924
4E F9 00 33 87 A0 JMP ($003387A0)
4E 71
;39 79 00 03 A4 A8 FF FC 39 79  MOVE.W  ($0003A4A8),$FFFC(A4)

org $3387A0
0C 42 7F FF CMPI.W #$7FFF,D2
66 0E BNE #$0E
39 79 00 03 A4 A8 FF FC 39 79  MOVE.W  ($0003A4A8),$FFFC(A4)  ; the hijacked code
4E F9 00 00 59 2C JMP ($0000592C)
52 42 ADDQ.W #1,D2
4E F9 00 33 87 A0 JMP ($003387A0); JMP to start of this code to loop

org $32F8DE
4E F9 00 33 87 80 JMP ($00338780)

org $338780
31 FC 00 08 FD 06 MOVE.W #$0008,$FD06 ;lives
31 FC 00 06 FD 04 MOVE.W #$0006,$FD04 ;difficulty
20 7C 00 00 03 60 MOVE.L #$00000360,A0 ;the top high score table in rom
22 7C FF FF FD 30 MOVE.L #$FFFFFD30,A1 ; where the table is supposed to go in ram
20 3C 00 00 00 9F MOVE.L #$A0-1,D0 ;the decrement for the loop
E4 48 LSR.W #2,D0 ;a division by 4 to account for the long address
22 D8 MOVE.L (A0)+,(A1)+ ;160 bytes from $360 to $3FF need to go to $FFFFFD30 to $FFFFFDCF
51 C8 FF FC DBF D0, @RECOVERTABLE ;loop back to the label
4E F9 00 00 02 28 JMP ($00000208) ;the jump to the sega screen

org $005924
4E F9 00 33 87 AC JMP ($003387C0)
4E 71
;39 79 00 03 A4 A8 FF FC MOVE.W  ($0003A4A8),$FFFC(A4)

org $3387AC
0C 42 7F FF CMPI.W #$7FFF,D2
66 0E BNE #$0E
39 79 00 03 A4 A8 FF FC  MOVE.W  ($0003A4A8),$FFFC(A4)  ; the hijacked code
4E F9 00 00 59 2C JMP ($0000592C)
52 42 ADDQ.W #1,D2
4E F9 00 33 87 AC JMP ($003387AC); JMP to start of this code to loop

Thanks for reading this blog!  I may have other things I’ve learned while making these hacks and may look to slip them in from time to time as I recall them.  Otherwise, please feel free as well to keep the conversations going on this thread!  And… please be sure to try out my TMNT Final hack and give it a review!

thanks I'll try


  • Full Member
  • ***
  • Posts: 120
  • NBA Jam 2K20 TE / TMNT of Rage Developer
    • View Profile
NOTE: The .zip file for this hack contains two .ips files: the  Final Shell Shock patch being playable on all hardware and in all emulators, with the Re-Shelled add-on allowing players a better sound experience when using the Terraonion MegaSD cartridge. Be sure to first patch a copy of your SoR2 rom with the Final Shell Shock patch to begin your TMNT experience.

I've gotten a few messages or seen a few notes this past couple weeks about some folks not being able to hear music when playing the game.  Let's fix that...

Are you playing the game in a Windows or Android-based emulator, including a Raspberry Pi?  If yes, do not apply the Re-Shelled patch.  Only apply the Final Shell Shock patch.

Are you playing the game using Terraonion's MegaSD cartridge?  The Re-Shelled patch is designed to allow you to hook the music tracks to new music, which you have to download and put on the same memory card that holds the .md Re-Shelled ROM.

First, apply the Final Shell Shock patch to a clean SoR2 ROM.  Then, apply the Re-Shelled patch to the same ROM.

You also need a .cue sheet and new music.  Download the .zip file with the music from MEGA.  Use this link:!nB0z0SRC!2dJ9bYE3fo58F4ZkptIPSsOp_5tF2f0i9pXemTw4vqc

For more instructions on how to get MD+ functionality on your MegaSD cartridge, please visit the Terraonion website or Zeldix.

MD+ functionality does not work on another current emulator in the wild... yet.  In the meantime, please be sure to try out that solo Final Shell Shock patch!

Shameless Plugs
Not sure you want to try out the game?  Why not take a look at a few gameplay videos?

This dude had some fun with the music... perhaps they made their own .cue sheet for the MegaSD?

Looks like there might be a live stream of gameplay June 18th?

Love them turtles and think the two worlds mesh together pretty well?  Hate the game with a passion and think I ruined your childhood?  Why not put up a review on RHDN?

Thanks again for reading... and playing!


  • Newbie
  • *
  • Posts: 3
    • View Profile
I love this! Recently finished doing runs with all 4 turtles on streams. i wrote a review of this hack here: