northstar91

SNES NHL94 ROM Mapping Project

Recommended Posts

Hey everybody! I've been reading around the forums for a while now, impressed by all of the hacks/edits performed on the GENS version (most notably the new Clockwise ROM and new stat creations). With the increased interest on hacking for the SNES side, including attempting to get 30+ teams and to deal with logos, I want to help out as much as possible.

That said, the first thing we should do to streamline SNES hacking/editing is to compile all the information we have on the ROM in one location. The eventual goal is to have a complete ROM mapping of NHL '94 for SNES (which I know will be difficult, but it can be done). For now, I have started a Google Spreadsheet to compile information related to locations of palettes and pointer tables I have found on the forums (click on the link below to view it). If you have information about any other locations of pointer tables/palettes/etc. that is not on the document, post it on this topic and I can add it to the spreadsheet.

Spreadsheet (Note: offsets assume header on the ROM)

https://spreadsheets.google.com/spreadsheet/ccc?key=0ArV1f1EnnLgZdElrZ3d0NUFWeGhSMndIQkpNSkRlMEE&hl=en_US&authkey=CMSFy4kC

Share this post


Link to post
Share on other sites

YAY! a few things:

-I think this thread should have the data in it, too, not just as a link. maybe the in-thread text would be a streamlined version with the obscure or super-detailed stuff left to the spreadsheet.

-what is "ptr?"

-why are you assuming a header? I don't mean "don't do that," I just want to examine the choice. when I hack, I don't add nor remove headers, I don't think, so which would that be?

-I want to say I will be adding a lot to this, but I'm just not that organized. here's hoping I pull it together. we very much will benefit from an organized, central location to cull data from.

-screenshots of the tile editing stuff would be nice additions to this thread.

-I can stop dropping irrelevant hints about the need for such a project.

-I love you.

Share this post


Link to post
Share on other sites

YAY! a few things:

-I think this thread should have the data in it, too, not just as a link. maybe the in-thread text would be a streamlined version with the obscure or super-detailed stuff left to the spreadsheet.

-what is "ptr?"

-why are you assuming a header? I don't mean "don't do that," I just want to examine the choice. when I hack, I don't add nor remove headers, I don't think, so which would that be?

-screenshots of the tile editing stuff would be nice additions to this thread.

-I can stop dropping irrelevant hints about the need for such a project.

1. This is just a start. We can have stuff in both (I was imagining that I would make a reference document if people preferred).

