mirror of
https://github.com/N64Recomp/N64ModernRuntime.git
synced 2026-06-26 18:02:55 +00:00
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>
|
||
|---|---|---|
| .. | ||
| include/librecomp | ||
| src | ||
| CMakeLists.txt | ||