AdamCatalyst Posted January 3 Report Posted January 3 (edited) How to: Wide Display Mode in '94 (Patches) v3.1 (2025 07 26) 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 July 27 by AdamCatalyst Updated for v3.1 Quote
AdamCatalyst Posted January 3 Author Report Posted January 3 (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 July 19 by AdamCatalyst Updated for v3.1 1 Quote
von Ozbourne Posted January 5 Report Posted January 5 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". Þ/π 1 Quote
AdamCatalyst Posted March 16 Author Report Posted March 16 FYI, to anyone using this patch, there is a new version with more fixes. Quote
AdamCatalyst Posted July 27 Author Report Posted July 27 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. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.