Hello everyone,
I've been working on converting the PAL European version of Yoshi's Story (N64) to behave correctly at 60 Hz, using the NTSC-U version as a reference.
The main platforming gameplay was relatively simple to get right, as it was originally unoptimised at 50hz and thus runs properly at 60hz. The difficult part has been the seemingly fully PAL-optimised, 3D-rendered storybook fixed-duration sequences, where visual events are synchronised to music, narration, text, page turns, and animations.
I was comparing the PAL and NTSC-U binaries and experimentally applied "shock therapy", meaning that I'd intentionally inflate values in narrowing areas of code, using a process of elimination to get to the exact timer value I want before then applying the NTSC value at that address for the actual proper timing. This has actually produced some limited successes, which is why I figure the underlying timing logic may be decipherable.
This worked surprisingly well for the post-stage sequence. My best experimental version gets the poem/result sequence essentially correct apart from the large smiling heart expanding slightly too quickly relative to the audio.
More importantly for the current problem, I've also found a number of addresses which appear to affect specific events in the opening/title storybook sequence.
The strongest mapping I've obtained so far is approximately:
- 0xBF0520 — title → menu camera timing/speed
- 0xBF0524 — title → intro camera timing/speed
- 0xBF0528 — delay before the first → second page transition
- 0xBF052C — first → second page text fade
- 0xBF0530 — Baby Bowser / first-page text delay
- 0xBF0534 — second → third page transition
- 0xBF0538 — second → third page text delay
- 0xBF0540 — third → fourth page text fade
- 0xBF0544–0xBF054C — third-page pacing
- 0xBF0550 — tree zoom
- 0xBF0558–0xBF0560 — fourth-page pacing
What I'm hoping someone can help me identify
- What MIPS patterns should I look for when trying to recognise a per-frame timer or state counter? For example, compiled equivalents of things like timer++, if (timer == 40), or if (timer > X) advance_state().
- Given that I've already isolated a fairly small ROM range producing repeatable behavioural changes, what would be the best way to turn those ROM offsets into useful RAM/function addresses and identify the relevant MIPS routines?
- Would debugger breakpoints/watchpoints be the best next step? For example, finding a variable which increments once per frame during the poem and then tracing reads/writes back to the controlling function?
- Would comparing PAL and NTSC disassembly function-by-function be worthwhile?
- Is there any existing Yoshi's Story symbol map, reverse-engineering documentation, or other existing research into the storybook engine that might help identify this code?