[HELP] Specific ROM Hacking Questions


New member
Hello. I've been working on a personal hack of NBA JAM TE for SNES and have gotten about as far as my understanding of hex codes and tiles will get me. There are a few nice additions I'd like to make to my ROM if I can figure out how (credit to be given in the ROM obviously to anyone who can help). If anyone can help answer one or more of the questions below, I'd appreciate the advice. Hopefully not overstepping here.

1) I'd like to change the player sprite that's in the Acclaim screen such that he looks like Vlade Divac. I believe the offset that picks up the head graphic is $0B1F0F. However, my attempts to locate the pointer using the SNES Development Wiki and the Mad Hacker's Guide to Pointers haven't seemed to work. I've tried factoring in the 0x200 bytes for headers. I've tried not factoring it in. I've tried LoROM conversion. I've added the 0x8000 bytes where the truncated offset isn't in the 8000 - FFFF range, but I can't seem to locate the pointer. Similarly, I've tried to adjust pointers in the roll call screen in attract mode with no luck. Wondering if anyone has experience hacking JAM, and if there's a different method by which the pointers are calculated (or if I'm simply botching the calcs).
(I'm also trying to figure out how to locate the body type graphic to change that as well but not sure how to go about doing that. I currently only located the head.)
2) I'd like to change the Rookies' uniforms such that they look like Olympics uniforms. I'm not sure if this requires ASM hacking or simple tile editing, as I don't know where to locate the uniforms in the ROM (is there a specific set of addresses I should look for?), how many tiles make up a uniform or how many animations there are to consider. If someone knows how to change the uniform colors, please let me know how that might be done.
3) I'd like to set up the team select screen such that two buttons cycle backward through the various player combinations. Currently, A, B, X, and Y all cycle forward. This looks like it requires an ASM hack, which I don't know how to do. Would someone would be able to briefly walk me through how that coding might work? And, would inserting that code lead to adding bytes and therefore cause problems in the ROM with pointers or size, etc.? (I'm probably overstepping on this one, so please feel free to ignore.)
4) I'd like to understand how to replace the compressed portraits sitting in the 7F bank of the ROM. It may require changing pointers, but I don't 100% understand what that means (see 1 above) and where the pointers would need to point (would a new bank need to be added and new portraits pointed over to there)? Looking to understand the theory here and how it'd work.
5) I've read of a bug in the original game where players who beat all 27 teams don't get their initials in the Grand Champions screen (I've also noted this playtesting my ROM hack). If there's a bug fix, is there a simple hex edit I can do, or does it require an ASM hack?
6) Similarly, there's a bug in the original game whereby the injury values don't reset after the 4th quarter of game one and before the first quarter of game two when the same team/players are selected. Is there a simple hex edit I can do to fix this, or does it require an ASM hack?

Thanks for reading!
Thanks for the tip. I've been picking some brains and learning more about the ROM as I go. Think I've narrowed down some of my questions to these.

1) For the Rookies uniform, running through the game, I think an easy fix would be to reset the team's uniform reference to that of the Detroit Pistons (the white and blue alternate uniform, presuming there's only one option for the palette/color; otherwise both uniform types). If the fix is this simple, I'm wondering if anyone can guide me to where perhaps the pointers would be to the uniforms such that I could swap out the Rookies uniform reference for the Pistons one.

2) Still pursuing guidance with respect to the button question and cycling through player options. Is there code someone would be able to walk me through that would accomplish this? I'm playing with xkas and injecting some simple assembly here and there, and I'd like to learn about the various commands required by such an ASM hack, so if someone were willing to provide me a quick tutorial and maybe answer a follow-up question or two on the whys of coding, I'd definitely appreciate it.

3) Injuries - Still pursuing this one. The injury values for a two person team used in game 1 will extend to the first quarter of game 2 if the same team and same player combination is selected. It may be a tad more than this, as I did some cheat code searches using SNES Geiger and thought I saw the player two injury value reset from previous game Q4 injury value to zero at new game tip-off, and then jump to another value (in one game, all the way to 14). I think I found the 4 values in RAM for injuries, one for each player on the court via that search and some breakpoint attempts, but I don't quite know where to go from there. Looking to see if there's a simple fix here, or - again - if there's so tutelage I can get, such that the injury value resets properly to zero for all players at tip-off of each new game.

(Building on that one, I'd love to figure out how to ramp up that max injury value from 25 to perhaps 50 or 99.)
OK, so I can say that I've got some resolution to items in OP #1, 2, and 6 above and now have a base understanding of how #4 works such that I don't need to pursue it much further at this time.

For OP #3, looking for ideas on where to begin. Could it be as simple and doing some CPU logging at the team select screen and pressing the various buttons to see what comes up for code? Should I expect to see button assignments such that I may want to create some CMP functions and branch over to new code to reassign what the buttons do? And... if that's the right path, what might the act of cycling look like in the code? Wondering if anyone's done something similar and has some tips on how to proceed.

Looking for any thoughts, tips, or guidance you may be willing to share on OP #3 and #5 (includes immediately preceding post #2).
Not sure if this will be helpful or not.

For #3, check RAM at team select screen. Cycle (forward) and look for values either increasing by 1, or changing to an entirely new value at each cycle, but not otherwise.

If this works, verify that each team has the repeating result when selected.

If it's an increase by 1, you might be able to find where the buttons are mapped to use the INC opcode on the RAM offset.

If not an increase by 1, the buttons might instead trigger JMP or JSR (jump, jump to subroutine) opcodes to go to wherever the code is located to assign the new team value.

On #5

I'd use the debugger and cheat finder to look at all of the opcodes and different RAM values directly when the screen is meant to come up, for each play through.

Find out what is different between when the initials screen works and doesn't work. Does it play some kind of end-of-game video or credits instead?

Disclaimer: I haven't messed with anything like this in maybe 8 years.
Thanks for the tips!

I'm still pondering the cycle forward/backward one. There seemed to be quite a few values in RAM that had changed, so I'm trying to think through why that'd be. The increases didn't seem by one but in some cases by 20+. Need to apply your suggestion on checking each team as well. I did different buttons with one team and got different results, though they all cycle forward, hence my current confusion.

The SRAM issue was that the Grand Champions NEVER display, so there's no way to figure out when the screen works versus doesn't. Turns out, based on another hacker's tracing exercise, the algorithm isn't correct, so one fix would be to apply the algorithm from another screen (such as most wins). It provides enough of the fix (and only requires changing one byte (the low byte in a jump address)) that the issue appears solved. I playtested through about 300 games (using fast forwarding and some PAR codes to keep the opponent score zero) and can see the Grand Champions now displaying after beating all teams and based on the top three players based on most wins.

If you're interested, I released my most recent version of my hack late last week. It's up at http://www.romhacking.net/hacks/4097/

Thanks again!
Top Bottom