Jump to content
NHL'94 Forums

Recommended Posts

Posted (edited)

How to: Wide Display Mode in '94 (Patches)

v3.1 (2025 07 26)


 

image.gif

ezgif-5-87716f6c56.gif

Above: The Original ROM and WWF Survivor Shoot-Out patched for Wide Display mode.


Here are a couple of patches that you can use on Sega Genesis/Mega Drive NHL ’94 ROMs to switch the gameplay view from 256 pixels wide to 320 pixels wide. These are entirely new patches built from the ground up to be the most comprehensive, stable, and minimally intrusive method to convert the game to 320 pixel wide mode. Furthermore, two different versions of the patch are included, one for the original 28-team ROM, and another for the 32-Team ROM hack, as well as uninstaller patches. As an added bonus, two optional patches allow you to limit the amount of horizontal camera movement. Without further ado, here are the patches!

cheers,

-Adam
 

NHL 94 - Patches - Display Mode - Wide - v3.1.zip

 


Installation Notes

  • If you are using this patch on a ROM that already has ANY previous first of this hack, it is highly recommended that you run the included uninstaller patch first. This will reset all affected areas of code to their default values. Please note, if you have further modified these areas of code, those modification will be lost.
  • These patches writes 110 bytes of data to 0x000FFE20 in the original 28-team ROM, or to 0x001FF320 in a 32-team ROM hack. By default this section is unused, but if your ROM has been modified to have data stored in this location, you should instead use the Manual installation method available at: https://forum.nhl94.com/index.php?/topic/35254-how-to-wide-display-mode-in-94-patches-manual-methods/#findComment-208436.
     

Version Notes

  • v3.1 Revised the Instant Replay screen initialization to remove garbage tiles, further optimization and relocation of code to its final resting place.
  • v3.0 Completely re-written from the ground up for optimal use of the game’s native systems.
  • v2.2 Fixed misaligned Arrow Indicators for Off-Screen players, and removed Gameplay overlays from Instant Replay view.
  • v2.1 Fixed Injury & Shoot-Out Overlays.
  • v2.0 Initial Public Release.
     

Known Issues

  • None as of version 3.1.
     

Potential Issues

  • When applying this to existing ROM hacks, there may be compatibility issues, as it is impossible to prepare a patch that will work with every single ROM hack variant. If you are having difficulties, you may wish to manually modify the ROM with my notes below, or to ask that ROM hack creator for help. Just about everything they need to know is included in the next post below.
     
Edited by AdamCatalyst
Updated for v3.1
Posted (edited)

How to: Wide Display Mode in '94 (Manual Methods)

So, you're a masochist, eh? Who am I to judge… Every change made by this patch is listed below. Feel free to critique and suggest improvements. Hopefully this will be useful for others looking to enhance the existing wide mode patches for other versions of the game.

Note on Patch Code Insertion

I have included the addresses that are used by my patches for any newly inserted code. You can adjust these addresses to point to anywhere that you have free space for the code. Furthermore, if you are using a modified ROM, it is possible that you may have a conflict at one of these addresses. You should adjust these default addresses to use free space in your ROM.

 


v3.1 (2025 07 19)


1. Remove Checksum (updated v3.1)

You will likely run into problems if you do not either (a) input the updated checksum value, or (b) use an emulator that ignores the Checksum, or (c) remove the Checksum check. Here is how to do the latter.
 

1.1  Jump to Checksum Subroutine

0x0300

Original

4EB9 000F FAC0

Revised

4E71 4E71 4E71

Technically that is all that is needed to stop the game from running the Checksum subroutine, but the next step will clear out the code entirely.
 

1.2  Checksum Subroutine

0x0FFAC0

Original

7000 91C8 223C 0003 FEB0 B0FC 018C 6604 5848 6002 D098 5381 6EF0 0C80 8AB9 F121 6602 4E75 287C 00C0 0004 38BC 8F02 38BC 8004 38BC 8700 38BC 8144 38BC C000 323C 003F 33FC 000E 00C0 0000 51C9 FFF6 60FE


Revised

FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF

2. Instant Replay Reverse View Display Mode

0x9D02

317C 8C00 0004 31FC 0005 B00E

Revised

317C 8C81 0004 31FC 0006 B00E

For some reason the Instant Replay Reverse view has a manual video mode refresh in it. This changes the settings used from 32-Column / Window Map #5 to 40-Column / Window Map #6.

 

3. Instant Replay Screen Initialization (updated v3.1)

0x9FEA

4EB9 0001 2B40



Replace with Jump to Patch (28-Team / 32-Team)

4EB9 000F FE6C / 4EB9 001F F36C



Patch @ 0x0FFE6C / 0x1FF36C

4EB9 0001 2B40 303C 06E8 3238 B004 343C 07FF 4EB9 0001 1544 33FC 9210 00C0 0004 4E75


