diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs index af0b2fc36c..feb338ad42 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.Core.cs @@ -16,7 +16,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES public PPU ppu; public APU apu; public byte[] ram; - NESWatch[] sysbus_watch = new NESWatch[65536]; public byte[] CIRAM; //AKA nametables string game_name = ""; //friendly name exposed to user and used as filename base CartInfo cart; //the current cart prototype. should be moved into the board, perhaps @@ -49,6 +48,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES // cheat addr index tracker // disables all cheats each frame public int[] cheat_indexes = new int[0x10000]; + public byte[] cheat_active = new byte[0x10000]; public int num_cheats; // new input system @@ -295,12 +295,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES { Board.WRAM[i] = 0xFF; } - - } - - + } } - } public long CycleCount => ppu.TotalCycles; @@ -414,11 +410,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES videoProvider.FillFrameBuffer(); - //turn off all cheats - for (int d=0;d= 0x4020) { - ret = Board.PeekCart(addr); //easy optimization, since rom reads are so common, move this up (reordering the rest of these elseifs is not easy) + //easy optimization, since rom reads are so common, move this up (reordering the rest of these elseifs is not easy) + ret = Board.PeekCart(addr); } else if (addr < 0x0800) { @@ -879,7 +874,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES if (addr >= 0x8000) { - ret = Board.ReadPRG(addr - 0x8000); //easy optimization, since rom reads are so common, move this up (reordering the rest of these elseifs is not easy) + //easy optimization, since rom reads are so common, move this up (reordering the rest of these elseifs is not easy) + ret = Board.ReadPRG(addr - 0x8000); } else if (addr < 0x0800) { @@ -906,13 +902,17 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES ret = Board.ReadWRAM(addr - 0x6000); } - //handle breakpoints and stuff. - //the idea is that each core can implement its own watch class on an address which will track all the different kinds of monitors and breakpoints and etc. - //but since freeze is a common case, it was implemented through its own mechanisms - if (sysbus_watch[addr] != null) + // handle cheats (currently cheats can only freeze read only areas) + // there is no way to distinguish between a memory poke and a memory freeze + if (num_cheats !=0) { - sysbus_watch[addr].Sync(); - ret = sysbus_watch[addr].ApplyGameGenie(ret); + for (int i = 0; i < num_cheats; i++) + { + if(cheat_indexes[i] == addr) + { + ret = cheat_active[addr]; + } + } } MemoryCallbacks.CallReads(addr, "System Bus"); @@ -921,21 +921,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES return ret; } - public void ApplyGameGenie(int addr, byte value, byte? compare) + public void ApplyCheat(int addr, byte value, byte? compare) { - if (addr < sysbus_watch.Length) + if (addr <= 0xFFFF) { cheat_indexes[num_cheats] = addr; + cheat_active[addr] = value; num_cheats++; - GetWatch(NESWatch.EDomain.Sysbus, addr).SetGameGenie(compare, value); - } - } - - public void RemoveGameGenie(int addr) - { - if (addr < sysbus_watch.Length) - { - GetWatch(NESWatch.EDomain.Sysbus, addr).RemoveGameGenie(); } } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.cs index f575a7c71e..5da37f44c4 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.cs @@ -57,7 +57,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES PickVSPalette(cart); } - ser.Register(cpu); Tracer = new TraceBuffer { Header = cpu.TraceHeader }; @@ -123,96 +122,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES get { return Board is FDS; } } - NESWatch GetWatch(NESWatch.EDomain domain, int address) - { - if (domain == NESWatch.EDomain.Sysbus) - { - NESWatch ret = sysbus_watch[address] ?? new NESWatch(this, domain, address); - sysbus_watch[address] = ret; - return ret; - } - return null; - } - - class NESWatch - { - public enum EDomain - { - Sysbus - } - - public NESWatch(NES nes, EDomain domain, int address) - { - Address = address; - Domain = domain; - if (domain == EDomain.Sysbus) - { - watches = nes.sysbus_watch; - } - } - public int Address; - public EDomain Domain; - - public enum EFlags - { - None = 0, - GameGenie = 1, - ReadPrint = 2 - } - EFlags flags; - - public void Sync() - { - if (flags == EFlags.None) - watches[Address] = null; - else watches[Address] = this; - } - - public void SetGameGenie(byte? compare, byte value) - { - flags |= EFlags.GameGenie; - Compare = compare; - Value = value; - Sync(); - } - - public bool HasGameGenie - { - get - { - return (flags & EFlags.GameGenie) != 0; - } - } - - public byte ApplyGameGenie(byte curr) - { - if (!HasGameGenie) - { - return curr; - } - else if (curr == Compare || Compare == null) - { - Console.WriteLine("applied game genie"); - return (byte)Value; - } - else - { - return curr; - } - } - - public void RemoveGameGenie() - { - flags &= ~EFlags.GameGenie; - Sync(); - } - - byte? Compare; - byte Value; - - NESWatch[] watches; - } - public CoreComm CoreComm { get; private set; } public DisplayType Region { get { return _display_type; } }