Mesen-X/GUI.NET/Debugger/ByteColorProvider.cs

71 lines
2.8 KiB
C#

using System;
using System.Drawing;
using Be.Windows.Forms;
namespace Mesen.GUI.Debugger
{
public class ByteColorProvider : IByteColorProvider
{
DebugMemoryType _memoryType;
Int32[] _readStamps;
Int32[] _writeStamps;
Int32[] _execStamps;
bool[] _freezeState;
DebugState _state = new DebugState();
bool _showExec;
bool _showWrite;
bool _showRead;
int _framesToFade;
public ByteColorProvider(DebugMemoryType memoryType, bool showExec, bool showWrite, bool showRead, int framesToFade)
{
_memoryType = memoryType;
_showExec = showExec;
_showWrite = showWrite;
_showRead = showRead;
_framesToFade = framesToFade;
}
public void Prepare(long firstByteIndex, long lastByteIndex)
{
_readStamps = InteropEmu.DebugGetMemoryAccessStamps((UInt32)firstByteIndex, (UInt32)(lastByteIndex - firstByteIndex + 1), _memoryType, MemoryOperationType.Read);
_writeStamps = InteropEmu.DebugGetMemoryAccessStamps((UInt32)firstByteIndex, (UInt32)(lastByteIndex - firstByteIndex + 1), _memoryType, MemoryOperationType.Write);
_execStamps = InteropEmu.DebugGetMemoryAccessStamps((UInt32)firstByteIndex, (UInt32)(lastByteIndex - firstByteIndex + 1), _memoryType, MemoryOperationType.Exec);
if(_memoryType == DebugMemoryType.CpuMemory) {
_freezeState = InteropEmu.DebugGetFreezeState((UInt16)firstByteIndex, (UInt16)(lastByteIndex - firstByteIndex + 1));
}
InteropEmu.DebugGetState(ref _state);
}
public Color DarkerColor(Color input, double brightnessPercentage)
{
if(brightnessPercentage < 0.20) {
brightnessPercentage *= 5;
} else {
brightnessPercentage = 1.0;
}
return Color.FromArgb((int)(input.R * brightnessPercentage), (int)(input.G * brightnessPercentage), (int)(input.B * brightnessPercentage));
}
public Color GetByteColor(long firstByteIndex, long byteIndex)
{
const int CyclesPerFrame = 29780;
long index = byteIndex - firstByteIndex;
double framesSinceExec = (double)(_state.CPU.CycleCount - _execStamps[index]) / CyclesPerFrame;
double framesSinceWrite = (double)(_state.CPU.CycleCount - _writeStamps[index]) / CyclesPerFrame;
double framesSinceRead = (double)(_state.CPU.CycleCount - _readStamps[index]) / CyclesPerFrame;
if(_freezeState != null && _freezeState[index]) {
return Color.Magenta;
} else if(_showExec && _execStamps[index] != 0 && framesSinceExec < _framesToFade) {
return DarkerColor(Color.Green, (_framesToFade - framesSinceExec) / _framesToFade);
} else if(_showWrite && _writeStamps[index] != 0 && framesSinceWrite < _framesToFade) {
return DarkerColor(Color.Red, (_framesToFade - framesSinceWrite) / _framesToFade);
} else if(_showRead && _readStamps[index] != 0 && framesSinceRead < _framesToFade) {
return DarkerColor(Color.Blue, (_framesToFade - framesSinceRead) / _framesToFade);
}
return Color.Black;
}
}
}