tldr; When initializing Instant Replay mode this patch clears video Layer A, and then it reduces the size of the Window layer to 12 rows to avoid video garbage from showing up on the screen.



When Instant Replay mode was increased to 320 pixels wide, the Window layer was not masking all of the Layer "A" content on the screen (score clock, etc.), and needed to be extended in size. However, once the Window layer was extended in size to mask the full screen, new persistent video garbage appeared on the lower part of the screen. It took me months to figure out that the game keeps track of the horizontal scrolling position in the VRAM area used by the increased VRAM footprint for the 320 pixel wide Window plane. Those two garbage tiles were actually code that constantly changes on horizontally scrolling. Unfortunately, when the Instant Replay is running there isn’t enough VRAM available to do anything about this. There are no contiguous blocks of VRAM available to relocate the Window layer, and because the horizontal scrolling needs to be registered to an increment of $400 bytes, nor is there a valid address available that could store the horizontal scrolling value. In the end, the solution was to rethink what this code was meant to do, and remake the intended effect with a method that uses less VRAM. Instead of relying on the VRAM mapped to the Window layer to mask Layer "A", I cleared the VRAM mapped to Layer “A” instead. Then, the Window Layer was reduced in size to just the first 16 rows that were originally allocated in VRAM, cropping out the section that overlaps with the Horizontal scrolling code. By doing this, I was able to circumvent the VRAM limitations, and get the same effect as what would have taken an extra 1024 bytes of VRAM. This was the single most difficult thing I have done on this project, all for two garbage tiles, but those two garbage pixels were the only known flaw on my wide display mode. It’s the Pareto principle for perfectionists: the final 1% takes 99% of the effort.

 

4. Camera / Viewport Horizontal Pan Maximums Decreased


4.1  Pan Maximum RIGHT Side - 1/2 (Instant Replay)

0x0A641

003C > 001C (Original Camera Movement Range)
003C > 0010 (Less Camera Movement)
003C > 0000 (No Camera Movement)


4.2  Pan Maximum RIGHT Side - 2/2 (Instant Replay)

0xA649

003C > 001C (Original Camera Movement Range)
003C > 0010 (Less Camera Movement)
003C > 0000 (No Camera Movement)

4.3  Pan Maximum LEFT Side - 1/2 (Instant Replay)

0xA64D

FFC4 > FFE4 (Original Camera Movement Range)
FFC4 > FFF0 (Less Camera Movement)
FFC4 > 0000 (No Camera Movement)


4.4 Horizontal Pan Maximum - LEFT Side - 2/2 (Instant Replay)

0xA655

FFC4 > FFE4 (Original Camera Movement Range)
FFC4 > FFF0 (Less Camera Movement)
FFC4 > 0000 (No Camera Movement)


4.5 Camera Horizontal Pan Maximum - LEFT Side - Mid-Ice (In-Play)

0xB0AB

FFC4 > FFE4 (Original Camera Movement Range)
FFC4 > FFF0 (Less Camera Movement)
FFC4 > 0000 (No Camera Movement)


4.6 Horizontal Pan Maximum - LEFT Side - Against Boards (In-Play)

0xB0B3

FFC4 > FFE4 (Original Camera Movement Range)
FFC4 > FFF0 (Less Camera Movement)
FFC4 > 0000 (No Camera Movement)


4.7  Pan Maximum RIGHT Side - Mid-Ice (In-Play)

0xB0C9

003C > 001C (Original Camera Movement Range)
003C > 0010 (Less Camera Movement)
003C > 0000 (No Camera Movement)


4.8 Pan Maximum RIGHT Side - Against Boards (In-Play)

0x0B0D1

003C > 001C (Original Camera Movement Range)
003C > 0010 (Less Camera Movement)
003C > 0000 (No Camera Movement)

 

5. Line Change Overlays Relocation

0x0B9E5

16 > 1F

 

6. Face-Off Overlays Relocation

Thanks to @McMarkis

6.1 Face-Off Overlays Left Side X-Position

0xFB5F

36 > 3E

6.2 Right Side Face-Off Overlays X-Position

0xFB6B

BE > F6

 

7. Clear Screen Box for Penalty Shot & Shoot-Out Relocation & Resizing

0x01203C

FF03 0200 701B

Revised / Custom

FF05 0200 701D / FF04 0200 701E

 

8. Patch Vertical Mode to 40-Columns / 320 pixels wide (updated v3.1)

0x012B44

08B8 0007 C2EC

Replace with Jump to Patch (28-Team / 32-Team)

4EB9 000F FE50 / 4EB9 001F F350

Patch @ 0x0FFE50 / 0x1FF350

08B8 0007 C2EC 08B8 0001 BF78 33FC 8C81 00C0 0004 31FC 0006 B00E 4E75

