Debugger breakpoint improvements (Conditional breaks, vram breaks, absolute address breaks, etc.)
This commit is contained in:
parent
056c71abd5
commit
a0d6e2d547
28 changed files with 1282 additions and 415 deletions
|
@ -2,11 +2,30 @@
|
||||||
|
|
||||||
#include "Breakpoint.h"
|
#include "Breakpoint.h"
|
||||||
|
|
||||||
Breakpoint::Breakpoint(BreakpointType type, uint32_t addr, bool isAbsoluteAddr)
|
Breakpoint::Breakpoint()
|
||||||
{
|
{
|
||||||
UpdateBreakpoint(type, addr, isAbsoluteAddr, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Breakpoint::~Breakpoint()
|
Breakpoint::~Breakpoint()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Breakpoint::Matches(uint32_t memoryAddr, uint32_t absoluteAddr)
|
||||||
|
{
|
||||||
|
return _addr == -1 || (memoryAddr == _addr && !_isAbsoluteAddr) || (absoluteAddr == _addr && _isAbsoluteAddr);
|
||||||
|
}
|
||||||
|
|
||||||
|
BreakpointType Breakpoint::GetType()
|
||||||
|
{
|
||||||
|
return _type;
|
||||||
|
}
|
||||||
|
|
||||||
|
string Breakpoint::GetCondition()
|
||||||
|
{
|
||||||
|
return _condition;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Breakpoint::ClearCondition()
|
||||||
|
{
|
||||||
|
memset(_condition, 0, sizeof(_condition));
|
||||||
|
}
|
|
@ -1,70 +1,31 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
#include "ExpressionEvaluator.h"
|
||||||
|
|
||||||
enum class BreakpointType
|
enum BreakpointType
|
||||||
{
|
{
|
||||||
Execute = 0,
|
Global = 0,
|
||||||
Read = 1,
|
Execute = 1,
|
||||||
Write = 2
|
ReadRam = 2,
|
||||||
|
WriteRam = 4,
|
||||||
|
ReadVram = 8,
|
||||||
|
WriteVram = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
class Breakpoint
|
class Breakpoint
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Breakpoint(BreakpointType type, uint32_t addr, bool isAbsoluteAddr);
|
Breakpoint();
|
||||||
~Breakpoint();
|
~Breakpoint();
|
||||||
|
|
||||||
bool Matches(uint32_t memoryAddr, uint32_t absoluteAddr)
|
bool Matches(uint32_t memoryAddr, uint32_t absoluteAddr);
|
||||||
{
|
BreakpointType GetType();
|
||||||
return _enabled && ((memoryAddr == _addr && !_isAbsoluteAddr) || (absoluteAddr == _addr && _isAbsoluteAddr));
|
string GetCondition();
|
||||||
}
|
void ClearCondition();
|
||||||
|
|
||||||
uint32_t GetAddr()
|
|
||||||
{
|
|
||||||
return _addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsAbsoluteAddr()
|
|
||||||
{
|
|
||||||
return _isAbsoluteAddr;
|
|
||||||
}
|
|
||||||
|
|
||||||
BreakpointType GetType()
|
|
||||||
{
|
|
||||||
return _type;
|
|
||||||
}
|
|
||||||
|
|
||||||
string GetTypeText()
|
|
||||||
{
|
|
||||||
switch(_type) {
|
|
||||||
case BreakpointType::Execute: return "Exec";
|
|
||||||
case BreakpointType::Read: return "Read";
|
|
||||||
case BreakpointType::Write: return "Write";
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsEnabled()
|
|
||||||
{
|
|
||||||
return _enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetEnabled(bool enabled)
|
|
||||||
{
|
|
||||||
_enabled = enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateBreakpoint(BreakpointType type, uint32_t addr, bool isAbsoluteAddr, bool enabled)
|
|
||||||
{
|
|
||||||
_type = type;
|
|
||||||
_addr = addr;
|
|
||||||
_isAbsoluteAddr = isAbsoluteAddr;
|
|
||||||
_enabled = enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
BreakpointType _type;
|
BreakpointType _type;
|
||||||
uint32_t _addr;
|
int32_t _addr;
|
||||||
bool _isAbsoluteAddr;
|
bool _isAbsoluteAddr;
|
||||||
bool _enabled;
|
char _condition[1000];
|
||||||
};
|
};
|
|
@ -271,6 +271,7 @@
|
||||||
<ClInclude Include="BF909x.h" />
|
<ClInclude Include="BF909x.h" />
|
||||||
<ClInclude Include="BnRom.h" />
|
<ClInclude Include="BnRom.h" />
|
||||||
<ClInclude Include="DefaultVideoFilter.h" />
|
<ClInclude Include="DefaultVideoFilter.h" />
|
||||||
|
<ClInclude Include="ExpressionEvaluator.h" />
|
||||||
<ClInclude Include="HdVideoFilter.h" />
|
<ClInclude Include="HdVideoFilter.h" />
|
||||||
<ClInclude Include="Namco108.h" />
|
<ClInclude Include="Namco108.h" />
|
||||||
<ClInclude Include="Namco108_154.h" />
|
<ClInclude Include="Namco108_154.h" />
|
||||||
|
@ -379,6 +380,7 @@
|
||||||
<ClCompile Include="Disassembler.cpp" />
|
<ClCompile Include="Disassembler.cpp" />
|
||||||
<ClCompile Include="DisassemblyInfo.cpp" />
|
<ClCompile Include="DisassemblyInfo.cpp" />
|
||||||
<ClCompile Include="EmulationSettings.cpp" />
|
<ClCompile Include="EmulationSettings.cpp" />
|
||||||
|
<ClCompile Include="ExpressionEvaluator.cpp" />
|
||||||
<ClCompile Include="GameClient.cpp" />
|
<ClCompile Include="GameClient.cpp" />
|
||||||
<ClCompile Include="GameClientConnection.cpp" />
|
<ClCompile Include="GameClientConnection.cpp" />
|
||||||
<ClCompile Include="GameConnection.cpp" />
|
<ClCompile Include="GameConnection.cpp" />
|
||||||
|
|
|
@ -332,6 +332,9 @@
|
||||||
<ClInclude Include="HdVideoFilter.h">
|
<ClInclude Include="HdVideoFilter.h">
|
||||||
<Filter>VideoDecoder\HD</Filter>
|
<Filter>VideoDecoder\HD</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="ExpressionEvaluator.h">
|
||||||
|
<Filter>Debugger</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="stdafx.cpp">
|
<ClCompile Include="stdafx.cpp">
|
||||||
|
@ -436,5 +439,8 @@
|
||||||
<ClCompile Include="HdVideoFilter.cpp">
|
<ClCompile Include="HdVideoFilter.cpp">
|
||||||
<Filter>VideoDecoder\HD</Filter>
|
<Filter>VideoDecoder\HD</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="ExpressionEvaluator.cpp">
|
||||||
|
<Filter>Debugger</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
|
@ -8,6 +8,7 @@
|
||||||
#include "VideoDecoder.h"
|
#include "VideoDecoder.h"
|
||||||
#include "APU.h"
|
#include "APU.h"
|
||||||
#include "CodeDataLogger.h"
|
#include "CodeDataLogger.h"
|
||||||
|
#include "ExpressionEvaluator.h"
|
||||||
|
|
||||||
Debugger* Debugger::Instance = nullptr;
|
Debugger* Debugger::Instance = nullptr;
|
||||||
|
|
||||||
|
@ -84,69 +85,82 @@ CdlRatios Debugger::GetCdlRatios()
|
||||||
return _codeDataLogger->GetRatios();
|
return _codeDataLogger->GetRatios();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Debugger::AddBreakpoint(BreakpointType type, uint32_t address, bool isAbsoluteAddr, bool enabled)
|
void Debugger::SetBreakpoints(Breakpoint breakpoints[], uint32_t length)
|
||||||
{
|
{
|
||||||
_bpLock.Acquire();
|
_bpLock.AcquireSafe();
|
||||||
|
|
||||||
if(isAbsoluteAddr) {
|
_globalBreakpoints.clear();
|
||||||
address = _mapper->ToAbsoluteAddress(address);
|
_execBreakpoints.clear();
|
||||||
|
_readBreakpoints.clear();
|
||||||
|
_writeBreakpoints.clear();
|
||||||
|
_readVramBreakpoints.clear();
|
||||||
|
_writeVramBreakpoints.clear();
|
||||||
|
|
||||||
|
ExpressionEvaluator expEval;
|
||||||
|
for(uint32_t i = 0; i < length; i++) {
|
||||||
|
Breakpoint& bp = breakpoints[i];
|
||||||
|
|
||||||
|
if(!expEval.Validate(bp.GetCondition())) {
|
||||||
|
//Remove any invalid condition (syntax-wise)
|
||||||
|
bp.ClearCondition();
|
||||||
}
|
}
|
||||||
|
|
||||||
shared_ptr<Breakpoint> breakpoint(new Breakpoint(type, address, isAbsoluteAddr));
|
BreakpointType type = bp.GetType();
|
||||||
breakpoint->SetEnabled(enabled);
|
if(type & BreakpointType::Execute) {
|
||||||
switch(type) {
|
_execBreakpoints.push_back(bp);
|
||||||
case BreakpointType::Execute: _execBreakpoints.push_back(breakpoint); break;
|
}
|
||||||
case BreakpointType::Read: _readBreakpoints.push_back(breakpoint); break;
|
if(type & BreakpointType::ReadRam) {
|
||||||
case BreakpointType::Write: _writeBreakpoints.push_back(breakpoint); break;
|
_readBreakpoints.push_back(bp);
|
||||||
|
}
|
||||||
|
if(type & BreakpointType::ReadVram) {
|
||||||
|
_readVramBreakpoints.push_back(bp);
|
||||||
|
}
|
||||||
|
if(type & BreakpointType::WriteRam) {
|
||||||
|
_writeBreakpoints.push_back(bp);
|
||||||
|
}
|
||||||
|
if(type & BreakpointType::WriteVram) {
|
||||||
|
_writeVramBreakpoints.push_back(bp);
|
||||||
|
}
|
||||||
|
if(type == BreakpointType::Global) {
|
||||||
|
_globalBreakpoints.push_back(bp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_bpLock.Release();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Debugger::RemoveBreakpoint(BreakpointType type, uint32_t address, bool isAbsoluteAddr)
|
bool Debugger::HasMatchingBreakpoint(BreakpointType type, uint32_t addr, int16_t value)
|
||||||
{
|
|
||||||
_bpLock.Acquire();
|
|
||||||
|
|
||||||
vector<shared_ptr<Breakpoint>> *breakpoints = nullptr;
|
|
||||||
switch(type) {
|
|
||||||
case BreakpointType::Execute: breakpoints = &_execBreakpoints; break;
|
|
||||||
case BreakpointType::Read: breakpoints = &_readBreakpoints; break;
|
|
||||||
case BreakpointType::Write: breakpoints = &_writeBreakpoints; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
shared_ptr<Breakpoint> breakpoint = GetMatchingBreakpoint(type, address);
|
|
||||||
for(size_t i = 0, len = breakpoints->size(); i < len; i++) {
|
|
||||||
shared_ptr<Breakpoint> breakpoint = (*breakpoints)[i];
|
|
||||||
if(breakpoint->GetAddr() == address && breakpoint->IsAbsoluteAddr() == isAbsoluteAddr) {
|
|
||||||
breakpoints->erase(breakpoints->begin() + i);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_bpLock.Release();
|
|
||||||
}
|
|
||||||
|
|
||||||
shared_ptr<Breakpoint> Debugger::GetMatchingBreakpoint(BreakpointType type, uint32_t addr)
|
|
||||||
{
|
{
|
||||||
uint32_t absoluteAddr = _mapper->ToAbsoluteAddress(addr);
|
uint32_t absoluteAddr = _mapper->ToAbsoluteAddress(addr);
|
||||||
vector<shared_ptr<Breakpoint>> *breakpoints = nullptr;
|
vector<Breakpoint> *breakpoints = nullptr;
|
||||||
|
|
||||||
switch(type) {
|
switch(type) {
|
||||||
|
case BreakpointType::Global: breakpoints = &_globalBreakpoints; break;
|
||||||
case BreakpointType::Execute: breakpoints = &_execBreakpoints; break;
|
case BreakpointType::Execute: breakpoints = &_execBreakpoints; break;
|
||||||
case BreakpointType::Read: breakpoints = &_readBreakpoints; break;
|
case BreakpointType::ReadRam: breakpoints = &_readBreakpoints; break;
|
||||||
case BreakpointType::Write: breakpoints = &_writeBreakpoints; break;
|
case BreakpointType::WriteRam: breakpoints = &_writeBreakpoints; break;
|
||||||
|
case BreakpointType::ReadVram: breakpoints = &_readVramBreakpoints; break;
|
||||||
|
case BreakpointType::WriteVram: breakpoints = &_writeVramBreakpoints; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
_bpLock.Acquire();
|
DebugState state;
|
||||||
|
GetState(&state);
|
||||||
|
|
||||||
|
_bpLock.AcquireSafe();
|
||||||
for(size_t i = 0, len = breakpoints->size(); i < len; i++) {
|
for(size_t i = 0, len = breakpoints->size(); i < len; i++) {
|
||||||
shared_ptr<Breakpoint> breakpoint = (*breakpoints)[i];
|
Breakpoint &breakpoint = (*breakpoints)[i];
|
||||||
if(breakpoint->Matches(addr, absoluteAddr)) {
|
if(type == BreakpointType::Global || breakpoint.Matches(addr, absoluteAddr)) {
|
||||||
_bpLock.Release();
|
string condition = breakpoint.GetCondition();
|
||||||
return breakpoint;
|
if(condition.empty()) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
ExpressionEvaluator expEval;
|
||||||
|
if(expEval.Evaluate(condition, state, value)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_bpLock.Release();
|
return false;
|
||||||
return shared_ptr<Breakpoint>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Debugger::UpdateCallstack(uint32_t addr)
|
void Debugger::UpdateCallstack(uint32_t addr)
|
||||||
|
@ -180,28 +194,20 @@ void Debugger::ProcessStepConditions(uint32_t addr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Debugger::BreakOnBreakpoint(MemoryOperationType type, uint32_t addr)
|
void Debugger::PrivateProcessPpuCycle()
|
||||||
{
|
{
|
||||||
BreakpointType breakpointType;
|
_breakLock.AcquireSafe();
|
||||||
switch(type) {
|
|
||||||
case MemoryOperationType::Read: breakpointType = BreakpointType::Read; break;
|
|
||||||
case MemoryOperationType::Write: breakpointType = BreakpointType::Write; break;
|
|
||||||
|
|
||||||
default:
|
if(HasMatchingBreakpoint(BreakpointType::Global, 0, -1)) {
|
||||||
case MemoryOperationType::ExecOpCode:
|
|
||||||
case MemoryOperationType::ExecOperand: breakpointType = BreakpointType::Execute; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(GetMatchingBreakpoint(breakpointType, addr)) {
|
|
||||||
//Found a matching breakpoint, stop execution
|
//Found a matching breakpoint, stop execution
|
||||||
Step(1);
|
Step(1);
|
||||||
SleepUntilResume();
|
SleepUntilResume();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Debugger::PrivateProcessRamOperation(MemoryOperationType type, uint16_t &addr)
|
void Debugger::PrivateProcessRamOperation(MemoryOperationType type, uint16_t &addr, uint8_t value)
|
||||||
{
|
{
|
||||||
_breakLock.Acquire();
|
_breakLock.AcquireSafe();
|
||||||
|
|
||||||
_currentReadAddr = &addr;
|
_currentReadAddr = &addr;
|
||||||
|
|
||||||
|
@ -226,12 +232,29 @@ void Debugger::PrivateProcessRamOperation(MemoryOperationType type, uint16_t &ad
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!breakDone) {
|
if(!breakDone) {
|
||||||
BreakOnBreakpoint(type, addr);
|
BreakOnBreakpoint(type, addr, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
_currentReadAddr = nullptr;
|
_currentReadAddr = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
_breakLock.Release();
|
void Debugger::BreakOnBreakpoint(MemoryOperationType type, uint32_t addr, uint8_t value)
|
||||||
|
{
|
||||||
|
BreakpointType breakpointType;
|
||||||
|
switch(type) {
|
||||||
|
case MemoryOperationType::Read: breakpointType = BreakpointType::ReadRam; break;
|
||||||
|
case MemoryOperationType::Write: breakpointType = BreakpointType::WriteRam; break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
case MemoryOperationType::ExecOpCode:
|
||||||
|
case MemoryOperationType::ExecOperand: breakpointType = BreakpointType::Execute; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(HasMatchingBreakpoint(breakpointType, addr, (type == MemoryOperationType::ExecOperand) ? -1 : value)) {
|
||||||
|
//Found a matching breakpoint, stop execution
|
||||||
|
Step(1);
|
||||||
|
SleepUntilResume();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Debugger::SleepUntilResume()
|
bool Debugger::SleepUntilResume()
|
||||||
|
@ -256,10 +279,18 @@ bool Debugger::SleepUntilResume()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Debugger::PrivateProcessVramOperation(MemoryOperationType type, uint16_t addr)
|
void Debugger::PrivateProcessVramOperation(MemoryOperationType type, uint16_t addr, uint8_t value)
|
||||||
{
|
{
|
||||||
|
if(type != MemoryOperationType::Write) {
|
||||||
int32_t absoluteAddr = _mapper->ToAbsoluteChrAddress(addr);
|
int32_t absoluteAddr = _mapper->ToAbsoluteChrAddress(addr);
|
||||||
_codeDataLogger->SetFlag(absoluteAddr, type == MemoryOperationType::Read ? CdlChrFlags::Read : CdlChrFlags::Drawn);
|
_codeDataLogger->SetFlag(absoluteAddr, type == MemoryOperationType::Read ? CdlChrFlags::Read : CdlChrFlags::Drawn);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(HasMatchingBreakpoint(type == MemoryOperationType::Write ? BreakpointType::WriteVram : BreakpointType::ReadVram, addr, value)) {
|
||||||
|
//Found a matching breakpoint, stop execution
|
||||||
|
Step(1);
|
||||||
|
SleepUntilResume();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Debugger::GetState(DebugState *state)
|
void Debugger::GetState(DebugState *state)
|
||||||
|
@ -373,17 +404,24 @@ void Debugger::SetNextStatement(uint16_t addr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Debugger::ProcessRamOperation(MemoryOperationType type, uint16_t &addr)
|
void Debugger::ProcessPpuCycle()
|
||||||
{
|
{
|
||||||
if(Debugger::Instance) {
|
if(Debugger::Instance) {
|
||||||
Debugger::Instance->PrivateProcessRamOperation(type, addr);
|
Debugger::Instance->PrivateProcessPpuCycle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Debugger::ProcessVramOperation(MemoryOperationType type, uint16_t addr)
|
void Debugger::ProcessRamOperation(MemoryOperationType type, uint16_t &addr, uint8_t value)
|
||||||
{
|
{
|
||||||
if(Debugger::Instance) {
|
if(Debugger::Instance) {
|
||||||
Debugger::Instance->PrivateProcessVramOperation(type, addr);
|
Debugger::Instance->PrivateProcessRamOperation(type, addr, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Debugger::ProcessVramOperation(MemoryOperationType type, uint16_t addr, uint8_t value)
|
||||||
|
{
|
||||||
|
if(Debugger::Instance) {
|
||||||
|
Debugger::Instance->PrivateProcessVramOperation(type, addr, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,9 +45,14 @@ private:
|
||||||
shared_ptr<PPU> _ppu;
|
shared_ptr<PPU> _ppu;
|
||||||
shared_ptr<MemoryManager> _memoryManager;
|
shared_ptr<MemoryManager> _memoryManager;
|
||||||
shared_ptr<BaseMapper> _mapper;
|
shared_ptr<BaseMapper> _mapper;
|
||||||
vector<shared_ptr<Breakpoint>> _readBreakpoints;
|
|
||||||
vector<shared_ptr<Breakpoint>> _writeBreakpoints;
|
vector<Breakpoint> _readBreakpoints;
|
||||||
vector<shared_ptr<Breakpoint>> _execBreakpoints;
|
vector<Breakpoint> _writeBreakpoints;
|
||||||
|
vector<Breakpoint> _execBreakpoints;
|
||||||
|
vector<Breakpoint> _globalBreakpoints;
|
||||||
|
vector<Breakpoint> _readVramBreakpoints;
|
||||||
|
vector<Breakpoint> _writeVramBreakpoints;
|
||||||
|
|
||||||
deque<uint32_t> _callstackAbsolute;
|
deque<uint32_t> _callstackAbsolute;
|
||||||
deque<uint32_t> _callstackRelative;
|
deque<uint32_t> _callstackRelative;
|
||||||
|
|
||||||
|
@ -65,22 +70,20 @@ private:
|
||||||
atomic<int32_t> _stepOverAddr;
|
atomic<int32_t> _stepOverAddr;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void PrivateProcessRamOperation(MemoryOperationType type, uint16_t &addr);
|
void PrivateProcessPpuCycle();
|
||||||
void PrivateProcessVramOperation(MemoryOperationType type, uint16_t addr);
|
void PrivateProcessRamOperation(MemoryOperationType type, uint16_t &addr, uint8_t value);
|
||||||
shared_ptr<Breakpoint> GetMatchingBreakpoint(BreakpointType type, uint32_t addr);
|
void PrivateProcessVramOperation(MemoryOperationType type, uint16_t addr, uint8_t value);
|
||||||
|
bool HasMatchingBreakpoint(BreakpointType type, uint32_t addr, int16_t value);
|
||||||
void UpdateCallstack(uint32_t addr);
|
void UpdateCallstack(uint32_t addr);
|
||||||
void ProcessStepConditions(uint32_t addr);
|
void ProcessStepConditions(uint32_t addr);
|
||||||
void BreakOnBreakpoint(MemoryOperationType type, uint32_t addr);
|
void BreakOnBreakpoint(MemoryOperationType type, uint32_t addr, uint8_t value);
|
||||||
bool SleepUntilResume();
|
bool SleepUntilResume();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Debugger(shared_ptr<Console> console, shared_ptr<CPU> cpu, shared_ptr<PPU> ppu, shared_ptr<MemoryManager> memoryManager, shared_ptr<BaseMapper> mapper);
|
Debugger(shared_ptr<Console> console, shared_ptr<CPU> cpu, shared_ptr<PPU> ppu, shared_ptr<MemoryManager> memoryManager, shared_ptr<BaseMapper> mapper);
|
||||||
~Debugger();
|
~Debugger();
|
||||||
|
|
||||||
void AddBreakpoint(BreakpointType type, uint32_t address, bool isAbsoluteAddr, bool enabled);
|
void SetBreakpoints(Breakpoint breakpoints[], uint32_t length);
|
||||||
void RemoveBreakpoint(BreakpointType type, uint32_t address, bool isAbsoluteAddr);
|
|
||||||
vector<shared_ptr<Breakpoint>> GetBreakpoints();
|
|
||||||
vector<uint32_t> GetExecBreakpointAddresses();
|
|
||||||
|
|
||||||
uint32_t GetMemoryState(DebugMemoryType type, uint8_t *buffer);
|
uint32_t GetMemoryState(DebugMemoryType type, uint8_t *buffer);
|
||||||
void GetNametable(int nametableIndex, uint32_t* frameBuffer, uint8_t* tileData, uint8_t* paletteData);
|
void GetNametable(int nametableIndex, uint32_t* frameBuffer, uint8_t* tileData, uint8_t* paletteData);
|
||||||
|
@ -112,8 +115,9 @@ public:
|
||||||
uint8_t GetMemoryValue(uint32_t addr);
|
uint8_t GetMemoryValue(uint32_t addr);
|
||||||
uint32_t GetRelativeAddress(uint32_t addr);
|
uint32_t GetRelativeAddress(uint32_t addr);
|
||||||
|
|
||||||
static void ProcessRamOperation(MemoryOperationType type, uint16_t &addr);
|
static void ProcessRamOperation(MemoryOperationType type, uint16_t &addr, uint8_t value);
|
||||||
static void ProcessVramOperation(MemoryOperationType type, uint16_t addr);
|
static void ProcessVramOperation(MemoryOperationType type, uint16_t addr, uint8_t value);
|
||||||
|
static void ProcessPpuCycle();
|
||||||
|
|
||||||
static void BreakIfDebugging();
|
static void BreakIfDebugging();
|
||||||
};
|
};
|
325
Core/ExpressionEvaluator.cpp
Normal file
325
Core/ExpressionEvaluator.cpp
Normal file
|
@ -0,0 +1,325 @@
|
||||||
|
#include "stdafx.h"
|
||||||
|
#include "ExpressionEvaluator.h"
|
||||||
|
#include "Console.h"
|
||||||
|
#include "Debugger.h"
|
||||||
|
|
||||||
|
std::unordered_map<string, std::vector<int>, StringHasher> ExpressionEvaluator::_outputCache;
|
||||||
|
SimpleLock ExpressionEvaluator::_cacheLock;
|
||||||
|
|
||||||
|
bool ExpressionEvaluator::IsOperator(string token, int &precedence, bool unaryOperator)
|
||||||
|
{
|
||||||
|
if(unaryOperator) {
|
||||||
|
for(size_t i = 0, len = _unaryOperators.size(); i < len; i++) {
|
||||||
|
if(token.compare(_unaryOperators[i]) == 0) {
|
||||||
|
precedence = _unaryPrecedence[i];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for(size_t i = 0, len = _binaryOperators.size(); i < len; i++) {
|
||||||
|
if(token.compare(_binaryOperators[i]) == 0) {
|
||||||
|
precedence = _binaryPrecedence[i];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
EvalOperators ExpressionEvaluator::GetOperator(string token, bool unaryOperator)
|
||||||
|
{
|
||||||
|
if(unaryOperator) {
|
||||||
|
for(size_t i = 0, len = _unaryOperators.size(); i < len; i++) {
|
||||||
|
if(token.compare(_unaryOperators[i]) == 0) {
|
||||||
|
return (EvalOperators)(2000000050 + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for(size_t i = 0, len = _binaryOperators.size(); i < len; i++) {
|
||||||
|
if(token.compare(_binaryOperators[i]) == 0) {
|
||||||
|
return (EvalOperators)(2000000000 + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return EvalOperators::Addition;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExpressionEvaluator::CheckSpecialTokens(string expression, size_t &pos, string &output)
|
||||||
|
{
|
||||||
|
string token;
|
||||||
|
size_t len = expression.size();
|
||||||
|
do {
|
||||||
|
char c = std::tolower(expression[pos]);
|
||||||
|
if(c >= 'a' && c <= 'z') {
|
||||||
|
token += expression[pos];
|
||||||
|
pos++;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while(pos < len);
|
||||||
|
|
||||||
|
if(!token.compare("a")) {
|
||||||
|
output += std::to_string(EvalValues::RegA);
|
||||||
|
} else if(!token.compare("x")) {
|
||||||
|
output += std::to_string(EvalValues::RegX);
|
||||||
|
} else if(!token.compare("y")) {
|
||||||
|
output += std::to_string(EvalValues::RegY);
|
||||||
|
} else if(!token.compare("ps")) {
|
||||||
|
output += std::to_string(EvalValues::RegPS);
|
||||||
|
} else if(!token.compare("sp")) {
|
||||||
|
output += std::to_string(EvalValues::RegSP);
|
||||||
|
} else if(!token.compare("cycle")) {
|
||||||
|
output += std::to_string(EvalValues::PpuCycle);
|
||||||
|
} else if(!token.compare("scanline")) {
|
||||||
|
output += std::to_string(EvalValues::PpuScanline);
|
||||||
|
} else if(!token.compare("irq")) {
|
||||||
|
output += std::to_string(EvalValues::Irq);
|
||||||
|
} else if(!token.compare("nmi")) {
|
||||||
|
output += std::to_string(EvalValues::Nmi);
|
||||||
|
} else if(!token.compare("value")) {
|
||||||
|
output += std::to_string(EvalValues::Value);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
string ExpressionEvaluator::GetNextToken(string expression, size_t &pos)
|
||||||
|
{
|
||||||
|
string output;
|
||||||
|
bool isOperator = false;
|
||||||
|
bool isNumber = false;
|
||||||
|
bool isHex = false;
|
||||||
|
size_t initialPos = pos;
|
||||||
|
for(size_t len = expression.size(); pos < len; pos++) {
|
||||||
|
char c = std::tolower(expression[pos]);
|
||||||
|
|
||||||
|
if(c == '$' && pos == initialPos) {
|
||||||
|
isHex = true;
|
||||||
|
} else if((c >= '0' && c <= '9') || (isHex && c >= 'a' && c <= 'f')) {
|
||||||
|
if(isNumber || output.empty()) {
|
||||||
|
output += c;
|
||||||
|
isNumber = true;
|
||||||
|
} else {
|
||||||
|
//Done reading number
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if(isNumber) {
|
||||||
|
//First non-numeric character, done
|
||||||
|
break;
|
||||||
|
} else if(c == '(' || c == ')' || c == '-' || c == '+' || c == '~') {
|
||||||
|
if(output.empty()) {
|
||||||
|
output += c;
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
} else if(c == '!') {
|
||||||
|
//Figure out if it's ! or !=
|
||||||
|
if(pos < len - 1) {
|
||||||
|
if(expression[pos + 1] == '=') {
|
||||||
|
pos++;
|
||||||
|
output += "!=";
|
||||||
|
} else {
|
||||||
|
output += "!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
if(c == '$') {
|
||||||
|
break;
|
||||||
|
} else if(c < 'a' || c > 'z') {
|
||||||
|
//Not a number, not a letter, this is an operator
|
||||||
|
isOperator = true;
|
||||||
|
output += c;
|
||||||
|
} else {
|
||||||
|
if(isOperator) {
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
if(output.empty()) {
|
||||||
|
if(CheckSpecialTokens(expression, pos, output)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output += c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(isHex) {
|
||||||
|
unsigned int x;
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << std::hex << output;
|
||||||
|
ss >> x;
|
||||||
|
output = std::to_string(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExpressionEvaluator::ToRpn(string expression, vector<int> &outputQueue)
|
||||||
|
{
|
||||||
|
std::stack<EvalOperators> opStack = std::stack<EvalOperators>();
|
||||||
|
std::stack<int> precedenceStack;
|
||||||
|
|
||||||
|
size_t position = 0;
|
||||||
|
bool previousTokenIsOp = true;
|
||||||
|
while(true) {
|
||||||
|
string token = GetNextToken(expression, position);
|
||||||
|
if(token.empty()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool unaryOperator = previousTokenIsOp;
|
||||||
|
previousTokenIsOp = false;
|
||||||
|
|
||||||
|
int precedence = 0;
|
||||||
|
if(IsOperator(token, precedence, unaryOperator)) {
|
||||||
|
EvalOperators op = GetOperator(token, unaryOperator);
|
||||||
|
if(!opStack.empty()) {
|
||||||
|
EvalOperators topOp = opStack.top();
|
||||||
|
if((unaryOperator && precedence < precedenceStack.top()) || (!unaryOperator && precedence <= precedenceStack.top())) {
|
||||||
|
opStack.pop();
|
||||||
|
precedenceStack.pop();
|
||||||
|
outputQueue.push_back(topOp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
opStack.push(op);
|
||||||
|
precedenceStack.push(precedence);
|
||||||
|
|
||||||
|
previousTokenIsOp = true;
|
||||||
|
} else if(token[0] == '(') {
|
||||||
|
opStack.push(EvalOperators::Parenthesis);
|
||||||
|
precedenceStack.push(0);
|
||||||
|
} else if(token[0] == ')') {
|
||||||
|
while(opStack.top() != EvalOperators::Parenthesis) {
|
||||||
|
outputQueue.push_back(opStack.top());
|
||||||
|
opStack.pop();
|
||||||
|
}
|
||||||
|
opStack.pop();
|
||||||
|
} else {
|
||||||
|
outputQueue.push_back(std::stoi(token));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while(!opStack.empty()) {
|
||||||
|
outputQueue.push_back(opStack.top());
|
||||||
|
opStack.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExpressionEvaluator::EvaluateExpression(vector<int> *outputQueue, DebugState &state, int16_t memoryValue)
|
||||||
|
{
|
||||||
|
int pos = 0;
|
||||||
|
int right = 0;
|
||||||
|
int left = 0;
|
||||||
|
int operandStack[1000];
|
||||||
|
|
||||||
|
for(size_t i = 0, len = outputQueue->size(); i < len; i++) {
|
||||||
|
int token = (*outputQueue)[i];
|
||||||
|
|
||||||
|
if(token >= EvalValues::RegA) {
|
||||||
|
//Replace value with a special value
|
||||||
|
switch(token) {
|
||||||
|
case EvalValues::RegA: token = state.CPU.A; break;
|
||||||
|
case EvalValues::RegX: token = state.CPU.X; break;
|
||||||
|
case EvalValues::RegY: token = state.CPU.Y; break;
|
||||||
|
case EvalValues::RegPS: token = state.CPU.PS; break;
|
||||||
|
case EvalValues::RegSP: token = state.CPU.SP; break;
|
||||||
|
case EvalValues::Irq: token = state.CPU.IRQFlag; break;
|
||||||
|
case EvalValues::Nmi: token = state.CPU.NMIFlag; break;
|
||||||
|
case EvalValues::PpuCycle: token = state.PPU.Cycle; break;
|
||||||
|
case EvalValues::PpuScanline: token = state.PPU.Scanline; break;
|
||||||
|
case EvalValues::Value: token = memoryValue; break;
|
||||||
|
}
|
||||||
|
} else if(token >= EvalOperators::Multiplication) {
|
||||||
|
right = operandStack[--pos];
|
||||||
|
if(pos > 0) {
|
||||||
|
left = operandStack[--pos];
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(token) {
|
||||||
|
case EvalOperators::Multiplication: token = left * right; break;
|
||||||
|
case EvalOperators::Division: token = left / right; break;
|
||||||
|
case EvalOperators::Modulo: token = left % right; break;
|
||||||
|
case EvalOperators::Addition: token = left + right; break;
|
||||||
|
case EvalOperators::Substration: token = left - right; break;
|
||||||
|
case EvalOperators::ShiftLeft: token = left << right; break;
|
||||||
|
case EvalOperators::ShiftRight: token = left >> right; break;
|
||||||
|
case EvalOperators::SmallerThan: token = left < right; break;
|
||||||
|
case EvalOperators::SmallerOrEqual: token = left <= right; break;
|
||||||
|
case EvalOperators::GreaterThan: token = left > right; break;
|
||||||
|
case EvalOperators::GreaterOrEqual: token = left >= right; break;
|
||||||
|
case EvalOperators::Equal: token = left == right; break;
|
||||||
|
case EvalOperators::NotEqual: token = left != right; break;
|
||||||
|
case EvalOperators::BinaryAnd: token = left & right; break;
|
||||||
|
case EvalOperators::BinaryXor: token = left | right; break;
|
||||||
|
case EvalOperators::BinaryOr: token = left ^ right; break;
|
||||||
|
case EvalOperators::LogicalAnd: token = left && right; break;
|
||||||
|
case EvalOperators::LogicalOr: token = left || right; break;
|
||||||
|
|
||||||
|
//Unary operators
|
||||||
|
case EvalOperators::Plus: token = right; break;
|
||||||
|
case EvalOperators::Minus: token = -right; break;
|
||||||
|
case EvalOperators::BinaryNot: token = ~right; break;
|
||||||
|
case EvalOperators::LogicalNot: token = !right; break;
|
||||||
|
default: throw std::runtime_error("Invalid operator");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
operandStack[pos++] = token;
|
||||||
|
}
|
||||||
|
return operandStack[0] != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ExpressionEvaluator::ExpressionEvaluator()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExpressionEvaluator::PrivateEvaluate(string expression, DebugState &state, int16_t memoryValue)
|
||||||
|
{
|
||||||
|
vector<int> *outputQueue = nullptr;
|
||||||
|
|
||||||
|
{
|
||||||
|
LockHandler lock = _cacheLock.AcquireSafe();
|
||||||
|
|
||||||
|
auto cacheOutputQueue = _outputCache.find(expression);
|
||||||
|
if(cacheOutputQueue != _outputCache.end()) {
|
||||||
|
outputQueue = &(cacheOutputQueue->second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(outputQueue == nullptr) {
|
||||||
|
vector<int> output;
|
||||||
|
|
||||||
|
string fixedExp = expression;
|
||||||
|
fixedExp.erase(std::remove(fixedExp.begin(), fixedExp.end(), ' '), fixedExp.end());
|
||||||
|
ToRpn(fixedExp, output);
|
||||||
|
|
||||||
|
LockHandler lock = _cacheLock.AcquireSafe();
|
||||||
|
_outputCache[expression] = output;
|
||||||
|
outputQueue = &_outputCache[expression];
|
||||||
|
}
|
||||||
|
|
||||||
|
return EvaluateExpression(outputQueue, state, memoryValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExpressionEvaluator::Evaluate(string expression, DebugState &state, int16_t memoryValue)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
return PrivateEvaluate(expression, state, memoryValue);
|
||||||
|
} catch(std::exception) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExpressionEvaluator::Validate(string expression)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
DebugState state;
|
||||||
|
PrivateEvaluate(expression, state, 0);
|
||||||
|
return true;
|
||||||
|
} catch(std::exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
91
Core/ExpressionEvaluator.h
Normal file
91
Core/ExpressionEvaluator.h
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
#pragma once
|
||||||
|
#include "stdafx.h"
|
||||||
|
#include <stack>
|
||||||
|
#include <deque>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include "../Utilities/SimpleLock.h"
|
||||||
|
|
||||||
|
struct DebugState;
|
||||||
|
|
||||||
|
enum EvalOperators
|
||||||
|
{
|
||||||
|
//Binary operators
|
||||||
|
Multiplication = 2000000000,
|
||||||
|
Division = 2000000001,
|
||||||
|
Modulo = 2000000002,
|
||||||
|
Addition = 2000000003,
|
||||||
|
Substration = 2000000004,
|
||||||
|
ShiftLeft = 2000000005,
|
||||||
|
ShiftRight = 2000000006,
|
||||||
|
SmallerThan = 2000000007,
|
||||||
|
SmallerOrEqual = 2000000008,
|
||||||
|
GreaterThan = 2000000009,
|
||||||
|
GreaterOrEqual = 2000000010,
|
||||||
|
Equal = 2000000011,
|
||||||
|
NotEqual = 2000000012,
|
||||||
|
BinaryAnd = 2000000013,
|
||||||
|
BinaryXor = 2000000014,
|
||||||
|
BinaryOr = 2000000015,
|
||||||
|
LogicalAnd = 2000000016,
|
||||||
|
LogicalOr = 2000000017,
|
||||||
|
|
||||||
|
//Unary operators
|
||||||
|
Plus = 2000000050,
|
||||||
|
Minus = 2000000051,
|
||||||
|
BinaryNot = 2000000052,
|
||||||
|
LogicalNot = 2000000053,
|
||||||
|
|
||||||
|
//Special value, not used as an operator
|
||||||
|
Parenthesis = 2000000100
|
||||||
|
};
|
||||||
|
|
||||||
|
enum EvalValues
|
||||||
|
{
|
||||||
|
RegA = 2000000100,
|
||||||
|
RegX = 2000000101,
|
||||||
|
RegY = 2000000102,
|
||||||
|
RegSP = 2000000103,
|
||||||
|
RegPS = 2000000104,
|
||||||
|
PpuCycle = 2000000105,
|
||||||
|
PpuScanline = 2000000106,
|
||||||
|
Nmi = 2000000107,
|
||||||
|
Irq = 2000000108,
|
||||||
|
Value = 2000000109,
|
||||||
|
};
|
||||||
|
|
||||||
|
class StringHasher
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
size_t operator()(const std::string& t) const
|
||||||
|
{
|
||||||
|
//Quick hash for expressions - most are likely to have different lengths, and not expecting dozens of breakpoints, either, so this should be fine.
|
||||||
|
return t.size();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class ExpressionEvaluator
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
const vector<string> _binaryOperators = { { "*", "/", "%", "+", "-", "<<", ">>", "<", "<=", ">", ">=", "==", "!=", "&", "^", "|", "&&", "||" } };
|
||||||
|
const vector<int> _binaryPrecedence = { { 10, 10, 10, 9, 9, 8, 8, 7, 7, 7, 7, 6, 6, 5, 4, 3, 2, 1 } };
|
||||||
|
const vector<string> _unaryOperators = { { "+", "-", "!", "~" } };
|
||||||
|
const vector<int> _unaryPrecedence = { { 11, 11, 11, 11 } };
|
||||||
|
|
||||||
|
static std::unordered_map<string, std::vector<int>, StringHasher> _outputCache;
|
||||||
|
static SimpleLock _cacheLock;
|
||||||
|
|
||||||
|
bool IsOperator(string token, int &precedence, bool unaryOperator);
|
||||||
|
EvalOperators GetOperator(string token, bool unaryOperator);
|
||||||
|
int GetOperatorPrecendence(string token);
|
||||||
|
bool CheckSpecialTokens(string expression, size_t &pos, string &output);
|
||||||
|
string GetNextToken(string expression, size_t &pos);
|
||||||
|
void ToRpn(string expression, vector<int> &outputQueue);
|
||||||
|
bool EvaluateExpression(vector<int> *outputQueue, DebugState &state, int16_t memoryValue);
|
||||||
|
bool PrivateEvaluate(string expression, DebugState &state, int16_t memoryValue);
|
||||||
|
|
||||||
|
public:
|
||||||
|
ExpressionEvaluator();
|
||||||
|
|
||||||
|
bool Evaluate(string expression, DebugState &state, int16_t memoryValue = 0);
|
||||||
|
bool Validate(string expression);
|
||||||
|
};
|
|
@ -97,8 +97,6 @@ uint8_t MemoryManager::DebugRead(uint16_t addr)
|
||||||
|
|
||||||
uint8_t MemoryManager::Read(uint16_t addr, MemoryOperationType operationType)
|
uint8_t MemoryManager::Read(uint16_t addr, MemoryOperationType operationType)
|
||||||
{
|
{
|
||||||
Debugger::ProcessRamOperation(operationType, addr);
|
|
||||||
|
|
||||||
uint8_t value;
|
uint8_t value;
|
||||||
if(addr <= 0x1FFF) {
|
if(addr <= 0x1FFF) {
|
||||||
value = _internalRAM[addr & 0x07FF];
|
value = _internalRAM[addr & 0x07FF];
|
||||||
|
@ -109,12 +107,15 @@ uint8_t MemoryManager::Read(uint16_t addr, MemoryOperationType operationType)
|
||||||
_mapper->ProcessCpuClock();
|
_mapper->ProcessCpuClock();
|
||||||
|
|
||||||
CheatManager::ApplyRamCodes(addr, value);
|
CheatManager::ApplyRamCodes(addr, value);
|
||||||
|
|
||||||
|
Debugger::ProcessRamOperation(operationType, addr, value);
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MemoryManager::Write(uint16_t addr, uint8_t value)
|
void MemoryManager::Write(uint16_t addr, uint8_t value)
|
||||||
{
|
{
|
||||||
Debugger::ProcessRamOperation(MemoryOperationType::Write, addr);
|
Debugger::ProcessRamOperation(MemoryOperationType::Write, addr, value);
|
||||||
|
|
||||||
if(addr <= 0x1FFF) {
|
if(addr <= 0x1FFF) {
|
||||||
_internalRAM[addr & 0x07FF] = value;
|
_internalRAM[addr & 0x07FF] = value;
|
||||||
|
@ -147,14 +148,15 @@ uint8_t MemoryManager::DebugReadVRAM(uint16_t addr)
|
||||||
|
|
||||||
uint8_t MemoryManager::ReadVRAM(uint16_t addr, MemoryOperationType operationType)
|
uint8_t MemoryManager::ReadVRAM(uint16_t addr, MemoryOperationType operationType)
|
||||||
{
|
{
|
||||||
Debugger::ProcessVramOperation(operationType, addr);
|
|
||||||
ProcessVramAccess(addr);
|
ProcessVramAccess(addr);
|
||||||
return _mapper->ReadVRAM(addr);
|
uint8_t value = _mapper->ReadVRAM(addr);
|
||||||
|
Debugger::ProcessVramOperation(operationType, addr, value);
|
||||||
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MemoryManager::WriteVRAM(uint16_t addr, uint8_t value)
|
void MemoryManager::WriteVRAM(uint16_t addr, uint8_t value)
|
||||||
{
|
{
|
||||||
Debugger::ProcessVramOperation(MemoryOperationType::Write, addr);
|
Debugger::ProcessVramOperation(MemoryOperationType::Write, addr, value);
|
||||||
ProcessVramAccess(addr);
|
ProcessVramAccess(addr);
|
||||||
_mapper->WriteVRAM(addr, value);
|
_mapper->WriteVRAM(addr, value);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include "CPU.h"
|
#include "CPU.h"
|
||||||
#include "EmulationSettings.h"
|
#include "EmulationSettings.h"
|
||||||
#include "VideoDecoder.h"
|
#include "VideoDecoder.h"
|
||||||
|
#include "Debugger.h"
|
||||||
|
|
||||||
PPU* PPU::Instance = nullptr;
|
PPU* PPU::Instance = nullptr;
|
||||||
|
|
||||||
|
@ -778,6 +779,8 @@ void PPU::Exec()
|
||||||
}
|
}
|
||||||
_cycle++;
|
_cycle++;
|
||||||
|
|
||||||
|
Debugger::ProcessPpuCycle();
|
||||||
|
|
||||||
if(_scanline != -1 && _scanline < 240) {
|
if(_scanline != -1 && _scanline < 240) {
|
||||||
ProcessVisibleScanline();
|
ProcessVisibleScanline();
|
||||||
} else if(_scanline == -1) {
|
} else if(_scanline == -1) {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
@ -8,31 +9,54 @@ namespace Mesen.GUI.Debugger
|
||||||
{
|
{
|
||||||
public class Breakpoint
|
public class Breakpoint
|
||||||
{
|
{
|
||||||
private bool _added = false;
|
public bool BreakOnRead = false;
|
||||||
|
public bool BreakOnWrite = false;
|
||||||
|
public bool BreakOnReadVram = false;
|
||||||
|
public bool BreakOnWriteVram = false;
|
||||||
|
public bool BreakOnExec = true;
|
||||||
|
|
||||||
public BreakpointType Type;
|
|
||||||
public bool Enabled = true;
|
public bool Enabled = true;
|
||||||
public UInt32 Address;
|
public UInt32 Address;
|
||||||
public bool IsAbsoluteAddress;
|
public bool SpecificAddress = true;
|
||||||
|
public bool IsAbsoluteAddress = false;
|
||||||
public void Remove()
|
public string Condition = "";
|
||||||
{
|
|
||||||
if(_added) {
|
|
||||||
InteropEmu.DebugRemoveBreakpoint(Type, Address, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Add()
|
|
||||||
{
|
|
||||||
InteropEmu.DebugAddBreakpoint(Type, Address, false, Enabled);
|
|
||||||
_added = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetEnabled(bool enabled)
|
public void SetEnabled(bool enabled)
|
||||||
{
|
{
|
||||||
Enabled = enabled;
|
Enabled = enabled;
|
||||||
Remove();
|
}
|
||||||
Add();
|
|
||||||
|
public BreakpointType Type
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
BreakpointType type = BreakpointType.Global;
|
||||||
|
if(BreakOnRead) {
|
||||||
|
type |= BreakpointType.Read;
|
||||||
|
}
|
||||||
|
if(BreakOnWrite) {
|
||||||
|
type |= BreakpointType.Write;
|
||||||
|
}
|
||||||
|
if(BreakOnExec) {
|
||||||
|
type |= BreakpointType.Execute;
|
||||||
|
}
|
||||||
|
if(BreakOnReadVram) {
|
||||||
|
type |= BreakpointType.ReadVram;
|
||||||
|
}
|
||||||
|
if(BreakOnWriteVram) {
|
||||||
|
type |= BreakpointType.WriteVram;
|
||||||
|
}
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public InteropBreakpoint ToInteropBreakpoint()
|
||||||
|
{
|
||||||
|
InteropBreakpoint bp = new InteropBreakpoint() { Address = SpecificAddress ? (Int32)Address : -1, Type = Type, IsAbsoluteAddress = IsAbsoluteAddress };
|
||||||
|
bp.Condition = new byte[1000];
|
||||||
|
byte[] condition = Encoding.UTF8.GetBytes(Condition);
|
||||||
|
Array.Copy(condition, bp.Condition, condition.Length);
|
||||||
|
return bp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -32,10 +32,11 @@
|
||||||
this.mnuAddBreakpoint = new System.Windows.Forms.ToolStripMenuItem();
|
this.mnuAddBreakpoint = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.mnuRemoveBreakpoint = new System.Windows.Forms.ToolStripMenuItem();
|
this.mnuRemoveBreakpoint = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.lstBreakpoints = new Mesen.GUI.Controls.MyListView();
|
this.lstBreakpoints = new Mesen.GUI.Controls.MyListView();
|
||||||
|
this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||||
this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||||
this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||||
|
this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||||
this.colLastColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
this.colLastColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||||
this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
|
||||||
this.contextMenuBreakpoints.SuspendLayout();
|
this.contextMenuBreakpoints.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
|
@ -70,6 +71,7 @@
|
||||||
this.columnHeader3,
|
this.columnHeader3,
|
||||||
this.columnHeader1,
|
this.columnHeader1,
|
||||||
this.columnHeader2,
|
this.columnHeader2,
|
||||||
|
this.columnHeader4,
|
||||||
this.colLastColumn});
|
this.colLastColumn});
|
||||||
this.lstBreakpoints.ContextMenuStrip = this.contextMenuBreakpoints;
|
this.lstBreakpoints.ContextMenuStrip = this.contextMenuBreakpoints;
|
||||||
this.lstBreakpoints.Dock = System.Windows.Forms.DockStyle.Fill;
|
this.lstBreakpoints.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
@ -86,6 +88,11 @@
|
||||||
this.lstBreakpoints.ColumnWidthChanging += new System.Windows.Forms.ColumnWidthChangingEventHandler(this.lstBreakpoints_ColumnWidthChanging);
|
this.lstBreakpoints.ColumnWidthChanging += new System.Windows.Forms.ColumnWidthChangingEventHandler(this.lstBreakpoints_ColumnWidthChanging);
|
||||||
this.lstBreakpoints.DoubleClick += new System.EventHandler(this.lstBreakpoints_DoubleClick);
|
this.lstBreakpoints.DoubleClick += new System.EventHandler(this.lstBreakpoints_DoubleClick);
|
||||||
//
|
//
|
||||||
|
// columnHeader3
|
||||||
|
//
|
||||||
|
this.columnHeader3.Text = "";
|
||||||
|
this.columnHeader3.Width = 21;
|
||||||
|
//
|
||||||
// columnHeader1
|
// columnHeader1
|
||||||
//
|
//
|
||||||
this.columnHeader1.Text = "Type";
|
this.columnHeader1.Text = "Type";
|
||||||
|
@ -94,16 +101,17 @@
|
||||||
// columnHeader2
|
// columnHeader2
|
||||||
//
|
//
|
||||||
this.columnHeader2.Text = "Address";
|
this.columnHeader2.Text = "Address";
|
||||||
this.columnHeader2.Width = 100;
|
this.columnHeader2.Width = 70;
|
||||||
|
//
|
||||||
|
// columnHeader4
|
||||||
|
//
|
||||||
|
this.columnHeader4.Text = "Condition";
|
||||||
|
this.columnHeader4.Width = 100;
|
||||||
//
|
//
|
||||||
// colLastColumn
|
// colLastColumn
|
||||||
//
|
//
|
||||||
this.colLastColumn.Text = "";
|
this.colLastColumn.Text = "";
|
||||||
//
|
//
|
||||||
// columnHeader3
|
|
||||||
//
|
|
||||||
this.columnHeader3.Text = "Enabled";
|
|
||||||
//
|
|
||||||
// ctrlBreakpoints
|
// ctrlBreakpoints
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
@ -126,5 +134,6 @@
|
||||||
private System.Windows.Forms.ToolStripMenuItem mnuAddBreakpoint;
|
private System.Windows.Forms.ToolStripMenuItem mnuAddBreakpoint;
|
||||||
private System.Windows.Forms.ToolStripMenuItem mnuRemoveBreakpoint;
|
private System.Windows.Forms.ToolStripMenuItem mnuRemoveBreakpoint;
|
||||||
private System.Windows.Forms.ColumnHeader columnHeader3;
|
private System.Windows.Forms.ColumnHeader columnHeader3;
|
||||||
|
private System.Windows.Forms.ColumnHeader columnHeader4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,22 +26,24 @@ namespace Mesen.GUI.Debugger.Controls
|
||||||
AdjustColumnWidth();
|
AdjustColumnWidth();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ToggleBreakpoint(int address)
|
public void ToggleBreakpoint(int address, bool toggleEnabled)
|
||||||
{
|
{
|
||||||
if(address >= 0) {
|
if(address >= 0) {
|
||||||
Breakpoint breakpoint = GetMatchingBreakpoint(address);
|
Breakpoint breakpoint = GetMatchingBreakpoint(address);
|
||||||
if(breakpoint != null) {
|
if(breakpoint != null) {
|
||||||
|
if(toggleEnabled) {
|
||||||
|
breakpoint.Enabled = !breakpoint.Enabled;
|
||||||
|
} else {
|
||||||
_breakpoints.Remove(breakpoint);
|
_breakpoints.Remove(breakpoint);
|
||||||
breakpoint.Remove();
|
}
|
||||||
} else {
|
} else {
|
||||||
breakpoint = new Breakpoint() {
|
breakpoint = new Breakpoint() {
|
||||||
Type = BreakpointType.Execute,
|
BreakOnExec = true,
|
||||||
Address = (UInt32)address,
|
Address = (UInt32)address,
|
||||||
IsAbsoluteAddress = false,
|
IsAbsoluteAddress = false,
|
||||||
Enabled = true
|
Enabled = true
|
||||||
};
|
};
|
||||||
_breakpoints.Add(breakpoint);
|
_breakpoints.Add(breakpoint);
|
||||||
breakpoint.Add();
|
|
||||||
}
|
}
|
||||||
RefreshList();
|
RefreshList();
|
||||||
OnBreakpointChanged();
|
OnBreakpointChanged();
|
||||||
|
@ -63,19 +65,38 @@ namespace Mesen.GUI.Debugger.Controls
|
||||||
return _breakpoints;
|
return _breakpoints;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetBreakpoints()
|
||||||
|
{
|
||||||
|
List<InteropBreakpoint> breakpoints = new List<InteropBreakpoint>();
|
||||||
|
foreach(Breakpoint bp in GetBreakpoints()) {
|
||||||
|
if(bp.Enabled) {
|
||||||
|
breakpoints.Add(bp.ToInteropBreakpoint());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
InteropEmu.DebugSetBreakpoints(breakpoints.ToArray(), (UInt32)breakpoints.Count);
|
||||||
|
}
|
||||||
|
|
||||||
private void RefreshList()
|
private void RefreshList()
|
||||||
{
|
{
|
||||||
lstBreakpoints.ItemChecked -= new System.Windows.Forms.ItemCheckedEventHandler(lstBreakpoints_ItemChecked);
|
lstBreakpoints.ItemChecked -= new System.Windows.Forms.ItemCheckedEventHandler(lstBreakpoints_ItemChecked);
|
||||||
lstBreakpoints.Items.Clear();
|
lstBreakpoints.Items.Clear();
|
||||||
foreach(Breakpoint breakpoint in _breakpoints) {
|
foreach(Breakpoint breakpoint in _breakpoints) {
|
||||||
|
string address = "$" + breakpoint.Address.ToString("X");
|
||||||
|
if(breakpoint.IsAbsoluteAddress) {
|
||||||
|
address = "[" + address + "]";
|
||||||
|
}
|
||||||
|
|
||||||
ListViewItem item = new ListViewItem();
|
ListViewItem item = new ListViewItem();
|
||||||
item.Tag = breakpoint;
|
item.Tag = breakpoint;
|
||||||
item.Checked = breakpoint.Enabled;
|
item.Checked = breakpoint.Enabled;
|
||||||
item.SubItems.Add(breakpoint.Type.ToString());
|
item.SubItems.Add(breakpoint.Type.ToString());
|
||||||
item.SubItems.Add("$" + breakpoint.Address.ToString("X"));
|
item.SubItems.Add(breakpoint.SpecificAddress ? address : "<any>");
|
||||||
|
item.SubItems.Add(breakpoint.Condition);
|
||||||
lstBreakpoints.Items.Add(item);
|
lstBreakpoints.Items.Add(item);
|
||||||
}
|
}
|
||||||
lstBreakpoints.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(lstBreakpoints_ItemChecked);
|
lstBreakpoints.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(lstBreakpoints_ItemChecked);
|
||||||
|
|
||||||
|
SetBreakpoints();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void lstBreakpoints_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e)
|
private void lstBreakpoints_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e)
|
||||||
|
@ -97,7 +118,7 @@ namespace Mesen.GUI.Debugger.Controls
|
||||||
lstBreakpoints.ColumnWidthChanged -= lstBreakpoints_ColumnWidthChanged;
|
lstBreakpoints.ColumnWidthChanged -= lstBreakpoints_ColumnWidthChanged;
|
||||||
|
|
||||||
//Force watch values to take the full width of the list
|
//Force watch values to take the full width of the list
|
||||||
int totalWidth = lstBreakpoints.Columns[0].Width + lstBreakpoints.Columns[1].Width + lstBreakpoints.Columns[2].Width;
|
int totalWidth = lstBreakpoints.Columns[0].Width + lstBreakpoints.Columns[1].Width + lstBreakpoints.Columns[2].Width + lstBreakpoints.Columns[3].Width;
|
||||||
colLastColumn.Width = lstBreakpoints.ClientSize.Width - totalWidth;
|
colLastColumn.Width = lstBreakpoints.ClientSize.Width - totalWidth;
|
||||||
|
|
||||||
lstBreakpoints.ColumnWidthChanging += lstBreakpoints_ColumnWidthChanging;
|
lstBreakpoints.ColumnWidthChanging += lstBreakpoints_ColumnWidthChanging;
|
||||||
|
@ -106,6 +127,7 @@ namespace Mesen.GUI.Debugger.Controls
|
||||||
|
|
||||||
private void OnBreakpointChanged()
|
private void OnBreakpointChanged()
|
||||||
{
|
{
|
||||||
|
SetBreakpoints();
|
||||||
if(BreakpointChanged != null) {
|
if(BreakpointChanged != null) {
|
||||||
BreakpointChanged(this, null);
|
BreakpointChanged(this, null);
|
||||||
}
|
}
|
||||||
|
@ -131,7 +153,6 @@ namespace Mesen.GUI.Debugger.Controls
|
||||||
private void mnuRemoveBreakpoint_Click(object sender, EventArgs e)
|
private void mnuRemoveBreakpoint_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
foreach(ListViewItem item in lstBreakpoints.SelectedItems) {
|
foreach(ListViewItem item in lstBreakpoints.SelectedItems) {
|
||||||
((Breakpoint)item.Tag).Remove();
|
|
||||||
_breakpoints.Remove((Breakpoint)item.Tag);
|
_breakpoints.Remove((Breakpoint)item.Tag);
|
||||||
}
|
}
|
||||||
RefreshList();
|
RefreshList();
|
||||||
|
|
|
@ -34,12 +34,12 @@
|
||||||
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
|
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
|
||||||
this.mnuShowOnlyDisassembledCode = new System.Windows.Forms.ToolStripMenuItem();
|
this.mnuShowOnlyDisassembledCode = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.mnuShowLineNotes = new System.Windows.Forms.ToolStripMenuItem();
|
this.mnuShowLineNotes = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.mnuShowCodeNotes = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator();
|
this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator();
|
||||||
this.mnuGoToLocation = new System.Windows.Forms.ToolStripMenuItem();
|
this.mnuGoToLocation = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.mnuAddToWatch = new System.Windows.Forms.ToolStripMenuItem();
|
this.mnuAddToWatch = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
||||||
this.ctrlCodeViewer = new Mesen.GUI.Debugger.ctrlScrollableTextbox();
|
this.ctrlCodeViewer = new Mesen.GUI.Debugger.ctrlScrollableTextbox();
|
||||||
this.mnuShowCodeNotes = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.contextMenuCode.SuspendLayout();
|
this.contextMenuCode.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
|
@ -56,7 +56,7 @@
|
||||||
this.mnuGoToLocation,
|
this.mnuGoToLocation,
|
||||||
this.mnuAddToWatch});
|
this.mnuAddToWatch});
|
||||||
this.contextMenuCode.Name = "contextMenuWatch";
|
this.contextMenuCode.Name = "contextMenuWatch";
|
||||||
this.contextMenuCode.Size = new System.Drawing.Size(259, 192);
|
this.contextMenuCode.Size = new System.Drawing.Size(259, 170);
|
||||||
this.contextMenuCode.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuCode_Opening);
|
this.contextMenuCode.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuCode_Opening);
|
||||||
//
|
//
|
||||||
// mnuShowNextStatement
|
// mnuShowNextStatement
|
||||||
|
@ -100,6 +100,14 @@
|
||||||
this.mnuShowLineNotes.Text = "Show PRG Addresses";
|
this.mnuShowLineNotes.Text = "Show PRG Addresses";
|
||||||
this.mnuShowLineNotes.Click += new System.EventHandler(this.mnuShowLineNotes_Click);
|
this.mnuShowLineNotes.Click += new System.EventHandler(this.mnuShowLineNotes_Click);
|
||||||
//
|
//
|
||||||
|
// mnuShowCodeNotes
|
||||||
|
//
|
||||||
|
this.mnuShowCodeNotes.CheckOnClick = true;
|
||||||
|
this.mnuShowCodeNotes.Name = "mnuShowCodeNotes";
|
||||||
|
this.mnuShowCodeNotes.Size = new System.Drawing.Size(258, 22);
|
||||||
|
this.mnuShowCodeNotes.Text = "Show Byte Code";
|
||||||
|
this.mnuShowCodeNotes.Click += new System.EventHandler(this.mnuShowCodeNotes_Click);
|
||||||
|
//
|
||||||
// toolStripMenuItem2
|
// toolStripMenuItem2
|
||||||
//
|
//
|
||||||
this.toolStripMenuItem2.Name = "toolStripMenuItem2";
|
this.toolStripMenuItem2.Name = "toolStripMenuItem2";
|
||||||
|
@ -127,19 +135,13 @@
|
||||||
this.ctrlCodeViewer.FontSize = 13F;
|
this.ctrlCodeViewer.FontSize = 13F;
|
||||||
this.ctrlCodeViewer.Location = new System.Drawing.Point(0, 0);
|
this.ctrlCodeViewer.Location = new System.Drawing.Point(0, 0);
|
||||||
this.ctrlCodeViewer.Name = "ctrlCodeViewer";
|
this.ctrlCodeViewer.Name = "ctrlCodeViewer";
|
||||||
|
this.ctrlCodeViewer.ShowContentNotes = false;
|
||||||
|
this.ctrlCodeViewer.ShowLineNumberNotes = false;
|
||||||
this.ctrlCodeViewer.Size = new System.Drawing.Size(379, 218);
|
this.ctrlCodeViewer.Size = new System.Drawing.Size(379, 218);
|
||||||
this.ctrlCodeViewer.TabIndex = 1;
|
this.ctrlCodeViewer.TabIndex = 1;
|
||||||
this.ctrlCodeViewer.MouseUp += new System.Windows.Forms.MouseEventHandler(this.ctrlCodeViewer_MouseUp);
|
this.ctrlCodeViewer.MouseUp += new System.Windows.Forms.MouseEventHandler(this.ctrlCodeViewer_MouseUp);
|
||||||
this.ctrlCodeViewer.MouseMove += new System.Windows.Forms.MouseEventHandler(this.ctrlCodeViewer_MouseMove);
|
this.ctrlCodeViewer.MouseMove += new System.Windows.Forms.MouseEventHandler(this.ctrlCodeViewer_MouseMove);
|
||||||
//
|
//
|
||||||
// mnuShowCodeNotes
|
|
||||||
//
|
|
||||||
this.mnuShowCodeNotes.CheckOnClick = true;
|
|
||||||
this.mnuShowCodeNotes.Name = "mnuShowCodeNotes";
|
|
||||||
this.mnuShowCodeNotes.Size = new System.Drawing.Size(258, 22);
|
|
||||||
this.mnuShowCodeNotes.Text = "Show Byte Code";
|
|
||||||
this.mnuShowCodeNotes.Click += new System.EventHandler(this.mnuShowCodeNotes_Click);
|
|
||||||
//
|
|
||||||
// ctrlDebuggerCode
|
// ctrlDebuggerCode
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
|
379
GUI.NET/Debugger/frmBreakpoint.Designer.cs
generated
379
GUI.NET/Debugger/frmBreakpoint.Designer.cs
generated
|
@ -27,22 +27,44 @@
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
|
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
|
||||||
this.lblBreakOn = new System.Windows.Forms.Label();
|
this.lblBreakOn = new System.Windows.Forms.Label();
|
||||||
this.lblAddress = new System.Windows.Forms.Label();
|
this.lblAddress = new System.Windows.Forms.Label();
|
||||||
this.flowLayoutPanel2 = new System.Windows.Forms.FlowLayoutPanel();
|
|
||||||
this.radTypeExecute = new System.Windows.Forms.RadioButton();
|
|
||||||
this.radTypeRead = new System.Windows.Forms.RadioButton();
|
|
||||||
this.radTypeWrite = new System.Windows.Forms.RadioButton();
|
|
||||||
this.txtAddress = new System.Windows.Forms.TextBox();
|
|
||||||
this.chkEnabled = new System.Windows.Forms.CheckBox();
|
this.chkEnabled = new System.Windows.Forms.CheckBox();
|
||||||
|
this.lblCondition = new System.Windows.Forms.Label();
|
||||||
|
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
|
||||||
|
this.picHelp = new System.Windows.Forms.PictureBox();
|
||||||
|
this.txtCondition = new System.Windows.Forms.TextBox();
|
||||||
|
this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();
|
||||||
|
this.txtAddress = new System.Windows.Forms.TextBox();
|
||||||
|
this.chkAbsolute = new System.Windows.Forms.CheckBox();
|
||||||
|
this.radSpecificAddress = new System.Windows.Forms.RadioButton();
|
||||||
|
this.radAnyAddress = new System.Windows.Forms.RadioButton();
|
||||||
|
this.tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel();
|
||||||
|
this.flowLayoutPanel3 = new System.Windows.Forms.FlowLayoutPanel();
|
||||||
|
this.chkReadVram = new System.Windows.Forms.CheckBox();
|
||||||
|
this.chkWriteVram = new System.Windows.Forms.CheckBox();
|
||||||
|
this.radCpu = new System.Windows.Forms.RadioButton();
|
||||||
|
this.radPpu = new System.Windows.Forms.RadioButton();
|
||||||
|
this.flowLayoutPanel2 = new System.Windows.Forms.FlowLayoutPanel();
|
||||||
|
this.chkRead = new System.Windows.Forms.CheckBox();
|
||||||
|
this.chkWrite = new System.Windows.Forms.CheckBox();
|
||||||
|
this.chkExec = new System.Windows.Forms.CheckBox();
|
||||||
|
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
||||||
this.tableLayoutPanel1.SuspendLayout();
|
this.tableLayoutPanel1.SuspendLayout();
|
||||||
|
this.tableLayoutPanel2.SuspendLayout();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.picHelp)).BeginInit();
|
||||||
|
this.tableLayoutPanel3.SuspendLayout();
|
||||||
|
this.tableLayoutPanel4.SuspendLayout();
|
||||||
|
this.flowLayoutPanel3.SuspendLayout();
|
||||||
this.flowLayoutPanel2.SuspendLayout();
|
this.flowLayoutPanel2.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// baseConfigPanel
|
// baseConfigPanel
|
||||||
//
|
//
|
||||||
this.baseConfigPanel.Location = new System.Drawing.Point(0, 142);
|
this.baseConfigPanel.Location = new System.Drawing.Point(0, 151);
|
||||||
|
this.baseConfigPanel.Size = new System.Drawing.Size(378, 29);
|
||||||
//
|
//
|
||||||
// tableLayoutPanel1
|
// tableLayoutPanel1
|
||||||
//
|
//
|
||||||
|
@ -51,18 +73,22 @@
|
||||||
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||||
this.tableLayoutPanel1.Controls.Add(this.lblBreakOn, 0, 0);
|
this.tableLayoutPanel1.Controls.Add(this.lblBreakOn, 0, 0);
|
||||||
this.tableLayoutPanel1.Controls.Add(this.lblAddress, 0, 1);
|
this.tableLayoutPanel1.Controls.Add(this.lblAddress, 0, 1);
|
||||||
this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel2, 1, 0);
|
this.tableLayoutPanel1.Controls.Add(this.chkEnabled, 0, 3);
|
||||||
this.tableLayoutPanel1.Controls.Add(this.txtAddress, 1, 1);
|
this.tableLayoutPanel1.Controls.Add(this.lblCondition, 0, 2);
|
||||||
this.tableLayoutPanel1.Controls.Add(this.chkEnabled, 0, 2);
|
this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 1, 2);
|
||||||
|
this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel3, 1, 1);
|
||||||
|
this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel4, 1, 0);
|
||||||
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
|
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
|
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
|
||||||
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
|
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
|
||||||
this.tableLayoutPanel1.RowCount = 4;
|
this.tableLayoutPanel1.RowCount = 5;
|
||||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||||
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||||
this.tableLayoutPanel1.Size = new System.Drawing.Size(327, 142);
|
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||||
|
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
|
||||||
|
this.tableLayoutPanel1.Size = new System.Drawing.Size(378, 180);
|
||||||
this.tableLayoutPanel1.TabIndex = 2;
|
this.tableLayoutPanel1.TabIndex = 2;
|
||||||
//
|
//
|
||||||
// lblBreakOn
|
// lblBreakOn
|
||||||
|
@ -77,94 +103,286 @@
|
||||||
//
|
//
|
||||||
// lblAddress
|
// lblAddress
|
||||||
//
|
//
|
||||||
this.lblAddress.Anchor = System.Windows.Forms.AnchorStyles.Left;
|
|
||||||
this.lblAddress.AutoSize = true;
|
this.lblAddress.AutoSize = true;
|
||||||
this.lblAddress.Location = new System.Drawing.Point(3, 76);
|
this.lblAddress.Location = new System.Drawing.Point(3, 51);
|
||||||
|
this.lblAddress.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0);
|
||||||
this.lblAddress.Name = "lblAddress";
|
this.lblAddress.Name = "lblAddress";
|
||||||
this.lblAddress.Size = new System.Drawing.Size(48, 13);
|
this.lblAddress.Size = new System.Drawing.Size(48, 13);
|
||||||
this.lblAddress.TabIndex = 3;
|
this.lblAddress.TabIndex = 3;
|
||||||
this.lblAddress.Text = "Address:";
|
this.lblAddress.Text = "Address:";
|
||||||
//
|
//
|
||||||
// flowLayoutPanel2
|
|
||||||
//
|
|
||||||
this.flowLayoutPanel2.Controls.Add(this.radTypeExecute);
|
|
||||||
this.flowLayoutPanel2.Controls.Add(this.radTypeRead);
|
|
||||||
this.flowLayoutPanel2.Controls.Add(this.radTypeWrite);
|
|
||||||
this.flowLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
|
|
||||||
this.flowLayoutPanel2.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
|
|
||||||
this.flowLayoutPanel2.Location = new System.Drawing.Point(59, 0);
|
|
||||||
this.flowLayoutPanel2.Margin = new System.Windows.Forms.Padding(0);
|
|
||||||
this.flowLayoutPanel2.Name = "flowLayoutPanel2";
|
|
||||||
this.flowLayoutPanel2.Size = new System.Drawing.Size(268, 70);
|
|
||||||
this.flowLayoutPanel2.TabIndex = 4;
|
|
||||||
//
|
|
||||||
// radTypeExecute
|
|
||||||
//
|
|
||||||
this.radTypeExecute.AutoSize = true;
|
|
||||||
this.radTypeExecute.Location = new System.Drawing.Point(3, 3);
|
|
||||||
this.radTypeExecute.Name = "radTypeExecute";
|
|
||||||
this.radTypeExecute.Size = new System.Drawing.Size(72, 17);
|
|
||||||
this.radTypeExecute.TabIndex = 0;
|
|
||||||
this.radTypeExecute.TabStop = true;
|
|
||||||
this.radTypeExecute.Text = "Execution";
|
|
||||||
this.radTypeExecute.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// radTypeRead
|
|
||||||
//
|
|
||||||
this.radTypeRead.AutoSize = true;
|
|
||||||
this.radTypeRead.Location = new System.Drawing.Point(3, 26);
|
|
||||||
this.radTypeRead.Name = "radTypeRead";
|
|
||||||
this.radTypeRead.Size = new System.Drawing.Size(51, 17);
|
|
||||||
this.radTypeRead.TabIndex = 1;
|
|
||||||
this.radTypeRead.TabStop = true;
|
|
||||||
this.radTypeRead.Text = "Read";
|
|
||||||
this.radTypeRead.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// radTypeWrite
|
|
||||||
//
|
|
||||||
this.radTypeWrite.AutoSize = true;
|
|
||||||
this.radTypeWrite.Location = new System.Drawing.Point(3, 49);
|
|
||||||
this.radTypeWrite.Name = "radTypeWrite";
|
|
||||||
this.radTypeWrite.Size = new System.Drawing.Size(50, 17);
|
|
||||||
this.radTypeWrite.TabIndex = 2;
|
|
||||||
this.radTypeWrite.TabStop = true;
|
|
||||||
this.radTypeWrite.Text = "Write";
|
|
||||||
this.radTypeWrite.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// txtAddress
|
|
||||||
//
|
|
||||||
this.txtAddress.Dock = System.Windows.Forms.DockStyle.Fill;
|
|
||||||
this.txtAddress.Location = new System.Drawing.Point(62, 73);
|
|
||||||
this.txtAddress.Name = "txtAddress";
|
|
||||||
this.txtAddress.Size = new System.Drawing.Size(262, 20);
|
|
||||||
this.txtAddress.TabIndex = 5;
|
|
||||||
//
|
|
||||||
// chkEnabled
|
// chkEnabled
|
||||||
//
|
//
|
||||||
this.chkEnabled.AutoSize = true;
|
this.chkEnabled.AutoSize = true;
|
||||||
this.tableLayoutPanel1.SetColumnSpan(this.chkEnabled, 2);
|
this.tableLayoutPanel1.SetColumnSpan(this.chkEnabled, 2);
|
||||||
this.chkEnabled.Location = new System.Drawing.Point(3, 99);
|
this.chkEnabled.Location = new System.Drawing.Point(3, 123);
|
||||||
this.chkEnabled.Name = "chkEnabled";
|
this.chkEnabled.Name = "chkEnabled";
|
||||||
this.chkEnabled.Size = new System.Drawing.Size(65, 17);
|
this.chkEnabled.Size = new System.Drawing.Size(65, 17);
|
||||||
this.chkEnabled.TabIndex = 2;
|
this.chkEnabled.TabIndex = 2;
|
||||||
this.chkEnabled.Text = "Enabled";
|
this.chkEnabled.Text = "Enabled";
|
||||||
this.chkEnabled.UseVisualStyleBackColor = true;
|
this.chkEnabled.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
|
// lblCondition
|
||||||
|
//
|
||||||
|
this.lblCondition.Anchor = System.Windows.Forms.AnchorStyles.Left;
|
||||||
|
this.lblCondition.AutoSize = true;
|
||||||
|
this.lblCondition.Location = new System.Drawing.Point(3, 100);
|
||||||
|
this.lblCondition.Name = "lblCondition";
|
||||||
|
this.lblCondition.Size = new System.Drawing.Size(54, 13);
|
||||||
|
this.lblCondition.TabIndex = 7;
|
||||||
|
this.lblCondition.Text = "Condition:";
|
||||||
|
//
|
||||||
|
// tableLayoutPanel2
|
||||||
|
//
|
||||||
|
this.tableLayoutPanel2.ColumnCount = 2;
|
||||||
|
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||||
|
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
|
||||||
|
this.tableLayoutPanel2.Controls.Add(this.picHelp, 1, 0);
|
||||||
|
this.tableLayoutPanel2.Controls.Add(this.txtCondition, 0, 0);
|
||||||
|
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.tableLayoutPanel2.Location = new System.Drawing.Point(60, 94);
|
||||||
|
this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(0);
|
||||||
|
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
|
||||||
|
this.tableLayoutPanel2.RowCount = 1;
|
||||||
|
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||||
|
this.tableLayoutPanel2.Size = new System.Drawing.Size(318, 26);
|
||||||
|
this.tableLayoutPanel2.TabIndex = 10;
|
||||||
|
//
|
||||||
|
// picHelp
|
||||||
|
//
|
||||||
|
this.picHelp.Image = global::Mesen.GUI.Properties.Resources.help;
|
||||||
|
this.picHelp.Location = new System.Drawing.Point(297, 5);
|
||||||
|
this.picHelp.Margin = new System.Windows.Forms.Padding(3, 5, 3, 3);
|
||||||
|
this.picHelp.Name = "picHelp";
|
||||||
|
this.picHelp.Size = new System.Drawing.Size(18, 18);
|
||||||
|
this.picHelp.TabIndex = 8;
|
||||||
|
this.picHelp.TabStop = false;
|
||||||
|
//
|
||||||
|
// txtCondition
|
||||||
|
//
|
||||||
|
this.txtCondition.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.txtCondition.Location = new System.Drawing.Point(3, 3);
|
||||||
|
this.txtCondition.MaxLength = 900;
|
||||||
|
this.txtCondition.Name = "txtCondition";
|
||||||
|
this.txtCondition.Size = new System.Drawing.Size(288, 20);
|
||||||
|
this.txtCondition.TabIndex = 6;
|
||||||
|
//
|
||||||
|
// tableLayoutPanel3
|
||||||
|
//
|
||||||
|
this.tableLayoutPanel3.ColumnCount = 3;
|
||||||
|
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
|
||||||
|
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||||
|
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
|
||||||
|
this.tableLayoutPanel3.Controls.Add(this.txtAddress, 1, 0);
|
||||||
|
this.tableLayoutPanel3.Controls.Add(this.chkAbsolute, 2, 0);
|
||||||
|
this.tableLayoutPanel3.Controls.Add(this.radSpecificAddress, 0, 0);
|
||||||
|
this.tableLayoutPanel3.Controls.Add(this.radAnyAddress, 0, 1);
|
||||||
|
this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.tableLayoutPanel3.Location = new System.Drawing.Point(60, 46);
|
||||||
|
this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(0);
|
||||||
|
this.tableLayoutPanel3.Name = "tableLayoutPanel3";
|
||||||
|
this.tableLayoutPanel3.RowCount = 2;
|
||||||
|
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||||
|
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||||
|
this.tableLayoutPanel3.Size = new System.Drawing.Size(318, 48);
|
||||||
|
this.tableLayoutPanel3.TabIndex = 11;
|
||||||
|
//
|
||||||
|
// txtAddress
|
||||||
|
//
|
||||||
|
this.txtAddress.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.txtAddress.Location = new System.Drawing.Point(75, 3);
|
||||||
|
this.txtAddress.Name = "txtAddress";
|
||||||
|
this.txtAddress.Size = new System.Drawing.Size(167, 20);
|
||||||
|
this.txtAddress.TabIndex = 5;
|
||||||
|
this.txtAddress.Enter += new System.EventHandler(this.txtAddress_Enter);
|
||||||
|
//
|
||||||
|
// chkAbsolute
|
||||||
|
//
|
||||||
|
this.chkAbsolute.AutoSize = true;
|
||||||
|
this.chkAbsolute.Location = new System.Drawing.Point(248, 5);
|
||||||
|
this.chkAbsolute.Margin = new System.Windows.Forms.Padding(3, 5, 3, 3);
|
||||||
|
this.chkAbsolute.Name = "chkAbsolute";
|
||||||
|
this.chkAbsolute.Size = new System.Drawing.Size(67, 17);
|
||||||
|
this.chkAbsolute.TabIndex = 6;
|
||||||
|
this.chkAbsolute.Text = "Absolute";
|
||||||
|
this.chkAbsolute.UseVisualStyleBackColor = true;
|
||||||
|
this.chkAbsolute.Enter += new System.EventHandler(this.txtAddress_Enter);
|
||||||
|
//
|
||||||
|
// radSpecificAddress
|
||||||
|
//
|
||||||
|
this.radSpecificAddress.AutoSize = true;
|
||||||
|
this.radSpecificAddress.Location = new System.Drawing.Point(3, 3);
|
||||||
|
this.radSpecificAddress.Name = "radSpecificAddress";
|
||||||
|
this.radSpecificAddress.Size = new System.Drawing.Size(66, 17);
|
||||||
|
this.radSpecificAddress.TabIndex = 7;
|
||||||
|
this.radSpecificAddress.TabStop = true;
|
||||||
|
this.radSpecificAddress.Text = "Specific:";
|
||||||
|
this.radSpecificAddress.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// radAnyAddress
|
||||||
|
//
|
||||||
|
this.radAnyAddress.AutoSize = true;
|
||||||
|
this.radAnyAddress.Location = new System.Drawing.Point(3, 29);
|
||||||
|
this.radAnyAddress.Name = "radAnyAddress";
|
||||||
|
this.radAnyAddress.Size = new System.Drawing.Size(43, 17);
|
||||||
|
this.radAnyAddress.TabIndex = 8;
|
||||||
|
this.radAnyAddress.TabStop = true;
|
||||||
|
this.radAnyAddress.Text = "Any";
|
||||||
|
this.radAnyAddress.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// tableLayoutPanel4
|
||||||
|
//
|
||||||
|
this.tableLayoutPanel4.ColumnCount = 2;
|
||||||
|
this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
|
||||||
|
this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||||
|
this.tableLayoutPanel4.Controls.Add(this.flowLayoutPanel3, 1, 1);
|
||||||
|
this.tableLayoutPanel4.Controls.Add(this.radCpu, 0, 0);
|
||||||
|
this.tableLayoutPanel4.Controls.Add(this.radPpu, 0, 1);
|
||||||
|
this.tableLayoutPanel4.Controls.Add(this.flowLayoutPanel2, 1, 0);
|
||||||
|
this.tableLayoutPanel4.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.tableLayoutPanel4.Location = new System.Drawing.Point(60, 0);
|
||||||
|
this.tableLayoutPanel4.Margin = new System.Windows.Forms.Padding(0);
|
||||||
|
this.tableLayoutPanel4.Name = "tableLayoutPanel4";
|
||||||
|
this.tableLayoutPanel4.RowCount = 2;
|
||||||
|
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||||
|
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||||
|
this.tableLayoutPanel4.Size = new System.Drawing.Size(318, 46);
|
||||||
|
this.tableLayoutPanel4.TabIndex = 12;
|
||||||
|
//
|
||||||
|
// flowLayoutPanel3
|
||||||
|
//
|
||||||
|
this.flowLayoutPanel3.Controls.Add(this.chkReadVram);
|
||||||
|
this.flowLayoutPanel3.Controls.Add(this.chkWriteVram);
|
||||||
|
this.flowLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.flowLayoutPanel3.Location = new System.Drawing.Point(56, 23);
|
||||||
|
this.flowLayoutPanel3.Margin = new System.Windows.Forms.Padding(0);
|
||||||
|
this.flowLayoutPanel3.Name = "flowLayoutPanel3";
|
||||||
|
this.flowLayoutPanel3.Size = new System.Drawing.Size(262, 23);
|
||||||
|
this.flowLayoutPanel3.TabIndex = 5;
|
||||||
|
//
|
||||||
|
// chkReadVram
|
||||||
|
//
|
||||||
|
this.chkReadVram.AutoSize = true;
|
||||||
|
this.chkReadVram.Location = new System.Drawing.Point(3, 3);
|
||||||
|
this.chkReadVram.Name = "chkReadVram";
|
||||||
|
this.chkReadVram.Size = new System.Drawing.Size(52, 17);
|
||||||
|
this.chkReadVram.TabIndex = 4;
|
||||||
|
this.chkReadVram.Text = "Read";
|
||||||
|
this.chkReadVram.UseVisualStyleBackColor = true;
|
||||||
|
this.chkReadVram.Enter += new System.EventHandler(this.chkWriteVram_Enter);
|
||||||
|
//
|
||||||
|
// chkWriteVram
|
||||||
|
//
|
||||||
|
this.chkWriteVram.AutoSize = true;
|
||||||
|
this.chkWriteVram.Location = new System.Drawing.Point(61, 3);
|
||||||
|
this.chkWriteVram.Name = "chkWriteVram";
|
||||||
|
this.chkWriteVram.Size = new System.Drawing.Size(51, 17);
|
||||||
|
this.chkWriteVram.TabIndex = 5;
|
||||||
|
this.chkWriteVram.Text = "Write";
|
||||||
|
this.chkWriteVram.UseVisualStyleBackColor = true;
|
||||||
|
this.chkWriteVram.Enter += new System.EventHandler(this.chkWriteVram_Enter);
|
||||||
|
//
|
||||||
|
// radCpu
|
||||||
|
//
|
||||||
|
this.radCpu.AutoSize = true;
|
||||||
|
this.radCpu.Location = new System.Drawing.Point(3, 3);
|
||||||
|
this.radCpu.Name = "radCpu";
|
||||||
|
this.radCpu.Size = new System.Drawing.Size(50, 17);
|
||||||
|
this.radCpu.TabIndex = 0;
|
||||||
|
this.radCpu.TabStop = true;
|
||||||
|
this.radCpu.Text = "CPU:";
|
||||||
|
this.radCpu.UseVisualStyleBackColor = true;
|
||||||
|
this.radCpu.CheckedChanged += new System.EventHandler(this.radCpu_CheckedChanged);
|
||||||
|
//
|
||||||
|
// radPpu
|
||||||
|
//
|
||||||
|
this.radPpu.AutoSize = true;
|
||||||
|
this.radPpu.Location = new System.Drawing.Point(3, 26);
|
||||||
|
this.radPpu.Name = "radPpu";
|
||||||
|
this.radPpu.Size = new System.Drawing.Size(50, 17);
|
||||||
|
this.radPpu.TabIndex = 1;
|
||||||
|
this.radPpu.TabStop = true;
|
||||||
|
this.radPpu.Text = "PPU:";
|
||||||
|
this.radPpu.UseVisualStyleBackColor = true;
|
||||||
|
this.radPpu.CheckedChanged += new System.EventHandler(this.radPpu_CheckedChanged);
|
||||||
|
//
|
||||||
|
// flowLayoutPanel2
|
||||||
|
//
|
||||||
|
this.flowLayoutPanel2.Controls.Add(this.chkRead);
|
||||||
|
this.flowLayoutPanel2.Controls.Add(this.chkWrite);
|
||||||
|
this.flowLayoutPanel2.Controls.Add(this.chkExec);
|
||||||
|
this.flowLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.flowLayoutPanel2.Location = new System.Drawing.Point(56, 0);
|
||||||
|
this.flowLayoutPanel2.Margin = new System.Windows.Forms.Padding(0);
|
||||||
|
this.flowLayoutPanel2.Name = "flowLayoutPanel2";
|
||||||
|
this.flowLayoutPanel2.Size = new System.Drawing.Size(262, 23);
|
||||||
|
this.flowLayoutPanel2.TabIndex = 4;
|
||||||
|
//
|
||||||
|
// chkRead
|
||||||
|
//
|
||||||
|
this.chkRead.AutoSize = true;
|
||||||
|
this.chkRead.Location = new System.Drawing.Point(3, 3);
|
||||||
|
this.chkRead.Name = "chkRead";
|
||||||
|
this.chkRead.Size = new System.Drawing.Size(52, 17);
|
||||||
|
this.chkRead.TabIndex = 4;
|
||||||
|
this.chkRead.Text = "Read";
|
||||||
|
this.chkRead.UseVisualStyleBackColor = true;
|
||||||
|
this.chkRead.Enter += new System.EventHandler(this.chkRead_Enter);
|
||||||
|
//
|
||||||
|
// chkWrite
|
||||||
|
//
|
||||||
|
this.chkWrite.AutoSize = true;
|
||||||
|
this.chkWrite.Location = new System.Drawing.Point(61, 3);
|
||||||
|
this.chkWrite.Name = "chkWrite";
|
||||||
|
this.chkWrite.Size = new System.Drawing.Size(51, 17);
|
||||||
|
this.chkWrite.TabIndex = 5;
|
||||||
|
this.chkWrite.Text = "Write";
|
||||||
|
this.chkWrite.UseVisualStyleBackColor = true;
|
||||||
|
this.chkWrite.Enter += new System.EventHandler(this.chkRead_Enter);
|
||||||
|
//
|
||||||
|
// chkExec
|
||||||
|
//
|
||||||
|
this.chkExec.AutoSize = true;
|
||||||
|
this.chkExec.Location = new System.Drawing.Point(118, 3);
|
||||||
|
this.chkExec.Name = "chkExec";
|
||||||
|
this.chkExec.Size = new System.Drawing.Size(73, 17);
|
||||||
|
this.chkExec.TabIndex = 3;
|
||||||
|
this.chkExec.Text = "Execution";
|
||||||
|
this.chkExec.UseVisualStyleBackColor = true;
|
||||||
|
this.chkExec.Enter += new System.EventHandler(this.chkRead_Enter);
|
||||||
|
//
|
||||||
|
// toolTip
|
||||||
|
//
|
||||||
|
this.toolTip.AutomaticDelay = 0;
|
||||||
|
this.toolTip.AutoPopDelay = 32700;
|
||||||
|
this.toolTip.InitialDelay = 10;
|
||||||
|
this.toolTip.ReshowDelay = 10;
|
||||||
|
this.toolTip.UseFading = false;
|
||||||
|
//
|
||||||
// frmBreakpoint
|
// frmBreakpoint
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.ClientSize = new System.Drawing.Size(327, 171);
|
this.ClientSize = new System.Drawing.Size(378, 180);
|
||||||
this.Controls.Add(this.tableLayoutPanel1);
|
this.Controls.Add(this.tableLayoutPanel1);
|
||||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
|
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
|
||||||
this.Name = "frmBreakpoint";
|
this.Name = "frmBreakpoint";
|
||||||
this.ShowInTaskbar = false;
|
this.ShowInTaskbar = false;
|
||||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||||
this.Text = "Breakpoint";
|
this.Text = "Breakpoint";
|
||||||
this.Controls.SetChildIndex(this.baseConfigPanel, 0);
|
|
||||||
this.Controls.SetChildIndex(this.tableLayoutPanel1, 0);
|
this.Controls.SetChildIndex(this.tableLayoutPanel1, 0);
|
||||||
|
this.Controls.SetChildIndex(this.baseConfigPanel, 0);
|
||||||
this.tableLayoutPanel1.ResumeLayout(false);
|
this.tableLayoutPanel1.ResumeLayout(false);
|
||||||
this.tableLayoutPanel1.PerformLayout();
|
this.tableLayoutPanel1.PerformLayout();
|
||||||
|
this.tableLayoutPanel2.ResumeLayout(false);
|
||||||
|
this.tableLayoutPanel2.PerformLayout();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.picHelp)).EndInit();
|
||||||
|
this.tableLayoutPanel3.ResumeLayout(false);
|
||||||
|
this.tableLayoutPanel3.PerformLayout();
|
||||||
|
this.tableLayoutPanel4.ResumeLayout(false);
|
||||||
|
this.tableLayoutPanel4.PerformLayout();
|
||||||
|
this.flowLayoutPanel3.ResumeLayout(false);
|
||||||
|
this.flowLayoutPanel3.PerformLayout();
|
||||||
this.flowLayoutPanel2.ResumeLayout(false);
|
this.flowLayoutPanel2.ResumeLayout(false);
|
||||||
this.flowLayoutPanel2.PerformLayout();
|
this.flowLayoutPanel2.PerformLayout();
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
|
@ -177,10 +395,25 @@
|
||||||
private System.Windows.Forms.Label lblBreakOn;
|
private System.Windows.Forms.Label lblBreakOn;
|
||||||
private System.Windows.Forms.Label lblAddress;
|
private System.Windows.Forms.Label lblAddress;
|
||||||
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel2;
|
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel2;
|
||||||
private System.Windows.Forms.RadioButton radTypeExecute;
|
|
||||||
private System.Windows.Forms.RadioButton radTypeRead;
|
|
||||||
private System.Windows.Forms.RadioButton radTypeWrite;
|
|
||||||
private System.Windows.Forms.TextBox txtAddress;
|
private System.Windows.Forms.TextBox txtAddress;
|
||||||
private System.Windows.Forms.CheckBox chkEnabled;
|
private System.Windows.Forms.CheckBox chkEnabled;
|
||||||
|
private System.Windows.Forms.TextBox txtCondition;
|
||||||
|
private System.Windows.Forms.Label lblCondition;
|
||||||
|
private System.Windows.Forms.PictureBox picHelp;
|
||||||
|
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
|
||||||
|
private System.Windows.Forms.ToolTip toolTip;
|
||||||
|
private System.Windows.Forms.CheckBox chkExec;
|
||||||
|
private System.Windows.Forms.CheckBox chkRead;
|
||||||
|
private System.Windows.Forms.CheckBox chkWrite;
|
||||||
|
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3;
|
||||||
|
private System.Windows.Forms.CheckBox chkAbsolute;
|
||||||
|
private System.Windows.Forms.RadioButton radSpecificAddress;
|
||||||
|
private System.Windows.Forms.RadioButton radAnyAddress;
|
||||||
|
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel4;
|
||||||
|
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel3;
|
||||||
|
private System.Windows.Forms.CheckBox chkReadVram;
|
||||||
|
private System.Windows.Forms.CheckBox chkWriteVram;
|
||||||
|
private System.Windows.Forms.RadioButton radCpu;
|
||||||
|
private System.Windows.Forms.RadioButton radPpu;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -19,23 +19,61 @@ namespace Mesen.GUI.Debugger
|
||||||
|
|
||||||
Entity = breakpoint;
|
Entity = breakpoint;
|
||||||
|
|
||||||
radTypeExecute.Tag = BreakpointType.Execute;
|
if(breakpoint.Type >= BreakpointType.ReadVram) {
|
||||||
radTypeRead.Tag = BreakpointType.Read;
|
radPpu.Checked = true;
|
||||||
radTypeWrite.Tag = BreakpointType.Write;
|
} else {
|
||||||
|
radCpu.Checked = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddBinding("SpecificAddress", radSpecificAddress, radAnyAddress);
|
||||||
AddBinding("Enabled", chkEnabled);
|
AddBinding("Enabled", chkEnabled);
|
||||||
|
AddBinding("IsAbsoluteAddress", chkAbsolute);
|
||||||
AddBinding("Address", txtAddress);
|
AddBinding("Address", txtAddress);
|
||||||
AddBinding("Type", radTypeExecute.Parent);
|
AddBinding("BreakOnRead", chkRead);
|
||||||
|
AddBinding("BreakOnWrite", chkWrite);
|
||||||
|
AddBinding("BreakOnExec", chkExec);
|
||||||
|
AddBinding("BreakOnReadVram", chkReadVram);
|
||||||
|
AddBinding("BreakOnWriteVram", chkWriteVram);
|
||||||
|
AddBinding("Condition", txtCondition);
|
||||||
|
|
||||||
|
this.toolTip.SetToolTip(this.chkAbsolute, "Check to set an absolute address based on the exact address in PRG/CHR ROM (not CPU/PPU memory)");
|
||||||
|
this.toolTip.SetToolTip(this.picHelp, "Most expressions/operators are accepted (C++ syntax)." + Environment.NewLine + "Note: Use the $ prefix to denote hexadecimal values." + Environment.NewLine + Environment.NewLine + "A/X/Y/PS/SP: Value of registers" + Environment.NewLine +"Irq/Nmi: True if the Irq/Nmi flags are set" + Environment.NewLine + "Cycle/Scanline: Current cycle (0-340)/scanline(-1 to 240) of the PPU" + Environment.NewLine + "Value: Current value being read/written from/to memory" + Environment.NewLine + Environment.NewLine + "Examples:" + Environment.NewLine + "a == 10 || x == $23" + Environment.NewLine + "scanline == 10 && (cycle >= 55 && cycle <= 100)");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnFormClosed(FormClosedEventArgs e)
|
protected override bool ValidateInput()
|
||||||
{
|
{
|
||||||
if(DialogResult == System.Windows.Forms.DialogResult.OK) {
|
return chkRead.Checked || chkWrite.Checked || chkExec.Checked || chkReadVram.Checked || chkWriteVram.Checked || txtCondition.Text.Length > 0;
|
||||||
((Breakpoint)Entity).Remove();
|
|
||||||
}
|
}
|
||||||
base.OnFormClosed(e);
|
|
||||||
if(DialogResult == System.Windows.Forms.DialogResult.OK) {
|
private void txtAddress_Enter(object sender, EventArgs e)
|
||||||
((Breakpoint)Entity).Add();
|
{
|
||||||
|
radSpecificAddress.Checked = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void chkWriteVram_Enter(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
radPpu.Checked = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void chkRead_Enter(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
radCpu.Checked = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void radCpu_CheckedChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if(radCpu.Checked) {
|
||||||
|
chkReadVram.Checked = false;
|
||||||
|
chkWriteVram.Checked = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void radPpu_CheckedChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if(radPpu.Checked) {
|
||||||
|
chkRead.Checked = false;
|
||||||
|
chkWrite.Checked = false;
|
||||||
|
chkExec.Checked = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,4 +117,7 @@
|
||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
|
<metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>17, 17</value>
|
||||||
|
</metadata>
|
||||||
</root>
|
</root>
|
289
GUI.NET/Debugger/frmDebugger.Designer.cs
generated
289
GUI.NET/Debugger/frmDebugger.Designer.cs
generated
|
@ -34,13 +34,19 @@
|
||||||
this.components = new System.ComponentModel.Container();
|
this.components = new System.ComponentModel.Container();
|
||||||
this.splitContainer = new System.Windows.Forms.SplitContainer();
|
this.splitContainer = new System.Windows.Forms.SplitContainer();
|
||||||
this.tlpTop = new System.Windows.Forms.TableLayoutPanel();
|
this.tlpTop = new System.Windows.Forms.TableLayoutPanel();
|
||||||
|
this.ctrlDebuggerCode = new Mesen.GUI.Debugger.ctrlDebuggerCode();
|
||||||
this.contextMenuCode = new System.Windows.Forms.ContextMenuStrip(this.components);
|
this.contextMenuCode = new System.Windows.Forms.ContextMenuStrip(this.components);
|
||||||
this.mnuShowNextStatement = new System.Windows.Forms.ToolStripMenuItem();
|
this.mnuShowNextStatement = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.mnuSetNextStatement = new System.Windows.Forms.ToolStripMenuItem();
|
this.mnuSetNextStatement = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.ctrlConsoleStatus = new Mesen.GUI.Debugger.ctrlConsoleStatus();
|
||||||
|
this.ctrlDebuggerCodeSplit = new Mesen.GUI.Debugger.ctrlDebuggerCode();
|
||||||
this.tableLayoutPanel10 = new System.Windows.Forms.TableLayoutPanel();
|
this.tableLayoutPanel10 = new System.Windows.Forms.TableLayoutPanel();
|
||||||
this.grpWatch = new System.Windows.Forms.GroupBox();
|
this.grpWatch = new System.Windows.Forms.GroupBox();
|
||||||
|
this.ctrlWatch = new Mesen.GUI.Debugger.ctrlWatch();
|
||||||
this.grpBreakpoints = new System.Windows.Forms.GroupBox();
|
this.grpBreakpoints = new System.Windows.Forms.GroupBox();
|
||||||
|
this.ctrlBreakpoints = new Mesen.GUI.Debugger.Controls.ctrlBreakpoints();
|
||||||
this.grpCallstack = new System.Windows.Forms.GroupBox();
|
this.grpCallstack = new System.Windows.Forms.GroupBox();
|
||||||
|
this.ctrlCallstack = new Mesen.GUI.Debugger.Controls.ctrlCallstack();
|
||||||
this.menuStrip = new System.Windows.Forms.MenuStrip();
|
this.menuStrip = new System.Windows.Forms.MenuStrip();
|
||||||
this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripSeparator();
|
this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripSeparator();
|
||||||
|
@ -70,26 +76,21 @@
|
||||||
this.mnuPpuViewer = new System.Windows.Forms.ToolStripMenuItem();
|
this.mnuPpuViewer = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.mnuMemoryViewer = new System.Windows.Forms.ToolStripMenuItem();
|
this.mnuMemoryViewer = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.mnuCodeDataLogger = new System.Windows.Forms.ToolStripMenuItem();
|
this.mnuCodeDataLogger = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.autoLoadsaveCDLFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripSeparator();
|
||||||
|
this.mnuLoadCdlFile = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.mnuSaveAsCdlFile = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.mnuResetCdlLog = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.generateROMToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.saveStrippedDataToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.saveUnusedDataToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.statusStrip = new System.Windows.Forms.StatusStrip();
|
this.statusStrip = new System.Windows.Forms.StatusStrip();
|
||||||
this.lblPrgAnalysis = new System.Windows.Forms.ToolStripStatusLabel();
|
this.lblPrgAnalysis = new System.Windows.Forms.ToolStripStatusLabel();
|
||||||
this.lblPrgAnalysisResult = new System.Windows.Forms.ToolStripStatusLabel();
|
this.lblPrgAnalysisResult = new System.Windows.Forms.ToolStripStatusLabel();
|
||||||
this.lblChrAnalysis = new System.Windows.Forms.ToolStripStatusLabel();
|
this.lblChrAnalysis = new System.Windows.Forms.ToolStripStatusLabel();
|
||||||
this.lblChrAnalysisResult = new System.Windows.Forms.ToolStripStatusLabel();
|
this.lblChrAnalysisResult = new System.Windows.Forms.ToolStripStatusLabel();
|
||||||
this.tmrCdlRatios = new System.Windows.Forms.Timer(this.components);
|
this.tmrCdlRatios = new System.Windows.Forms.Timer(this.components);
|
||||||
this.mnuResetCdlLog = new System.Windows.Forms.ToolStripMenuItem();
|
this.mnuDisableEnableBreakpoint = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.autoLoadsaveCDLFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.generateROMToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.saveStrippedDataToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.saveUnusedDataToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripSeparator();
|
|
||||||
this.mnuSaveAsCdlFile = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.mnuLoadCdlFile = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.ctrlDebuggerCode = new Mesen.GUI.Debugger.ctrlDebuggerCode();
|
|
||||||
this.ctrlConsoleStatus = new Mesen.GUI.Debugger.ctrlConsoleStatus();
|
|
||||||
this.ctrlDebuggerCodeSplit = new Mesen.GUI.Debugger.ctrlDebuggerCode();
|
|
||||||
this.ctrlWatch = new Mesen.GUI.Debugger.ctrlWatch();
|
|
||||||
this.ctrlBreakpoints = new Mesen.GUI.Debugger.Controls.ctrlBreakpoints();
|
|
||||||
this.ctrlCallstack = new Mesen.GUI.Debugger.Controls.ctrlCallstack();
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
|
||||||
this.splitContainer.Panel1.SuspendLayout();
|
this.splitContainer.Panel1.SuspendLayout();
|
||||||
this.splitContainer.Panel2.SuspendLayout();
|
this.splitContainer.Panel2.SuspendLayout();
|
||||||
|
@ -142,6 +143,19 @@
|
||||||
this.tlpTop.Size = new System.Drawing.Size(984, 412);
|
this.tlpTop.Size = new System.Drawing.Size(984, 412);
|
||||||
this.tlpTop.TabIndex = 2;
|
this.tlpTop.TabIndex = 2;
|
||||||
//
|
//
|
||||||
|
// ctrlDebuggerCode
|
||||||
|
//
|
||||||
|
this.ctrlDebuggerCode.Code = null;
|
||||||
|
this.ctrlDebuggerCode.ContextMenuStrip = this.contextMenuCode;
|
||||||
|
this.ctrlDebuggerCode.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.ctrlDebuggerCode.Location = new System.Drawing.Point(3, 3);
|
||||||
|
this.ctrlDebuggerCode.Name = "ctrlDebuggerCode";
|
||||||
|
this.ctrlDebuggerCode.Size = new System.Drawing.Size(546, 406);
|
||||||
|
this.ctrlDebuggerCode.TabIndex = 2;
|
||||||
|
this.ctrlDebuggerCode.OnWatchAdded += new Mesen.GUI.Debugger.ctrlDebuggerCode.AddressEventHandler(this.ctrlDebuggerCode_OnWatchAdded);
|
||||||
|
this.ctrlDebuggerCode.OnSetNextStatement += new Mesen.GUI.Debugger.ctrlDebuggerCode.AddressEventHandler(this.ctrlDebuggerCode_OnSetNextStatement);
|
||||||
|
this.ctrlDebuggerCode.Enter += new System.EventHandler(this.ctrlDebuggerCode_Enter);
|
||||||
|
//
|
||||||
// contextMenuCode
|
// contextMenuCode
|
||||||
//
|
//
|
||||||
this.contextMenuCode.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
this.contextMenuCode.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
|
@ -166,6 +180,28 @@
|
||||||
this.mnuSetNextStatement.Size = new System.Drawing.Size(258, 22);
|
this.mnuSetNextStatement.Size = new System.Drawing.Size(258, 22);
|
||||||
this.mnuSetNextStatement.Text = "Set Next Statement";
|
this.mnuSetNextStatement.Text = "Set Next Statement";
|
||||||
//
|
//
|
||||||
|
// ctrlConsoleStatus
|
||||||
|
//
|
||||||
|
this.ctrlConsoleStatus.Dock = System.Windows.Forms.DockStyle.Top;
|
||||||
|
this.ctrlConsoleStatus.Location = new System.Drawing.Point(552, 0);
|
||||||
|
this.ctrlConsoleStatus.Margin = new System.Windows.Forms.Padding(0);
|
||||||
|
this.ctrlConsoleStatus.Name = "ctrlConsoleStatus";
|
||||||
|
this.ctrlConsoleStatus.Size = new System.Drawing.Size(432, 362);
|
||||||
|
this.ctrlConsoleStatus.TabIndex = 3;
|
||||||
|
//
|
||||||
|
// ctrlDebuggerCodeSplit
|
||||||
|
//
|
||||||
|
this.ctrlDebuggerCodeSplit.Code = null;
|
||||||
|
this.ctrlDebuggerCodeSplit.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.ctrlDebuggerCodeSplit.Location = new System.Drawing.Point(555, 3);
|
||||||
|
this.ctrlDebuggerCodeSplit.Name = "ctrlDebuggerCodeSplit";
|
||||||
|
this.ctrlDebuggerCodeSplit.Size = new System.Drawing.Size(1, 406);
|
||||||
|
this.ctrlDebuggerCodeSplit.TabIndex = 4;
|
||||||
|
this.ctrlDebuggerCodeSplit.Visible = false;
|
||||||
|
this.ctrlDebuggerCodeSplit.OnWatchAdded += new Mesen.GUI.Debugger.ctrlDebuggerCode.AddressEventHandler(this.ctrlDebuggerCode_OnWatchAdded);
|
||||||
|
this.ctrlDebuggerCodeSplit.OnSetNextStatement += new Mesen.GUI.Debugger.ctrlDebuggerCode.AddressEventHandler(this.ctrlDebuggerCode_OnSetNextStatement);
|
||||||
|
this.ctrlDebuggerCodeSplit.Enter += new System.EventHandler(this.ctrlDebuggerCodeSplit_Enter);
|
||||||
|
//
|
||||||
// tableLayoutPanel10
|
// tableLayoutPanel10
|
||||||
//
|
//
|
||||||
this.tableLayoutPanel10.ColumnCount = 3;
|
this.tableLayoutPanel10.ColumnCount = 3;
|
||||||
|
@ -194,6 +230,14 @@
|
||||||
this.grpWatch.TabStop = false;
|
this.grpWatch.TabStop = false;
|
||||||
this.grpWatch.Text = "Watch";
|
this.grpWatch.Text = "Watch";
|
||||||
//
|
//
|
||||||
|
// ctrlWatch
|
||||||
|
//
|
||||||
|
this.ctrlWatch.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.ctrlWatch.Location = new System.Drawing.Point(3, 16);
|
||||||
|
this.ctrlWatch.Name = "ctrlWatch";
|
||||||
|
this.ctrlWatch.Size = new System.Drawing.Size(316, 123);
|
||||||
|
this.ctrlWatch.TabIndex = 0;
|
||||||
|
//
|
||||||
// grpBreakpoints
|
// grpBreakpoints
|
||||||
//
|
//
|
||||||
this.grpBreakpoints.Controls.Add(this.ctrlBreakpoints);
|
this.grpBreakpoints.Controls.Add(this.ctrlBreakpoints);
|
||||||
|
@ -205,6 +249,15 @@
|
||||||
this.grpBreakpoints.TabStop = false;
|
this.grpBreakpoints.TabStop = false;
|
||||||
this.grpBreakpoints.Text = "Breakpoints";
|
this.grpBreakpoints.Text = "Breakpoints";
|
||||||
//
|
//
|
||||||
|
// ctrlBreakpoints
|
||||||
|
//
|
||||||
|
this.ctrlBreakpoints.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.ctrlBreakpoints.Location = new System.Drawing.Point(3, 16);
|
||||||
|
this.ctrlBreakpoints.Name = "ctrlBreakpoints";
|
||||||
|
this.ctrlBreakpoints.Size = new System.Drawing.Size(316, 123);
|
||||||
|
this.ctrlBreakpoints.TabIndex = 0;
|
||||||
|
this.ctrlBreakpoints.BreakpointChanged += new System.EventHandler(this.ctrlBreakpoints_BreakpointChanged);
|
||||||
|
//
|
||||||
// grpCallstack
|
// grpCallstack
|
||||||
//
|
//
|
||||||
this.grpCallstack.Controls.Add(this.ctrlCallstack);
|
this.grpCallstack.Controls.Add(this.ctrlCallstack);
|
||||||
|
@ -216,6 +269,15 @@
|
||||||
this.grpCallstack.TabStop = false;
|
this.grpCallstack.TabStop = false;
|
||||||
this.grpCallstack.Text = "Callstack";
|
this.grpCallstack.Text = "Callstack";
|
||||||
//
|
//
|
||||||
|
// ctrlCallstack
|
||||||
|
//
|
||||||
|
this.ctrlCallstack.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.ctrlCallstack.Location = new System.Drawing.Point(3, 16);
|
||||||
|
this.ctrlCallstack.Name = "ctrlCallstack";
|
||||||
|
this.ctrlCallstack.Size = new System.Drawing.Size(316, 123);
|
||||||
|
this.ctrlCallstack.TabIndex = 0;
|
||||||
|
this.ctrlCallstack.FunctionSelected += new System.EventHandler(this.ctrlCallstack_FunctionSelected);
|
||||||
|
//
|
||||||
// menuStrip
|
// menuStrip
|
||||||
//
|
//
|
||||||
this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
|
@ -315,6 +377,7 @@
|
||||||
this.mnuStepOut,
|
this.mnuStepOut,
|
||||||
this.toolStripMenuItem1,
|
this.toolStripMenuItem1,
|
||||||
this.mnuToggleBreakpoint,
|
this.mnuToggleBreakpoint,
|
||||||
|
this.mnuDisableEnableBreakpoint,
|
||||||
this.toolStripMenuItem2,
|
this.toolStripMenuItem2,
|
||||||
this.mnuRunOneFrame});
|
this.mnuRunOneFrame});
|
||||||
this.debugToolStripMenuItem.Name = "debugToolStripMenuItem";
|
this.debugToolStripMenuItem.Name = "debugToolStripMenuItem";
|
||||||
|
@ -325,7 +388,7 @@
|
||||||
//
|
//
|
||||||
this.mnuContinue.Name = "mnuContinue";
|
this.mnuContinue.Name = "mnuContinue";
|
||||||
this.mnuContinue.ShortcutKeys = System.Windows.Forms.Keys.F5;
|
this.mnuContinue.ShortcutKeys = System.Windows.Forms.Keys.F5;
|
||||||
this.mnuContinue.Size = new System.Drawing.Size(190, 22);
|
this.mnuContinue.Size = new System.Drawing.Size(258, 22);
|
||||||
this.mnuContinue.Text = "Continue";
|
this.mnuContinue.Text = "Continue";
|
||||||
this.mnuContinue.Click += new System.EventHandler(this.mnuContinue_Click);
|
this.mnuContinue.Click += new System.EventHandler(this.mnuContinue_Click);
|
||||||
//
|
//
|
||||||
|
@ -335,7 +398,7 @@
|
||||||
this.mnuBreak.ShortcutKeyDisplayString = "Ctrl+Alt+Break";
|
this.mnuBreak.ShortcutKeyDisplayString = "Ctrl+Alt+Break";
|
||||||
this.mnuBreak.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Alt)
|
this.mnuBreak.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Alt)
|
||||||
| System.Windows.Forms.Keys.Cancel)));
|
| System.Windows.Forms.Keys.Cancel)));
|
||||||
this.mnuBreak.Size = new System.Drawing.Size(190, 22);
|
this.mnuBreak.Size = new System.Drawing.Size(258, 22);
|
||||||
this.mnuBreak.Text = "Break";
|
this.mnuBreak.Text = "Break";
|
||||||
this.mnuBreak.Click += new System.EventHandler(this.mnuBreak_Click);
|
this.mnuBreak.Click += new System.EventHandler(this.mnuBreak_Click);
|
||||||
//
|
//
|
||||||
|
@ -343,7 +406,7 @@
|
||||||
//
|
//
|
||||||
this.mnuStepInto.Name = "mnuStepInto";
|
this.mnuStepInto.Name = "mnuStepInto";
|
||||||
this.mnuStepInto.ShortcutKeys = System.Windows.Forms.Keys.F11;
|
this.mnuStepInto.ShortcutKeys = System.Windows.Forms.Keys.F11;
|
||||||
this.mnuStepInto.Size = new System.Drawing.Size(190, 22);
|
this.mnuStepInto.Size = new System.Drawing.Size(258, 22);
|
||||||
this.mnuStepInto.Text = "Step Into";
|
this.mnuStepInto.Text = "Step Into";
|
||||||
this.mnuStepInto.Click += new System.EventHandler(this.mnuStepInto_Click);
|
this.mnuStepInto.Click += new System.EventHandler(this.mnuStepInto_Click);
|
||||||
//
|
//
|
||||||
|
@ -351,7 +414,7 @@
|
||||||
//
|
//
|
||||||
this.mnuStepOver.Name = "mnuStepOver";
|
this.mnuStepOver.Name = "mnuStepOver";
|
||||||
this.mnuStepOver.ShortcutKeys = System.Windows.Forms.Keys.F10;
|
this.mnuStepOver.ShortcutKeys = System.Windows.Forms.Keys.F10;
|
||||||
this.mnuStepOver.Size = new System.Drawing.Size(190, 22);
|
this.mnuStepOver.Size = new System.Drawing.Size(258, 22);
|
||||||
this.mnuStepOver.Text = "Step Over";
|
this.mnuStepOver.Text = "Step Over";
|
||||||
this.mnuStepOver.Click += new System.EventHandler(this.mnuStepOver_Click);
|
this.mnuStepOver.Click += new System.EventHandler(this.mnuStepOver_Click);
|
||||||
//
|
//
|
||||||
|
@ -359,33 +422,33 @@
|
||||||
//
|
//
|
||||||
this.mnuStepOut.Name = "mnuStepOut";
|
this.mnuStepOut.Name = "mnuStepOut";
|
||||||
this.mnuStepOut.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Shift | System.Windows.Forms.Keys.F11)));
|
this.mnuStepOut.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Shift | System.Windows.Forms.Keys.F11)));
|
||||||
this.mnuStepOut.Size = new System.Drawing.Size(190, 22);
|
this.mnuStepOut.Size = new System.Drawing.Size(258, 22);
|
||||||
this.mnuStepOut.Text = "Step Out";
|
this.mnuStepOut.Text = "Step Out";
|
||||||
this.mnuStepOut.Click += new System.EventHandler(this.mnuStepOut_Click);
|
this.mnuStepOut.Click += new System.EventHandler(this.mnuStepOut_Click);
|
||||||
//
|
//
|
||||||
// toolStripMenuItem1
|
// toolStripMenuItem1
|
||||||
//
|
//
|
||||||
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
|
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
|
||||||
this.toolStripMenuItem1.Size = new System.Drawing.Size(187, 6);
|
this.toolStripMenuItem1.Size = new System.Drawing.Size(255, 6);
|
||||||
//
|
//
|
||||||
// mnuToggleBreakpoint
|
// mnuToggleBreakpoint
|
||||||
//
|
//
|
||||||
this.mnuToggleBreakpoint.Name = "mnuToggleBreakpoint";
|
this.mnuToggleBreakpoint.Name = "mnuToggleBreakpoint";
|
||||||
this.mnuToggleBreakpoint.ShortcutKeys = System.Windows.Forms.Keys.F9;
|
this.mnuToggleBreakpoint.ShortcutKeys = System.Windows.Forms.Keys.F9;
|
||||||
this.mnuToggleBreakpoint.Size = new System.Drawing.Size(190, 22);
|
this.mnuToggleBreakpoint.Size = new System.Drawing.Size(258, 22);
|
||||||
this.mnuToggleBreakpoint.Text = "Toggle Breakpoint";
|
this.mnuToggleBreakpoint.Text = "Toggle Breakpoint";
|
||||||
this.mnuToggleBreakpoint.Click += new System.EventHandler(this.mnuToggleBreakpoint_Click);
|
this.mnuToggleBreakpoint.Click += new System.EventHandler(this.mnuToggleBreakpoint_Click);
|
||||||
//
|
//
|
||||||
// toolStripMenuItem2
|
// toolStripMenuItem2
|
||||||
//
|
//
|
||||||
this.toolStripMenuItem2.Name = "toolStripMenuItem2";
|
this.toolStripMenuItem2.Name = "toolStripMenuItem2";
|
||||||
this.toolStripMenuItem2.Size = new System.Drawing.Size(187, 6);
|
this.toolStripMenuItem2.Size = new System.Drawing.Size(255, 6);
|
||||||
//
|
//
|
||||||
// mnuRunOneFrame
|
// mnuRunOneFrame
|
||||||
//
|
//
|
||||||
this.mnuRunOneFrame.Name = "mnuRunOneFrame";
|
this.mnuRunOneFrame.Name = "mnuRunOneFrame";
|
||||||
this.mnuRunOneFrame.ShortcutKeys = System.Windows.Forms.Keys.F12;
|
this.mnuRunOneFrame.ShortcutKeys = System.Windows.Forms.Keys.F12;
|
||||||
this.mnuRunOneFrame.Size = new System.Drawing.Size(190, 22);
|
this.mnuRunOneFrame.Size = new System.Drawing.Size(258, 22);
|
||||||
this.mnuRunOneFrame.Text = "Run one frame";
|
this.mnuRunOneFrame.Text = "Run one frame";
|
||||||
this.mnuRunOneFrame.Click += new System.EventHandler(this.mnuRunOneFrame_Click);
|
this.mnuRunOneFrame.Click += new System.EventHandler(this.mnuRunOneFrame_Click);
|
||||||
//
|
//
|
||||||
|
@ -469,6 +532,63 @@
|
||||||
this.mnuCodeDataLogger.Size = new System.Drawing.Size(171, 22);
|
this.mnuCodeDataLogger.Size = new System.Drawing.Size(171, 22);
|
||||||
this.mnuCodeDataLogger.Text = "Code/Data Logger";
|
this.mnuCodeDataLogger.Text = "Code/Data Logger";
|
||||||
//
|
//
|
||||||
|
// autoLoadsaveCDLFileToolStripMenuItem
|
||||||
|
//
|
||||||
|
this.autoLoadsaveCDLFileToolStripMenuItem.Checked = true;
|
||||||
|
this.autoLoadsaveCDLFileToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||||
|
this.autoLoadsaveCDLFileToolStripMenuItem.Enabled = false;
|
||||||
|
this.autoLoadsaveCDLFileToolStripMenuItem.Name = "autoLoadsaveCDLFileToolStripMenuItem";
|
||||||
|
this.autoLoadsaveCDLFileToolStripMenuItem.Size = new System.Drawing.Size(193, 22);
|
||||||
|
this.autoLoadsaveCDLFileToolStripMenuItem.Text = "Auto load/save log file";
|
||||||
|
//
|
||||||
|
// toolStripMenuItem4
|
||||||
|
//
|
||||||
|
this.toolStripMenuItem4.Name = "toolStripMenuItem4";
|
||||||
|
this.toolStripMenuItem4.Size = new System.Drawing.Size(190, 6);
|
||||||
|
//
|
||||||
|
// mnuLoadCdlFile
|
||||||
|
//
|
||||||
|
this.mnuLoadCdlFile.Name = "mnuLoadCdlFile";
|
||||||
|
this.mnuLoadCdlFile.Size = new System.Drawing.Size(193, 22);
|
||||||
|
this.mnuLoadCdlFile.Text = "Load CDL file...";
|
||||||
|
this.mnuLoadCdlFile.Click += new System.EventHandler(this.mnuLoadCdlFile_Click);
|
||||||
|
//
|
||||||
|
// mnuSaveAsCdlFile
|
||||||
|
//
|
||||||
|
this.mnuSaveAsCdlFile.Name = "mnuSaveAsCdlFile";
|
||||||
|
this.mnuSaveAsCdlFile.Size = new System.Drawing.Size(193, 22);
|
||||||
|
this.mnuSaveAsCdlFile.Text = "Save as CDL file...";
|
||||||
|
this.mnuSaveAsCdlFile.Click += new System.EventHandler(this.mnuSaveAsCdlFile_Click);
|
||||||
|
//
|
||||||
|
// mnuResetCdlLog
|
||||||
|
//
|
||||||
|
this.mnuResetCdlLog.Name = "mnuResetCdlLog";
|
||||||
|
this.mnuResetCdlLog.Size = new System.Drawing.Size(193, 22);
|
||||||
|
this.mnuResetCdlLog.Text = "Reset log";
|
||||||
|
this.mnuResetCdlLog.Click += new System.EventHandler(this.mnuResetCdlLog_Click);
|
||||||
|
//
|
||||||
|
// generateROMToolStripMenuItem
|
||||||
|
//
|
||||||
|
this.generateROMToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
|
this.saveStrippedDataToolStripMenuItem,
|
||||||
|
this.saveUnusedDataToolStripMenuItem});
|
||||||
|
this.generateROMToolStripMenuItem.Enabled = false;
|
||||||
|
this.generateROMToolStripMenuItem.Name = "generateROMToolStripMenuItem";
|
||||||
|
this.generateROMToolStripMenuItem.Size = new System.Drawing.Size(193, 22);
|
||||||
|
this.generateROMToolStripMenuItem.Text = "Generate ROM";
|
||||||
|
//
|
||||||
|
// saveStrippedDataToolStripMenuItem
|
||||||
|
//
|
||||||
|
this.saveStrippedDataToolStripMenuItem.Name = "saveStrippedDataToolStripMenuItem";
|
||||||
|
this.saveStrippedDataToolStripMenuItem.Size = new System.Drawing.Size(170, 22);
|
||||||
|
this.saveStrippedDataToolStripMenuItem.Text = "Save stripped data";
|
||||||
|
//
|
||||||
|
// saveUnusedDataToolStripMenuItem
|
||||||
|
//
|
||||||
|
this.saveUnusedDataToolStripMenuItem.Name = "saveUnusedDataToolStripMenuItem";
|
||||||
|
this.saveUnusedDataToolStripMenuItem.Size = new System.Drawing.Size(170, 22);
|
||||||
|
this.saveUnusedDataToolStripMenuItem.Text = "Save unused data";
|
||||||
|
//
|
||||||
// statusStrip
|
// statusStrip
|
||||||
//
|
//
|
||||||
this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
|
@ -514,123 +634,13 @@
|
||||||
this.tmrCdlRatios.Interval = 300;
|
this.tmrCdlRatios.Interval = 300;
|
||||||
this.tmrCdlRatios.Tick += new System.EventHandler(this.tmrCdlRatios_Tick);
|
this.tmrCdlRatios.Tick += new System.EventHandler(this.tmrCdlRatios_Tick);
|
||||||
//
|
//
|
||||||
// mnuResetCdlLog
|
// mnuDisableEnableBreakpoint
|
||||||
//
|
//
|
||||||
this.mnuResetCdlLog.Name = "mnuResetCdlLog";
|
this.mnuDisableEnableBreakpoint.Name = "mnuDisableEnableBreakpoint";
|
||||||
this.mnuResetCdlLog.Size = new System.Drawing.Size(193, 22);
|
this.mnuDisableEnableBreakpoint.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F9)));
|
||||||
this.mnuResetCdlLog.Text = "Reset log";
|
this.mnuDisableEnableBreakpoint.Size = new System.Drawing.Size(258, 22);
|
||||||
this.mnuResetCdlLog.Click += new System.EventHandler(this.mnuResetCdlLog_Click);
|
this.mnuDisableEnableBreakpoint.Text = "Disable/Enable Breakpoint";
|
||||||
//
|
this.mnuDisableEnableBreakpoint.Click += new System.EventHandler(this.mnuDisableEnableBreakpoint_Click);
|
||||||
// autoLoadsaveCDLFileToolStripMenuItem
|
|
||||||
//
|
|
||||||
this.autoLoadsaveCDLFileToolStripMenuItem.Checked = true;
|
|
||||||
this.autoLoadsaveCDLFileToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked;
|
|
||||||
this.autoLoadsaveCDLFileToolStripMenuItem.Enabled = false;
|
|
||||||
this.autoLoadsaveCDLFileToolStripMenuItem.Name = "autoLoadsaveCDLFileToolStripMenuItem";
|
|
||||||
this.autoLoadsaveCDLFileToolStripMenuItem.Size = new System.Drawing.Size(193, 22);
|
|
||||||
this.autoLoadsaveCDLFileToolStripMenuItem.Text = "Auto load/save log file";
|
|
||||||
//
|
|
||||||
// generateROMToolStripMenuItem
|
|
||||||
//
|
|
||||||
this.generateROMToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
|
||||||
this.saveStrippedDataToolStripMenuItem,
|
|
||||||
this.saveUnusedDataToolStripMenuItem});
|
|
||||||
this.generateROMToolStripMenuItem.Enabled = false;
|
|
||||||
this.generateROMToolStripMenuItem.Name = "generateROMToolStripMenuItem";
|
|
||||||
this.generateROMToolStripMenuItem.Size = new System.Drawing.Size(193, 22);
|
|
||||||
this.generateROMToolStripMenuItem.Text = "Generate ROM";
|
|
||||||
//
|
|
||||||
// saveStrippedDataToolStripMenuItem
|
|
||||||
//
|
|
||||||
this.saveStrippedDataToolStripMenuItem.Name = "saveStrippedDataToolStripMenuItem";
|
|
||||||
this.saveStrippedDataToolStripMenuItem.Size = new System.Drawing.Size(170, 22);
|
|
||||||
this.saveStrippedDataToolStripMenuItem.Text = "Save stripped data";
|
|
||||||
//
|
|
||||||
// saveUnusedDataToolStripMenuItem
|
|
||||||
//
|
|
||||||
this.saveUnusedDataToolStripMenuItem.Name = "saveUnusedDataToolStripMenuItem";
|
|
||||||
this.saveUnusedDataToolStripMenuItem.Size = new System.Drawing.Size(170, 22);
|
|
||||||
this.saveUnusedDataToolStripMenuItem.Text = "Save unused data";
|
|
||||||
//
|
|
||||||
// toolStripMenuItem4
|
|
||||||
//
|
|
||||||
this.toolStripMenuItem4.Name = "toolStripMenuItem4";
|
|
||||||
this.toolStripMenuItem4.Size = new System.Drawing.Size(190, 6);
|
|
||||||
//
|
|
||||||
// mnuSaveAsCdlFile
|
|
||||||
//
|
|
||||||
this.mnuSaveAsCdlFile.Name = "mnuSaveAsCdlFile";
|
|
||||||
this.mnuSaveAsCdlFile.Size = new System.Drawing.Size(193, 22);
|
|
||||||
this.mnuSaveAsCdlFile.Text = "Save as CDL file...";
|
|
||||||
this.mnuSaveAsCdlFile.Click += new System.EventHandler(this.mnuSaveAsCdlFile_Click);
|
|
||||||
//
|
|
||||||
// mnuLoadCdlFile
|
|
||||||
//
|
|
||||||
this.mnuLoadCdlFile.Name = "mnuLoadCdlFile";
|
|
||||||
this.mnuLoadCdlFile.Size = new System.Drawing.Size(193, 22);
|
|
||||||
this.mnuLoadCdlFile.Text = "Load CDL file...";
|
|
||||||
this.mnuLoadCdlFile.Click += new System.EventHandler(this.mnuLoadCdlFile_Click);
|
|
||||||
//
|
|
||||||
// ctrlDebuggerCode
|
|
||||||
//
|
|
||||||
this.ctrlDebuggerCode.Code = null;
|
|
||||||
this.ctrlDebuggerCode.ContextMenuStrip = this.contextMenuCode;
|
|
||||||
this.ctrlDebuggerCode.Dock = System.Windows.Forms.DockStyle.Fill;
|
|
||||||
this.ctrlDebuggerCode.Location = new System.Drawing.Point(3, 3);
|
|
||||||
this.ctrlDebuggerCode.Name = "ctrlDebuggerCode";
|
|
||||||
this.ctrlDebuggerCode.Size = new System.Drawing.Size(546, 406);
|
|
||||||
this.ctrlDebuggerCode.TabIndex = 2;
|
|
||||||
this.ctrlDebuggerCode.OnWatchAdded += new Mesen.GUI.Debugger.ctrlDebuggerCode.AddressEventHandler(this.ctrlDebuggerCode_OnWatchAdded);
|
|
||||||
this.ctrlDebuggerCode.OnSetNextStatement += new Mesen.GUI.Debugger.ctrlDebuggerCode.AddressEventHandler(this.ctrlDebuggerCode_OnSetNextStatement);
|
|
||||||
this.ctrlDebuggerCode.Enter += new System.EventHandler(this.ctrlDebuggerCode_Enter);
|
|
||||||
//
|
|
||||||
// ctrlConsoleStatus
|
|
||||||
//
|
|
||||||
this.ctrlConsoleStatus.Dock = System.Windows.Forms.DockStyle.Top;
|
|
||||||
this.ctrlConsoleStatus.Location = new System.Drawing.Point(552, 0);
|
|
||||||
this.ctrlConsoleStatus.Margin = new System.Windows.Forms.Padding(0);
|
|
||||||
this.ctrlConsoleStatus.Name = "ctrlConsoleStatus";
|
|
||||||
this.ctrlConsoleStatus.Size = new System.Drawing.Size(432, 362);
|
|
||||||
this.ctrlConsoleStatus.TabIndex = 3;
|
|
||||||
//
|
|
||||||
// ctrlDebuggerCodeSplit
|
|
||||||
//
|
|
||||||
this.ctrlDebuggerCodeSplit.Code = null;
|
|
||||||
this.ctrlDebuggerCodeSplit.Dock = System.Windows.Forms.DockStyle.Fill;
|
|
||||||
this.ctrlDebuggerCodeSplit.Location = new System.Drawing.Point(555, 3);
|
|
||||||
this.ctrlDebuggerCodeSplit.Name = "ctrlDebuggerCodeSplit";
|
|
||||||
this.ctrlDebuggerCodeSplit.Size = new System.Drawing.Size(1, 406);
|
|
||||||
this.ctrlDebuggerCodeSplit.TabIndex = 4;
|
|
||||||
this.ctrlDebuggerCodeSplit.Visible = false;
|
|
||||||
this.ctrlDebuggerCodeSplit.OnWatchAdded += new Mesen.GUI.Debugger.ctrlDebuggerCode.AddressEventHandler(this.ctrlDebuggerCode_OnWatchAdded);
|
|
||||||
this.ctrlDebuggerCodeSplit.OnSetNextStatement += new Mesen.GUI.Debugger.ctrlDebuggerCode.AddressEventHandler(this.ctrlDebuggerCode_OnSetNextStatement);
|
|
||||||
this.ctrlDebuggerCodeSplit.Enter += new System.EventHandler(this.ctrlDebuggerCodeSplit_Enter);
|
|
||||||
//
|
|
||||||
// ctrlWatch
|
|
||||||
//
|
|
||||||
this.ctrlWatch.Dock = System.Windows.Forms.DockStyle.Fill;
|
|
||||||
this.ctrlWatch.Location = new System.Drawing.Point(3, 16);
|
|
||||||
this.ctrlWatch.Name = "ctrlWatch";
|
|
||||||
this.ctrlWatch.Size = new System.Drawing.Size(316, 123);
|
|
||||||
this.ctrlWatch.TabIndex = 0;
|
|
||||||
//
|
|
||||||
// ctrlBreakpoints
|
|
||||||
//
|
|
||||||
this.ctrlBreakpoints.Dock = System.Windows.Forms.DockStyle.Fill;
|
|
||||||
this.ctrlBreakpoints.Location = new System.Drawing.Point(3, 16);
|
|
||||||
this.ctrlBreakpoints.Name = "ctrlBreakpoints";
|
|
||||||
this.ctrlBreakpoints.Size = new System.Drawing.Size(316, 123);
|
|
||||||
this.ctrlBreakpoints.TabIndex = 0;
|
|
||||||
this.ctrlBreakpoints.BreakpointChanged += new System.EventHandler(this.ctrlBreakpoints_BreakpointChanged);
|
|
||||||
//
|
|
||||||
// ctrlCallstack
|
|
||||||
//
|
|
||||||
this.ctrlCallstack.Dock = System.Windows.Forms.DockStyle.Fill;
|
|
||||||
this.ctrlCallstack.Location = new System.Drawing.Point(3, 16);
|
|
||||||
this.ctrlCallstack.Name = "ctrlCallstack";
|
|
||||||
this.ctrlCallstack.Size = new System.Drawing.Size(316, 123);
|
|
||||||
this.ctrlCallstack.TabIndex = 0;
|
|
||||||
this.ctrlCallstack.FunctionSelected += new System.EventHandler(this.ctrlCallstack_FunctionSelected);
|
|
||||||
//
|
//
|
||||||
// frmDebugger
|
// frmDebugger
|
||||||
//
|
//
|
||||||
|
@ -724,5 +734,6 @@
|
||||||
private System.Windows.Forms.ToolStripMenuItem generateROMToolStripMenuItem;
|
private System.Windows.Forms.ToolStripMenuItem generateROMToolStripMenuItem;
|
||||||
private System.Windows.Forms.ToolStripMenuItem saveStrippedDataToolStripMenuItem;
|
private System.Windows.Forms.ToolStripMenuItem saveStrippedDataToolStripMenuItem;
|
||||||
private System.Windows.Forms.ToolStripMenuItem saveUnusedDataToolStripMenuItem;
|
private System.Windows.Forms.ToolStripMenuItem saveUnusedDataToolStripMenuItem;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem mnuDisableEnableBreakpoint;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -116,9 +116,9 @@ namespace Mesen.GUI.Debugger
|
||||||
RefreshBreakpoints();
|
RefreshBreakpoints();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ToggleBreakpoint()
|
private void ToggleBreakpoint(bool toggleEnabled)
|
||||||
{
|
{
|
||||||
ctrlBreakpoints.ToggleBreakpoint(_lastCodeWindow.GetCurrentLine());
|
ctrlBreakpoints.ToggleBreakpoint(_lastCodeWindow.GetCurrentLine(), toggleEnabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RefreshBreakpoints()
|
private void RefreshBreakpoints()
|
||||||
|
@ -149,7 +149,12 @@ namespace Mesen.GUI.Debugger
|
||||||
|
|
||||||
private void mnuToggleBreakpoint_Click(object sender, EventArgs e)
|
private void mnuToggleBreakpoint_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
ToggleBreakpoint();
|
ToggleBreakpoint(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void mnuDisableEnableBreakpoint_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
ToggleBreakpoint(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void mnuBreak_Click(object sender, EventArgs e)
|
private void mnuBreak_Click(object sender, EventArgs e)
|
||||||
|
|
|
@ -98,6 +98,12 @@ namespace Mesen.GUI.Forms
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void AddBinding(string fieldName, RadioButton trueRadio, RadioButton falseRadio)
|
||||||
|
{
|
||||||
|
falseRadio.Checked = true;
|
||||||
|
AddBinding(fieldName, trueRadio);
|
||||||
|
}
|
||||||
|
|
||||||
protected void AddBinding(string fieldName, Control bindedField)
|
protected void AddBinding(string fieldName, Control bindedField)
|
||||||
{
|
{
|
||||||
if(BindedType == null) {
|
if(BindedType == null) {
|
||||||
|
@ -145,6 +151,8 @@ namespace Mesen.GUI.Forms
|
||||||
}
|
}
|
||||||
} else if(kvp.Value is CheckBox) {
|
} else if(kvp.Value is CheckBox) {
|
||||||
((CheckBox)kvp.Value).Checked = (bool)value;
|
((CheckBox)kvp.Value).Checked = (bool)value;
|
||||||
|
} else if(kvp.Value is RadioButton) {
|
||||||
|
((RadioButton)kvp.Value).Checked = (bool)value;
|
||||||
} else if(kvp.Value is Panel) {
|
} else if(kvp.Value is Panel) {
|
||||||
RadioButton radio = kvp.Value.Controls.OfType<RadioButton>().FirstOrDefault(r => r.Tag.Equals(value));
|
RadioButton radio = kvp.Value.Controls.OfType<RadioButton>().FirstOrDefault(r => r.Tag.Equals(value));
|
||||||
if(radio != null) {
|
if(radio != null) {
|
||||||
|
@ -192,6 +200,7 @@ namespace Mesen.GUI.Forms
|
||||||
if(kvp.Value is TextBox) {
|
if(kvp.Value is TextBox) {
|
||||||
object value = kvp.Value.Text;
|
object value = kvp.Value.Text;
|
||||||
if(field.FieldType == typeof(UInt32)) {
|
if(field.FieldType == typeof(UInt32)) {
|
||||||
|
value = ((string)value).Trim().Replace("$", "").Replace("0x", "");
|
||||||
value = (object)UInt32.Parse((string)value, System.Globalization.NumberStyles.HexNumber);
|
value = (object)UInt32.Parse((string)value, System.Globalization.NumberStyles.HexNumber);
|
||||||
} else if(field.FieldType == typeof(Byte)) {
|
} else if(field.FieldType == typeof(Byte)) {
|
||||||
value = (object)Byte.Parse((string)value, System.Globalization.NumberStyles.HexNumber);
|
value = (object)Byte.Parse((string)value, System.Globalization.NumberStyles.HexNumber);
|
||||||
|
@ -199,6 +208,8 @@ namespace Mesen.GUI.Forms
|
||||||
field.SetValue(Entity, value);
|
field.SetValue(Entity, value);
|
||||||
} else if(kvp.Value is CheckBox) {
|
} else if(kvp.Value is CheckBox) {
|
||||||
field.SetValue(Entity, ((CheckBox)kvp.Value).Checked);
|
field.SetValue(Entity, ((CheckBox)kvp.Value).Checked);
|
||||||
|
} else if(kvp.Value is RadioButton) {
|
||||||
|
field.SetValue(Entity, ((RadioButton)kvp.Value).Checked);
|
||||||
} else if(kvp.Value is Panel) {
|
} else if(kvp.Value is Panel) {
|
||||||
field.SetValue(Entity, kvp.Value.Controls.OfType<RadioButton>().FirstOrDefault(r => r.Checked).Tag);
|
field.SetValue(Entity, kvp.Value.Controls.OfType<RadioButton>().FirstOrDefault(r => r.Checked).Tag);
|
||||||
} else if(kvp.Value is ctrlTrackbar) {
|
} else if(kvp.Value is ctrlTrackbar) {
|
||||||
|
|
|
@ -415,6 +415,7 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Content Include="Icon.ico" />
|
<Content Include="Icon.ico" />
|
||||||
|
<None Include="Resources\help.png" />
|
||||||
<None Include="Resources\Close.png" />
|
<None Include="Resources\Close.png" />
|
||||||
<None Include="Resources\PreviousArrow.png" />
|
<None Include="Resources\PreviousArrow.png" />
|
||||||
<None Include="Resources\NextArrow.png" />
|
<None Include="Resources\NextArrow.png" />
|
||||||
|
|
|
@ -83,8 +83,7 @@ namespace Mesen.GUI
|
||||||
[DllImport(DLLPath)] public static extern void DebugInitialize();
|
[DllImport(DLLPath)] public static extern void DebugInitialize();
|
||||||
[DllImport(DLLPath)] public static extern void DebugRelease();
|
[DllImport(DLLPath)] public static extern void DebugRelease();
|
||||||
[DllImport(DLLPath)] public static extern void DebugGetState(ref DebugState state);
|
[DllImport(DLLPath)] public static extern void DebugGetState(ref DebugState state);
|
||||||
[DllImport(DLLPath)] public static extern void DebugAddBreakpoint(BreakpointType type, UInt32 address, [MarshalAs(UnmanagedType.I1)]bool isAbsoluteAddr, [MarshalAs(UnmanagedType.I1)]bool enabled);
|
[DllImport(DLLPath)] public static extern void DebugSetBreakpoints([MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)]InteropBreakpoint[] breakpoints, UInt32 length);
|
||||||
[DllImport(DLLPath)] public static extern void DebugRemoveBreakpoint(BreakpointType type, UInt32 address, [MarshalAs(UnmanagedType.I1)]bool isAbsoluteAddr);
|
|
||||||
[DllImport(DLLPath)] public static extern void DebugStep(UInt32 count);
|
[DllImport(DLLPath)] public static extern void DebugStep(UInt32 count);
|
||||||
[DllImport(DLLPath)] public static extern void DebugStepCycles(UInt32 count);
|
[DllImport(DLLPath)] public static extern void DebugStepCycles(UInt32 count);
|
||||||
[DllImport(DLLPath)] public static extern void DebugStepOut();
|
[DllImport(DLLPath)] public static extern void DebugStepOut();
|
||||||
|
@ -425,11 +424,27 @@ namespace Mesen.GUI
|
||||||
Mmc3IrqAltBehavior = 0x8000,
|
Mmc3IrqAltBehavior = 0x8000,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public struct InteropBreakpoint
|
||||||
|
{
|
||||||
|
public BreakpointType Type;
|
||||||
|
public Int32 Address;
|
||||||
|
|
||||||
|
[MarshalAs(UnmanagedType.I1)]
|
||||||
|
public bool IsAbsoluteAddress;
|
||||||
|
|
||||||
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1000)]
|
||||||
|
public byte[] Condition;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Flags]
|
||||||
public enum BreakpointType
|
public enum BreakpointType
|
||||||
{
|
{
|
||||||
Execute = 0,
|
Global = 0,
|
||||||
Read = 1,
|
Execute = 1,
|
||||||
Write = 2
|
Read = 2,
|
||||||
|
Write = 4,
|
||||||
|
ReadVram = 8,
|
||||||
|
WriteVram = 16
|
||||||
};
|
};
|
||||||
|
|
||||||
public enum NesModel
|
public enum NesModel
|
||||||
|
|
10
GUI.NET/Properties/Resources.Designer.cs
generated
10
GUI.NET/Properties/Resources.Designer.cs
generated
|
@ -70,6 +70,16 @@ namespace Mesen.GUI.Properties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||||
|
/// </summary>
|
||||||
|
internal static System.Drawing.Bitmap help {
|
||||||
|
get {
|
||||||
|
object obj = ResourceManager.GetObject("help", resourceCulture);
|
||||||
|
return ((System.Drawing.Bitmap)(obj));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -121,6 +121,9 @@
|
||||||
<data name="Close" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="Close" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\resources\close.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\resources\close.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="help" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>..\Resources\help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
|
</data>
|
||||||
<data name="MesenIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
<data name="MesenIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
<value>..\Icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
<value>..\Icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||||
</data>
|
</data>
|
||||||
|
|
BIN
GUI.NET/Resources/help.png
Normal file
BIN
GUI.NET/Resources/help.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 763 B |
|
@ -28,8 +28,7 @@ extern "C"
|
||||||
|
|
||||||
DllExport void __stdcall DebugGetState(DebugState *state) { GetDebugger()->GetState(state); }
|
DllExport void __stdcall DebugGetState(DebugState *state) { GetDebugger()->GetState(state); }
|
||||||
|
|
||||||
DllExport void __stdcall DebugAddBreakpoint(uint32_t type, uint32_t address, bool isAbsoluteAddr, bool enabled) { GetDebugger()->AddBreakpoint((BreakpointType)type, address, isAbsoluteAddr, enabled); }
|
DllExport void __stdcall DebugSetBreakpoints(Breakpoint breakpoints[], uint32_t length) { GetDebugger()->SetBreakpoints(breakpoints, length); }
|
||||||
DllExport void __stdcall DebugRemoveBreakpoint(uint32_t type, uint32_t address, bool isAbsoluteAddr) { GetDebugger()->RemoveBreakpoint((BreakpointType)type, address, isAbsoluteAddr); }
|
|
||||||
|
|
||||||
DllExport void __stdcall DebugRun() { GetDebugger()->Run(); }
|
DllExport void __stdcall DebugRun() { GetDebugger()->Run(); }
|
||||||
DllExport void __stdcall DebugStep(uint32_t count) { GetDebugger()->Step(count); }
|
DllExport void __stdcall DebugStep(uint32_t count) { GetDebugger()->Step(count); }
|
||||||
|
|
|
@ -25,6 +25,11 @@ uint32_t SimpleLock::GetThreadId()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LockHandler SimpleLock::AcquireSafe()
|
||||||
|
{
|
||||||
|
return LockHandler(this);
|
||||||
|
}
|
||||||
|
|
||||||
void SimpleLock::Acquire()
|
void SimpleLock::Acquire()
|
||||||
{
|
{
|
||||||
if(_lockCount == 0 || _holderThreadID != GetThreadId()) {
|
if(_lockCount == 0 || _holderThreadID != GetThreadId()) {
|
||||||
|
@ -65,3 +70,15 @@ void SimpleLock::Release()
|
||||||
assert(false);
|
assert(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LockHandler::LockHandler(SimpleLock *lock)
|
||||||
|
{
|
||||||
|
_lock = lock;
|
||||||
|
_lock->Acquire();
|
||||||
|
}
|
||||||
|
|
||||||
|
LockHandler::~LockHandler()
|
||||||
|
{
|
||||||
|
_lock->Release();
|
||||||
|
}
|
|
@ -1,6 +1,17 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
class SimpleLock;
|
||||||
|
|
||||||
|
class LockHandler
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
SimpleLock *_lock;
|
||||||
|
public:
|
||||||
|
LockHandler(SimpleLock *lock);
|
||||||
|
~LockHandler();
|
||||||
|
};
|
||||||
|
|
||||||
class SimpleLock
|
class SimpleLock
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
@ -13,6 +24,9 @@ private:
|
||||||
public:
|
public:
|
||||||
SimpleLock();
|
SimpleLock();
|
||||||
~SimpleLock();
|
~SimpleLock();
|
||||||
|
|
||||||
|
LockHandler AcquireSafe();
|
||||||
|
|
||||||
void Acquire();
|
void Acquire();
|
||||||
bool IsFree();
|
bool IsFree();
|
||||||
void WaitForRelease();
|
void WaitForRelease();
|
||||||
|
|
Loading…
Add table
Reference in a new issue