NTSC games on PAL N64 rolling video / shifted colours fix

for more info: Video Interface@64brew
special greetings to Roadhouse of High Society

Now... no need for paladin (& sound issues see threadmark, please download latest version) or a RGB mod... do this:
Hex edit the rom, search for 00000C150C150C15 & replace all instances with 00170C690C6F0C6D
Usually this is enough, but on some tvs you also need to do this:
search for 03E5223900 replace with 04541E3A00
key word "some TVs". as such, my personal pattern, "opt" does not automatically patch this; nor the pal2ntsc reverse ones,
Remember to fix CRC or the game will not boot. (I use rn64crc2)
If the game's compressed (ex. no pattern found) or you aren't using a copier / flashcard, you can easily create a GameShark code.
Dump the ram & search for the aforementioned values. As an example, here's the code that I made for Densha De Go. It is pretty long, since patching only a few video tables just crashed the output (tv: no video but could hear the audio)

Note: Why continuous write? Well, If I remember correctly the injector does not support F1 (write once at boot) cheat codes.
Everdrive does... but everdrive also needs "enable codes". Here's a simplified version of the code, for use with an everdrive.
F105BD20 2400 ---> enable code, thanks Shogun of gamehacking.org
F1074306 0C4D --| only video table used
F1074308 0C4D --| htotal patch taken from n64opt.json
F107430A 0C4D --| and uses F1 write once instead of 81 continuous

Anyway... the long code is below.

#VIBURST
8107425C 0454
8107425E 1E3A
810742AC 0454
810742AE 1E3A
810742FC 0454
810742FE 1E3A
8107434C 0454
8107434E 1E3A
8107439C 0454
8107439E 1E3A
810743EC 0454
810743EE 1E3A
8107443C 0454
8107443E 1E3A
8107448C 0454
8107448E 1E3A
810744DC 0454
810744DE 1E3A
8107452C 0454
8107452E 1E3A
8107457C 0454
8107457E 1E3A
810745CC 0454
810745CE 1E3A
8107461C 0454
8107461E 1E3A
8107466C 0454
8107466E 1E3A
810753DC 0454
810753DE 1E3A
8107580C 0454
8107580E 1E3A
#VIBURST_END

#HSYNC
81074264 0017
81074266 0C69
81074268 0C6F
8107426A 0C6D
810742B4 0017
810742B6 0C69
810742B8 0C6F
810742BA 0C6D
81074304 0017
81074306 0C69
81074308 0C6F
8107430A 0C6D
81074354 0017
81074356 0C69
81074358 0C6F
8107435A 0C6D
810743A4 0017
810743A6 0C69
810743A8 0C6F
810743AA 0C6D
810743F4 0017
810743F6 0C69
810743F8 0C6F
810743FA 0C6D
81074444 0017
81074446 0C69
81074448 0C6F
8107444A 0C6D
81074494 0017
81074496 0C69
81074498 0C6F
8107449A 0C6D
810744E4 0017
810744E6 0C69
810744E8 0C6F
810744EA 0C6D
81074534 0017
81074536 0C69
81074538 0C6F
8107453A 0C6D
81074584 0017
81074586 0C69
81074588 0C6F
8107458A 0C6D
810745D4 0017
810745D6 0C69
810745D8 0C6F
810745DA 0C6D
81074624 0017
81074626 0C69
81074628 0C6F
8107462A 0C6D
81074674 0017
81074676 0C69
81074678 0C6F
8107467A 0C6D
810753E4 0017
810753E6 0C69
810753E8 0C6F
810753EA 0C6D
81075814 0017
81075816 0C69
81075818 0C6F
8107581A 0C6D
#HSYNC_END

I attached a json file in order to automate the process with Garey27's Binary-AutoPatcher (you can find it on GitHub) - Big Endian (z64) input file

edit: added pal game to ntsc patterns zip for ntsc console users that have the opposite problem.
hint: if you're trying to make a pal2ntsc code/manual hex edit... search also for 00150C690C6F0C6E to patch, not only 0017...0C6D!
edit: added optimized ntsc2pal pattern zip
edit: added opt&n64 files in single zip, like the one for NTSC consoles. now includes audio fix by @LaminGaming - see threadmark for RAM patching.
 

Attachments

Last edited by Fabax01,
  • Love
Reactions: hippy dave
Man thank you so much! With that i finally could fix the problem that my upscaler didn't want to take the Output signal of the original NTSC roms on my RGB modded PAL N64. While weirdly on my other old flatscreen with Scart input it perfectly works even without the patch. It seems like that the TV does something different than the upscaler.

I made a powershell script that automated the process of patching all the rooms in the folder, put them in an extra folder and also rename them without the ".patched" afterwards. Then I let the checksum checker run over them et voila, all of them worked, no matter if US or JP.

For anyone who wants to use it: Put the files of the patcher, the n64 json script and also the powershellscript in the same folder as your roms. Then start the powershell-script. After it's done, all the patched roms should be in the "patched" folder.

Thank you again!
 

Attachments

Last edited by Tommy_Tc,
  • Like
Reactions: Fabax01
This has worked great for most games. However, it doesn't seem to work with Goldeneye, with rn64crc just saying the CRC is OK rather than UPDATED. I do mainly use the PAL Goldeneye but i'm trying to play Goldfinger 64 and still getting the ghosting, if anyone has a way to fix this for Goldeneye specifically I'd really appreciate it.

