using System;
using System.Collections.Generic;
namespace BizHawk.Emulation.Common
{
public delegate void MemoryCallbackDelegate(uint address, uint value, uint flags);
///
/// This is a property of , and defines the means by which a client
/// gets and sets memory callbacks in the core. A memory callback should fire any time memory is
/// read/written/executed by the core, and depends on the type specified by the callback
///
///
public interface IMemoryCallbackSystem : IEnumerable
{
/*
* DANGER:
* Many cores will blindly call CallReads(), CallWrites(), CallExecutes() on every rwx no matter what.
* These functions must return very quickly if the list is empty. Very very quickly.
*/
///
/// Gets a value indicating whether or not Execute callbacks are available for this this implementation
///
bool ExecuteCallbacksAvailable { get; }
///
/// Gets a value indicating whether or not there are currently any read hooks
///
bool HasReads { get; }
///
/// Gets a value indicating whether or not there are currently any write hooks
///
bool HasWrites { get; }
///
/// Gets a value indicating whether or not there are currently any execute hooks
///
bool HasExecutes { get; }
///
/// Gets a value indicating whether or not there are currently any read hooks
///
bool HasReadsForScope(string scope);
///
/// Gets a value indicating whether or not there are currently any write hooks
///
bool HasWritesForScope(string scope);
///
/// Gets a value indicating whether or not there are currently any execute hooks
///
bool HasExecutesForScope(string scope);
///
/// Adds a callback for the given type to the given address
/// If no address is specified the callback will be hooked to all addresses
/// Note: an execute callback can not be added without an address, else an InvalidOperationException will occur
///
/// Thrown when the property of the is not in the
void Add(IMemoryCallback callback);
///
/// Executes all matching callbacks for the given address and domain
///
/// The address to check for callbacks
/// The value contained (or written to) addr
/// The callback flags relevant to this access
/// The scope that the address pertains to. Must be a value in
void CallMemoryCallbacks(uint addr, uint value, uint flags, string scope);
///
/// Removes the given callback from the list
///
void Remove(MemoryCallbackDelegate action);
///
/// Removes the given callbacks from the list
///
void RemoveAll(IEnumerable actions);
///
/// Removes all read,write, and execute callbacks
///
void Clear();
///
/// A list of available "scopes" (memory domains, cpus, etc) that a the property of the can have
/// Passing a into the method that is not in this list will result in an
///
string[] AvailableScopes { get; }
}
///
/// This service defines a memory callback used by an IMemoryCallbackSystem implementation
///
///
public interface IMemoryCallback
{
MemoryCallbackType Type { get; }
string Name { get; }
MemoryCallbackDelegate Callback { get; }
uint? Address { get; }
uint? AddressMask { get; }
string Scope { get; }
}
public enum MemoryCallbackType
{
Read, Write, Execute
}
[Flags]
public enum MemoryCallbackFlags : uint
{
SizeUnknown = 0x00 << 16,
SizeByte = 0x01 << 16,
SizeWord = 0x02 << 16,
SizeLong = 0x03 << 16,
AccessUnknown = 0x00 << 12,
AccessRead = 0x01 << 12,
AccessWrite = 0x02 << 12,
AccessExecute = 0x04 << 12,
CPUUnknown = 0x00 << 8,
CPUZero = 0x01 << 8,
DomainUnknown = 0x00
}
}