2. "ptr" is pointer (CS shorthand, I'll try to avoid it)

3. I'll include both header and non-header stuff eventually. I've been using a header on my edits, so that's what I am used to, and I know that others use headerless ROMs. I'll work on that...

4. I personally haven't been trying tile editing stuff

5. I saw one of your posts mentioning the need for this, and I decided to follow through on it.

Share this post


Link to post
Share on other sites

I'm currently seeking fatigue and rest rates. might have to search for flipped hex data from the Genesis version, replace, test and repeat.

Share this post


Link to post
Share on other sites
....header offsets to team data within each team are in Big Endian. Please note some of my notes/guesses may be wrong.... as I've never got into the SNES version to know any better (or care for that matter).

Search for Hex 55000E00 to find the start header for all teams.

Using LA at 0x000E3FB2 as an example (5500 0E00 7002 1D00 0E00 1300 1500):

5500 - 0x000E3FB2 + 5500 (85 bytes big endian relative offset) = 0x00E4007 (1st Goalie Player Name Byte length of 0E00 - 14 bytes until Jersey No).

0E00 - 0x000E3FB2 + 0E00 = Pallete?

7002 - 0x000E3FB2 + 7002 (624) = 0x000E4222 - 0D00 start of Team name length bytes

1D00 - 0x000E3FB2 + 1D00 (29) = best line - line changes off????????????

0E00 - 0x000E3FB2 + 0E00 = Pallete? Same as above???

1300 - 0x000E2857 + 1300 (19) = 0x000E286A. Bytes CBC0 - Amount of Goalies working from L to R... value > 0 = Goalie. Most likely acts as rating value of some sort too! As per the Genesis roms. Tested it within the SNES rom and worked as excepted... e.g. C000 only gave LA one goalie.

1500 - 0x000E2857 + 1500 = (21) = First line - line changes on?....[related image link]

....while the sega stored period lengths bytes are 012C 0258 04B0, the snes are 2C01 5802 B004....

F9D2E - Period Lengths (find/change menu text to match)

FC8A2 - Overtime....

...(The first value is the default one)

Game Mode - 0000 for Regular season, 0100 for Continue Playoffs, 0200 for New Playoffs etc.

Home Team - 0B00 (Montreal, 0000 for Anaheim thru 001B for for ASW)

Away Team - 0A00 (Los Angeles)

Per. Length - 0001 - 0000 for 5 min, 0100 for 10 min, 0200 as 20 min (or as hacked)

Penalties - 0000 - Off, 0100 = On, 0200 = Off, No Offside

Line Change - 0000 - Off, 0100 = On, 0200 = Automatic

Goalies - 0000 Manual, 0001 Auto....

The overall rating appears to be stored within each team's main data group (lines, roster, team name, venue etc). You can find the hex value of the overall rating two bytes before the line configuration data for the team....[related image link]
....These codes will work from the in-game/pause menu (use SNES9X's or ZSNES cheat utilities to dynamically add these codes after opening the rom):

Address 7E1C90 Value 00 = Automatic Goalie (Game Genie code = DDFB-FA78)

Address 7E1C90 Value 01 = Manual Goalie (Game Genie code = DFFB-FA78)

Address 7E1C94 Value 00 = Defense Ctrl Off (Game Genie code = DDFB-F278)

Address 7E1C94 Value 01 = Defense Ctrl On (Game Genie code = DFFB-F278)...

....Player stats (The individual stats of a player is directly after the player name.)

XX 123456789ABCDE

XX = Jersey # (decimal)

1 = Weight

2 = Agility

3 = Speed

4 = Off. Aware.

5 = Def. Aware.

6 = Shot Power

7 = Checking

8 = Stick hand: Uneven = Right. Even = Left.

9 = Stick Handling

A = Shot Accuracy

B = Endurance

C = ? [editor's note: pass/shoot bias rating]

D = Passing

E = Aggression

Goalie stats (The individual stats of a player is directly after the player name.)

XX 123456789ABCDE

XX = Jersey # (decimal)

1 = Weight

2 = Agility

3 = Speed

4 = ?

5 = Def. Aware.

6 = Puck Cont.

7 = ? (0)

8 = Handness

9 = ? (0)

A = ? (0)

B = Stick Right

C = Stick Left

D = Glove Right

E = Glove Left

Stats are 0-6 (0 = 25, 1 = 35, 2 = 45, 3 = 55, 4 = 65, 5 = 85, 6 = 100)

Weight is 0-F (0 = 140, 1 = 148, 2 = 156, 3 = 164, 4 = 172, 5 = 180, 6 = 188, 7 = 196, 8 = 204, 9 = 212, A = 220, B = 228, C = 236, D = 244, E = 252, F = 260)

Note: 789A in the goalie stats are almost always 0000, Daren Puppa is one of the few goalies that right handed. Thereby 0100 at those positions to create a right handed goalie....

=========================

-- LINES --

Each teams lineup is in hex, between "team overall" and "number of players". In the following order: SC1, SC2, CHK, PP1, PP2, PK1, PK2. And each line is in the following order: G, LD, RD, LW, C, RW and then the extra attacker, when you pull your goalie.

-- NO. OFF/DEF PLAYERS --

In 94, the single byte before the "team overall" bytes defines the amount of forwards and defense players.

Anaheim for example has Hex 97, so 9 forwards and 7 defense players.

Usual hex rules apply, A = 10, B = 11, .... F = 15.

-- STATS/WEIGHT --

Stats are 0-6:

0 = 25

1 = 35

2 = 45

3 = 55

4 = 65

5 = 85

6 = 100

Weight is 0-F

0 = 140

1 = 148

2 = 156

3 = 164

4 = 172

5 = 180

6 = 188

7 = 196

8 = 204

9 = 212

A = 220

B = 228

C = 236

D = 244

E = 252

F = 260

--DEFAULT GAME SETTINGS--

At hex offset 000E9EC2 you can change the default game settings:

-in game- -default-

Game mode 0000 for Regular season, 0100 for Continue Playoffs, 0200 for New Playoffs etc.

Team home 0B00 (Montreal, 0000 for Anaheim thru 1B00 for for ASW)

Team away 0A00 (Los Angeles)

Per. Length 0100 - 0000 for 5 min, 0100 for 10 min, 0200 as 20 min (or as hacked)

Penalties 0000 - Off, 0100 = On, 0200 = Off, No Offside

Line Change 0000 - Off, 0100 = On, 0200 = Automatic

Goalies 0000 Manual, 0100 Auto

-- Timers --

Offset Def. Hex Sec

5 min F9D2E 5 min 2C01 300

10 min F9D30 10 min 5802 600

20 min F9D32 20 min B004 1200

OT FC8A2 5 min 2C01 300

SO ??

....Anaheim Mighty Ducks

Players: 18

Goalies: 2

Forwards: 9

Defense: 7

#HEX Name #DEC

01 Guy Hebert 1

02 Ron Tugnutt 2

03 Steven King 3

04 Troy Loney 4

05 Stu Grimson 5

06 Terry Yake 6

07 Bob Corkum 7

08 Anatoli Semenov 8

09 Lonnie Loach 9

0A Robin Bawa 10

0B Tim Sweeney 11

0C Alexei Kasatonov 12

0D Sean Hill 13

0E Randy Ladouceur 14

0F David Williams 15

10 Bill Houlder 16

11 Bobby Dollas 17

12 Dennis Vial 18

Team number: 0000

Offsets:

945504: Players

945505: Overall

945506-07: Unknown bytes.

945508: Best

945516: SC1

945524: SC2

945532: CHK

945540: PP1

945548: PP2

945556: PK1

945564: PK2

945572: First player (Goalie)....

Share this post


Link to post
Share on other sites
The hex code to edit the SNES playoffs exists at offset E6F59. It appears as if the teams are in hex numerical order even with the addition of Anaheim and Florida. You can easily add the all star teams by replacing any hex in the area with 1A or 1B....

Anaheim ‘00

Boston ‘01

Buffalo ‘02

Calgary ‘03

Chicago ‘04

Dallas ‘05

Detroit ‘06

Edmonton ‘07

Florida ‘08

Hartford ‘09

Los Angeles ‘0A

Montreal ‘0B

New Jersey ‘0C

NYI ‘0D

NY R ‘0E

Ottawa ‘0F

Philadelphia ‘10

Pittsburgh ‘11

Quebec ‘12

San Jose ‘13

St Louis ‘14

Tampa Bay ‘15

Toronto ‘16

Vancouver ‘17

Washington ‘18

Winnipeg ‘19

ASE ‘1A

ASW ‘1B

To swop Toronto and Colorado, simply point your cursor to E6F59 in SNES; replace 12 with 1A; replace 16 with 12; and replace 1A with 16. To add an all star team, pick a team of your choice (I picked L.A. and Edmonton, because they sucked last year) and do a find but not replace all, and replace every other LA and Edmonton that appears with either 1A or 1B....

Here's how you add the all star teams as selectable playoff teams in SNES. Open a hex editor and make your way to byte 961299. You should see "1A 00" - change this to "1C 00". This will make the all star teams selectable in the menus. Make your way to byte 957182. You again should see a "1A 00" - change this to "1C 00" as well. This will not default the teams to Winnipeg (team 26) after you select them from the menu. Remember to put the all star teams in at least one of the playoff series or else the game will hang....

some notes on expanding player names for Statto's editor..

First, here is a document on pointers in SNES. They are waaay more confusing than in the Genesis. http://www.romhacking.net/docs/%5B50%5Dxcalpointers.txt.

Here is an example:

  • I thought that there must be a pointer to the start of the All Stars East team. I figured/guessed that the start was at offset 0E2857
    in the ROM, where there is a "U" character (value 55), since this character appeared right after all the rink names, except for the last team.
  • So, my starting pointer is E2857.
  • In SNES pointers, you only need the last 4 numbers in an address (don't ask why.. long story..), so you have 2857.
  • Next, subtract the ROM header size, which is 0200. This gives you 2657.
  • Next, you need the pointer's first digit to be between 8-F. So, if it's 0-7, add 8 to it. This gives you A657.
  • Next, the SNES CPU is "little endian", so you reverse the bytes in the number, giving you 57A6.

It turns out that this value, 57A6, appears in the ROM twice, and the 2nd time is the 'team pointer.' The pointers to the other teams are also in this area. Team Pointers are each followed by the value "9C00" (I don't know why.. (EDIT: this is the "bank" number.. it's part of the pointer, though sometimes it is found separate from the other part))

The team pointer table is from E27E7-E2857 (ie, it ends right were the ASE team data starts)

post-253-1269550795_thumb.pngpost-253-1269550359_thumb.png

As an excel sheet:snes94.zip...

can you tell me where SNES stores the number of goalies? (i found it for forwards and D)

Team Data format:

starting at byte 0, using Anaheim as an example.

  0: 55 (same for all teams?)
 1: 00 (same for all teams?)
... 
 4: DD
 5: 01
...
14: 07 (0 offense, 7 defense strength)
15: 02 (0 home, 2 away strength)
16: 13 (1 PP, 3 PK strength)
17: 97 (9 forwards, 7 D)
18: 33 (team rating, 51 in decimal)...

If you combine bytes 4-5 in reverse, you get 01DD (477 in decimal). This is the offset from the start of the team data to the City Name string ("..Anaheim" where ".." has the value "0900", which is 9, the length of the Anaheim string +2)

If you change the length of a player name, you need to change the values in bytes 4-5 to match the change.

....The number of characters in the name of the arena precedes it by two bytes... so the "11" before "Pond in Anaheim" refers to the 17(decimal) bytes after and including that one...
I was able to add letters to vanbiesbrouck's name!

post-253-1269564895_thumb.png

What I did:

Part 1, move FLA and ANA to free bytes:

  1. Copy data from E6B4D-E6F59. This is the FLA and ANA team data.
  2. Paste (overwrite not insert) to E7B46. This puts FLA at E7B46 and ANA at E7D4B.
  3. Go back to E6B4D-E6F59 and overwrite it all with FFFFFF...
  4. Update the FLA team pointer at E2807 (see table in post above) to the value 46F9 (E7B46->7B46->7946->F946->46F9)
  5. Update the ANA team pointer at E2807 (see table in post above) to the value 48FB (E7D48->7D48->7B48->FB48->48FB)

Part 2, extend player's name:

  1. Insert the missing characters in Vanbiesbrouck's name ("ouc", 3 extra characters)
  2. Update the length of Vanb's name from 1100 to 1400.
  3. Because data was inserted, you need to remove some of the 'free bytes'. Delete 3 of the FF bytes from before E8200.
  4. Update the "player info size" value in the 4-5th bytes of the team data. Old value: DD01. New value: DD01+0300=E001.
  5. Because we changed the total length of FLA's data, we need up update the pointers for all teams AFTER Florida in the ROM. In this case, it's just ANA:
  6. Team Pointer Location: E2807. Old data location: E7D48. New data location: E7D48+0003=E7D4B -> 4BFB

NOTE: The 'data' section of the ROM ends at 0E81FF. The code starts at 0E8200. You have to make sure the code section doesn't move.

NHL___94__U_____smoz.zip

....here are my notes from editing jerseys in SNES using a palette editor. The hex number next to the team represents the number '1' in the top part. If this doesn't make sense, too bad.

1 DO NOT CHANGE

2 GLOVES AND SKATES AND STICK - keep black

3 SLEEVES

4 SHORTS

5 SOCKS primary

6 TOP PART primary

7 SKIN

8 TRIM top sleeve & sock trim

-

9 TRIM bottom sleeve & main sock trim

10 TRIM middle sleeve and belt

11 OUTER JERSEY and HELMET TRIM

12 MIDDLE JERSEY and HELMET

13 TRIM - top stripe

14 NECK-SKIN & EYES

15 SKATES - DNChange

16 SKATES - DNChange

Anaheim Ducks Away - $0B4BD0

Boston Bruins Away - $0B4BF0

Buffalo Sabres Away - $0B4C1E

Calgary Flames Away - $0B4C30

Chicago Blackhawks Away - $0B4C50

Dallas Stars Away - $0B4C7C - green 1,9,7

Dallas Stars Home - $0B4FF0

Detroit Red Wings Away - $0B4C90

Florida Panthers Away - $0B4CD0

Hartford Whalers Away - $0B4CF0

New Jersey Devils Away - $0B4D50

NY Islanders Away - $0B4D70

NY Rangers Away - $0B4D90

Ottawa Senators Away - $0B4DB0

Philadelphia Away - $0B4DD0

Pittsburgh Penguins Away - $0B4DF0

Quebec Nordiques Away - $0B4E10

San Jose Sharks Away - $0B4E30

St Louis Blues Away - $0B4E50

Tampa Bay Lightning Away - $0B4E70

Toronto Maple Leafs Away - $0B4E90

Vancouver Canucks Away - 0B4EB0

Washington Capitals Away - 0B4ED0

Winnipeg Jets Away - $0B4EF0

All Stars 1 Away - $0B4F10

All Stars 2 Away - $0B4F30

Anaheim Ducks Home - $0B4F50

Boston Bruins Home - $0B4F70

Buffalo Sabres Home - $0B4F90

Calgary Flames Home - $0B4FB0

Edmonton Oilers Home - $0B5030

Florida Panthers Home - $0B5050

Hartford Whalers Home - $0B5070

LA Kings Home - $0B5090

Montreal Canadiens Home - $0B50B0

New Jersey Devils Home - $0B50D0

NY Islanders Home - $0B50F0

NY Rangers Home - $0B5110

Ottawa Senators Home - $0B5130

Philadelphia Flyers Home - $0B5150

Pittsburgh Penguins Home - $0B5170

Quebec Nordiques Home - $0B5190

San Jose Sharks Home - $0B51B0

St Louis Blues Home - $0B51D0

Tampa Bay Lightning Home - $0B51F0

Toronto Maple Leafs Home - $0B5210

Vancouver Canucks Home - $0B5230

Washington Capitals Home - $0B5250

Winnipeg Jets Home - $0B5270

All Star Team 2 Home - $0B5290

All Star Team 2 Home - $0B52B0

$0D7160 - Boston Team Banner

also:

0D5356 - Bruins to Stars centerice colors

0D5382 - Calgary Flames centerice color

stumbled upon a 'pod' of teams, can't find any other ones though

EDIT: 0D5356 to 0D5382 is the PALETTE for the centre ice logos, not any information about the centre ice logos themselves. Still useful.

Pretty impressive tutorial from a Super Mario World editing forum:

http://www.smwcentral.net/?p=thread&id=16714

I found it when I was trying to figure out the difference between DMA mode 0 and mode 1.

mode 0 is 4 layers + 4 colours per palette

mode 1 is 3 layers + 16 colours per palette.

mode 1 would be used when loading a player portrait, since they're 16 colours.

i suspect mode 0 is used to show team banners (upper half of banner = 4 colours, lower half = 4, text = 4..), but that's a guess. EDIT: reading the document made me realize that banner idea is wrong.. the mode 0 stuff i was seeing was actually changing palettes..

Here are some other references on:

SNES Graphics: http://web.archive.org/web/20071111200111/...u/qsnesdoc.html

General SNES programming info: http://en.wikibooks.org/wiki/Super_NES_Programming....

Apparently Anomie's documents are good:

http://www.romhacking.net/?category=&P...itle=&desc=

Register Map:

http://www.romhacking.net/docs/%5B196%5Dregs.txt (Anomie's)

http://fh.digitalmenagerie.org/coding/Snesmap.txt (someone else's)

Found this stuff when looking for info about register 4202:

4202  wb++++ WRMPYA - Multiplicand A
4203  wb++++ WRMPYB - Multiplicand B
	mmmmmmmm
	Write $4202, then $4203. 8 "machine cycles" (probably 48 master cycles)
	after $4203 is set, the product may be read from $4216/7. $4202 will
	not be altered by this process, thus a new value may be written to
	$4203 to perform another multiplication without resetting $4202.
	The multiplication is unsigned.

That bit about cycles is important: after setting 4202 and 4203 (to say 2 and 3), you need to wait a while (run some other instructions) before the result is ready. Once the result is ready, you can actually set a new value into 4202 (say 10), then immediately pull the old result from 4216 (2x3=6) before it changes to the new result a few cycles later (10x33=30).

Share this post


Link to post
Share on other sites
....for anaheim: 070213

07 is offense/defense

02 is home/away (set all teams to 11 to make them all average, not 00, sorry)

13 is pp/pk....

team, location begin/end, o/d h/a pp/pk advantages sequence

ANH E6D5D-E6D5F 07 02 13

BOS E2DBA-E2DBC 41 21 21

BUF E3040-E3042 64 10 21

CGY E32CF-E32D1 42 00 00

CHI E354E-E3550 20 10 21

DAL E425D-E425F 14 10 00

DET E37E5-E3737 73 21 00

EDM E3AAB-E3AAD 16 02 12

FLA E6B5B-E6B5D 07 02 13

HFD E3D2B-E3D2D 17 02 00

LA. E3FC0-E3FC2 66 12 11

MTL E44E9-E44EB 52 11 21

NJ. E478C-E478E 34 11 12

NYI E4A39-E4A3B 53 21 00

NYR E4CAA-E4CAC 34 11 11

OTW E4F14-E4F16 07 02 13

PHI E51BA-E51BC 36 02 22

PIT E5445-E5447 71 20 21

QBC E56E0-E56E2 75 21 00

SJ. E596E-E5970 07 02 12

STL E5BE2-E5BE4 22 20 21

TB. E5E58-E5E5A 05 02 00

TOR E60EA-E60EC 20 20 11

VAN E638C-E638E 61 02 11

WPG E6613-E6615 45 11 11

WSH E68BB-E68BD 52 20 11

ASE E2865-E2867 77 20 00

ASW E2B12-E2B14 77 20 00

I just know the Genesis side where these are the meanings:

Offense - Good 7 ... 0 Bad
Defense - Good 0 ... 7 Bad
PP      - Good 2 ... 0 Bad
PK      - Good 0 ... 2 Bad
Home    - Good 2 ... 0 Bad
Away    - Good 0 ... 2 Bad (3 Really bad (OTT, FLA, ANH))

So to make everyone average, it's 441111.

I think I remember checking the genesis version and finding that offense/defense are never actually used, so can be ignored.

I believe 70 30 30 gives the best advantages and 07 03 03 gives the worst.

Share this post


Link to post
Share on other sites
I've been making some progress on the player portraits in NHL '94.

NOTE: I am using a headerless ROM. This means the first 512 bytes ($200 in hex) have been deleted from the ROM, since the debugger emulator doesn't work with them. If you are using a ROM with a header (such as the default ROM), then add $200 onto offsets to translate to headerless. (Don't add to pointers, just offsets, which I mark with an @ symbol). Eg: headerless: @EC200. header: @EC400)

Player-to-Portrait pointer table

In the SNES version of the game, each team has 26 picture pointers allocated to it. This means each team can have up to 26 players with portraits. In the original NHL 94 ROM, only 6 players on each team (the starting lineup) actually have portraits, so their pointers point to their portraits, and the remaining pointers point to generic pictures. The exception to this is the All Star teams, which use most of their pointers, since most of the players are starting players on their normal teams.

Within each team, the pointers go in the same order as the team roster data (goalies, then forwards, then defensemen). If the team doesn't have 26 players (none do, actually), then extra pointers still point to generic pictures.

Starting at @0ecd53, there is a massive pointer table with 26 pointers for 28 teams. That's 728 pointers!

As a pointer is 4 bytes and each team has 26 pointers, this means the start of each team is separated by 104 bytes ($68 bytes).

@0ECD53 - ANA (1st: Hebert, 4th: Loney, 6th: Yake, 8th: Semenov 12th: Kasatonov, 14th: Ladouceur)

@0ECDBB - BOS

@0ECE23 - BUF

@0ECE8B - CGY

@0ECEF3 - CHI

@0ECF5B - DAL

@0ECFC3 - DET

@0ED02B - EDM

@0ED093 - FLA

@0ED0FB - HFD

@0ED163 - L.A

@0ED1CB - MTL

@0ED233 - N.J

@0ED29B - NYI

@0ED303 - NYR

@0ED36B - OTT

@0ED3D3 - PHI

@0ED43B - PIT

@0ED4A3 - QUE

@0ED50B - S.J

@0ED573 - STL

@0ED5DB - T.B

@0ED643 - TOR

@0ED6AB - VAN

@0ED713 - WSH

@0ED77B - WPG

@0ED7E3 - ASE

@0ED84B - ASW

For example, if you go to @0ecd53 in the ROM (Anaheim) (remember my offsets are headless! Add $200 if you have a header), the first pointer is $36ac9900. In data bank notation: $0099:ac36. Rom offset: @0cac36. So, Hebert's picture is stored at @0cac36. Now I just need to figure out how it decompresses the picture...

The next pointer is $4EC69900. If you skip ahead $68 bytes (104 decimal), you'll see that the same pointer appears again. This is the generic goalie picture that the backup goalies use. A few teams don't have backups (NYI, NYR, to name two).

I'll come up with an excel sheet with all the picture pointers some time.

Palettes

Immediately following the player portrait pointers section are the palettes.

Each team gets its own palette. The palette is applied to any portrait loaded for that team, including the generic pictures.

post-253-1270677952_thumb.png

(Edmonton's portrait palette)

They're 16 colours, 32 bytes ($20 bytes)

Colour 0: usually magenta (31/0/31), used as the transparent colour *

Colours 1-12: skin and hair tones.

Colours 13-15: sweater and helmet colours. Sometimes used for black hair if the sweater has black. The fact that the player's hair and helmet will use the sweater colours will probably cause problems moving players between teams.

* there are a couple teams that don't use magenta, they just use the grey/green background colour. Someone messed up! :anger:

There are 25 palettes in one big group, and then the ones for Boston and Anaheim are crammed in elsewhere.

The All Star teams each use the same palette (located between FLA and HFD for some reason), so there are 27 palettes in total.

Palette locations:

@0D747C - ANA

@02FFDF - BOS

@0D6A5C - BUF

@0D6A7C - CGY

@0D6A9C - CHI

@0D6ABC - DAL

@0D6ADC - DET

@0D6AFC - EDM

@0D6B1C - FLA

@0D6B3C - ASE & ASW

@0D6B5C - HFD

@0D6B7C - L.A

@0D6B9C - MTL

@0D6BBC - N.J

@0D6BDC - NYI

@0D6BFC - NYR

@0D6C1C - OTT

@0D6C3C - PHI

@0D6C5C - PIT

@0D6C7C - QUE

@0D6C9C - S.J

@0D6CBC - STL

@0D6CDC - T.B

@0D6CFC - TOR

@0D6D1C - VAN

@0D6D3C - WSH

@0D6D5C - WPG

Sometimes the sweater colours get used in the players' helmets and hair, so if you change them, you have to watch out that a player doesn't end up with blue hair or a yellow helmet...

There is a pointer table for these palettes at $ED8B3. The pointers are in alphabetical order (ANA-WPG), and then the two All Star teams at the end.

I think I found the decompression routine.

It's at @04373 (headerless) ($80/C373 in a trace)....

Share this post


Link to post
Share on other sites

Is this better than a thread guide?

With a thread guide, you can fairly easily see all the topics, then follow the links to the a whole discussion on the topic you're interested in.

At the least, you should provide a link to the topic you're quoting. On the plus side, you can eliminate the fluff and out-of-date info from the threads.. but what happens when the info here becomes out-of-date.. will people remember to update their quotes..

Share this post


Link to post
Share on other sites

I don't know. I was just trying to cull some data from elsewhere and contribute. feel free to make another such link list. any work you put into the SNES side of things is greatly appreciated. I don't mean that your efforts in the Genesis stuff aren't, though. those efforts have surely helped me to actually enjoy those games through hacking.

Share this post


Link to post
Share on other sites

Oh I missed the spreadsheet. I like that... but I would add a column with links to the threads explaining those things.

For a thread guide, do one of you want to take control on that? I wasn't a mod or anything when I set up the Gens thread guide.

Share this post


Link to post
Share on other sites

I like it all in one place, for my own ease of use, so... I'm not motivated to do it.

I don't use smileys.

http://twitter.com/diesmiley

Share this post


Link to post
Share on other sites

I found the pointer table for center ice logos! They are located from @0E03B7-@0E0496 (headerless). It seems that the pointers are 8 bytes rather than 4. I'll update the Google spreadsheet. Experimenting with it, I found that if the second half is changed and the first half is unchanged, the logo gets distorted but the game is playable. By contrast, if the first half is unchanged and the second half is unchanged, the game breaks after the beginning of the game.

Now we just have to figure out where the pointers for the logos in the main menu are located in the ROM. One would think since most of the pointer tables that have been found are in the Exxxx portion of the ROM, the main menu logo pointers would be there as well.

Edited by northstar91

Share this post


Link to post
Share on other sites

8-byte (64-bit) pointers?

Sounds like one half is the pointer to the start of the graphic (something like 34 12 9D 00?) and the other is something else, maybe the size of the graphic, or a second pointer to something else used for the graphic (perhaps the tile map -- the logos are broken up into to 16x16 and 8x8 pixel tiles that then are arranged to create the graphic.. one of the reasons I got discouraged working on it was I had no idea where the tile maps were in 94 or how they worked).

But excellent find.

Share this post


Link to post
Share on other sites

8-byte (64-bit) pointers?

Sounds like one half is the pointer to the start of the graphic (something like 34 12 9D 00?) and the other is something else, maybe the size of the graphic, or a second pointer to something else used for the graphic (perhaps the tile map -- the logos are broken up into to 16x16 and 8x8 pixel tiles that then are arranged to create the graphic.. one of the reasons I got discouraged working on it was I had no idea where the tile maps were in 94 or how they worked).

But excellent find.

I'll keep playing around with that pointer section in order to figure out how exactly it works. It might be the arrangement of the logo, as you mentioned.

Edited by northstar91

Share this post


Link to post
Share on other sites

Does anyone have any idea about possible locations for the main menu team logo pointer table, or how I could figure it out with an SNES debugger? I am having trouble figuring out where it could possibly be.

Share this post


Link to post
Share on other sites

There are 115 pointers from e03b7-e057f

So probably all the logos are there? That's 4x28 + 3. Not sure what that extra 3 would be...

Share this post


Link to post
Share on other sites

There are 115 pointers from e03b7-e057f

So probably all the logos are there? That's 4x28 + 3. Not sure what that extra 3 would be...

No, I don't think the menu logos are there. Here's what the pointers are from e03b7-e057f, based on information I have (I can always double check to confirm, I could have messed up somewhere):

Center Ice Logos: @0E03B7-@0E0496

Menu Logo Palettes: @0E0497-@0E050E (28 teams + NHL shield + NHLPA logo)

Banner Palettes: @0E050F-@0E057E

Edited by northstar91

Share this post


Link to post
Share on other sites

The centre-ice logo pointers are definitely logo/map pairs.

The second pointer in each pair points to 70 bytes (46 hex) of data, representing the logo tile map.

The first 6 bytes always seem to be 0800 0400 0803. 0800 (8 ) is the width, 0400 (4) is the height. I don't know what 0803 represents; I tried changing it and nothing happened.

After that, you get 32 (i.e., 8x4) 2-byte tile IDs. So a typical logo would go 0000 0100 0200 0300, etc. saying to lay the tiles out in order. Some tiles will get reused. Some tile IDs have the form xx04 (e.g., 0004 0104 0204 0304). The 04 sometimes changes the colours; I don't really understand the point of it.

Share this post


Link to post
Share on other sites

Interesting observations about the center ice logos. They seem to work quite differently from other graphics we have found so far.

the 8-byte "unknown" portion of the pointer table area I referred to in an earlier post is actually two pointers to menu logo palettes; one for the NHL shield and the other for the NHLPA logo. Thus, it seems like that pointer table area does not pertain to the logos in the main menu.

One would think that there would be a 70 or 140 byte pointer table (if including the NHL/NHLPA logos, 78 and 156) somewhere in that references those logos, assuming that they work in a similar fashion to player portraits. So far, it's been quite elusive.

Share this post


Link to post
Share on other sites

I've been looking, but I don't think there's a pointer table anymore. It probably has something like a base pointer and then sizes or relative offsets from that base pointer.

Share this post


Link to post
Share on other sites

this was almost setting defense control on whenever L or R is pressed in the game:

at $FCF2F (or $FCD2F), change:

A0 00 00 E0 0C 00 90 03 A0 02 00 B9 94 1C D0 01

to:

A9 00 00 E0 0C 00 B0 01 6B 1A 8D 96 1C 1A 80 04

the asm for this is:

LDA #$0000
CPX #$000C
BCS $01
RTL
INC
STA 1C96
INC
BRA 04

it doesn't work for the right defenseman when defending the bottom of the screen. this was an attempt at a fix:

....At $fcd2f

A9 01 00 8d 94 1c 8d 96 1c 1a 80 08

to replace

A0 00 00 E0 0C 00 90 03 A0 02 00 B9 

LDA #0001
STA 1C94
STA 1C96
INC
BRA 08

$1c94 is team 2's defense control and $1c96 is team 1's, or maybe vice versa sometimes, not really sure. This way removes the check against #0c and just sets both teams' defense control on.

it was still glitchy. then Smozoma saved the day:
....turn the defense control on in a clean way before the game starts (so you can turn it off or back on again in the game menu), you can do this:

At ROM address @F857c

old:

22 B2 C6 9F

JSL 9F:6CB2  # Long Jump to Subroutine

new:

20 30 FB EA

JSR :FB30  # Jump to SubRoutine of our custome code
NOP        # No OPeration (space filler operation)

@FFD30

old:

FF FF FF ..

(unused section)

new:

22 B2 C6 9F A9 01 00 8D 94 1C 8D 96 1C 60

JSL 9F:6CB2 # do the code we cut out
LDA #0001   # LoaD A=0001
STA 1C94    # STore A (0001) into :1C94
STA 1C96    # STore A (0001) into :1C96
RTS         # ReTurn from this Subroutine

it's quite functional. use it. there is no reason to have defense control off, ever. Edited by trudatman

Share this post


Link to post
Share on other sites

somebody stick this thread to the top of the page, please.

Share this post


Link to post
Share on other sites

thanks for sticking this. I come here often. that didn't seem to make it quite sticky enough.

I want to gently encourage everybody to keep making progress. I sure could use some hand-holding. if anybody with the skills wants to help get a hack polished up, there are a few things I'm not comfortable with that others seem to have down. I'm still using initials for first names in the expansion teams (ANA and FLA) and there are plenty of things left to work on for adding to this thread.

Share this post


Link to post
Share on other sites

Get a hex-editor (I recommend HxD, very easy to use and very user friendly) and open NHL'94 rom in it.

Center ice logos are located at E03B7 - E0496 offsets, find it with "Goto" option.

The center ice logos offset stars with 7B B4 9A 00 3C E5 9A 00 A1 BF etc etc and ends with 88 00 B6 D4 9A 00 C6 FF 88 00.

You can also find beginning of the offset with "Find" option, search for 7B B4 9A 00 in Hex-values datatypes.

The complete offsets values for center ice logos look like this in HxD:

7B B4 9A 00 3C E5 9A 00 A1

BF 9A 00 F8 E7 9A 00 96 CA 9A 00 6C E7 9A 00 3D

FF 8D 00 E0 E6 9A 00 2E AC 9A 00 F6 E4 9A 00 38

FF 84 00 98 E3 9A 00 80 C8 9A 00 F4 E1 9A 00 15

C3 9A 00 26 E7 9A 00 57 C5 9A 00 54 E6 9A 00 A9

FE 82 00 B0 E4 9A 00 9C D7 9A 00 C6 E2 9A 00 4A

DA 9A 00 3E E8 9A 00 F5 BB 9A 00 9A E6 9A 00 CB

FE 98 00 82 E5 9A 00 A0 CB 9A 00 C8 E5 9A 00 C0

FE 99 00 0E E6 9A 00 36 C4 9A 00 B2 E7 9A 00 47

FF 83 00 68 E1 9A 00 AF D5 9A 00 AE E1 9A 00 67

C6 9A 00 3A E2 9A 00 74 C7 9A 00 80 E2 9A 00 85

FE 97 00 0C E3 9A 00 72 D9 9A 00 52 E3 9A 00 78

FE 86 00 DE E3 9A 00 33 DD 9A 00 24 E4 9A 00 73

BE 9A 00 6A E4 9A 00 B6 D4 9A 00 C6 FF 88 00 B6

D4 9A 00 C6 FF 88 00

It's a mess, after formatting and adding team names it makes much more sense:

7B B4 9A 00 3C E5 9A 00 Anaheim

A1 BF 9A 00 F8 E7 9A 00 Boston

96 CA 9A 00 6C E7 9A 00 Buffalo

3D FF 8D 00 E0 E6 9A 00 Calgary

2E AC 9A 00 F6 E4 9A 00 Chicago

38 FF 84 00 98 E3 9A 00 Dallas

80 C8 9A 00 F4 E1 9A 00 Detroit

15 C3 9A 00 26 E7 9A 00 Edmonton

57 C5 9A 00 54 E6 9A 00 Florida

A9 FE 82 00 B0 E4 9A 00 Hartford

9C D7 9A 00 C6 E2 9A 00 Los Angeles

4A DA 9A 00 3E E8 9A 00 Montreal

F5 BB 9A 00 9A E6 9A 00 New Jersey

CB FE 98 00 82 E5 9A 00 NY Islanders

A0 CB 9A 00 C8 E5 9A 00 NY Rangers

C0 FE 99 00 0E E6 9A 00 Ottawa

36 C4 9A 00 B2 E7 9A 00 Philadelphia

47 FF 83 00 68 E1 9A 00 Pittsburgh

AF D5 9A 00 AE E1 9A 00 Quebec

67 C6 9A 00 3A E2 9A 00 San Jose

74 C7 9A 00 80 E2 9A 00 St. Louis

85 FE 97 00 0C E3 9A 00 Tampa Bay

72 D9 9A 00 52 E3 9A 00 Toronto

78 FE 86 00 DE E3 9A 00 Vancouver

33 DD 9A 00 24 E4 9A 00 Washington

73 BE 9A 00 6A E4 9A 00 Winnipeg

B6 D4 9A 00 C6 FF 88 00 East

B6 D4 9A 00 C6 FF 88 00 West

Yes, it's that simple, every line represents one center ice logo. For instance, if you want to change Quebec ice cener logo in your custom NHL 99 rom with generic NHL logo, just rewrite the values on the Quebec line (AF D5 9A 00 AE E1 9A 00) with the values from East or West line (B6 D4 9A 00 C6 FF 88 00).

I bolded values which differ to frequent 9A value.

Do not edit just part of the line, the game freezes after that. If you edit only first two values, the game works but the logo looks ugly....Post NHL 94 teams do not need to use Jets, Whalers or Nordiques logos in modern NHL roms but generic NHL logo now. For international tournaments or non-NHL leagues roms you can choose the same logo for all teams....

Share this post


Link to post
Share on other sites

also:

0D5356 - Bruins to Stars centerice colors

0D5382 - Calgary Flames centerice color

stumbled upon a 'pod' of teams, can't find any other ones though

EDIT:

0D5356 to 0D5382 is the PALETTE for the centre ice logos, not any information about the centre ice logos themselves. Still useful.

I edited everything from D5556 (D5356+200) to D5582 (D5382+200) with AA and then 00 and nothing happened. Bruins, Flames and Stars centre ice logos remained, unchanged.

Menu logos always change color after editing menu logos palette offsets.

Not sure if these are really center ice logos colors.

Edited by DominikJagr

Share this post


Link to post
Share on other sites

Spreadsheet, Pointer Table Offsets Tab, line 9:

Menu NHL and NHLPA logos (do not appear in Regular Season mode)

Edited by DominikJagr

Share this post


Link to post
Share on other sites

Music is located from DB53F+- to DBFA1.

Intro theme, menu music.

Anyone knows where the organ tunes are located?

Some centre ice logos findings: http://forum.nhl94.com/index.php?/topic/16251-center-ice-logos-tutorial/

Edited by DominikJagr

Share this post


Link to post
Share on other sites

the organ tunes are pretty easy to spot in the hex editor, I think, but I've never messed with them to test them. a pattern of many large sections of code that look similar and have identifiable intro values....

rather than link to new developments, please continue to copy into this thread -- and keep updated -- any and all charts, rants, data that spell the larger book on our preferred game; this thread is meant to have all of the information a SNES hacker can collect from others to understand and/or build their own NHL '94. you seem to get a lot of this better than I do, so please help keep this thread well edited. rewrite, clarify, copy... keep bringing in content and get your first-line position secured.

we are a lot closer to a map of this sucker than we were three years ago. you look to be the dude about to make the next set declarations. it had been well over a year that this thread was stagnant.

Edited by trudatman

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now