Is there also a way to apply this fix to N64DD games?

And a fun quirk I've noticed is that the Neversoft games (Spider-Man and THPS) do work with this fix, but the ghosting remains in the menus, it goes away in game so it's not a dealbreaker.
 
This has worked great for most games. However, it doesn't seem to work with Goldeneye, with rn64crc just saying the CRC is OK rather than UPDATED. I do mainly use the PAL Goldeneye but i'm trying to play Goldfinger 64 and still getting the ghosting, if anyone has a way to fix this for Goldeneye specifically I'd really appreciate it.

Is there also a way to apply this fix to N64DD games?

And a fun quirk I've noticed is that the Neversoft games (Spider-Man and THPS) do work with this fix, but the ghosting remains in the menus, it goes away in game so it's not a dealbreaker.
What's the issue with N64DD? Black screen?
I think N64DD conversion do not use a common CIC, at least not one that rn64crc2 knows about (it's old software, after all...)
I no longer have it, but "n64.py" should be able to correctly recalculate checksum. Game should boot then.
---
About "Goldeneye" - OK = probably means that the patcher changed nothing (as in, pattern not found).
99% sure goldeneye is compressed. Can't seem to find the video tables by manually looking with an hex editor.
Please make a cheat code by looking where the video tables are located in RAM... like I did for Densha De Go
(check thread, use good old "nemu" or newer debug-enabled pj64 as your emulator of choice.)
Either then add the code to your ED64 or if you have another flashcard you can integrate the code inside the ROM using n64_gameshark_code_injector.
---
Re: Neversoft - interesting.... maybe "menu mode" video tables are loaded from compressed area?
As in, patcher can't find them -> patches only tables used by "game mode".
If this is the issue, cheat code method should also fix these Neversoft games...
 
With N64DD the games run fine but still have the ghosting, it just seems as though the patcher doesn't work with them.

With Goldeneye, I'm quite new to this stuff so i'll give it a go, though I'm currently on Summercart 64 and apparently that doesn't take Gamesharm codes yet. I also tried other methods such as changing the region of the rom with Info64 but no luck
 
With N64DD the games run fine but still have the ghosting, it just seems as though the patcher doesn't work with them.

With Goldeneye, I'm quite new to this stuff so i'll give it a go, though I'm currently on Summercart 64 and apparently that doesn't take Gamesharm codes yet. I also tried other methods such as changing the region of the rom with Info64 but no luck
Hmm... Try the code injector then. A friend with a ED64+ (which is a clone, stuck on ver 1.x, a version that doesn't support enabling game shark codes from the everdrive interface) had success enabling my Densha de go 64 code with it...
"Mini"-tutorial to make the n64 cheat:
Load rom (I used NEMU. PJ64 is way, way faster if you know what you're doing, but let's use NEMU for the sake of a "simple" explanation.)
Plugins -> Search memory.
Search value -> 00000C15, hex 32 BITS ALIGNED
Click on the results to verify (did we find 00000C150C150C15? Let's proceed.)
Focus on the last 6 numbers of the address, ignore the initial double zeros
append "81" to the address ex.
000269d4 -> 810269d4
& add what we'll write to the location AKA 00170C690C6F0C6D (pal values of: 5bit leap pattern, total duration minus one of a line in 1/4 pixels, leap a & b - the alternative duration of 1st or 2nd vsync line in 1/4 pixels)
There's no way to do 32 bit write, only 16 bit so we'll split the numbers in groups of 4.
(0017) (0C69) (0C6F) (0C6D)
Example (partial):
810269D4 0017
Now we add +2 to find next address to write to:
810269D6 0C69
& then...
810269D8 0C6F
finally...
810269DA 0C6D
hint: why A? in hex 9+1 = A, A+1 = B, B+1 = C, and so on until "F". F+1 = 10.
---
Example (full):
#GOLDENEYE PALFIX
810269D4 0017
810269D6 0C69
810269D8 0C6F
810269DA 0C6D
---
Repeat for all the other addresses found during SEARCH, add to code (check main post, see densha de go for example of long, full cheat)
////////////////
OPTIONAL:
You may also want to adjust VI_BURST (or/and "Timing", see NEMU register page) if there are still issues.
Search value -> 03E52239, hex 32 BITS ALIGNED
Same method as before...
ex. Address is 000269CC -> 810269CC
hint: verify that number of correct results match - as in, if you found 5 00000C150C150C15 there will be 5 03E52239, as it's a part of a video table. If, as an example, search returns 6 results, it means that one is extra data and not part of a video table... so double check location of data, you'll see that the correct ones are "near" each 00000C150C150C15 result.
We need to write 04541E3A
So... again, let's split in groups of 4, (0454) (1E3A)
Example (partial):
810269CC 0454
We do +2
810259CE 1E3A
--
Example (full):
#GOLDENEYE VIBURST
810269CC 0454
810259CE 1E3A
---
Repeat for all the other addresses found during SEARCH, add to code (check main post, see densha de go for example of long, full cheat)
Re: 64DD
Sorry - can't help you there.
Never cared much for 64DD, but a few years ago the common method was to use converted roms (z64 extension)
Seems like the "Summercart" expects 64DD disc drive images... Even if you could patch these images (by the way, I'm not sure why you couldn't... a simple search with an hex editor in one of them reveals clear video tables...)
I think the game wouldn't boot if you don't fix the checksum... which rn64crc2 cannot do, as I said before.
Not for the disk images, nor for the zoinkity conversions.
If they one day implement GS codes in the summercart (I don't think n64 code injector works with dd conversions), you could craft a cheat code, exactly in the same way as one for a compressed, cart game (using PJ64, I think it supports DD games nowadays)
 
Last edited by Fabax01,
Thanks so much for the detailed reply, I'll give this a go at the weekend when I have time. I'm assuming it's one of those things that looks less complicated when you actually do it and even then it doesn't look so bad
 
So my attempt almost worked. I put Goldfinger 64 into NEMU and made the code, and it didn't work, giving me errors on NEMU and PJ64 and blackscreening on my SC64. Out of curiousity I applied the code to a stock US Goldeneye rom and it actually worked, at least on NEMU and PJ64. So i'm unsure if it's just the romhacks being weird (I tried Goldfinger and Tomorrow Never Dies) or an error on my part with me being new to this, but props to your tutorial for actually getting me some success as someone who's never done this before, if I come across any more compressed roms this will work a treat.
For reference, this is my code:

#VIBURST
810269CC 0454
810269CE 1E3A
81026A1C 0454
81026A1E 1E3A
81026A6C 0454
81026A6E 1E3A
81026ABC 0454
81026ABE 1E3A
81026B0C 0454
81026B0E 1E3A
81026B5C 0454
81026B5E 1E3A
81026BAC 0454
81026BAE 1E3A
81026BFC 0454
81026BFE 1E3A
81026C4C 0454
81026C4E 1E3A
81026C9C 0454
81026C9E 1E3A
81026CEC 0454
81026CEE 1E3A
81026D3C 0454
81026D3E 1E3A
81026D8C 0454
81026D8E 1E3A
81026DDC 0454
81026DDE 1E3A
#VIBURST_END

#HSYNC
810269D4 0017
810269D6 0C69
810269D8 0C6F
810269DA 0C6D
81026A24 0017
81026A26 0C69
81026A28 0C6F
81026A2A 0C6D
81026A74 0017
81026A76 0C69
81026A78 0C6F
81026A7A 0C6D
81026AC4 0017
81026AC6 0C69
81026AC8 0C6F
81026ACA 0C6D
81026B14 0017
81026B16 0C69
81026B18 0C6F
81026B1A 0C6D
81026B64 0017
81026B66 0C69
81026B68 0C6F
81026B6A 0C6D
81026BB4 0017
81026BB6 0C69
81026BB8 0C6F
81026BBA 0C6D
81026C04 0017
81026C06 0C69
81026C08 0C6F
81026C0A 0C6D
81026C54 0017
81026C56 0C69
81026C58 0C6F
81026C5A 0C6D
81026CA4 0017
81026CA6 0C69
81026CA8 0C6F
81026CAA 0C6D
81026CF4 0017
81026CF6 0C69
81026CF8 0C6F
81026CFA 0C6D
81026D44 0017
81026D46 0C69
81026D48 0C6F
81026D4A 0C6D
81026D94 0017
81026D96 0C69
81026D98 0C6F
81026D9A 0C6D
81026DE4 0017
81026DE6 0C69
81026DE8 0C6F
81026DEA 0C6D
#HSYNC_END
 
Last edited by thunder_gun1,
  • Like
Reactions: Fabax01
Hello @thunder_gun1 and sorry for the late response.
Nice to see that you've successfully made a code :grog:! I've tested it on real hardware (injected retail usa goldeneye) and it works.
Don't worry - it is not the fault of your code, but of the code injector. Doesn't work with these hackroms...
You can easily verify this by simply pressing "patch" without inserting any cheats.
Retail goldeneye will boot, "Goldfinger" will not. Try contacting the author, maybe they can sort out a solution.
 
Hello @thunder_gun1 and sorry for the late response.
Nice to see that you've successfully made a code :grog:! I've tested it on real hardware (injected retail usa goldeneye) and it works.
Don't worry - it is not the fault of your code, but of the code injector. Doesn't work with these hackroms...
You can easily verify this by simply pressing "patch" without inserting any cheats.
Retail goldeneye will boot, "Goldfinger" will not. Try contacting the author, maybe they can sort out a solution.

Glad to hear the code works on your end too, and thanks again for putting such a good guide together. While it doesn't get the game working it's quite comforting knowing it isn't my fault haha. I'll try contacting them too
 
Glad to hear the code works on your end too, and thanks again for putting such a good guide together. While it doesn't get the game working it's quite comforting knowing it isn't my fault haha. I'll try contacting them too
Bad news :mellow:
I did a closer inspection (this time) using headphones.
Rare must've optimized the hell out of Goldeneye between PAL & NTSC ver.

Minimal patch that you can do in games to fix rolling video is to change only 0000--->0C15<---0C150C15
PAL = 0C69
PAL_M = 0C12
Not that I suggest patching only H_TOTAL without touching leap and all (you'll have screen glitches, such as shaking...) but the image will, at least, not roll. Useful to know if you need to do a quick - does the tv sync? - test.

Well, if you edit this in any way in Goldeneye the audio will become kinda fucky...
So your code works..! but you get bad audio instead. Sorry, never happened in other games...
At least it's not like "paladin", which forces 50Hz, inherently causing audio issues in ALL games.
---
BTW, I have tested "Spider-Man", my hunch was correct.
You'll find a lonely 00000C150C150C15 in RAM :P even when it's patched with the tool.
And the menu uses NTSC video table (you can check from the register page in Nemu) and switches to PAL when in game.
"OK, I'll make a code!" there's a catch - spider man still doesn't work with the injector, so guess you're out of luck...
 
Last edited by Fabax01,
That's actually crazy, trust me to find a bunch of games that end up being really weird to fix haha. Tbf with Spider-Man and THPS3 I can live with the graphics being weird in the menus so it isn't a big issue. The one curiousity I have now is that sketchy ebay sellers have repro carts of Goldfinger and Tomorrow Never Dies and advertise them as PAL. I wonder if they have the ghosting too or if they've done something else to them. I don't think it's worth spending £40 on a cart to find out though
Post automatically merged:

So it seems to be a Rare thing. I tried running the patcher on Banzo-Kazooie (I was wanting to play Nostalgia 64) and the same thing happened. I haven't deep-dived or tried to make a code with it since it'd probably lead to the same result as Goldeneye, but it seems Rare really like to compress their games :rofl2:
 
Last edited by thunder_gun1,
Hello,

here's a bit of "experimentation"...
Any expert feel free to chime in if I got something wrong.

"lines per field" = VI_V_SYNC_REG (value /2)
"dots per line" = VI_H_SYNC_REG (value +1)/4
"pixel clock" = videoclock /4

PAL video clock: 49656530Hz
PAL color subcarrier: 4433618.75Hz
PAL chroma period formula: 4433618.75/x=(49656530/4)/1/(3178/4) = 283.75

  • default video modes:
625i@50.00Hz reported by ossc users.
(49656530/4)=x*312.5*(3178/4) --> x = 50.000281938326Hz

313p@49.92Hz reported by ossc users.
(49656530/4)=x*313*(3178/4) --> x = 49.920409283472Hz

here's what happens when you try to play a NTSC game on a PAL console without patching!
(49656530/4)=x*263*(3094/4) --> x = 61.02Hz

  • ntsc2pal optimized

refresh rate:
(49656530/4)=x*263*(3150/4) --> x = 59.93Hz
(49656530/4)=x*262.5*(3150/4) --> x = 60.05Hz


chroma:
4433618.75/x=(49656530/4)/263/(3150/4) --> result is 73968.75
4433618.75/x=(49656530/4)/525/(3150/4) --> result is 147656.25



  • swap (old method)
refresh rate:
(49656530/4)=x*263*(3178/4) --> x = 59.41Hz
(49656530/4)=x*262.5*(3178/4) --> x = 59.52Hz


chroma:
4433618.75/x=(49656530/4)/263/(3178/4) --> result is 74626.25
4433618.75/x=(49656530/4)/525/(3178/4) --> result is 148968.75


  • near ntsc:
If you are using composite... expect a lot of artifacts with this preset.
may be useful for RGB SCART users that want freq near ntsc console (as they are unaffected by chroma signal.)

(49656530/4)=59.82*263*(y/4) --> y = 3156.27
progressive mode: 3156 nets 59.82Hz (or 3155, which results in 59.84Hz)
interlaced mode: 3156 nets 59.93Hz (or 3155, which results in 59.95Hz)
----


NTSC video clock: 48681812Hz
NTSC color subcarrier: 3579545Hz
NTSC chroma period formula: 3579545/x=(48681812/4)/1/(3094/4) = 227.5

  • default video modes:
263p@59.82Hz reported by ossc users.
(48681812/4)=x*263*(3094/4) --> x = 59.826097856516Hz

525i@59.94Hz reported by ossc users.
(48681812/4)=x*262.5*(3094/4) --> x = 59.940052328624Hz

here's what happens when you try to play a PAL game on NTSC console without patching!
(48681812/4)=x*313*(3178/4) --> x = 48.94Hz

  • swap. cannot test, only have PAL n64 at hand
refresh rate:
(48681812/4)=x*313*(3094/4) --> x = 50.26Hz
(48681812/4)=x*312.5*(3094/4) --> x = 50.34Hz


chroma:
3579545/x=(48681812/4)/313/(3094/4) --> result is 71207.5
3579545/x=(48681812/4)/625/(3094/4) --> result is 142187.5


  • pal2ntsc alternative. cannot test, only have PAL n64 at hand
refresh rate:
(48681812/4)=x*313*(3162/4) --> x = 49.18Hz
(48681812/4)=x*312.5*(3162/4) --> x = 49.26Hz


chroma:
3579545/x=(48681812/4)/313/(3162/4) --> result is 72772.5
3579545/x=(48681812/4)/625/(3162/4) --> result is 145312.5

  • near pal. cannot test, only have PAL n64 at hand
If you are using composite... expect a lot of artifacts with this preset.
may be useful for RGB SCART users that want freq near pal console (as they are unaffected by chroma signal.)

(48681812/4)=49.92*313*(y/4) --> y = 3115.6
progressive mode: 3116 nets 49.91Hz (or 3115, which results in 49.93Hz)
interlaced mode: 3116 nets 49.99Hz (or 3115, which results in 50.01Hz)
 
Last edited by Fabax01,
rareware audio fix by lamingaming New
After some thorough testing, I think I figured out how to fix the audio for Rare games. By comparing the RDRAM of Diddy Kong Racing in both NTSC and PAL modes, I discovered some bytes that were different between them. Looking at these bytes in a programmer calculator shows the video clock rates: 02E6D354 is 48681812Hz (NTSC) and 02F5B2D2 is 49656530Hz (PAL). The audio seems to be using the video clock to control its speed, hence why there's either distortion or it isn't being slowed down to sync up with the video, e.g. the DK rap in DK64.

Simply swapping these video clocks around fixes the audio with every NTSC Rare game I've tried, except for Banjo-Kazooie v1.1 and Banjo-Tooie. For those games, they have two sets of these bytes for some reason. Changing the first one crashes the game, and the other is the one that's supposed to work (this is the case for Banjo-Kazooie v1.0). But no matter what I tried I couldn't get them to work.

As an example, here's some code I created for Banjo-Kazooie v1.0:
81277128 02F5
8127712A B2D2

Also, I wanted to talk about my findings with video tables as well. For the most part, every game only ever requires one of these tables to be changed in order to work, so that helps to mitigate having to create a big list of codes lol.

I can even simplify my code down further if I use a repeater code, using Banjo v1.0 as another example:
50000302 0000
80275C97 0053

However, there are some that require multiple tables, around two or three depending on the game. An easy way to check this is to look at the VI registers in an emulator at 0xA4400000. The video table seems to change primarily when the resolution changes, i.e. 240p to 480i and vice versa, but not always.

Edit: After doing a memory search with 02E6 and D354 separately, I found other instances of those values. Changing these values fixed the audio for Banjo-Kazooie v1.1 and Banjo-Tooie.

Edit 2: I realised that the audio is only fixed for 59.83Hz. For the other refresh rates, use these instead:

02FAFE22 for 59.41Hz
02F44533 for 59.94Hz

Also, instead of using 02F5B2D2 for 59.83Hz, you can also use 02F5B5F8. As the refresh is actually 59.825Hz rather than 59.826Hz. Although, using 02F5B2D2 is the most accurate to a real NTSC N64.

This is probably also the case for PAL on NTSC:

02F1E241 for 49.19Hz
02E6EA9F for 49.91Hz
02E1ABD7 for 50.27Hz

Maths:

3094/3178*49656530 = 48344022.6
3116/3178*49656530 = 48687774.5
3162/3178*49656530 = 49406528.6
3150/3094*48681812 = 49562930.8
3156/3094*48681812 = 49657336.4
3178/3094*48681812 = 50003490.2

48344023 = 02E1ABD7
48687775 = 02E6EA9F
49406529 = 02F1E241
49562931 = 02F44533
49657336 = 02F5B5F8
50003490 = 02FAFE22

These patches are for NTSC-U Rareware games on the PAL N64. They are needed to fix audio issues that occur when changing the video tables to use 59.83Hz instead of 61.02Hz.

When making patches, locating the values to change is different depending on the patch method. For a RAM patch, replacing 02E6D354 with 02F5B2D2 will work in almost all cases, except for some games that require other values changed - the same way as a ROM patch. As an example, for Diddy Kong Racing, replace 3C0902E6 3529D354 with 3C0902F5 3529B2D2. These values can be different depending on the game, so searching for either 02E6????D354 or 02E6????????????????????D354 is the best way to locate them.

For the other refresh rates, use these instead, otherwise, the audio will still be incorrect:

02FAFE22 for 59.41Hz
02F44533 for 59.94Hz

Or instead of using 02F5B2D2 for 59.83Hz, you can also use 02F5B5F8. As the refresh is actually 59.825Hz rather than 59.826Hz. Although, using 02F5B2D2 is the most accurate to a real NTSC N64.


RAM

Banjo-Kazooie
v1.0
81277128 02F5
8127712A B2D2
v1.1
8123F7D2 02F5
8123F7DE B2D2

Banjo-Tooie
810125FE 02F5
8101260A B2D2

Blast Corps
v1.0
81306D8C 02F5
81306D8E B2D2
v1.1
81306E3C 02F5
81306E3E B2D2

Conker's Bad Fur Day
8102BDE8 02F5
8102BDEA B2D2

Diddy Kong Racing
v1.0
810E4878 02F5
810E487A B2D2
v1.1
810E4E08 02F5
810E4E0A B2D2

Dinosaur Planet
81096C48 02F5
81096C4A B2D2

Donkey Kong 64
810100A8 02F5
810100AA B2D2

GoldenEye 007
8102804C 02F5
8102804E B2D2

Jet Force Gemini
810A9F18 02F5
810A9F1A B2D2

Killer Instinct Gold
v1.0/v1.1
8100705C 02F5
8100705E B2D2
v1.2
8100704C 02F5
8100704E B2D2

Mickey's Speedway USA
810808F8 02F5
810808FA B2D2

Perfect Dark
v1.0/v1.1
8105CF68 02F5
8105CF6A B2D2


ROM

Conker's Bad Fur Day
00024380: 3C0902F5 3529B2D2

Diddy Kong Racing
v1.0
000D37E0: 3C0902F5 3529B2D2
v1.1
000D3D40: 3C0902F5 3529B2D2

Dinosaur Planet
0007D648: 3C0C02F5 358CB2D2

Donkey Kong 64
00006188: 3C1802F5 3718B2D2

GoldenEye 007
000196BC: 3C0C02F5 358CB2D2

Jet Force Gemini
0009B850: 3C0902F5 3529B2D2

Killer Instinct Gold
v1.0/v1.1/v1.2
00005FD0: 3C0D02F5 35ADB2D2

Mickey's Speedway USA
00073810: 3C0902F5 3529B2D2
These patches are for NTSC-J Rareware games on the PAL N64. They are needed to fix audio issues that occur when changing the video tables to use 59.83Hz instead of 61.02Hz.

When making patches, locating the values to change is different depending on the patch method. For a RAM patch, replacing 02E6D354 with 02F5B2D2 will work in almost all cases, except for some games that require other values changed - the same way as a ROM patch. As an example, for Diddy Kong Racing, replace 3C0902E6 3529D354 with 3C0902F5 3529B2D2. These values can be different depending on the game, so searching for either 02E6????D354 or 02E6????????????????????D354 is the best way to locate them.

For the other refresh rates, use these instead, otherwise, the audio will still be incorrect:

02FAFE22 for 59.41Hz
02F44533 for 59.94Hz

Or instead of using 02F5B2D2 for 59.83Hz, you can also use 02F5B5F8. As the refresh is actually 59.825Hz rather than 59.826Hz. Although, using 02F5B2D2 is the most accurate to a real NTSC N64.


RAM

Banjo to Kazooie no Daibouken
8123F7D2 02F5
8123F7DE B2D2

Banjo to Kazooie no Daibouken 2
8101256E 02F5
8101257A B2D2

Blastdozer
813070CC 02F5
813070CE B2D2

Diddy Kong Racing
810E63D8 02F5
810E63DA B2D2

Donkey Kong 64
81010368 02F5
8101036A B2D2

GoldenEye 007
8102808C 02F5
8102808E B2D2

Mickey no Racing Challenge USA
810809F8 02F5
810809FA B2D2

Perfect Dark
810611F8 02F5
810611FA B2D2

Star Twins
810A9E28 02F5
810A9E2A B2D2


ROM

Diddy Kong Racing
000D5170: 3C0902F5 3529B2D2

Donkey Kong 64
000063F8: 3C1802F5 3718B2D2

GoldenEye 007
000196FC: 3C0C02F5 358CB2D2

Mickey no Racing Challenge USA
00073910: 3C0902F5 3529B2D2

Star Twins
0009B710: 3C0902F5 3529B2D2
These patches are for PAL Rareware games on the NTSC N64. They are needed to fix audio issues that occur when changing the video tables to use 49.91Hz instead of 48.94Hz.

When making patches, locating the values to change is different depending on the patch method. For a RAM patch, replacing 02F5B2D2 with 02E6D354 will work in almost all cases, except for some games that require other values changed - the same way as a ROM patch. As an example, for Diddy Kong Racing, replace 3C0C02F5 358CB2D2 with 3C0C02E6 358CD354. These values can be different depending on the game, so searching for either 02F5????B2D2 or 02F5????????????B2D2 is the best way to locate them.

For the other refresh rates, use these instead, otherwise, the audio will still be incorrect:

02F1E241 for 49.19Hz
02E1ABD7 for 50.27Hz

Or instead of using 02E6D354 for 49.91Hz, you can also use 02E6EA9F. As the refresh is 49.91Hz rather than 49.92Hz. Although, using 02E6D354 is the most accurate to a real PAL N64.


RAM

Banjo-Kazooie
8124076A 02E6
8124076E D354

Banjo-Tooie
81012536 02E6
8101254A D354

Blast Corps
812DC2EA 02E6
812DC2EE D354

Conker's Bad Fur Day
8102C138 02E6
8102C13A D354

Diddy Kong Racing
v1.0
810E4908 02E6
810E490A D354
v1.1
810E4E98 02E6
810E4E9A D354

Donkey Kong 64
81010328 02E6
8101032A D354

GoldenEye 007
8100D776 02E6
8100D77A D354

Jet Force Gemini
810AA198 02E6
810AA19A D354

Killer Instinct Gold
8100706C 02E6
8100706E D354

Mickey's Speedway USA
81080C38 02E6
81080C3A D354

Perfect Dark
810519CA 02E6
810519CE D354


ROM

Conker's Bad Fur Day
0002478C: 3C0C02E6 358CD354

Diddy Kong Racing
v1.0
000D380C: 3C0C02E6 358CD354
v1.1
000D3D6C: 3C0C02E6 358CD354

Donkey Kong 64
0000635C: 3C0C02E6 358CD354

GoldenEye 007
0000E374: 3C1802E6 3718D354

Jet Force Gemini
0009BA5C: 3C0C02E6 358CD354

Killer Instinct Gold
00005FF8: 3C1902E6 3739D354

Mickey's Speedway USA
00073A6C: 3C0C02E6 358CD354

Edit 3: Thought to give an update on the audio fix. It turns out that it isn't just Rare games that have audio issues, but also other games that appeared to be fine initially before further inspection.

After testing with and without the fix, and comparing with their PAL counterparts, I've found that all non-Rare games either have correct tempo with incorrect pitch or incorrect tempo and pitch. Neither creates distortion like the majority of Rare's games, so that's why it was hard to tell initially. Now knowing this, I've created more codes for the rest of my games, and also created a list below if anyone wants to have them.

007 The World Is Not Enough
810D1078 02F5
810D107A B2D2

F-Zero X
810D1CE8 02F5
810D1CEA B2D2

Mario Golf
810C9468 02F5
810C946A B2D2

Mario Kart 64
810EB438 02F5
810EB43A B2D2

Mario Party
810C7728 02F5
810C772A B2D2

Mario Party 2
810CF0A8 02F5
810CF0AA B2D2

Mario Party 3
810A3FA8 02F5
810A3FAA B2D2

Mario Tennis
8105B648 02F5
8105B64A B2D2

Paper Mario
810958F8 02F5
810958FA B2D2

Pilotwings 64
8124C17C 02F5
8124C17E B2D2

Quake
8106F848 02F5
8106F84A B2D2

Quake II
8106BE18 02F5
8106BE1A B2D2

Rayman 2: The Great Escape
F10040CE 02F5
F10040DA B2D2

Star Fox 64
v1.0
810C3998 02F5
810C399A B2D2
v1.1
810C7E18 02F5
810C7E1A B2D2

Star Wars Episode I: Racer
810A7B48 02F5
810A7B4A B2D2

Super Mario 64
81335A2C 02F5
81335A2E B2D2

Super Smash Bros.
8103D3F8 02F5
8103D3FA B2D2

The Legend of Zelda: Majora's Mask
81097E58 02F5
81097E5A B2D2

The Legend of Zelda: Ocarina of Time
v1.0/v1.1
81006358 02F5
8100635A B2D2
v1.2
810068D8 02F5
810068DA B2D2

Turok: Dinosaur Hunter
v1.0
810EF288 02F5
810EF28A B2D2
v1.1/v1.2
810EF3D8 02F5
810EF3DA B2D2

Turok: Rage Wars
v1.0
810D3F00 02F5
810D3F02 B2D2
v1.1
810D9280 02F5
810D9282 B2D2

Turok 2: Seeds of Evil
v1.0
810B8900 02F5
810B8902 B2D2
v1.1
810BABC0 02F5
810BABC2 B2D2

Turok 3: Shadow of Oblivion
8110BC40 02F5
8110BC42 B2D2

Wave Race 64: Kawasaki Jet Ski
v1.0
810E8E3C 02F5
810E8E3E B2D2
v1.1
810E90BC 02F5
810E90BE B2D2

Yoshi's Story
810AAC48 02F5
810AAC4A B2D2

Edit 4: To help automate the process for ROM patches, I've created some json files with patterns for both NTSC and PAL.
 

Attachments

Last edited by LaminGaming,
  • Like
Reactions: Fabax01
Added as a threadmark, thanks^^
Re videotables:
yep, most games use only one! In fact, you NEED to trim down the search to only the ones being used if ex. you have an everdrive, since max codes in use is limited (iirc 20 at a time? And you gotta enable master codes too!)
I did update the main post with a shorter densha de go code after I verified that the other are not used for anything.
Still, I do prefer a "hard patch" vs "ram patch" approach if possible, too lazy to check which ones are in use / are not in use (see RE2 + scaler resolution nightmares...)
Who knows if the N64 games do stuff like the ones on PS, with their well known "sudden switch to 480i for menus / videos at the end of the game" xD
 
  • Like
Reactions: LaminGaming
Added as a threadmark, thanks^^
Re videotables:
yep, most games use only one! In fact, you NEED to trim down the search to only the ones being used if ex. you have an everdrive, since max codes in use is limited (iirc 20 at a time? And you gotta enable master codes too!)
I did update the main post with a shorter densha de go code after I verified that the other are not used for anything.
Still, I do prefer a "hard patch" vs "ram patch" approach if possible, too lazy to check which ones are in use / are not in use (see RE2 + scaler resolution nightmares...)
Who knows if the N64 games do stuff like the ones on PS, with their well known "sudden switch to 480i for menus / videos at the end of the game" xD
Yeah, on my everdrive it's limited to 34 codes per game, which isn't enough, so using a repeater code would be the only way to get all of them to fit, and even that isn't enough for some games. That's why I decided to focus only on the video tables that were being used when making codes. For me, doing a ram patch is preferable, as there are some games that can only be patched that way anyway, so doing it to the rest made more sense.

Also, with the audio fix, I think a ram patch is the only option, I don't know if a rom patch is possible. I did try it, but it didn't work. So maybe there's something else that needs changing. That might explain why neither Banjo-Kazooie v1.1 or Banjo-Tooie would work.
 
My assumptions about Banjo-Kazooie v1.1 and Banjo-Tooie were correct, something else was controlling it. After doing a memory search with both 02E6 and D354, I found other instances of those values. Changing these values fixed the audio for those games.

Updated codes:

Banjo-Kazooie v1.1
8123F7D2 02F5
8123F7DE B2D2

Banjo-Tooie
810125FE 02F5
8101260A B2D2

I can also confirm that it's possible to do a ROM patch depending on the game.
 
Man thank you so much! With that i finally could fix the problem that my upscaler didn't want to take the Output signal of the original NTSC roms on my RGB modded PAL N64. While weirdly on my other old flatscreen with Scart input it perfectly works even without the patch. It seems like that the TV does something different than the upscaler.


More people really need to understand this... In order for a PAL N64 to properly play NTSC U/J region games, it NEEDS a crystal swap. RGB only solves the color encoding (RGB is free from NTSC/PAL encoding).

Otherwise the refresh will be something like 59.5Hz instead of near 60Hz. Slightly too slow. The refresh being off will be problematic for most setups (other than CRTs which don't care and show the true refresh as is)

Scalers might not like that because it's too far below what it can buffer (you scaler might not even have buffering, so it just fails). Buffering frames = scrolling stutters and input lag, coming from the fact that old consoles aren't exactly the 60Hz that the TV refreshes at. To completely get rid of the "once every few seconds stutter" and improve lag you will need a Tink5x/4k with VRR (variable refreshrate, done through Freesync) and a compatible Freesync TV/monitor. Only then do you get the exact refresh match of the console. NES and SNES for example need a TV that displays 60.1Hz in order to be perfectly fluid. Without VRR these have a stutter frame every few seconds.

Additionally there are some timing sensitive things in games that can have bugs due to playing at the wrong refresh, there are a few confirmed cases of this for the N64 but I forget exactly what they were.

Sega Saturn and PS1 also has this problem, for those you need a DFO chip (dual frequency oscillator, gives correct crystal speeds). No such mod exists for N64 that I've seen, so you'll need to replace the crystal completely instead and have perfect NTSC-U/J games only.

How to swap the crystal of the N64, ignore the PIF swap since you can bypass the region check with a flashcart. But the crystal swap is an absolute must.
Guide below:
https://www.pimyretro.org/converting-a-pal-nintendo-64-motherboard-to-ntsc/

Locate the U7 chip, cut the pin7 trace and wire pin7 to pin4. (Please don't lift leg pins as the guide says, you risk breaking them, simply just cut the trace instead). Then replace the crystal with a proper 4.31818 Mhz crystal.

Also:
Cut the trace for the "P" labeled jumper on the back, bridge the "N" jumper next to it instead. (PAL and NTSC video encoding), this is for non-RGB use, so you get NTSC video encoding.
 
Thought to give an update on the audio fix. It turns out that it isn't just Rare games that have audio issues, but also other games that appeared to be fine initially before further inspection.

After testing with and without the fix, and comparing with their PAL counterparts, I've found that all non-Rare games either have correct tempo with incorrect pitch or incorrect tempo and pitch. Neither creates distortion like the majority of Rare's games, so that's why it was hard to tell initially. Now knowing this, I've created more codes for the rest of my games, and also created a list below if anyone wants to have them.

007 The World Is Not Enough
810D1078 02F5
810D107A B2D2

F-Zero X
810D1CE8 02F5
810D1CEA B2D2

Mario Golf
810C9468 02F5
810C946A B2D2

Mario Kart 64
810EB438 02F5
810EB43A B2D2

Mario Party
810C7728 02F5
810C772A B2D2

Mario Party 2
810CF0A8 02F5
810CF0AA B2D2

Mario Party 3
810A3FA8 02F5
810A3FAA B2D2

Mario Tennis
8105B648 02F5
8105B64A B2D2

Paper Mario
810958F8 02F5
810958FA B2D2

Pilotwings 64
8124C17C 02F5
8124C17E B2D2

Quake
8106F848 02F5
8106F84A B2D2

Quake II
8106BE18 02F5
8106BE1A B2D2

Rayman 2: The Great Escape
F10040CE 02F5
F10040DA B2D2

Star Fox 64
v1.0
810C3998 02F5
810C399A B2D2
v1.1
810C7E18 02F5
810C7E1A B2D2

Star Wars Episode I: Racer
810A7B48 02F5
810A7B4A B2D2

Super Mario 64
81335A2C 02F5
81335A2E B2D2

Super Smash Bros.
8103D3F8 02F5
8103D3FA B2D2

The Legend of Zelda: Majora's Mask
81097E58 02F5
81097E5A B2D2

The Legend of Zelda: Ocarina of Time
v1.0/v1.1
81006358 02F5
8100635A B2D2
v1.2
810068D8 02F5
810068DA B2D2

Turok: Dinosaur Hunter
v1.0
810EF288 02F5
810EF28A B2D2
v1.1/v1.2
810EF3D8 02F5
810EF3DA B2D2

Turok: Rage Wars
v1.0
810D3F00 02F5
810D3F02 B2D2
v1.1
810D9280 02F5
810D9282 B2D2

Turok 2: Seeds of Evil
v1.0
810B8900 02F5
810B8902 B2D2
v1.1
810BABC0 02F5
810BABC2 B2D2

Turok 3: Shadow of Oblivion
8110BC40 02F5
8110BC42 B2D2

Wave Race 64: Kawasaki Jet Ski
v1.0
810E8E3C 02F5
810E8E3E B2D2
v1.1
810E90BC 02F5
810E90BE B2D2

Yoshi's Story
810AAC48 02F5
810AAC4A B2D2
 
Last edited by LaminGaming,
  • Like
Reactions: Fabax01


Write your reply...

Site & Scene News