After the view mode flag is set to Vertical, this patch sets the display mode flag to 40 columns, the video mode to 320 pixels wide, and the Window to Map #6.

 

9. Clear Screen Box for Games set to 40-Columns / 320 pixels wide

0x012B7F

20 > 28

This properly clears overlays.

 

10. Patch Horizontal Mode (Sideboards View) to 32-Columns / 256 pixels wide (updated v3.1)

0x012B98

08F8 0007 C2EC


Replace with Jump to Patch (28-Team / 32-Team)

4EB9 000F FE20 / 4EB9 001F F320


Patch @ 0xFFE20 / 0x1FF320

08F8 0007 C2EC 08F8 0001 BF78 33FC 8C00 00C0 0004 31FC 0005 B00E 4E75

After the view mode flag is set to Horizontal, this patch sets the display mode flag to 32 columns, the video mode to 256 pixels wide, and the Window to Map #5.

 

11. Score Clock Relocation

11.1 Score Clock position

0x012C7B

17 > 1F

11.2 Home Team Name
0x012C8D

18 > 20

11.3 Visitor Team Name
0x012C9F

18 > 20

11.4 Score position
0x012D1F

1C > 24

 

12. Rink Background X-position Revised

0x015F3F

C0 > E0

 

13. Sideboards Crowd Animation X-position Revised

0x0161F7

C0 > E0

 

14. Crowd Animation Events X-position Revised

14.1

0x016281

C0 > E0

14.2

0x016287

90 > D0

 

15. Arrows Indicating Off-Screen Players

From what I can tell, the system takes the players positions on the ice, and then rescales them to a smaller overlay. 0x16592 indicates $0100, or 256 pixels wide, the original viewport. $0120 changes the overlay to 320 pixels wide for wide mode, so it doesn't draw each arrow 20% too far to the left.

The thresholds for when the arrows appear has been adjusted, and the middle arrow have been re-positioned offscreen.

15.1 Horizontal Arrow RIGHT Side THRESHOLD @
0x016540

Original

0074

Revised


0084


15.2 Horizontal Arrow LEFT Side THRESHOLD @

0x01654C 

Original

FF8C 

Revised

FF7C


 

15.3 Arrow Map Width @
0x016592


Original (256)

0100

Revised (320)

0120


15.4 Diagonal Arrow RIGHT side Offsets @
0x0165C4 / 0x0165CC / 0x0165D4

Original (116)

0074 / 0074 / 0074

Revised

007C / 017C / 0054

Custom

007C / 017C / 005C

Top Right / Middle Right / Bottom Right


15.5 Arrow Offsets LEFT side @
0x0165E4 / 0x0165EC / 0x0165F4

Original (-116)

FF8C / FF8C / FF8C

Revised (-124)

FFAC / FE84 / FF84

Bottom Left / Middle Left / Top Left

 

16. Rink Player Sprite Draw Distance

16.1 Rink Player Visibility Right Side

0x016941

90 > B0

16.2 Rink Player Sprite Draw Distance West

0x016949

70 > 50

 

17. Offset the Position of Players in the Rink and Sideboards to Match (updated v3.1)

Gameplay Display X-Position

0x01694E

0640 0100 D242


Replace with Jump to Patch (28-Team / 32-Team)

4EB9 000F FE3C / 4EB9 001F F33C


Patch @ 0xFFE3C / 0x1FF33C

0640 0120 0838 0007 C2EC 6704 0640 FFDF D242 4E75

Changes default gameplay X-Offset from 256 to 288, to centre gameplay in wider viewport. If in horizontal mode, it changes the offset back to 256. 

 

18. Stars of the Game Overlay Relocated


18.1 Box for Stars of the Game

0x018541

02 > 06


18.2 Text: Stars of the Game

0x018553

09 > 0D


18.3 Graphic: Stars of the Game Sponsor Icon (unused by default)

0x018567

03 > 07


18.4 Text: Player Team

0x01859D

1A > 1E


18.5 Text: Player Number & Name

0x0185B9

03 > 07

 

19.  Injury Overlays Relocation

19.1 Injury Text Box @

0x018727

0B > 13

19.2 Text: “Injury to:” (PERIOD) @
0x018743

0C > 14

19.3 Text: “Out for period” @
0x018750

0C > 14

19.4 Text: Injured Player Name (PERIOD) @
0x018761

0C > 14

19.5 Text: “Injury to:” (GAME) @
0x01876F

0C > 14

19.6 Text: “Out for game” @
0x01877C

0C > 14

19.7 Injured Player Name (GAME) @
0x01878B

0C > 14

 

20. Penalty Shot Overlay Relocation


20.1 Penalty Shot Overlay Box

0x0187E2

BF03 0200 701B

Revised

BF06 0200 701C


