diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Events.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Events.cs
index 6fae338a14..a2486a0203 100644
--- a/BizHawk.Client.Common/lua/EmuLuaLibrary.Events.cs
+++ b/BizHawk.Client.Common/lua/EmuLuaLibrary.Events.cs
@@ -17,6 +17,9 @@ namespace BizHawk.Client.Common
[OptionalService]
public IDebuggable DebuggableCore { get; set; }
+ [RequiredService]
+ public IEmulator Emulator { get; set; }
+
private readonly LuaFunctionList _luaFunctions = new LuaFunctionList();
public EventLuaLibrary(Lua lua)
@@ -132,7 +135,12 @@ namespace BizHawk.Client.Common
private void LogMemoryCallbacksNotImplemented()
{
- Log(string.Format("{0} does not implement memory callbacks"));
+ Log(string.Format("{0} does not implement memory callbacks", Emulator.Attributes().CoreName));
+ }
+
+ private void LogMemoryExecuteCallbacksNotImplemented()
+ {
+ Log(string.Format("{0} does not implement memory execute callbacks", Emulator.Attributes().CoreName));
}
#endregion
@@ -212,7 +220,8 @@ namespace BizHawk.Client.Common
{
try
{
- if (DebuggableCore != null)
+ if (DebuggableCore != null && DebuggableCore.MemoryCallbacksAvailable() &&
+ DebuggableCore.MemoryCallbacks.ExecuteCallbacksAvailable)
{
var nlf = new NamedLuaFunction(luaf, "OnMemoryExecute", LogOutputCallback, CurrentThread, name);
_luaFunctions.Add(nlf);
@@ -224,11 +233,11 @@ namespace BizHawk.Client.Common
}
catch(NotImplementedException)
{
- LogMemoryCallbacksNotImplemented();
+ LogMemoryExecuteCallbacksNotImplemented();
return Guid.Empty.ToString();
}
- LogMemoryCallbacksNotImplemented();
+ LogMemoryExecuteCallbacksNotImplemented();
return Guid.Empty.ToString();
}
@@ -240,7 +249,7 @@ namespace BizHawk.Client.Common
{
try
{
- if (DebuggableCore != null)
+ if (DebuggableCore != null && DebuggableCore.MemoryCallbacksAvailable())
{
var nlf = new NamedLuaFunction(luaf, "OnMemoryRead", LogOutputCallback, CurrentThread, name);
_luaFunctions.Add(nlf);
@@ -268,7 +277,7 @@ namespace BizHawk.Client.Common
{
try
{
- if (DebuggableCore != null)
+ if (DebuggableCore != null && DebuggableCore.MemoryCallbacksAvailable())
{
var nlf = new NamedLuaFunction(luaf, "OnMemoryWrite", LogOutputCallback, CurrentThread, name);
_luaFunctions.Add(nlf);
diff --git a/BizHawk.Client.EmuHawk/tools/Debugger/AddBreakpointDialog.Designer.cs b/BizHawk.Client.EmuHawk/tools/Debugger/AddBreakpointDialog.Designer.cs
index dae11ab55a..c7b88092b9 100644
--- a/BizHawk.Client.EmuHawk/tools/Debugger/AddBreakpointDialog.Designer.cs
+++ b/BizHawk.Client.EmuHawk/tools/Debugger/AddBreakpointDialog.Designer.cs
@@ -28,6 +28,7 @@
///
private void InitializeComponent()
{
+ this.components = new System.ComponentModel.Container();
this.AddButton = new System.Windows.Forms.Button();
this.BreakpointTypeGroupbox = new System.Windows.Forms.GroupBox();
this.ExecuteRadio = new System.Windows.Forms.RadioButton();
@@ -35,6 +36,7 @@
this.ReadRadio = new System.Windows.Forms.RadioButton();
this.AddressBox = new BizHawk.Client.EmuHawk.HexTextBox();
this.label1 = new System.Windows.Forms.Label();
+ this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
this.BreakpointTypeGroupbox.SuspendLayout();
this.SuspendLayout();
//
@@ -144,5 +146,6 @@
private System.Windows.Forms.RadioButton ReadRadio;
private HexTextBox AddressBox;
private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.ToolTip toolTip1;
}
}
\ No newline at end of file
diff --git a/BizHawk.Client.EmuHawk/tools/Debugger/AddBreakpointDialog.cs b/BizHawk.Client.EmuHawk/tools/Debugger/AddBreakpointDialog.cs
index 695a5d1ff0..d14da0c99d 100644
--- a/BizHawk.Client.EmuHawk/tools/Debugger/AddBreakpointDialog.cs
+++ b/BizHawk.Client.EmuHawk/tools/Debugger/AddBreakpointDialog.cs
@@ -18,6 +18,17 @@ namespace BizHawk.Client.EmuHawk
InitializeComponent();
}
+ public void DisableExecuteOption()
+ {
+ if (ExecuteRadio.Checked)
+ {
+ ReadRadio.Checked = true;
+ }
+
+ ExecuteRadio.Enabled = false;
+
+ }
+
public MemoryCallbackType BreakType
{
get
diff --git a/BizHawk.Client.EmuHawk/tools/Debugger/AddBreakpointDialog.resx b/BizHawk.Client.EmuHawk/tools/Debugger/AddBreakpointDialog.resx
index 29dcb1b3a3..65a871b69c 100644
--- a/BizHawk.Client.EmuHawk/tools/Debugger/AddBreakpointDialog.resx
+++ b/BizHawk.Client.EmuHawk/tools/Debugger/AddBreakpointDialog.resx
@@ -117,4 +117,7 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ 17, 17
+
\ No newline at end of file
diff --git a/BizHawk.Client.EmuHawk/tools/Debugger/BreakpointControl.cs b/BizHawk.Client.EmuHawk/tools/Debugger/BreakpointControl.cs
index 62e570200c..08f052fb6c 100644
--- a/BizHawk.Client.EmuHawk/tools/Debugger/BreakpointControl.cs
+++ b/BizHawk.Client.EmuHawk/tools/Debugger/BreakpointControl.cs
@@ -150,6 +150,11 @@ namespace BizHawk.Client.EmuHawk.tools.Debugger
MaxAddressSize = Global.Emulator.AsMemoryDomains().SystemBus.Size - 1
};
+ if (!MCS.ExecuteCallbacksAvailable)
+ {
+ b.DisableExecuteOption();
+ }
+
if (b.ShowHawkDialog() == DialogResult.OK)
{
Breakpoints.Add(Core, b.Address, b.BreakType);
diff --git a/BizHawk.Emulation.Common/Base Implementations/MemoryCallbackSystem.cs b/BizHawk.Emulation.Common/Base Implementations/MemoryCallbackSystem.cs
index c9d7b9ac6f..9a14debc4e 100644
--- a/BizHawk.Emulation.Common/Base Implementations/MemoryCallbackSystem.cs
+++ b/BizHawk.Emulation.Common/Base Implementations/MemoryCallbackSystem.cs
@@ -8,6 +8,11 @@ namespace BizHawk.Emulation.Common
{
public class MemoryCallbackSystem : IMemoryCallbackSystem
{
+ public MemoryCallbackSystem()
+ {
+ ExecuteCallbacksAvailable = true;
+ }
+
private readonly List Reads = new List();
private readonly List Writes = new List();
private readonly List Execs = new List();
@@ -18,6 +23,8 @@ namespace BizHawk.Emulation.Common
private bool _hasWrites = false;
private bool _hasExecutes = false;
+ public bool ExecuteCallbacksAvailable { get; set; }
+
public void Add(IMemoryCallback callback)
{
switch (callback.Type)
diff --git a/BizHawk.Emulation.Common/Extensions.cs b/BizHawk.Emulation.Common/Extensions.cs
index ed73ed2bfc..16387bc5b7 100644
--- a/BizHawk.Emulation.Common/Extensions.cs
+++ b/BizHawk.Emulation.Common/Extensions.cs
@@ -136,7 +136,7 @@ namespace BizHawk.Emulation.Common.IEmulatorExtensions
{
try
{
- var tracer = debuggable.MemoryCallbacks;
+ var callbacks = debuggable.MemoryCallbacks;
return true;
}
catch (NotImplementedException)
@@ -148,6 +148,24 @@ namespace BizHawk.Emulation.Common.IEmulatorExtensions
return false;
}
+ public static bool MemoryCallbacksAvailable(this IDebuggable core)
+ {
+ if (core == null)
+ {
+ return false;
+ }
+
+ try
+ {
+ var callbacks = core.MemoryCallbacks;
+ return true;
+ }
+ catch (NotImplementedException)
+ {
+ return false;
+ }
+ }
+
public static bool CanDisassemble(this IEmulator core)
{
if (core == null)
diff --git a/BizHawk.Emulation.Common/Interfaces/IMemoryCallbackSystem.cs b/BizHawk.Emulation.Common/Interfaces/IMemoryCallbackSystem.cs
index d9230ca409..b2a60cc4e7 100644
--- a/BizHawk.Emulation.Common/Interfaces/IMemoryCallbackSystem.cs
+++ b/BizHawk.Emulation.Common/Interfaces/IMemoryCallbackSystem.cs
@@ -11,6 +11,11 @@ namespace BizHawk.Emulation.Common
* These functions must return very quickly if the list is empty. Very very quickly.
*/
+ ///
+ /// Specifies whether or not Execute callbacks are available for this this implementation
+ ///
+ bool ExecuteCallbacksAvailable { get; }
+
///
/// Returns whether or not there are currently any read hooks
///
diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64.cs
index 9c542e17b4..dad320ffe1 100644
--- a/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64.cs
+++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64.cs
@@ -54,7 +54,10 @@ namespace BizHawk.Emulation.Cores.Nintendo.N64
{
ServiceProvider = new BasicServiceProvider(this);
InputCallbacks = new InputCallbackSystem();
- MemoryCallbacks = new MemoryCallbackSystem();
+ MemoryCallbacks = new MemoryCallbackSystem
+ {
+ ExecuteCallbacksAvailable = false
+ };
int SaveType = 0;
if (game.OptionValue("SaveType") == "EEPROM_16K")