-
Notifications
You must be signed in to change notification settings - Fork 723
Difficult to Emulate Games
Connor McLaughlin edited this page Aug 11, 2024
·
14 revisions
This is a list of games with.. interesting issues, which may be difficult to emulate depending on your level of accuracy. The symptoms range from hangs/crashes to minor graphical issues.
Some of these are from my memory a year ago, so there might be some minor errors, but most if it should be correct.
TODO: Sort into categories or something... the list ended up being much longer than I expected.
- Relies on the CLUT being cached for title screens, the VRAM that the primitives point to gets overwritten.
- DMA transfer timing or FMVs lock up
- Commands spanning multiple blocks
- DMA timing or hangs on startup/ingame
- Infinite DMA linked list/chains
- Infinite DMA linked list/chains
- Requires GPU draw timing for the menus, presumably it alters the DMA chain after starting it
- First draws copy the background, which take a while, so plenty of time for that to happen
- Requires DMA timing otherwise battles time out/lock up
- Loop address from ADPCM blocks must be ignored with the register value taking precedence
- Hangs in various locations if DMA timing is off
- Locks up if DMA timing is off/CPU does not run
- Two releases, the old version corrupts palettes if you don't emulate fetch timing from the BIOS ROM
- It executes a bunch of memmoves (running from uncached ROM), which can't complete too quickly, racing the DMA
- Interestingly, version 1.1 spams printf during the same screen transition with a bunch of a's and a number suffix
- Kicks off a DMA chain involving a VRAM fill, which takes a while to complete,
- then does a memcpy out of uncached ROM
- then zeroes out some of the headers in the DMA chain before it finishes
- Will hang emulators (if they don't properly handle infinite LLs) or the game will time out and skip a bunch of texture uploads in the loading scren
- Has self-modifying code which changes the operands of geometry manipulating functions every frame.
- Will cause slowdown on dynarecs which do not efficiently handle this.
- If you're emulating icache incorrectly, it'll also result in stale code executing, since the game does not flush cache, instead it relies on the old code being evicted implicitly.
- HUD/UI will flicker during battles if draw and DMA timing is instant
- Runs too fast if CPU/GPU timing is off
- Audio will drift slowly over time with game if GPU frame rate is incorrect
- Sensitive to DMA timing - rider will be missing from bike if incorrect
- Needs timer0 clocked from dot clock emulated
- Main menu music will drop in and out if SPU interrupts are not re-triggered after enabling
- Puts SPU IRQs in addresses being read by released/off voices
- Requires GPU coordinate truncation/sign-extension otherwise objects will be missing
- Requires CPU icache emulation
- Spams invalid MDEC commands, need to be ignored/parameters skipped
- Libcrypt protection is really nasty - the cop0 instructions to grab are xor-obfuscated, and written immediately before execution
- Naive icache implementations will break - you need to handle partial line fetches from non-16-byte-aligned addresses
- Uses an undocumented method for swapping the dualshock motors, intensity will be zero if not emulated correctly
- Has some scenes which rely on coordinate truncation/sign extension per-scanline
- Seems to use VRAM as a swap area during transitions
- VRAM writes and readbacks must be bit-accurate, otherwise at best you get broken animations, at worst crashes
- Requires code execution in-between DMA mode 1 blocks transfer on the intro movie.
- Sensitive to MDEC timing
- Requires interlaced rendering (line skipping) otherwise hangs on startup
- Requires interlaced rendering, otherwise artifacts on screen in various locations
- Screws with GPU packets after enabling DMA, requires CPU to run in parallel otherwise menu will be black
- Expects other DMA channels to run while an infinite linked list chain is running
- Sensitive to ODE bit (31) in GPU status register
- Does logical seeks to data sectors, this needs to succeed, but reads of audio sectors should fail for other games
- XA audio in intro has more data than can be played by the SPU, buffers need to be correctly cleared on overflow
- Triggers interrupts by setting cop0 bits in software, can be tricky for recompilers
- lwr in branch delay slot, and lwl in load delay slot, can be tricky for recompilers
- Requires VRAM transfers to be masked to 9 bits
- Branches in branch delay slots, fun times for recompilers
- Battle transitions will finish too quickly if GPU draw timings are not emulated
- Uses timer gated by hblank but sysclk as clock source, essentially counting ticks outside of hblank
- Will hang at startup if not emulated correctly
- Repeatedly seek commands while seek is in progress, position needs to be updated when the next request comes in
- Requires deferring setting the reading/playing bit in the CD-ROM until the first sector is read
- Requires error interrupt on shell open for disc change detection
- Music in transitions will slow down due to timeouts in the CD-ROM code when commands are cancelled
- I use a heuristic of "cancel only when the new command has fewer parameters than the old command, otherwise clear FIFO and send error"
- Supplementary disc detection will fail if pregaps are incorrect, or errors are not sent on ReadN
- Sensitive to sector buffering/overwrite behavior when missing CD-ROM reads
- Requires one cycle delay from CD-ROM interrupts
- Creates new CLUTs by modulating existing CLUT with vertex colour and direct texturing.
- Will break hardware renderers that don't track CLUTs that have been drawn, instead of written.
- Starts a CD seek+read while the start confirmation sound is playing on the title screen, and overwrites the voice memory as soon as the CD read comes in.
- Requires the ~40 minute sled seek to be about 550ms or longer.
- Very sensitive to CD seek timing for short (<10 LBA) seeks.
- Spams GetlocL during intro music playback.
- Race conditions in the CD interrupt handler, it clears the INT3/ACK before reading out the results.
- INT1 after INT3 has to be delayed, otherwise it'll end up with the INT1's results when it's expecting the INT3.
- Various graphical errors if mask bit is not emulated correctly
- Requires semi-accurate CPU timings (icache/fetch) and GPU draw timings, otherwise games run too fast
- Sensitive to DMA timing (and CPU/DMA slices), otherwise controller input is dropped