DEV Community

Nivando Soares
Nivando Soares

Posted on

Porting Test Drive II from SNES to PC, Part 43: Closing the first post-02:9016 rival marker split

Porting Test Drive II from SNES to PC, Part 43: Closing the first post-02:9016 rival marker split

The previous checkpoint fixed the screenshot pack for the first shared gameplay
window after both the default-rival and no-opponent paths reach 02:9016.

That gave me a clean visual target:

  • same callback surface
  • same lower cockpit
  • one small stable difference in the top strip

This checkpoint closes that first live split instead of leaving it as a vague
"HUD difference".

The user review narrowed the visual meaning immediately

The corrected screenshots were already useful, but the human review made the
next step much sharper.

Default-rival frame 2048:

Default rival 2048

No-opponent frame 2048:

No opponent 2048

The practical read from the review was:

  • the split is OAM-owned, not BG-owned
  • the lower cockpit stays the same in 2048..2088
  • the road/world objects are not the source yet
  • the rival lane carries the extra marker
  • the user also noticed rival blinking lights in the rearview, which is likely another OAM-facing difference but not yet tied to a specific state field

The automated diff was already tiny:

First delta diff

But now the next question changed from "what is different?" to "which staged
OAM word owns that marker?"

Extending the gameplay probe closed the marker itself

I extended the boot probe so it also snapshots the gameplay-facing fields
around this HUD/OAM path:

  • state_11a7
  • state_11cd
  • state_11df
  • state_11f1
  • state_11f3
  • state_11f5
  • state_137c
  • oam_072c..073a

Then I reran the two already-recovered flows:

  • default rival
  • no opponent clock slot

and compared only the corrected visible window 2048..2088.

That compare demoted the earlier suspects 09A2 and 09A8.

They still diverge intermittently, but they are not the first stable visible
split.

The stable whole-window split is now explicit:

  • $1C76 = 1 -> 0
  • state_11f3 = 44 -> 0
  • oam_0730 = 4618 -> 57600
  • $1C70 = 0 -> 3

while the adjacent staged OAM words stay the same:

  • oam_072c
  • oam_0734

That is exactly the shape expected from "one extra rival-only marker", not a
full HUD rewrite.

Bank-2 code matches the recovered visual split exactly

The key static match is bank2.asm L0108EF.

That code stages:

  • oam_072c <- state_11f1
  • oam_0730 <- state_11f3 only when $1C76 != 0
  • oam_0734 <- state_11f5

So the first stable live split after 02:9016 is now closed as:

$1C76 -> state_11f3 -> oam_0730

In practice, that is the recovered rival-only marker on the top HUD strip.

This matters because it moves the lane out of generic post-handoff comparison
and into specific ownership:

  • the first live split is no longer unknown
  • the rival/no-opponent handoff is now tied to a concrete staged OAM slot
  • 09A2/09A8 are no longer the first target; they are later or secondary OAM-side behavior

What remains open after this checkpoint

This does not finish the whole gameplay divergence.

Two things still look worth chasing next:

  • the rearview blinking lights the user reported
  • the intermittent 09A2/09A8-side differences that survive after the marker split is explained

But those are now later layers of the same problem.

The first stable rival-only gameplay-visible split is no longer a guess.

It is a closed OAM marker path.

Top comments (0)