diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/SxROM.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/SxROM.cs index 56e5cbe160..c4ba2a08aa 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/SxROM.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/SxROM.cs @@ -207,19 +207,26 @@ namespace BizHawk.Emulation.Consoles.Nintendo //configuration protected int prg_mask, chr_mask; protected int vram_mask; + const int pputimeout = 4; // i don't know if this is right, but anything lower will not boot Bill & Ted bool disablemirror = false; // mapper 171: mmc1 without mirroring control //state public MMC1 mmc1; - /// cpu cyle when the last MMC1 serial write occured - int lastwritecycle; + /// number of cycles since last WritePRG() + uint ppuclock; + + public override void ClockPPU() + { + if (ppuclock < pputimeout) + ppuclock++; + } public override void WritePRG(int addr, byte value) { // mmc1 ignores subsequent writes that are very close together - if (NES.cpu.TotalExecutedCycles - lastwritecycle != 1) + if (ppuclock >= pputimeout) { - lastwritecycle = NES.cpu.TotalExecutedCycles; + ppuclock = 0; mmc1.Write(addr, value); if (!disablemirror) SetMirrorType(mmc1.mirror); //often redundant, but gets the job done @@ -265,7 +272,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo { base.SyncState(ser); mmc1.SyncState(ser); - ser.Sync("lastwritecycle", ref lastwritecycle); + ser.Sync("ppuclock", ref ppuclock); } public override bool Configure(NES.EDetectionOrigin origin) @@ -359,6 +366,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo chr_mask = (Cart.chr_size / 8 * 2) - 1; if (!disablemirror) SetMirrorType(mmc1.mirror); + ppuclock = pputimeout; } } //class SxROM