mirror of
https://github.com/dborth/snes9xgx.git
synced 2024-11-27 13:04:21 +01:00
Snes9x - Add render position hack and clean up rest. (#880)
This removes the "known bad dumps" section, which probably aren't relevant anymore. It also removes commented out APU hacks which are no longer needed.
This commit is contained in:
parent
d7739e797e
commit
adb43e9262
@ -2635,6 +2635,12 @@ void CMemory::InitROM (void)
|
|||||||
and the NMI handler, time enough for an instruction or two. */
|
and the NMI handler, time enough for an instruction or two. */
|
||||||
// Wild Guns, Mighty Morphin Power Rangers - The Fighting Edition
|
// Wild Guns, Mighty Morphin Power Rangers - The Fighting Edition
|
||||||
Timings.NMIDMADelay = 24;
|
Timings.NMIDMADelay = 24;
|
||||||
|
Timings.IRQTriggerCycles = 14;
|
||||||
|
Timings.APUSpeedup = 0;
|
||||||
|
#ifdef GEKKO
|
||||||
|
Timings.APUAllowTimeOverflow = FALSE;
|
||||||
|
#endif
|
||||||
|
S9xAPUTimingSetSpeedup(Timings.APUSpeedup);
|
||||||
|
|
||||||
IPPU.TotalEmulatedFrames = 0;
|
IPPU.TotalEmulatedFrames = 0;
|
||||||
|
|
||||||
@ -3645,26 +3651,8 @@ void CMemory::ApplyROMFixes (void)
|
|||||||
{
|
{
|
||||||
Settings.BlockInvalidVRAMAccess = Settings.BlockInvalidVRAMAccessMaster;
|
Settings.BlockInvalidVRAMAccess = Settings.BlockInvalidVRAMAccessMaster;
|
||||||
|
|
||||||
//// Warnings
|
if (Settings.DisableGameSpecificHacks)
|
||||||
|
return;
|
||||||
// Reject strange hacked games
|
|
||||||
if ((ROMCRC32 == 0x6810aa95) ||
|
|
||||||
(ROMCRC32 == 0x340f23e5) ||
|
|
||||||
(ROMCRC32 == 0x77fd806a) ||
|
|
||||||
(match_nn("HIGHWAY BATTLE 2")) ||
|
|
||||||
(match_na("FX SKIING NINTENDO 96") && (ROM[0x7fda] == 0)) ||
|
|
||||||
(match_nn("HONKAKUHA IGO GOSEI") && (ROM[0xffd5] != 0x31)))
|
|
||||||
{
|
|
||||||
Settings.DisplayColor = BUILD_PIXEL(31, 0, 0);
|
|
||||||
SET_UI_COLOR(255, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
//// APU timing hacks :(
|
|
||||||
|
|
||||||
Timings.APUSpeedup = 0;
|
|
||||||
#ifdef GEKKO
|
|
||||||
Timings.APUAllowTimeOverflow = FALSE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!Settings.DisableGameSpecificHacks)
|
if (!Settings.DisableGameSpecificHacks)
|
||||||
{
|
{
|
||||||
@ -3736,11 +3724,6 @@ void CMemory::ApplyROMFixes (void)
|
|||||||
#ifdef GEKKO
|
#ifdef GEKKO
|
||||||
S9xAPUAllowTimeOverflow(Timings.APUAllowTimeOverflow);
|
S9xAPUAllowTimeOverflow(Timings.APUAllowTimeOverflow);
|
||||||
#endif
|
#endif
|
||||||
//// Other timing hacks :(
|
|
||||||
|
|
||||||
Timings.HDMAStart = SNES_HDMA_START_HC + Settings.HDMATimingHack - 100;
|
|
||||||
Timings.HBlankStart = SNES_HBLANK_START_HC + Timings.HDMAStart - SNES_HDMA_START_HC;
|
|
||||||
Timings.IRQTriggerCycles = 14;
|
|
||||||
|
|
||||||
#ifdef GEKKO
|
#ifdef GEKKO
|
||||||
if (match_id("YI ")) { // Super Mario World 2 - Yoshi's Island
|
if (match_id("YI ")) { // Super Mario World 2 - Yoshi's Island
|
||||||
@ -3751,61 +3734,66 @@ void CMemory::ApplyROMFixes (void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!Settings.DisableGameSpecificHacks)
|
// Other timing hacks
|
||||||
|
// The delay to sync CPU and DMA which Snes9x does not emulate.
|
||||||
|
// Some games need really severe delay timing...
|
||||||
|
if (match_na("BATTLE GRANDPRIX")) // Battle Grandprix
|
||||||
|
Timings.DMACPUSync = 20;
|
||||||
|
else if (match_na("KORYU NO MIMI ENG")) // Koryu no Mimi translation by rpgone)
|
||||||
{
|
{
|
||||||
// The delay to sync CPU and DMA which Snes9x cannot emulate.
|
// An infinite loop reads $4210 and checks NMI flag. This only works if LDA instruction executes before the NMI triggers,
|
||||||
// Some games need really severe delay timing...
|
// which doesn't work very well with s9x's default DMA timing.
|
||||||
if (match_na("BATTLE GRANDPRIX")) // Battle Grandprix
|
Timings.DMACPUSync = 20;
|
||||||
{
|
|
||||||
Timings.DMACPUSync = 20;
|
|
||||||
printf("DMA sync: %d\n", Timings.DMACPUSync);
|
|
||||||
}
|
|
||||||
else if (match_na("KORYU NO MIMI ENG")) // Koryu no Mimi translation by rpgone)
|
|
||||||
{
|
|
||||||
// An infinite loop reads $4210 and checks NMI flag. This only works if LDA instruction executes before the NMI triggers,
|
|
||||||
// which doesn't work very well with s9x's default DMA timing.
|
|
||||||
Timings.DMACPUSync = 20;
|
|
||||||
printf("DMA sync: %d\n", Timings.DMACPUSync);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//// SRAM initial value
|
if (Timings.DMACPUSync != 18)
|
||||||
|
printf("DMA sync: %d\n", Timings.DMACPUSync);
|
||||||
|
|
||||||
if (!Settings.DisableGameSpecificHacks)
|
|
||||||
|
// SRAM initial value
|
||||||
|
if (match_na("HITOMI3"))
|
||||||
{
|
{
|
||||||
if (match_na("HITOMI3"))
|
SRAMSize = 1;
|
||||||
{
|
SRAMMask = ((1 << (SRAMSize + 3)) * 128) - 1;
|
||||||
SRAMSize = 1;
|
|
||||||
SRAMMask = ((1 << (SRAMSize + 3)) * 128) - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// SRAM value fixes
|
|
||||||
if (match_na("SUPER DRIFT OUT") || // Super Drift Out
|
|
||||||
match_na("SATAN IS OUR FATHER!") ||
|
|
||||||
match_na("goemon 4")) // Ganbare Goemon Kirakira Douchuu
|
|
||||||
SNESGameFixes.SRAMInitialValue = 0x00;
|
|
||||||
|
|
||||||
// Additional game fixes by sanmaiwashi ...
|
|
||||||
// XXX: unnecessary?
|
|
||||||
if (match_na("SFX \xC5\xB2\xC4\xB6\xDE\xDD\xC0\xDE\xD1\xD3\xC9\xB6\xDE\xC0\xD8 1")) // SD Gundam Gaiden - Knight Gundam Monogatari
|
|
||||||
SNESGameFixes.SRAMInitialValue = 0x6b;
|
|
||||||
|
|
||||||
// others: BS and ST-01x games are 0x00.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//// OAM hacks :(
|
// SRAM value fixes
|
||||||
|
if (match_na("SUPER DRIFT OUT") || // Super Drift Out
|
||||||
|
match_na("SATAN IS OUR FATHER!") ||
|
||||||
|
match_na("goemon 4")) // Ganbare Goemon Kirakira Douchuu
|
||||||
|
SNESGameFixes.SRAMInitialValue = 0x00;
|
||||||
|
|
||||||
if (!Settings.DisableGameSpecificHacks)
|
// Additional game fixes by sanmaiwashi ...
|
||||||
|
// XXX: unnecessary?
|
||||||
|
if (match_na("SFX \xC5\xB2\xC4\xB6\xDE\xDD\xC0\xDE\xD1\xD3\xC9\xB6\xDE\xC0\xD8 1")) // SD Gundam Gaiden - Knight Gundam Monogatari
|
||||||
|
SNESGameFixes.SRAMInitialValue = 0x6b;
|
||||||
|
|
||||||
|
// others: BS and ST-01x games are 0x00.
|
||||||
|
|
||||||
|
// OAM hacks :(
|
||||||
|
// OAM hacks because we don't fully understand the behavior of the SNES.
|
||||||
|
// Totally wacky display in 2P mode...
|
||||||
|
// seems to need a disproven behavior, so we're definitely overlooking some other bug?
|
||||||
|
if (match_nn("UNIRACERS")) // Uniracers
|
||||||
{
|
{
|
||||||
// OAM hacks because we don't fully understand the behavior of the SNES.
|
SNESGameFixes.Uniracers = TRUE;
|
||||||
// Totally wacky display in 2P mode...
|
printf("Applied Uniracers hack.\n");
|
||||||
// seems to need a disproven behavior, so we're definitely overlooking some other bug?
|
|
||||||
if (match_nn("UNIRACERS")) // Uniracers
|
|
||||||
{
|
|
||||||
SNESGameFixes.Uniracers = TRUE;
|
|
||||||
printf("Applied Uniracers hack.\n");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Render Position
|
||||||
|
if (match_na("Sugoro Quest++"))
|
||||||
|
Timings.RenderPos = 128;
|
||||||
|
else if (match_na("FIREPOWER 2000"))
|
||||||
|
Timings.RenderPos = 32;
|
||||||
|
else if (match_na("DERBY STALLION 98"))
|
||||||
|
Timings.RenderPos = 128;
|
||||||
|
else if (match_na("AIR STRIKE PATROL") || match_na("DESERT FIGHTER"))
|
||||||
|
Timings.RenderPos = 128; // Just hides shadow
|
||||||
|
// From bsnes
|
||||||
|
else if (match_na("NHL '94") || match_na("NHL PROHOCKEY'94"))
|
||||||
|
Timings.RenderPos = 32;
|
||||||
|
else if (match_na("ADVENTURES OF FRANKEN") && Settings.PAL)
|
||||||
|
Timings.RenderPos = 32;
|
||||||
}
|
}
|
||||||
|
|
||||||
// BPS % UPS % IPS
|
// BPS % UPS % IPS
|
||||||
|
Loading…
Reference in New Issue
Block a user