diff --git a/BizHawk.Emulation.Cores/CPUs/CP1610/CP1610.Execute.cs b/BizHawk.Emulation.Cores/CPUs/CP1610/CP1610.Execute.cs index dece4fc4cf..cffb04037c 100644 --- a/BizHawk.Emulation.Cores/CPUs/CP1610/CP1610.Execute.cs +++ b/BizHawk.Emulation.Cores/CPUs/CP1610/CP1610.Execute.cs @@ -88,15 +88,15 @@ namespace BizHawk.Emulation.Cores.Components.CP1610 } if (!FlagD) { - value = ReadMemory(Register[mem], false); + value = ReadMemoryWrapper(Register[mem], false); } else { // Double Byte Data. - value = (ushort)(ReadMemory(Register[mem], false) & 0xFF); + value = (ushort)(ReadMemoryWrapper(Register[mem], false) & 0xFF); if (mem >= 4) Register[mem]++; - value |= (ushort)(ReadMemory(Register[mem], false) << 8); + value |= (ushort)(ReadMemoryWrapper(Register[mem], false) << 8); } // Auto-increment the memory register if it does so on write. if (mem >= 0x4 && mem != 0x6) @@ -128,7 +128,7 @@ namespace BizHawk.Emulation.Cores.Components.CP1610 public void Indirect_Set(byte mem, byte src) { - WriteMemory(Register[mem], Register[src], false); + WriteMemoryWrapper(Register[mem], Register[src], false); // Auto-increment the memory register if it does so on read. if (mem >= 0x4) { @@ -178,16 +178,23 @@ namespace BizHawk.Emulation.Cores.Components.CP1610 Log.WriteLine(Disassemble(RegisterPC, out addrToAdvance)); Log.Flush(); } + byte dest, src, mem; ushort dest_value, src_value, mem_read, addr, addr_read, offset; int decle2, decle3, result = 0, twos, status_word, lower, sign, cond, ext; //int ones, carry; bool branch = false; bool FlagD_prev = FlagD; - opcode = ReadMemory(RegisterPC++, false) & 0x3FF; + opcode = ReadMemoryWrapper(RegisterPC++, false) & 0x3FF; if (TraceCallback != null) TraceCallback(CP1610State()); + + if (MemoryCallbacks != null) + { + MemoryCallbacks.CallExecutes(RegisterPC); + } + switch (opcode) { case 0x000: // HLT @@ -209,8 +216,8 @@ namespace BizHawk.Emulation.Cores.Components.CP1610 break; case 0x004: // J, JE, JD, JSR, JSRE, JSRD // 0000:0000:0000:0100 0000:00rr:aaaa:aaff 0000:00aa:aaaa:aaaa - decle2 = ReadMemory(RegisterPC++, false); - decle3 = ReadMemory(RegisterPC++, false); + decle2 = ReadMemoryWrapper(RegisterPC++, false); + decle3 = ReadMemoryWrapper(RegisterPC++, false); // rr indicates the register into which to store the return address dest = (byte)(((decle2 >> 8) & 0x3) + 4); // aaaaaaaaaaaaaaaa indicates the address to where the CP1610 should Jump @@ -1159,7 +1166,7 @@ namespace BizHawk.Emulation.Cores.Components.CP1610 case 0x23D: case 0x23E: case 0x23F: - offset = ReadMemory(RegisterPC++, false); + offset = ReadMemoryWrapper(RegisterPC++, false); cond = opcode & 0xF; ext = opcode & 0x10; // BEXT @@ -1261,8 +1268,8 @@ namespace BizHawk.Emulation.Cores.Components.CP1610 case 0x246: case 0x247: src = (byte)(opcode & 0x7); - addr = ReadMemory(RegisterPC++, false); - WriteMemory(addr, Register[src], false); + addr = ReadMemoryWrapper(RegisterPC++, false); + WriteMemoryWrapper(addr, Register[src], false); cycles = 11; Interruptible = false; break; @@ -1339,8 +1346,8 @@ namespace BizHawk.Emulation.Cores.Components.CP1610 case 0x286: case 0x287: dest = (byte)(opcode & 0x7); - addr = ReadMemory(RegisterPC++, false); - Register[dest] = ReadMemory(addr, false); + addr = ReadMemoryWrapper(RegisterPC++, false); + Register[dest] = ReadMemoryWrapper(addr, false); cycles = 10; Interruptible = true; break; @@ -1417,9 +1424,9 @@ namespace BizHawk.Emulation.Cores.Components.CP1610 case 0x2C6: case 0x2C7: dest = (byte)(opcode & 0x7); - addr = ReadMemory(RegisterPC++, false); + addr = ReadMemoryWrapper(RegisterPC++, false); dest_value = Register[dest]; - addr_read = ReadMemory(addr, false); + addr_read = ReadMemoryWrapper(addr, false); result = dest_value + addr_read; Calc_FlagC(result); Calc_FlagO_Add(dest_value, addr_read, result); @@ -1511,9 +1518,9 @@ namespace BizHawk.Emulation.Cores.Components.CP1610 case 0x306: case 0x307: dest = (byte)(opcode & 0x7); - addr = ReadMemory(RegisterPC++, false); + addr = ReadMemoryWrapper(RegisterPC++, false); dest_value = Register[dest]; - addr_read = ReadMemory(addr, false); + addr_read = ReadMemoryWrapper(addr, false); twos = (0xFFFF ^ addr_read) + 1; result = dest_value + twos; Calc_FlagC(result); @@ -1607,9 +1614,9 @@ namespace BizHawk.Emulation.Cores.Components.CP1610 case 0x346: case 0x347: dest = (byte)(opcode & 0x7); - addr = ReadMemory(RegisterPC++, false); + addr = ReadMemoryWrapper(RegisterPC++, false); dest_value = Register[dest]; - addr_read = ReadMemory(addr, false); + addr_read = ReadMemoryWrapper(addr, false); twos = (0xFFFF ^ addr_read) + 1; result = dest_value + twos; Calc_FlagC(result); @@ -1701,9 +1708,9 @@ namespace BizHawk.Emulation.Cores.Components.CP1610 case 0x386: case 0x387: dest = (byte)(opcode & 0x7); - addr = ReadMemory(RegisterPC++, false); + addr = ReadMemoryWrapper(RegisterPC++, false); dest_value = Register[dest]; - addr_read = ReadMemory(addr, false); + addr_read = ReadMemoryWrapper(addr, false); result = dest_value & addr_read; Calc_FlagS(result); Calc_FlagZ(result); @@ -1788,9 +1795,9 @@ namespace BizHawk.Emulation.Cores.Components.CP1610 case 0x3C6: case 0x3C7: dest = (byte)(opcode & 0x7); - addr = ReadMemory(RegisterPC++, false); + addr = ReadMemoryWrapper(RegisterPC++, false); dest_value = Register[dest]; - addr_read = ReadMemory(addr, false); + addr_read = ReadMemoryWrapper(addr, false); result = dest_value ^ addr_read; Calc_FlagS(result); Calc_FlagZ(result); diff --git a/BizHawk.Emulation.Cores/CPUs/CP1610/CP1610.cs b/BizHawk.Emulation.Cores/CPUs/CP1610/CP1610.cs index 84f78002cd..29c2ea6524 100644 --- a/BizHawk.Emulation.Cores/CPUs/CP1610/CP1610.cs +++ b/BizHawk.Emulation.Cores/CPUs/CP1610/CP1610.cs @@ -25,6 +25,27 @@ namespace BizHawk.Emulation.Cores.Components.CP1610 } public Action TraceCallback; + public IMemoryCallbackSystem MemoryCallbacks { get; set; } + + public ushort ReadMemoryWrapper(ushort addr, bool peek) + { + if (MemoryCallbacks != null && !peek) + { + MemoryCallbacks.CallReads(addr); + } + + return ReadMemory(addr, peek); + } + + public void WriteMemoryWrapper(ushort addr, ushort value, bool poke) + { + if (MemoryCallbacks != null && !poke) + { + MemoryCallbacks.CallWrites(addr); + } + + WriteMemory(addr, value, poke); + } public int TotalExecutedCycles; public int PendingCycles; diff --git a/BizHawk.Emulation.Cores/Consoles/Intellivision/Intellivision.IDebuggable.cs b/BizHawk.Emulation.Cores/Consoles/Intellivision/Intellivision.IDebuggable.cs index e0ad1557d5..addf85d6df 100644 --- a/BizHawk.Emulation.Cores/Consoles/Intellivision/Intellivision.IDebuggable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Intellivision/Intellivision.IDebuggable.cs @@ -82,8 +82,7 @@ namespace BizHawk.Emulation.Cores.Intellivision } } - [FeatureNotImplemented] - public IMemoryCallbackSystem MemoryCallbacks { get { throw new NotImplementedException(); } } + public IMemoryCallbackSystem MemoryCallbacks { get; } = new MemoryCallbackSystem(); public bool CanStep(StepType type) { diff --git a/BizHawk.Emulation.Cores/Consoles/Intellivision/Intellivision.cs b/BizHawk.Emulation.Cores/Consoles/Intellivision/Intellivision.cs index 9ec9410929..a5c89f1eeb 100644 --- a/BizHawk.Emulation.Cores/Consoles/Intellivision/Intellivision.cs +++ b/BizHawk.Emulation.Cores/Consoles/Intellivision/Intellivision.cs @@ -41,7 +41,8 @@ namespace BizHawk.Emulation.Cores.Intellivision _cpu = new CP1610 { ReadMemory = ReadMemory, - WriteMemory = WriteMemory + WriteMemory = WriteMemory, + MemoryCallbacks = MemoryCallbacks }; _cpu.Reset();