20.2 Heading Text: “PENALTY SHOT!”

0x018887

04 > 08


20.3 Infraction Name

0x01882D

04 > 08


20.4 Infracting Player Number & Name

0x018858

04 > 08


20.5 Shooter Number & Name

0x018897

04 > 08

 

21. Goal Overlays (Goal, PP Goal, Hat Trick) Relocation


21.1 “Goal!” Box

0x0188D1

0B > 13


21.2 Goal Scorer

0x01897D

0C > 14


21.3 Text Heading “Assist by:”

0x0189C1

0E > 16


21.4 Assist #1

0x0189CE

0C > 14


21.5 Assist #2

0x0189F3

0C > 14


21.6 Text Heading “GOALl!”

0x018A17

0F > 17


21.7 TBD: May Be Unnecessary / Unwanted

0x018A1F

0C > 14


21.8 Text Heading “HAT TRICK!” (1/2)

0x018A25

0C > 14


21.9 TBD: May Be Unnecessary / Unwanted

0x018A32

0C > 14


21.10 Text Heading “PP GOALl!”

0x018A37

0D > 15


21.11 TBD: May Be Unnecessary / Unwanted

0x018A42

0C > 14


21.12 Text Heading “HAT TRICK!” (2/2)

0x018A47

0C > 14


21.13 TBD: May Be Unnecessary / Unwanted

0x018A54

0C > 14


21.14 Overtime Goal Clear Box

0x018A5C

FF0B 0200 7013 > FF13 0200 701B

 

22. Shoot-Out Overlays Relocation


22.1 Shoot-Out Overlay Box

0x0FC337

03 > 06


22.2 Second Player Name Position

0x0FC38F

04 > 07


22.3 First Team (Home) Name & Score

0x0FC3CF

04 > 07


22.4 First Team (Home) Score Position

0x0FC3E9

15 > 18


22.5 Second Team (Visitor) Name & Score Position

0x0FC409

04 > 07


22.6 Second Team (Visitor) Score Position

0x0FC423

15 > 18


22.7 Round Number Position

0x0FC443

04 > 07


22.8 Heading Text: “SHOOTOUT MODE”

0x0FC469

04 > 07


22.9 First Player Name Position

0x0FC479

04 > 07


22.10 End of Shoot-Out Box Position

0x0FC5BB

01 > 05


22.11 End of Shoot-Out Text “SHOOTOUT WON BY”

0x0FC5D5

02 > 06


22.12 End of Shoot-Out Text: Winning Team Name Position (X-Axis)

0x0FC611

02 > 06

 

23. Bench & Crowd Animation Relocation

23.1

0x0FD81D

C0 > E0

23.2

0x0FD823

90 > D0

 

24. Optional PowerPlay Clock Bug Fix (new v3.1)



This patch is not strictly related to wide display mode, but it patches a potential game crashing bug that can happen when playing with penalties on. I am including it here, because for whatever reason this crash seems to happen more often with Wide Display mode. This patch will prevent the PowerPlay clock from crashing the game, something that can happen on any ’94 ROM.

Original @0x012A2E

4240 4243 41EA 009A

Replace with Jump to Patch (28-Team / 32-Team)

4240 4EB9 001F FE8E / 4240 4EB9 001F F38E

Patch @ 0x0FFE8E / 0x1FF38E

4243 347C C6CE 47EA 0364 0838 0006 C2EE 6602 C54B 41EA 009A 4E75

What does this do? Right before Register A2 is used by the PP clock, this patch manually resets A2 to the Home Team pointer, and A3 to Away. It then checks the PP flag set by updatePowerPlay to see who is on the PP. If the Away team is on the PP, it swaps A2 & A3 before proceeding with the rest of PP Clock code.

 


And that's it. Your ROM should now have a seamless 320 pixel wide gameplay experience.

 

Edited by AdamCatalyst
Updated for v3.1
  • Wow 1
Posted

First? That's what the leet innerwebs kids say right?

Just have to say that at risk of sounding like a plant and a cheerleader, this patch amazing and worked perfectly.
Except for the fact that it didn't compensate for the four letter names I used in my WWF mod.
0/10.

But since you were nice enough to include all of the offsets for manual editing, I didn't need to track those down in my notes and was able to quickly edit the hex value to move the score numbers over by one tile, thus redeeming yourself.
A/7

I also liked that you included an add-on for less lateral camera movement. Haven't tried "minimal", but "less" seemed just right compared to the default of "lots".
Þ/π

  • Love 1
  • AdamCatalyst changed the title to How to: Wide Display Mode in '94 (Patches + Manual Methods)
Posted

v3.1 released

FYI, to anyone using this patch, I am thrilled to say there are now no known issues. The latest distribution above also includes uninstaller patches, to make it easier to upgrade your code.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...