N64ModernRuntime/librecomp
Matthew Stanley e43892bb5f pi: mirror ROM into kseg1 region of rdram
Adds recomp::mirror_rom_to_kseg1(rdram) that copies the loaded ROM
into rdram + 0x30000000 with XOR-3-byte-swapped storage so direct
MIPS reads of cart vaddrs return the expected bytes.

Why:
  The recompiler's MEM_W formula maps kseg1 vaddrs into the second
  512 MiB of the rdram allocation:
    MEM_W(addr) = *(int32_t*)(rdram + (addr - 0xFFFFFFFF80000000))
  For addr=0xB0000000, that's rdram + 0x30000000. Previously, ROM
  bytes were only available via osPiStartDma -> do_rom_read; direct
  reads of cart vaddrs (e.g. `lw $t0, 0xE38($t9)` with $t9=0xB000_0000)
  hit never-written rdram and returned garbage.

Visible symptom:
  Pokemon Stadium's Game_DoCopyProtection at 0x80028FA0 reads
  *(u32*)0xB0000E38 and compares the low 16 bits against 0x828A.
  Without the mirror that read returned 0, the magic check tripped,
  and the function returned -0x10 = 0xFFFFFFF0 — a sentinel state
  that the main state-machine switch doesn't handle. Title screen
  flashed for 1-2 frames then reverted to intro on every run.

  After the fix: copyprot returns input state unchanged, title
  screen stays up cleanly. Verified via Stadium harness:
  gCurrentGameState transitions 0x01 -> 0x02 and stays there
  through 25s of idle with zero copyprot trips logged.

Generality:
  Any N64 game with a ROM-checksum / magic-word check (Stadium,
  many original-IP games, anti-piracy code in others) needs this.
  CIC-NUS-6103 / 6105 / 6106 boot also reads ROM via virtual
  addresses. The mirror is install-once at game-start time, after
  load_stored_rom populates the rom vector.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 22:27:58 -07:00
..
include/librecomp pi: mirror ROM into kseg1 region of rdram 2026-05-05 22:27:58 -07:00
src pi: mirror ROM into kseg1 region of rdram 2026-05-05 22:27:58 -07:00
CMakeLists.txt Implement displaylist event extension functions for easier game scheduling modifications (#128) 2025-12-12 02:11:14 -05:00