Debugger: Added DSP debugger

This commit is contained in:
Sour 2020-02-23 21:50:55 -05:00
parent 71d0ac693a
commit 2e8a13e920
54 changed files with 1550 additions and 274 deletions

View file

@ -840,13 +840,6 @@ void Console::ProcessWorkRamWrite(uint32_t addr, uint8_t value)
}
}
void Console::ProcessNecDspExec(uint32_t addr, uint32_t value)
{
if(_debugger) {
_debugger->ProcessNecDspExec(addr, value);
}
}
void Console::ProcessCx4Exec()
{
if(_debugger) {
@ -884,11 +877,13 @@ template void Console::ProcessMemoryRead<CpuType::Cpu>(uint32_t addr, uint8_t va
template void Console::ProcessMemoryRead<CpuType::Sa1>(uint32_t addr, uint8_t value, MemoryOperationType opType);
template void Console::ProcessMemoryRead<CpuType::Spc>(uint32_t addr, uint8_t value, MemoryOperationType opType);
template void Console::ProcessMemoryRead<CpuType::Gsu>(uint32_t addr, uint8_t value, MemoryOperationType opType);
template void Console::ProcessMemoryRead<CpuType::NecDsp>(uint32_t addr, uint8_t value, MemoryOperationType opType);
template void Console::ProcessMemoryWrite<CpuType::Cpu>(uint32_t addr, uint8_t value, MemoryOperationType opType);
template void Console::ProcessMemoryWrite<CpuType::Sa1>(uint32_t addr, uint8_t value, MemoryOperationType opType);
template void Console::ProcessMemoryWrite<CpuType::Spc>(uint32_t addr, uint8_t value, MemoryOperationType opType);
template void Console::ProcessMemoryWrite<CpuType::Gsu>(uint32_t addr, uint8_t value, MemoryOperationType opType);
template void Console::ProcessMemoryWrite<CpuType::NecDsp>(uint32_t addr, uint8_t value, MemoryOperationType opType);
template void Console::ProcessInterrupt<CpuType::Cpu>(uint32_t originalPc, uint32_t currentPc, bool forNmi);
template void Console::ProcessInterrupt<CpuType::Sa1>(uint32_t originalPc, uint32_t currentPc, bool forNmi);

View file

@ -173,7 +173,6 @@ public:
void ProcessPpuWrite(uint32_t addr, uint8_t value, SnesMemoryType memoryType);
void ProcessWorkRamRead(uint32_t addr, uint8_t value);
void ProcessWorkRamWrite(uint32_t addr, uint8_t value);
void ProcessNecDspExec(uint32_t addr, uint32_t value);
void ProcessCx4Exec();
void ProcessPpuCycle();
template<CpuType type> void ProcessInterrupt(uint32_t originalPc, uint32_t currentPc, bool forNmi);

View file

@ -63,6 +63,7 @@
<ClInclude Include="Cx4Types.h" />
<ClInclude Include="DebugUtilities.h" />
<ClInclude Include="DmaControllerTypes.h" />
<ClInclude Include="NecDspDebugger.h" />
<ClInclude Include="ForceDisconnectMessage.h" />
<ClInclude Include="GameClient.h" />
<ClInclude Include="GameClientConnection.h" />
@ -250,6 +251,7 @@
<ClCompile Include="Disassembler.cpp" />
<ClCompile Include="DisassemblyInfo.cpp" />
<ClCompile Include="DmaController.cpp" />
<ClCompile Include="NecDspDebugger.cpp" />
<ClCompile Include="EmuSettings.cpp" />
<ClCompile Include="EventManager.cpp" />
<ClCompile Include="ExpressionEvaluator.cpp" />

View file

@ -515,6 +515,9 @@
<ClInclude Include="BsxStream.h">
<Filter>SNES\Coprocessors\BSX</Filter>
</ClInclude>
<ClInclude Include="NecDspDebugger.h">
<Filter>Debugger\Debuggers</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="stdafx.cpp" />
@ -827,6 +830,9 @@
<ClCompile Include="BsxStream.cpp">
<Filter>SNES\Coprocessors\BSX</Filter>
</ClCompile>
<ClCompile Include="NecDspDebugger.cpp">
<Filter>Debugger\Debuggers</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Filter Include="SNES">

View file

@ -31,6 +31,7 @@ enum class SnesMemoryType
CpuMemory,
SpcMemory,
Sa1Memory,
NecDspMemory,
GsuMemory,
PrgRom,
WorkRam,

View file

@ -10,11 +10,11 @@ public:
switch(type) {
case CpuType::Cpu: return SnesMemoryType::CpuMemory;
case CpuType::Spc: return SnesMemoryType::SpcMemory;
case CpuType::NecDsp: return SnesMemoryType::NecDspMemory;
case CpuType::Sa1: return SnesMemoryType::Sa1Memory;
case CpuType::Gsu: return SnesMemoryType::GsuMemory;
case CpuType::Cx4: break;
case CpuType::NecDsp: break;
}
throw std::runtime_error("Invalid CPU type");

View file

@ -12,6 +12,7 @@
#include "CpuDebugger.h"
#include "SpcDebugger.h"
#include "GsuDebugger.h"
#include "NecDspDebugger.h"
#include "BaseCartridge.h"
#include "MemoryManager.h"
#include "EmuSettings.h"
@ -58,6 +59,7 @@ Debugger::Debugger(shared_ptr<Console> console)
_watchExpEval[(int)CpuType::Spc].reset(new ExpressionEvaluator(this, CpuType::Spc));
_watchExpEval[(int)CpuType::Sa1].reset(new ExpressionEvaluator(this, CpuType::Sa1));
_watchExpEval[(int)CpuType::Gsu].reset(new ExpressionEvaluator(this, CpuType::Gsu));
_watchExpEval[(int)CpuType::NecDsp].reset(new ExpressionEvaluator(this, CpuType::NecDsp));
_codeDataLogger.reset(new CodeDataLogger(_cart->DebugGetPrgRomSize(), _memoryManager.get()));
_memoryDumper.reset(new MemoryDumper(this));
@ -75,6 +77,8 @@ Debugger::Debugger(shared_ptr<Console> console)
_sa1Debugger.reset(new CpuDebugger(this, CpuType::Sa1));
} else if(_cart->GetGsu()) {
_gsuDebugger.reset(new GsuDebugger(this));
} else if(_cart->GetDsp()) {
_necDspDebugger.reset(new NecDspDebugger(this));
}
_step.reset(new StepRequest());
@ -124,6 +128,7 @@ void Debugger::ProcessMemoryRead(uint32_t addr, uint8_t value, MemoryOperationTy
switch(type) {
case CpuType::Cpu: _cpuDebugger->ProcessRead(addr, value, opType); break;
case CpuType::Spc: _spcDebugger->ProcessRead(addr, value, opType); break;
case CpuType::NecDsp: _necDspDebugger->ProcessRead(addr, value, opType); break;
case CpuType::Sa1: _sa1Debugger->ProcessRead(addr, value, opType); break;
case CpuType::Gsu: _gsuDebugger->ProcessRead(addr, value, opType); break;
}
@ -135,6 +140,7 @@ void Debugger::ProcessMemoryWrite(uint32_t addr, uint8_t value, MemoryOperationT
switch(type) {
case CpuType::Cpu: _cpuDebugger->ProcessWrite(addr, value, opType); break;
case CpuType::Spc: _spcDebugger->ProcessWrite(addr, value, opType); break;
case CpuType::NecDsp: _necDspDebugger->ProcessWrite(addr, value, opType); break;
case CpuType::Sa1: _sa1Debugger->ProcessWrite(addr, value, opType); break;
case CpuType::Gsu: _gsuDebugger->ProcessWrite(addr, value, opType); break;
}
@ -202,21 +208,6 @@ void Debugger::ProcessPpuCycle()
}
}
void Debugger::ProcessNecDspExec(uint32_t addr, uint32_t value)
{
if(_traceLogger->IsCpuLogged(CpuType::NecDsp)) {
AddressInfo addressInfo { (int32_t)addr * 4, SnesMemoryType::DspProgramRom };
_disassembler->BuildCache(addressInfo, 0, CpuType::NecDsp);
DebugState debugState;
GetState(debugState, true);
DisassemblyInfo disInfo = _disassembler->GetDisassemblyInfo(addressInfo);
_traceLogger->Log(CpuType::NecDsp, debugState, disInfo);
}
}
void Debugger::ProcessCx4Exec()
{
if(_traceLogger->IsCpuLogged(CpuType::Cx4)) {
@ -248,6 +239,8 @@ void Debugger::SleepUntilResume(BreakSource source, MemoryOperationInfo *operati
_disassembler->Disassemble(CpuType::Sa1);
} else if(_cart->GetGsu()) {
_disassembler->Disassemble(CpuType::Gsu);
} else if(_cart->GetDsp()) {
_disassembler->Disassemble(CpuType::NecDsp);
}
_executionStopped = true;
@ -338,6 +331,9 @@ void Debugger::Run()
if(_gsuDebugger) {
_gsuDebugger->Run();
}
if(_necDspDebugger) {
_necDspDebugger->Run();
}
_waitForBreakResume = false;
}
@ -353,9 +349,9 @@ void Debugger::Step(CpuType cpuType, int32_t stepCount, StepType type)
switch(cpuType) {
case CpuType::Cpu: debugger = _cpuDebugger.get(); break;
case CpuType::Spc: debugger = _spcDebugger.get(); break;
case CpuType::NecDsp: debugger = _necDspDebugger.get(); break;
case CpuType::Sa1: debugger = _sa1Debugger.get(); break;
case CpuType::Gsu: debugger = _gsuDebugger.get(); break;
case CpuType::NecDsp:
case CpuType::Cx4:
throw std::runtime_error("Step(): Unsupported CPU type.");
}
@ -378,7 +374,9 @@ void Debugger::Step(CpuType cpuType, int32_t stepCount, StepType type)
if(_gsuDebugger && debugger != _gsuDebugger.get()) {
_gsuDebugger->Run();
}
if(_necDspDebugger && debugger != _necDspDebugger.get()) {
_necDspDebugger->Run();
}
_waitForBreakResume = false;
}
@ -455,6 +453,8 @@ AddressInfo Debugger::GetAbsoluteAddress(AddressInfo relAddress)
return _cart->GetSa1()->GetMemoryMappings()->GetAbsoluteAddress(relAddress.Address);
} else if(relAddress.Type == SnesMemoryType::GsuMemory) {
return _cart->GetGsu()->GetMemoryMappings()->GetAbsoluteAddress(relAddress.Address);
} else if(relAddress.Type == SnesMemoryType::NecDspMemory) {
return { relAddress.Address, SnesMemoryType::DspProgramRom };
}
throw std::runtime_error("Unsupported address type");
@ -499,6 +499,10 @@ AddressInfo Debugger::GetRelativeAddress(AddressInfo absAddress, CpuType cpuType
case SnesMemoryType::SpcRom:
return { _spc->GetRelativeAddress(absAddress), SnesMemoryType::SpcMemory };
case SnesMemoryType::DspProgramRom:
return { absAddress.Address, SnesMemoryType::NecDspMemory };
case SnesMemoryType::Register:
return { absAddress.Address & 0xFFFF, SnesMemoryType::Register };
@ -546,6 +550,9 @@ void Debugger::SetBreakpoints(Breakpoint breakpoints[], uint32_t length)
if(_sa1Debugger) {
_sa1Debugger->GetBreakpointManager()->SetBreakpoints(breakpoints, length);
}
if(_necDspDebugger) {
_necDspDebugger->GetBreakpointManager()->SetBreakpoints(breakpoints, length);
}
}
void Debugger::SaveRomToDisk(string filename, bool saveAsIps, CdlStripOption stripOption)
@ -647,11 +654,13 @@ template void Debugger::ProcessMemoryRead<CpuType::Cpu>(uint32_t addr, uint8_t v
template void Debugger::ProcessMemoryRead<CpuType::Sa1>(uint32_t addr, uint8_t value, MemoryOperationType opType);
template void Debugger::ProcessMemoryRead<CpuType::Spc>(uint32_t addr, uint8_t value, MemoryOperationType opType);
template void Debugger::ProcessMemoryRead<CpuType::Gsu>(uint32_t addr, uint8_t value, MemoryOperationType opType);
template void Debugger::ProcessMemoryRead<CpuType::NecDsp>(uint32_t addr, uint8_t value, MemoryOperationType opType);
template void Debugger::ProcessMemoryWrite<CpuType::Cpu>(uint32_t addr, uint8_t value, MemoryOperationType opType);
template void Debugger::ProcessMemoryWrite<CpuType::Sa1>(uint32_t addr, uint8_t value, MemoryOperationType opType);
template void Debugger::ProcessMemoryWrite<CpuType::Spc>(uint32_t addr, uint8_t value, MemoryOperationType opType);
template void Debugger::ProcessMemoryWrite<CpuType::Gsu>(uint32_t addr, uint8_t value, MemoryOperationType opType);
template void Debugger::ProcessMemoryWrite<CpuType::NecDsp>(uint32_t addr, uint8_t value, MemoryOperationType opType);
template void Debugger::ProcessInterrupt<CpuType::Cpu>(uint32_t originalPc, uint32_t currentPc, bool forNmi);
template void Debugger::ProcessInterrupt<CpuType::Sa1>(uint32_t originalPc, uint32_t currentPc, bool forNmi);

View file

@ -30,6 +30,7 @@ class ScriptManager;
class SpcDebugger;
class CpuDebugger;
class GsuDebugger;
class NecDspDebugger;
class Breakpoint;
class Assembler;
@ -53,6 +54,7 @@ private:
unique_ptr<CpuDebugger> _cpuDebugger;
unique_ptr<CpuDebugger> _sa1Debugger;
unique_ptr<GsuDebugger> _gsuDebugger;
unique_ptr<NecDspDebugger> _necDspDebugger;
shared_ptr<ScriptManager> _scriptManager;
shared_ptr<TraceLogger> _traceLogger;
@ -96,7 +98,6 @@ public:
void ProcessPpuWrite(uint16_t addr, uint8_t value, SnesMemoryType memoryType);
void ProcessPpuCycle();
void ProcessNecDspExec(uint32_t addr, uint32_t value);
void ProcessCx4Exec();
template<CpuType type>

View file

@ -50,7 +50,6 @@ Disassembler::Disassembler(shared_ptr<Console> console, shared_ptr<CodeDataLogge
_spcRom = _spc->GetSpcRom();
_spcRomSize = Spc::SpcRomSize;
_necDspProgramRom = cart->GetDsp() ? cart->GetDsp()->DebugGetProgramRom() : nullptr;
_necDspProgramRomSize = cart->GetDsp() ? cart->GetDsp()->DebugGetProgramRomSize() : 0;
@ -90,6 +89,12 @@ Disassembler::Disassembler(shared_ptr<Console> console, shared_ptr<CodeDataLogge
_sources[(int)SnesMemoryType::GsuWorkRam] = { _gsuWorkRam, &_gsuWorkRamCache, _gsuWorkRamSize };
_sources[(int)SnesMemoryType::BsxPsRam] = { _bsxPsRam, &_bsxPsRamCache, _bsxPsRamSize };
_sources[(int)SnesMemoryType::BsxMemoryPack] = { _bsxMemPack, &_bsxMemPackCache, _bsxMemPackSize };
if(_necDspProgramRomSize > 0) {
//Build cache for the entire DSP chip (since it only contains instructions)
AddressInfo dspStart = { 0, SnesMemoryType::DspProgramRom };
BuildCache(dspStart, 0, CpuType::NecDsp);
}
}
DisassemblerSource Disassembler::GetSource(SnesMemoryType type)
@ -106,9 +111,9 @@ vector<DisassemblyResult>& Disassembler::GetDisassemblyList(CpuType type)
switch(type) {
case CpuType::Cpu: return _disassembly;
case CpuType::Spc: return _spcDisassembly;
case CpuType::NecDsp: return _necDspDisassembly;
case CpuType::Sa1: return _sa1Disassembly;
case CpuType::Gsu: return _gsuDisassembly;
case CpuType::NecDsp: break;
case CpuType::Cx4: break;
}
throw std::runtime_error("Disassembly::GetDisassemblyList(): Invalid cpu type");
@ -157,8 +162,8 @@ void Disassembler::SetDisassembleFlag(CpuType type)
_needDisassemble[(int)CpuType::Cpu] = true;
_needDisassemble[(int)CpuType::Sa1] = true;
_needDisassemble[(int)CpuType::Gsu] = true;
} else if(type == CpuType::Spc) {
_needDisassemble[(int)CpuType::Spc] = true;
} else {
_needDisassemble[(int)type] = true;
}
}
@ -202,9 +207,13 @@ void Disassembler::Disassemble(CpuType cpuType)
auto lock = _disassemblyLock.AcquireSafe();
bool isSpc = cpuType == CpuType::Spc;
bool isDsp = cpuType == CpuType::NecDsp;
MemoryMappings *mappings = nullptr;
int32_t maxAddr = 0xFFFFFF;
switch(cpuType) {
case CpuType::Cpu: mappings = _memoryManager->GetMemoryMappings(); break;
case CpuType::Cpu:
mappings = _memoryManager->GetMemoryMappings();
break;
case CpuType::Sa1:
if(!_console->GetCartridge()->GetSa1()) {
@ -220,12 +229,23 @@ void Disassembler::Disassemble(CpuType cpuType)
mappings = _console->GetCartridge()->GetGsu()->GetMemoryMappings();
break;
case CpuType::Spc: mappings = nullptr; break;
case CpuType::NecDsp:
if(!_console->GetCartridge()->GetDsp()) {
return;
}
mappings = nullptr;
maxAddr = _necDspProgramRomSize - 1;
break;
case CpuType::Spc:
mappings = nullptr;
maxAddr = 0xFFFF;
break;
default: throw std::runtime_error("Disassemble(): Invalid cpu type");
}
vector<DisassemblyResult> &results = GetDisassemblyList(cpuType);
int32_t maxAddr = isSpc ? 0xFFFF : 0xFFFFFF;
results.clear();
bool disUnident = _settings->CheckDebuggerFlag(DebuggerFlags::DisassembleUnidentifiedData);
@ -241,7 +261,11 @@ void Disassembler::Disassemble(CpuType cpuType)
int byteCounter = 0;
for(int32_t i = 0; i <= maxAddr; i++) {
prevAddrInfo = addrInfo;
addrInfo = isSpc ? _spc->GetAbsoluteAddress(i) : mappings->GetAbsoluteAddress(i);
if(isDsp) {
addrInfo = { i, SnesMemoryType::DspProgramRom };
} else {
addrInfo = isSpc ? _spc->GetAbsoluteAddress(i) : mappings->GetAbsoluteAddress(i);
}
if(addrInfo.Address < 0) {
continue;
@ -536,9 +560,20 @@ bool Disassembler::GetLineData(CpuType type, uint32_t lineIndex, CodeLineData &d
}
break;
}
case CpuType::NecDsp:
if(!disInfo.IsInitialized()) {
disInfo = DisassemblyInfo(src.Data + result.Address.Address, 0, CpuType::NecDsp);
} else {
data.Flags |= LineFlags::VerifiedCode;
}
data.OpSize = disInfo.GetOpSize();
data.EffectiveAddress = -1;
data.ValueSize = 0;
break;
case CpuType::Cx4:
case CpuType::NecDsp:
throw std::runtime_error("GetLineData - CPU type not supported");
}

View file

@ -53,6 +53,7 @@ private:
vector<DisassemblyResult> _spcDisassembly;
vector<DisassemblyResult> _sa1Disassembly;
vector<DisassemblyResult> _gsuDisassembly;
vector<DisassemblyResult> _necDspDisassembly;
DisassemblerSource _sources[(int)SnesMemoryType::Register];

View file

@ -139,7 +139,7 @@ uint8_t DisassemblyInfo::GetOpSize(uint8_t opCode, uint8_t flags, CpuType type)
}
return 1;
case CpuType::NecDsp: return 4;
case CpuType::NecDsp: return 3;
case CpuType::Cx4: return 2;
}
return 0;
@ -206,9 +206,11 @@ bool DisassemblyInfo::UpdateCpuFlags(uint8_t &cpuFlags)
case CpuType::Gsu:
case CpuType::Spc:
case CpuType::NecDsp:
case CpuType::Cx4:
return false;
case CpuType::NecDsp:
return true;
}
return false;

View file

@ -68,6 +68,11 @@ Gsu::Gsu(Console *console, uint32_t gsuRamSize)
_mappings.RegisterHandler(0x70, 0x71, 0x0000, 0xFFFF, _gsuRamHandlers);
}
Gsu::~Gsu()
{
delete[] _gsuRam;
}
void Gsu::ProcessEndOfFrame()
{
uint8_t clockMultiplier = _settings->GetEmulationConfig().GsuClockSpeed / 100;

View file

@ -145,6 +145,7 @@ private:
public:
Gsu(Console *console, uint32_t gsuRamSize);
virtual ~Gsu();
void ProcessEndOfFrame() override;

View file

@ -52,6 +52,7 @@ int64_t LabelManager::GetLabelKey(uint32_t absoluteAddr, SnesMemoryType memType)
case SnesMemoryType::GsuWorkRam: return absoluteAddr | ((uint64_t)8 << 32);
case SnesMemoryType::BsxPsRam: return absoluteAddr | ((uint64_t)9 << 32);
case SnesMemoryType::BsxMemoryPack: return absoluteAddr | ((uint64_t)10 << 32);
case SnesMemoryType::DspProgramRom: return absoluteAddr | ((uint64_t)11 << 32);
default: return -1;
}
}
@ -69,6 +70,7 @@ SnesMemoryType LabelManager::GetKeyMemoryType(uint64_t key)
case ((uint64_t)8 << 32): return SnesMemoryType::GsuWorkRam; break;
case ((uint64_t)9 << 32): return SnesMemoryType::BsxPsRam; break;
case ((uint64_t)10 << 32): return SnesMemoryType::BsxMemoryPack; break;
case ((uint64_t)11 << 32): return SnesMemoryType::DspProgramRom; break;
}
throw std::runtime_error("Invalid label key");

View file

@ -50,7 +50,7 @@ void MemoryDumper::SetMemoryState(SnesMemoryType type, uint8_t *buffer, uint32_t
case SnesMemoryType::SpcRam: memcpy(_spc->GetSpcRam(), buffer, length); break;
case SnesMemoryType::SpcRom: memcpy(_spc->GetSpcRom(), buffer, length); break;
case SnesMemoryType::DspProgramRom: memcpy(_cartridge->GetDsp()->DebugGetProgramRom(), buffer, length); break;
case SnesMemoryType::DspProgramRom: memcpy(_cartridge->GetDsp()->DebugGetProgramRom(), buffer, length); _cartridge->GetDsp()->BuildProgramCache(); break;
case SnesMemoryType::DspDataRom: memcpy(_cartridge->GetDsp()->DebugGetDataRom(), buffer, length); break;
case SnesMemoryType::DspDataRam: memcpy(_cartridge->GetDsp()->DebugGetDataRam(), buffer, length); break;
@ -188,7 +188,7 @@ void MemoryDumper::SetMemoryValue(SnesMemoryType memoryType, uint32_t address, u
case SnesMemoryType::SpcRam: _spc->GetSpcRam()[address] = value; invalidateCache(); break;
case SnesMemoryType::SpcRom: _spc->GetSpcRom()[address] = value; invalidateCache(); break;
case SnesMemoryType::DspProgramRom: _cartridge->GetDsp()->DebugGetProgramRom()[address] = value; invalidateCache(); break;
case SnesMemoryType::DspProgramRom: _cartridge->GetDsp()->DebugGetProgramRom()[address] = value; _cartridge->GetDsp()->BuildProgramCache(); break;
case SnesMemoryType::DspDataRom: _cartridge->GetDsp()->DebugGetDataRom()[address] = value; break;
case SnesMemoryType::DspDataRam: _cartridge->GetDsp()->DebugGetDataRam()[address] = value; break;

View file

@ -53,9 +53,10 @@ NecDsp::NecDsp(CoprocessorType type, Console* console, vector<uint8_t> &programR
}
}
_progSize = (uint32_t)programRom.size() / 3;
_progRom = new uint32_t[_progSize];
_progMask = _progSize - 1;
_progSize = (uint32_t)programRom.size();
_progRom = new uint8_t[_progSize];
_prgCache = new uint32_t[_progSize / 3];
_progMask = (_progSize / 3)- 1;
_dataSize = (uint32_t)dataRom.size() / 2;
_dataRom = new uint16_t[_dataSize];
@ -69,14 +70,22 @@ NecDsp::NecDsp(CoprocessorType type, Console* console, vector<uint8_t> &programR
console->GetSettings()->InitializeRam(_ram, _ramSize * sizeof(uint16_t));
console->GetSettings()->InitializeRam(_stack, _stackSize * sizeof(uint16_t));
for(uint32_t i = 0; i < _progSize; i++) {
_progRom[i] = programRom[i * 3] | (programRom[i * 3 + 1] << 8) | (programRom[i * 3 + 2] << 16);
}
memcpy(_progRom, programRom.data(), _progSize);
BuildProgramCache();
for(uint32_t i = 0; i < _dataSize; i++) {
_dataRom[i] = dataRom[i * 2] | (dataRom[i * 2 + 1] << 8);
}
}
NecDsp::~NecDsp()
{
delete[] _progRom;
delete[] _prgCache;
delete[] _dataRom;
delete[] _ram;
}
NecDsp* NecDsp::InitCoprocessor(CoprocessorType type, Console *console, vector<uint8_t> &embeddedFirware)
{
bool firmwareLoaded = false;
@ -120,18 +129,31 @@ void NecDsp::SaveBattery()
}
}
void NecDsp::BuildProgramCache()
{
//For the sake of performance, keep a precalculated array of 24-bit opcodes for each entry in the ROM
for(uint32_t i = 0; i < _progSize / 3; i++) {
_prgCache[i] = _progRom[i * 3] | (_progRom[i * 3 + 1] << 8) | (_progRom[i * 3 + 2] << 16);
}
}
void NecDsp::ReadOpCode()
{
_opCode = _prgCache[_state.PC & _progMask];
_console->ProcessMemoryRead<CpuType::NecDsp>((_state.PC & _progMask) * 3, _opCode, MemoryOperationType::ExecOpCode);
}
void NecDsp::Run()
{
uint64_t targetCycle = (uint64_t)(_memoryManager->GetMasterClock() * (_frequency / _console->GetMasterClockRate()));
if(_inRqmLoop) {
if(_inRqmLoop && !_console->IsDebugging()) {
_cycleCount = targetCycle;
return;
}
while(_cycleCount < targetCycle) {
_opCode = _progRom[_state.PC & _progMask];
_console->ProcessNecDspExec(_state.PC, _opCode);
ReadOpCode();
_state.PC++;
switch(_opCode & 0xC00000) {
@ -517,7 +539,7 @@ uint16_t NecDsp::GetSourceValue(uint8_t source)
uint8_t* NecDsp::DebugGetProgramRom()
{
return (uint8_t*)_progRom;
return _progRom;
}
uint8_t* NecDsp::DebugGetDataRom()
@ -532,7 +554,7 @@ uint8_t* NecDsp::DebugGetDataRam()
uint32_t NecDsp::DebugGetProgramRomSize()
{
return _progSize * sizeof(uint32_t);
return _progSize;
}
uint32_t NecDsp::DebugGetDataRomSize()

View file

@ -19,7 +19,8 @@ private:
double _frequency = 7600000;
uint32_t _opCode = 0;
uint32_t *_progRom = nullptr;
uint8_t *_progRom = nullptr;
uint32_t *_prgCache = nullptr;
uint16_t *_dataRom = nullptr;
uint16_t *_ram = nullptr;
uint16_t _stack[16];
@ -38,6 +39,8 @@ private:
uint16_t _registerMask = 0;
bool _inRqmLoop = false;
void ReadOpCode();
void RunApuOp(uint8_t aluOperation, uint16_t source);
void UpdateDataPointer();
@ -51,6 +54,8 @@ private:
NecDsp(CoprocessorType type, Console* console, vector<uint8_t> &programRom, vector<uint8_t> &dataRom);
public:
virtual ~NecDsp();
static NecDsp* InitCoprocessor(CoprocessorType type, Console* console, vector<uint8_t> &embeddedFirmware);
void Reset() override;
@ -58,6 +63,8 @@ public:
void LoadBattery() override;
void SaveBattery() override;
void BuildProgramCache();
uint8_t Read(uint32_t addr) override;
void Write(uint32_t addr, uint8_t value) override;

101
Core/NecDspDebugger.cpp Normal file
View file

@ -0,0 +1,101 @@
#include "stdafx.h"
#include "NecDsp.h"
#include "NecDspDebugger.h"
#include "DisassemblyInfo.h"
#include "Disassembler.h"
#include "TraceLogger.h"
#include "CallstackManager.h"
#include "BreakpointManager.h"
#include "BaseCartridge.h"
#include "MemoryManager.h"
#include "Debugger.h"
#include "Console.h"
#include "MemoryAccessCounter.h"
#include "ExpressionEvaluator.h"
#include "EmuSettings.h"
NecDspDebugger::NecDspDebugger(Debugger* debugger)
{
_debugger = debugger;
_traceLogger = debugger->GetTraceLogger().get();
_disassembler = debugger->GetDisassembler().get();
_dsp = debugger->GetConsole()->GetCartridge()->GetDsp();
_settings = debugger->GetConsole()->GetSettings().get();
_breakpointManager.reset(new BreakpointManager(debugger, CpuType::NecDsp));
_step.reset(new StepRequest());
}
void NecDspDebugger::Reset()
{
}
void NecDspDebugger::ProcessRead(uint16_t addr, uint8_t value, MemoryOperationType type)
{
AddressInfo addressInfo = { (uint32_t)addr, type == MemoryOperationType::ExecOpCode ? SnesMemoryType::DspProgramRom : SnesMemoryType::DspDataRom };
MemoryOperationInfo operation { (uint32_t)addr, value, type };
if(type == MemoryOperationType::ExecOpCode) {
if(_traceLogger->IsCpuLogged(CpuType::NecDsp) || _settings->CheckDebuggerFlag(DebuggerFlags::NecDspDebuggerEnabled)) {
_disassembler->BuildCache(addressInfo, 0, CpuType::NecDsp);
if(_traceLogger->IsCpuLogged(CpuType::NecDsp)) {
DebugState debugState;
_debugger->GetState(debugState, true);
DisassemblyInfo disInfo = _disassembler->GetDisassemblyInfo(addressInfo);
_traceLogger->Log(CpuType::NecDsp, debugState, disInfo);
}
}
_prevProgramCounter = addr;
if(_step->StepCount > 0) {
_step->StepCount--;
}
}
_debugger->ProcessBreakConditions(_step->StepCount == 0, GetBreakpointManager(), operation, addressInfo);
}
void NecDspDebugger::ProcessWrite(uint16_t addr, uint8_t value, MemoryOperationType type)
{
AddressInfo addressInfo { addr, SnesMemoryType::DspDataRam }; //Writes never affect the DSP ROM
MemoryOperationInfo operation { addr, value, type };
_debugger->ProcessBreakConditions(false, GetBreakpointManager(), operation, addressInfo);
}
void NecDspDebugger::Run()
{
_step.reset(new StepRequest());
}
void NecDspDebugger::Step(int32_t stepCount, StepType type)
{
StepRequest step;
switch(type) {
case StepType::Step: step.StepCount = stepCount; break;
case StepType::StepOut:
case StepType::StepOver:
step.StepCount = 1;
break;
case StepType::SpecificScanline:
case StepType::PpuStep:
break;
}
_step.reset(new StepRequest(step));
}
shared_ptr<CallstackManager> NecDspDebugger::GetCallstackManager()
{
return nullptr;
}
BreakpointManager* NecDspDebugger::GetBreakpointManager()
{
return _breakpointManager.get();
}

40
Core/NecDspDebugger.h Normal file
View file

@ -0,0 +1,40 @@
#pragma once
#include "stdafx.h"
#include "DebugTypes.h"
#include "IDebugger.h"
class Disassembler;
class Debugger;
class TraceLogger;
class NecDsp;
class CallstackManager;
class MemoryAccessCounter;
class MemoryManager;
class BreakpointManager;
class EmuSettings;
class NecDspDebugger final : public IDebugger
{
Debugger* _debugger;
Disassembler* _disassembler;
TraceLogger* _traceLogger;
NecDsp* _dsp;
EmuSettings* _settings;
unique_ptr<BreakpointManager> _breakpointManager;
unique_ptr<StepRequest> _step;
uint32_t _prevProgramCounter = 0;
public:
NecDspDebugger(Debugger* debugger);
void Reset();
void ProcessRead(uint16_t addr, uint8_t value, MemoryOperationType type);
void ProcessWrite(uint16_t addr, uint8_t value, MemoryOperationType type);
void Run();
void Step(int32_t stepCount, StepType type);
shared_ptr<CallstackManager> GetCallstackManager();
BreakpointManager* GetBreakpointManager();
};

View file

@ -2,8 +2,10 @@
#include "NecDspDisUtils.h"
#include "DisassemblyInfo.h"
#include "EmuSettings.h"
#include "LabelManager.h"
#include "../Utilities/HexUtilities.h"
#include "../Utilities/FastString.h"
#include "DebugTypes.h"
void NecDspDisUtils::GetDisassembly(DisassemblyInfo &info, string &out, uint32_t memoryAddr, LabelManager *labelManager, EmuSettings* settings)
{
@ -67,6 +69,8 @@ void NecDspDisUtils::GetDisassembly(DisassemblyInfo &info, string &out, uint32_t
if(operationType == 1) {
str.Delimiter(" | ");
str.Write("RET");
} else if(opCode == 0) {
str.Write("NOP");
}
} else if(operationType == 2) {
//Jump
@ -116,8 +120,15 @@ void NecDspDisUtils::GetDisassembly(DisassemblyInfo &info, string &out, uint32_t
case 0x141: str.Write("HCALL"); target |= 0x2000; break;
default: str.Write("<unknown jump>"); break;
}
str.Write(' ');
str.WriteAll(" $", HexUtilities::ToHex(target));
AddressInfo absAddress = { (int32_t)target*3, SnesMemoryType::DspProgramRom };
string label = labelManager->GetLabel(absAddress);
if(label.empty()) {
str.WriteAll('$', HexUtilities::ToHex(target * 3));
} else {
str.Write(label, true);
}
} else if(operationType == 3) {
//Load
uint16_t value = opCode >> 6;

View file

@ -65,6 +65,11 @@ Sa1::Sa1(Console* console)
Reset();
}
Sa1::~Sa1()
{
delete[] _iRam;
}
void Sa1::Sa1RegisterWrite(uint16_t addr, uint8_t value)
{
switch(addr) {

View file

@ -61,6 +61,7 @@ private:
public:
Sa1(Console* console);
virtual ~Sa1();
void WriteSa1(uint32_t addr, uint8_t value, MemoryOperationType type);
uint8_t ReadSa1(uint32_t addr, MemoryOperationType type = MemoryOperationType::Read);

View file

@ -486,6 +486,7 @@ enum class DebuggerFlags : uint32_t
UseAltSpcOpNames = 0x1000,
UseLowerCaseDisassembly = 0x2000,
NecDspDebuggerEnabled = 0x08000000,
GsuDebuggerEnabled = 0x10000000,
Sa1DebuggerEnabled = 0x20000000,
SpcDebuggerEnabled = 0x40000000,

View file

@ -110,6 +110,7 @@ namespace Mesen.GUI.Debugger
case SnesMemoryType.SpcMemory: type = "SPC"; break;
case SnesMemoryType.Sa1Memory: type = "SA1"; break;
case SnesMemoryType.GsuMemory: type = "GSU"; break;
case SnesMemoryType.NecDspMemory: type = "DSP"; break;
case SnesMemoryType.PrgRom: type = "PRG"; break;
case SnesMemoryType.WorkRam: type = "WRAM"; break;
@ -121,6 +122,7 @@ namespace Mesen.GUI.Debugger
case SnesMemoryType.SpcRam: type = "RAM"; break;
case SnesMemoryType.SpcRom: type = "ROM"; break;
case SnesMemoryType.DspProgramRom: type = "DSP"; break;
case SnesMemoryType.Sa1InternalRam: type = "IRAM"; break;
case SnesMemoryType.GsuWorkRam: type = "GWRAM"; break;

View file

@ -131,7 +131,8 @@ namespace Mesen.GUI.Debugger.Controls
private void mnuAddBreakpoint_Click(object sender, EventArgs e)
{
Breakpoint breakpoint = new Breakpoint() { MemoryType = _cpuType.ToMemoryType(), CpuType = _cpuType };
SnesMemoryType memType = _cpuType == CpuType.NecDsp ? SnesMemoryType.DspProgramRom : _cpuType.ToMemoryType();
Breakpoint breakpoint = new Breakpoint() { MemoryType = memType, CpuType = _cpuType };
if(new frmBreakpoint(breakpoint).ShowDialog() == DialogResult.OK) {
BreakpointManager.AddBreakpoint(breakpoint);
}

View file

@ -398,7 +398,7 @@
this.cboBreakpointType.FormattingEnabled = true;
this.cboBreakpointType.Location = new System.Drawing.Point(3, 3);
this.cboBreakpointType.Name = "cboBreakpointType";
this.cboBreakpointType.Size = new System.Drawing.Size(121, 21);
this.cboBreakpointType.Size = new System.Drawing.Size(159, 21);
this.cboBreakpointType.TabIndex = 13;
this.cboBreakpointType.SelectedIndexChanged += new System.EventHandler(this.cboBreakpointType_SelectedIndexChanged);
//
@ -407,7 +407,7 @@
this.lblRange.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblRange.AutoSize = true;
this.lblRange.ForeColor = System.Drawing.SystemColors.ControlDarkDark;
this.lblRange.Location = new System.Drawing.Point(130, 6);
this.lblRange.Location = new System.Drawing.Point(168, 6);
this.lblRange.Name = "lblRange";
this.lblRange.Size = new System.Drawing.Size(40, 13);
this.lblRange.TabIndex = 6;

View file

@ -76,6 +76,10 @@ namespace Mesen.GUI.Debugger
cboBreakpointType.Items.Add("-");
cboBreakpointType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.SpcRam));
cboBreakpointType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.SpcRom));
} else if(_cpuType == CpuType.NecDsp) {
cboBreakpointType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.DspProgramRom));
cboBreakpointType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.DspDataRom));
cboBreakpointType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.DspDataRam));
}
this.toolTip.SetToolTip(this.picExpressionWarning, "Condition contains invalid syntax or symbols.");

View file

@ -14,7 +14,7 @@ namespace Mesen.GUI.Debugger.Code
{
private static Regex _space = new Regex("^[ \t]+", RegexOptions.IgnoreCase | RegexOptions.Compiled);
private static Regex _opCode = new Regex("^[a-z0-9]{2,5}", RegexOptions.IgnoreCase | RegexOptions.Compiled);
private static Regex _syntax = new Regex("^[]([)!+,.]{1}", RegexOptions.Compiled);
private static Regex _syntax = new Regex("^[]([)!+,.|:]{1}", RegexOptions.Compiled);
private static Regex _operand = new Regex("^(([$][0-9a-f]*([.]\\d){0,1})|(#[@$:_0-9a-z]*)|([@_a-z]([@_a-z0-9])*))", RegexOptions.IgnoreCase | RegexOptions.Compiled);
public static List<CodeColor> GetCpuHighlights(CodeLineData lineData, bool highlightCode, string addressFormat, Color? textColor, bool showMemoryValues)

View file

@ -0,0 +1,29 @@
using Mesen.GUI.Debugger.Controls;
using Mesen.GUI.Debugger.Integration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Mesen.GUI.Debugger.Code
{
public class NecDspDisassemblyManager : CpuDisassemblyManager
{
public override CpuType CpuType { get { return CpuType.NecDsp; } }
public override SnesMemoryType RelativeMemoryType { get { return SnesMemoryType.NecDspMemory; } }
public override int AddressSize { get { return 4; } }
public override int ByteCodeSize { get { return 3; } }
public override bool AllowSourceView { get { return false; } }
public override void RefreshCode(ISymbolProvider symbolProvider, SourceFileInfo file)
{
this._provider = new CodeDataProvider(CpuType.NecDsp);
}
protected override int GetFullAddress(int address, int length)
{
return address;
}
}
}

View file

@ -0,0 +1,64 @@
using Mesen.GUI.Config;
using Mesen.GUI.Debugger.Controls;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Mesen.GUI.Debugger.Code
{
public class NecDspLineStyleProvider : BaseStyleProvider
{
public NecDspLineStyleProvider()
{
}
public override string GetLineComment(int lineNumber)
{
return null;
}
public static void ConfigureActiveStatement(LineProperties props)
{
props.FgColor = Color.Black;
props.TextBgColor = ConfigManager.Config.Debug.Debugger.CodeActiveStatementColor;
props.Symbol |= LineSymbol.Arrow;
}
public override LineProperties GetLineStyle(CodeLineData lineData, int lineIndex)
{
DebuggerInfo cfg = ConfigManager.Config.Debug.Debugger;
LineProperties props = new LineProperties();
if(lineData.Address >= 0) {
GetBreakpointLineProperties(props, lineData.Address);
}
bool isActiveStatement = ActiveAddress.HasValue && ActiveAddress.Value == lineData.Address;
if(isActiveStatement) {
ConfigureActiveStatement(props);
}
if(lineData.Flags.HasFlag(LineFlags.VerifiedData)) {
props.LineBgColor = cfg.CodeVerifiedDataColor;
} else if(!lineData.Flags.HasFlag(LineFlags.VerifiedCode)) {
props.LineBgColor = cfg.CodeUnidentifiedDataColor;
}
return props;
}
private void GetBreakpointLineProperties(LineProperties props, int cpuAddress)
{
AddressInfo absAddress = DebugApi.GetAbsoluteAddress(new AddressInfo() { Address = cpuAddress, Type = SnesMemoryType.NecDspMemory });
foreach(Breakpoint breakpoint in BreakpointManager.Breakpoints) {
if(breakpoint.Matches((uint)cpuAddress, SnesMemoryType.NecDspMemory, CpuType.NecDsp) || (absAddress.Address >= 0 && breakpoint.Matches((uint)absAddress.Address, absAddress.Type, CpuType.NecDsp))) {
SetBreakpointLineProperties(props, breakpoint);
return;
}
}
}
}
}

View file

@ -77,6 +77,8 @@ namespace Mesen.GUI.Config
public XmlKeys OpenSa1Debugger = Keys.None;
[ShortcutName("Open GSU Debugger")]
public XmlKeys OpenGsuDebugger = Keys.None;
[ShortcutName("Open DSP Debugger")]
public XmlKeys OpenNecDspDebugger = Keys.None;
[ShortcutName("Open Event Viewer")]
public XmlKeys OpenEventViewer = Keys.Control | Keys.E;
[ShortcutName("Open Memory Tools")]

View file

@ -345,6 +345,8 @@ namespace Mesen.GUI.Debugger.Controls
DebugApi.RefreshDisassembly(CpuType.Cpu);
DebugApi.RefreshDisassembly(CpuType.Spc);
DebugApi.RefreshDisassembly(CpuType.Sa1);
DebugApi.RefreshDisassembly(CpuType.Gsu);
DebugApi.RefreshDisassembly(CpuType.NecDsp);
}
_manager.RefreshCode(_inSourceView ? _symbolProvider : null, _inSourceView ? cboSourceFile.SelectedItem as SourceFileInfo : null);

View file

@ -0,0 +1,646 @@
namespace Mesen.GUI.Debugger.Controls
{
partial class ctrlNecDspStatus
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if(disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.grpNecDsp = new System.Windows.Forms.GroupBox();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.label3 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.label5 = new System.Windows.Forms.Label();
this.label8 = new System.Windows.Forms.Label();
this.label9 = new System.Windows.Forms.Label();
this.label10 = new System.Windows.Forms.Label();
this.label11 = new System.Windows.Forms.Label();
this.label12 = new System.Windows.Forms.Label();
this.label13 = new System.Windows.Forms.Label();
this.label14 = new System.Windows.Forms.Label();
this.label15 = new System.Windows.Forms.Label();
this.label16 = new System.Windows.Forms.Label();
this.txtTR = new System.Windows.Forms.TextBox();
this.txtRP = new System.Windows.Forms.TextBox();
this.txtK = new System.Windows.Forms.TextBox();
this.txtTRB = new System.Windows.Forms.TextBox();
this.txtDP = new System.Windows.Forms.TextBox();
this.txtL = new System.Windows.Forms.TextBox();
this.txtPC = new System.Windows.Forms.TextBox();
this.txtDR = new System.Windows.Forms.TextBox();
this.txtM = new System.Windows.Forms.TextBox();
this.txtSP = new System.Windows.Forms.TextBox();
this.txtSR = new System.Windows.Forms.TextBox();
this.txtN = new System.Windows.Forms.TextBox();
this.label17 = new System.Windows.Forms.Label();
this.txtA = new System.Windows.Forms.TextBox();
this.label7 = new System.Windows.Forms.Label();
this.txtB = new System.Windows.Forms.TextBox();
this.tlpFlagsA = new System.Windows.Forms.TableLayoutPanel();
this.chkZeroA = new System.Windows.Forms.CheckBox();
this.chkCarryA = new System.Windows.Forms.CheckBox();
this.chkOverflow1A = new System.Windows.Forms.CheckBox();
this.chkOverflow0A = new System.Windows.Forms.CheckBox();
this.chkSign0A = new System.Windows.Forms.CheckBox();
this.chkSign1A = new System.Windows.Forms.CheckBox();
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.chkCarryB = new System.Windows.Forms.CheckBox();
this.chkZeroB = new System.Windows.Forms.CheckBox();
this.chkOverflow0B = new System.Windows.Forms.CheckBox();
this.chkOverflow1B = new System.Windows.Forms.CheckBox();
this.chkSign0B = new System.Windows.Forms.CheckBox();
this.chkSign1B = new System.Windows.Forms.CheckBox();
this.grpNecDsp.SuspendLayout();
this.tableLayoutPanel1.SuspendLayout();
this.tlpFlagsA.SuspendLayout();
this.tableLayoutPanel2.SuspendLayout();
this.SuspendLayout();
//
// grpNecDsp
//
this.grpNecDsp.Controls.Add(this.tableLayoutPanel1);
this.grpNecDsp.Dock = System.Windows.Forms.DockStyle.Top;
this.grpNecDsp.Location = new System.Drawing.Point(0, 0);
this.grpNecDsp.Name = "grpNecDsp";
this.grpNecDsp.Size = new System.Drawing.Size(325, 150);
this.grpNecDsp.TabIndex = 0;
this.grpNecDsp.TabStop = false;
this.grpNecDsp.Text = "DSP";
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 8;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel1.Controls.Add(this.label3, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.label4, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.label5, 2, 0);
this.tableLayoutPanel1.Controls.Add(this.label8, 4, 0);
this.tableLayoutPanel1.Controls.Add(this.label9, 6, 0);
this.tableLayoutPanel1.Controls.Add(this.label10, 2, 1);
this.tableLayoutPanel1.Controls.Add(this.label11, 4, 1);
this.tableLayoutPanel1.Controls.Add(this.label12, 6, 1);
this.tableLayoutPanel1.Controls.Add(this.label13, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.label14, 2, 2);
this.tableLayoutPanel1.Controls.Add(this.label15, 4, 2);
this.tableLayoutPanel1.Controls.Add(this.label16, 6, 2);
this.tableLayoutPanel1.Controls.Add(this.txtTR, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.txtRP, 1, 1);
this.tableLayoutPanel1.Controls.Add(this.txtK, 1, 2);
this.tableLayoutPanel1.Controls.Add(this.txtTRB, 3, 0);
this.tableLayoutPanel1.Controls.Add(this.txtDP, 3, 1);
this.tableLayoutPanel1.Controls.Add(this.txtL, 3, 2);
this.tableLayoutPanel1.Controls.Add(this.txtPC, 5, 0);
this.tableLayoutPanel1.Controls.Add(this.txtDR, 5, 1);
this.tableLayoutPanel1.Controls.Add(this.txtM, 5, 2);
this.tableLayoutPanel1.Controls.Add(this.txtSP, 7, 0);
this.tableLayoutPanel1.Controls.Add(this.txtSR, 7, 1);
this.tableLayoutPanel1.Controls.Add(this.txtN, 7, 2);
this.tableLayoutPanel1.Controls.Add(this.label17, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.txtA, 1, 3);
this.tableLayoutPanel1.Controls.Add(this.label7, 0, 4);
this.tableLayoutPanel1.Controls.Add(this.txtB, 1, 4);
this.tableLayoutPanel1.Controls.Add(this.tlpFlagsA, 2, 3);
this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 2, 4);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 16);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 9;
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.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(319, 131);
this.tableLayoutPanel1.TabIndex = 0;
//
// label3
//
this.label3.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(3, 6);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(25, 13);
this.label3.TabIndex = 17;
this.label3.Text = "TR:";
//
// label4
//
this.label4.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(3, 32);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(25, 13);
this.label4.TabIndex = 18;
this.label4.Text = "RP:";
//
// label5
//
this.label5.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(80, 6);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(32, 13);
this.label5.TabIndex = 19;
this.label5.Text = "TRB:";
//
// label8
//
this.label8.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label8.AutoSize = true;
this.label8.Location = new System.Drawing.Point(164, 6);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(24, 13);
this.label8.TabIndex = 20;
this.label8.Text = "PC:";
//
// label9
//
this.label9.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label9.AutoSize = true;
this.label9.Location = new System.Drawing.Point(242, 6);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(24, 13);
this.label9.TabIndex = 21;
this.label9.Text = "SP:";
//
// label10
//
this.label10.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label10.AutoSize = true;
this.label10.Location = new System.Drawing.Point(80, 32);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(25, 13);
this.label10.TabIndex = 22;
this.label10.Text = "DP:";
//
// label11
//
this.label11.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label11.AutoSize = true;
this.label11.Location = new System.Drawing.Point(164, 32);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(26, 13);
this.label11.TabIndex = 23;
this.label11.Text = "DR:";
//
// label12
//
this.label12.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label12.AutoSize = true;
this.label12.Location = new System.Drawing.Point(242, 32);
this.label12.Name = "label12";
this.label12.Size = new System.Drawing.Size(25, 13);
this.label12.TabIndex = 24;
this.label12.Text = "SR:";
//
// label13
//
this.label13.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label13.AutoSize = true;
this.label13.Location = new System.Drawing.Point(3, 58);
this.label13.Name = "label13";
this.label13.Size = new System.Drawing.Size(17, 13);
this.label13.TabIndex = 25;
this.label13.Text = "K:";
//
// label14
//
this.label14.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label14.AutoSize = true;
this.label14.Location = new System.Drawing.Point(80, 58);
this.label14.Name = "label14";
this.label14.Size = new System.Drawing.Size(16, 13);
this.label14.TabIndex = 26;
this.label14.Text = "L:";
//
// label15
//
this.label15.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label15.AutoSize = true;
this.label15.Location = new System.Drawing.Point(164, 58);
this.label15.Name = "label15";
this.label15.Size = new System.Drawing.Size(19, 13);
this.label15.TabIndex = 27;
this.label15.Text = "M:";
//
// label16
//
this.label16.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label16.AutoSize = true;
this.label16.Location = new System.Drawing.Point(242, 58);
this.label16.Name = "label16";
this.label16.Size = new System.Drawing.Size(18, 13);
this.label16.TabIndex = 28;
this.label16.Text = "N:";
//
// txtTR
//
this.txtTR.Location = new System.Drawing.Point(34, 3);
this.txtTR.Name = "txtTR";
this.txtTR.Size = new System.Drawing.Size(40, 20);
this.txtTR.TabIndex = 29;
this.txtTR.Text = "DDDD";
//
// txtRP
//
this.txtRP.Location = new System.Drawing.Point(34, 29);
this.txtRP.Name = "txtRP";
this.txtRP.Size = new System.Drawing.Size(40, 20);
this.txtRP.TabIndex = 30;
this.txtRP.Text = "DDDD";
//
// txtK
//
this.txtK.Location = new System.Drawing.Point(34, 55);
this.txtK.Name = "txtK";
this.txtK.Size = new System.Drawing.Size(40, 20);
this.txtK.TabIndex = 31;
this.txtK.Text = "DDDD";
//
// txtTRB
//
this.txtTRB.Location = new System.Drawing.Point(118, 3);
this.txtTRB.Name = "txtTRB";
this.txtTRB.Size = new System.Drawing.Size(40, 20);
this.txtTRB.TabIndex = 32;
this.txtTRB.Text = "DDDD";
//
// txtDP
//
this.txtDP.Location = new System.Drawing.Point(118, 29);
this.txtDP.Name = "txtDP";
this.txtDP.Size = new System.Drawing.Size(40, 20);
this.txtDP.TabIndex = 33;
this.txtDP.Text = "DDDD";
//
// txtL
//
this.txtL.Location = new System.Drawing.Point(118, 55);
this.txtL.Name = "txtL";
this.txtL.Size = new System.Drawing.Size(40, 20);
this.txtL.TabIndex = 34;
this.txtL.Text = "DDDD";
//
// txtPC
//
this.txtPC.Location = new System.Drawing.Point(196, 3);
this.txtPC.Name = "txtPC";
this.txtPC.Size = new System.Drawing.Size(40, 20);
this.txtPC.TabIndex = 35;
this.txtPC.Text = "DDDD";
//
// txtDR
//
this.txtDR.Location = new System.Drawing.Point(196, 29);
this.txtDR.Name = "txtDR";
this.txtDR.Size = new System.Drawing.Size(40, 20);
this.txtDR.TabIndex = 36;
this.txtDR.Text = "DDDD";
//
// txtM
//
this.txtM.Location = new System.Drawing.Point(196, 55);
this.txtM.Name = "txtM";
this.txtM.Size = new System.Drawing.Size(40, 20);
this.txtM.TabIndex = 37;
this.txtM.Text = "DDDD";
//
// txtSP
//
this.txtSP.Location = new System.Drawing.Point(273, 3);
this.txtSP.Name = "txtSP";
this.txtSP.Size = new System.Drawing.Size(40, 20);
this.txtSP.TabIndex = 38;
this.txtSP.Text = "DDDD";
//
// txtSR
//
this.txtSR.Location = new System.Drawing.Point(273, 29);
this.txtSR.Name = "txtSR";
this.txtSR.Size = new System.Drawing.Size(40, 20);
this.txtSR.TabIndex = 39;
this.txtSR.Text = "DDDD";
//
// txtN
//
this.txtN.Location = new System.Drawing.Point(273, 55);
this.txtN.Name = "txtN";
this.txtN.Size = new System.Drawing.Size(40, 20);
this.txtN.TabIndex = 40;
this.txtN.Text = "DDDD";
//
// label17
//
this.label17.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label17.AutoSize = true;
this.label17.Location = new System.Drawing.Point(3, 84);
this.label17.Name = "label17";
this.label17.Size = new System.Drawing.Size(17, 13);
this.label17.TabIndex = 41;
this.label17.Text = "A:";
//
// txtA
//
this.txtA.Location = new System.Drawing.Point(34, 81);
this.txtA.Name = "txtA";
this.txtA.Size = new System.Drawing.Size(40, 20);
this.txtA.TabIndex = 43;
//
// label7
//
this.label7.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label7.AutoSize = true;
this.label7.Location = new System.Drawing.Point(3, 110);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(17, 13);
this.label7.TabIndex = 14;
this.label7.Text = "B:";
//
// txtB
//
this.txtB.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.txtB.Location = new System.Drawing.Point(34, 107);
this.txtB.Name = "txtB";
this.txtB.Size = new System.Drawing.Size(40, 20);
this.txtB.TabIndex = 15;
this.txtB.Text = "DD";
//
// tlpFlagsA
//
this.tlpFlagsA.ColumnCount = 6;
this.tableLayoutPanel1.SetColumnSpan(this.tlpFlagsA, 6);
this.tlpFlagsA.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tlpFlagsA.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tlpFlagsA.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tlpFlagsA.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tlpFlagsA.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tlpFlagsA.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tlpFlagsA.Controls.Add(this.chkCarryA, 0, 0);
this.tlpFlagsA.Controls.Add(this.chkZeroA, 1, 0);
this.tlpFlagsA.Controls.Add(this.chkOverflow0A, 2, 0);
this.tlpFlagsA.Controls.Add(this.chkOverflow1A, 3, 0);
this.tlpFlagsA.Controls.Add(this.chkSign0A, 4, 0);
this.tlpFlagsA.Controls.Add(this.chkSign1A, 5, 0);
this.tlpFlagsA.Dock = System.Windows.Forms.DockStyle.Fill;
this.tlpFlagsA.Location = new System.Drawing.Point(80, 81);
this.tlpFlagsA.Name = "tlpFlagsA";
this.tlpFlagsA.RowCount = 1;
this.tlpFlagsA.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tlpFlagsA.Size = new System.Drawing.Size(236, 20);
this.tlpFlagsA.TabIndex = 16;
//
// chkZeroA
//
this.chkZeroA.AutoSize = true;
this.chkZeroA.Location = new System.Drawing.Point(33, 3);
this.chkZeroA.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.chkZeroA.Name = "chkZeroA";
this.chkZeroA.Size = new System.Drawing.Size(33, 17);
this.chkZeroA.TabIndex = 21;
this.chkZeroA.Text = "Z";
this.chkZeroA.UseVisualStyleBackColor = true;
//
// chkCarryA
//
this.chkCarryA.AutoSize = true;
this.chkCarryA.Location = new System.Drawing.Point(0, 3);
this.chkCarryA.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.chkCarryA.Name = "chkCarryA";
this.chkCarryA.Size = new System.Drawing.Size(33, 17);
this.chkCarryA.TabIndex = 23;
this.chkCarryA.Text = "C";
this.chkCarryA.UseVisualStyleBackColor = true;
//
// chkOverflow1A
//
this.chkOverflow1A.AutoSize = true;
this.chkOverflow1A.Location = new System.Drawing.Point(105, 3);
this.chkOverflow1A.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.chkOverflow1A.Name = "chkOverflow1A";
this.chkOverflow1A.Size = new System.Drawing.Size(39, 17);
this.chkOverflow1A.TabIndex = 17;
this.chkOverflow1A.Text = "V1";
this.chkOverflow1A.UseVisualStyleBackColor = true;
//
// chkOverflow0A
//
this.chkOverflow0A.AutoSize = true;
this.chkOverflow0A.Location = new System.Drawing.Point(66, 3);
this.chkOverflow0A.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.chkOverflow0A.Name = "chkOverflow0A";
this.chkOverflow0A.Size = new System.Drawing.Size(39, 17);
this.chkOverflow0A.TabIndex = 20;
this.chkOverflow0A.Text = "V0";
this.chkOverflow0A.UseVisualStyleBackColor = true;
//
// chkSign0A
//
this.chkSign0A.AutoSize = true;
this.chkSign0A.Location = new System.Drawing.Point(144, 3);
this.chkSign0A.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.chkSign0A.Name = "chkSign0A";
this.chkSign0A.Size = new System.Drawing.Size(39, 17);
this.chkSign0A.TabIndex = 24;
this.chkSign0A.Text = "S0";
this.chkSign0A.UseVisualStyleBackColor = true;
//
// chkSign1A
//
this.chkSign1A.AutoSize = true;
this.chkSign1A.Location = new System.Drawing.Point(183, 3);
this.chkSign1A.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.chkSign1A.Name = "chkSign1A";
this.chkSign1A.Size = new System.Drawing.Size(39, 17);
this.chkSign1A.TabIndex = 25;
this.chkSign1A.Text = "S1";
this.chkSign1A.UseVisualStyleBackColor = true;
//
// tableLayoutPanel2
//
this.tableLayoutPanel2.ColumnCount = 6;
this.tableLayoutPanel1.SetColumnSpan(this.tableLayoutPanel2, 6);
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel2.Controls.Add(this.chkCarryB, 0, 0);
this.tableLayoutPanel2.Controls.Add(this.chkZeroB, 1, 0);
this.tableLayoutPanel2.Controls.Add(this.chkOverflow0B, 2, 0);
this.tableLayoutPanel2.Controls.Add(this.chkOverflow1B, 3, 0);
this.tableLayoutPanel2.Controls.Add(this.chkSign0B, 4, 0);
this.tableLayoutPanel2.Controls.Add(this.chkSign1B, 5, 0);
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel2.Location = new System.Drawing.Point(80, 107);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 1;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel2.Size = new System.Drawing.Size(236, 20);
this.tableLayoutPanel2.TabIndex = 44;
//
// chkCarryB
//
this.chkCarryB.AutoSize = true;
this.chkCarryB.Location = new System.Drawing.Point(0, 3);
this.chkCarryB.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.chkCarryB.Name = "chkCarryB";
this.chkCarryB.Size = new System.Drawing.Size(33, 17);
this.chkCarryB.TabIndex = 23;
this.chkCarryB.Text = "C";
this.chkCarryB.UseVisualStyleBackColor = true;
//
// chkZeroB
//
this.chkZeroB.AutoSize = true;
this.chkZeroB.Location = new System.Drawing.Point(33, 3);
this.chkZeroB.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.chkZeroB.Name = "chkZeroB";
this.chkZeroB.Size = new System.Drawing.Size(33, 17);
this.chkZeroB.TabIndex = 21;
this.chkZeroB.Text = "Z";
this.chkZeroB.UseVisualStyleBackColor = true;
//
// chkOverflow0B
//
this.chkOverflow0B.AutoSize = true;
this.chkOverflow0B.Location = new System.Drawing.Point(66, 3);
this.chkOverflow0B.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.chkOverflow0B.Name = "chkOverflow0B";
this.chkOverflow0B.Size = new System.Drawing.Size(39, 17);
this.chkOverflow0B.TabIndex = 20;
this.chkOverflow0B.Text = "V0";
this.chkOverflow0B.UseVisualStyleBackColor = true;
//
// chkOverflow1B
//
this.chkOverflow1B.AutoSize = true;
this.chkOverflow1B.Location = new System.Drawing.Point(105, 3);
this.chkOverflow1B.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.chkOverflow1B.Name = "chkOverflow1B";
this.chkOverflow1B.Size = new System.Drawing.Size(39, 17);
this.chkOverflow1B.TabIndex = 17;
this.chkOverflow1B.Text = "V1";
this.chkOverflow1B.UseVisualStyleBackColor = true;
//
// chkSign0B
//
this.chkSign0B.AutoSize = true;
this.chkSign0B.Location = new System.Drawing.Point(144, 3);
this.chkSign0B.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.chkSign0B.Name = "chkSign0B";
this.chkSign0B.Size = new System.Drawing.Size(39, 17);
this.chkSign0B.TabIndex = 24;
this.chkSign0B.Text = "S0";
this.chkSign0B.UseVisualStyleBackColor = true;
//
// chkSign1B
//
this.chkSign1B.AutoSize = true;
this.chkSign1B.Location = new System.Drawing.Point(183, 3);
this.chkSign1B.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.chkSign1B.Name = "chkSign1B";
this.chkSign1B.Size = new System.Drawing.Size(39, 17);
this.chkSign1B.TabIndex = 25;
this.chkSign1B.Text = "S1";
this.chkSign1B.UseVisualStyleBackColor = true;
//
// ctrlNecDspStatus
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.grpNecDsp);
this.Name = "ctrlNecDspStatus";
this.Size = new System.Drawing.Size(325, 150);
this.grpNecDsp.ResumeLayout(false);
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.tlpFlagsA.ResumeLayout(false);
this.tlpFlagsA.PerformLayout();
this.tableLayoutPanel2.ResumeLayout(false);
this.tableLayoutPanel2.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox grpNecDsp;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.TextBox txtB;
private System.Windows.Forms.TableLayoutPanel tlpFlagsA;
private System.Windows.Forms.CheckBox chkSign0A;
private System.Windows.Forms.CheckBox chkCarryA;
private System.Windows.Forms.CheckBox chkZeroA;
private System.Windows.Forms.CheckBox chkOverflow1A;
private System.Windows.Forms.CheckBox chkOverflow0A;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label8;
private System.Windows.Forms.Label label9;
private System.Windows.Forms.Label label10;
private System.Windows.Forms.Label label11;
private System.Windows.Forms.Label label12;
private System.Windows.Forms.Label label13;
private System.Windows.Forms.Label label14;
private System.Windows.Forms.Label label15;
private System.Windows.Forms.Label label16;
private System.Windows.Forms.TextBox txtTR;
private System.Windows.Forms.TextBox txtRP;
private System.Windows.Forms.TextBox txtK;
private System.Windows.Forms.TextBox txtTRB;
private System.Windows.Forms.TextBox txtDP;
private System.Windows.Forms.TextBox txtL;
private System.Windows.Forms.TextBox txtPC;
private System.Windows.Forms.TextBox txtDR;
private System.Windows.Forms.TextBox txtM;
private System.Windows.Forms.TextBox txtSP;
private System.Windows.Forms.TextBox txtSR;
private System.Windows.Forms.TextBox txtN;
private System.Windows.Forms.Label label17;
private System.Windows.Forms.TextBox txtA;
private System.Windows.Forms.CheckBox chkSign1A;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
private System.Windows.Forms.CheckBox chkCarryB;
private System.Windows.Forms.CheckBox chkZeroB;
private System.Windows.Forms.CheckBox chkOverflow0B;
private System.Windows.Forms.CheckBox chkOverflow1B;
private System.Windows.Forms.CheckBox chkSign0B;
private System.Windows.Forms.CheckBox chkSign1B;
}
}

View file

@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Mesen.GUI.Controls;
using Mesen.GUI.Forms;
namespace Mesen.GUI.Debugger.Controls
{
public partial class ctrlNecDspStatus : BaseControl
{
public ctrlNecDspStatus()
{
InitializeComponent();
if(IsDesignMode) {
return;
}
}
public void UpdateStatus(NecDspState state)
{
txtTR.Text = state.TR.ToString("X4");
txtTRB.Text = state.TRB.ToString("X4");
txtPC.Text = state.PC.ToString("X4");
txtSP.Text = state.SP.ToString("X2");
txtRP.Text = state.RP.ToString("X4");
txtDP.Text = state.DP.ToString("X4");
txtDR.Text = state.DR.ToString("X4");
txtSR.Text = state.SR.ToString("X4");
txtK.Text = state.K.ToString("X4");
txtL.Text = state.L.ToString("X4");
txtM.Text = state.M.ToString("X4");
txtN.Text = state.N.ToString("X4");
txtA.Text = state.A.ToString("X4");
txtB.Text = state.B.ToString("X4");
chkCarryA.Checked = state.FlagsA.Carry;
chkZeroA.Checked = state.FlagsA.Zero;
chkOverflow0A.Checked = state.FlagsA.Overflow0;
chkOverflow1A.Checked = state.FlagsA.Overflow1;
chkSign0A.Checked = state.FlagsA.Sign0;
chkSign1A.Checked = state.FlagsA.Sign1;
chkCarryB.Checked = state.FlagsB.Carry;
chkZeroB.Checked = state.FlagsB.Zero;
chkOverflow0B.Checked = state.FlagsB.Overflow0;
chkOverflow1B.Checked = state.FlagsB.Overflow1;
chkSign0B.Checked = state.FlagsB.Sign0;
chkSign1B.Checked = state.FlagsB.Sign1;
}
}
}

View file

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View file

@ -15,7 +15,7 @@ namespace Mesen.GUI.Debugger.Controls
public partial class ctrlSpcStatus : BaseControl
{
private EntityBinder _binder = new EntityBinder();
private DebugState _lastState;
private SpcState _lastState;
public ctrlSpcStatus()
{
@ -33,11 +33,11 @@ namespace Mesen.GUI.Debugger.Controls
_binder.AddBinding(nameof(SpcState.PS), txtP);
}
public void UpdateStatus(DebugState state)
public void UpdateStatus(SpcState state)
{
_lastState = state;
_binder.Entity = state.Spc;
_binder.Entity = state;
_binder.UpdateUI();
UpdateCpuFlags();
@ -46,7 +46,7 @@ namespace Mesen.GUI.Debugger.Controls
private void UpdateCpuFlags()
{
SpcFlags flags = _lastState.Spc.PS;
SpcFlags flags = _lastState.PS;
chkNegative.Checked = flags.HasFlag(SpcFlags.Negative);
chkOverflow.Checked = flags.HasFlag(SpcFlags.Overflow);
chkPage.Checked = flags.HasFlag(SpcFlags.DirectPage);
@ -60,7 +60,7 @@ namespace Mesen.GUI.Debugger.Controls
private void UpdateStack()
{
StringBuilder sb = new StringBuilder();
for(UInt32 i = (uint)_lastState.Spc.SP + 1; (i & 0xFF) != 0; i++) {
for(UInt32 i = (uint)_lastState.SP + 1; (i & 0xFF) != 0; i++) {
sb.Append("$");
sb.Append(DebugApi.GetMemoryValue(SnesMemoryType.SpcMemory, 0x100 | i).ToString("X2"));
sb.Append(", ");

View file

@ -30,6 +30,7 @@ namespace Mesen.GUI.Debugger
case DebugWindow.SpcDebugger: frm = new frmDebugger(CpuType.Spc); frm.Icon = Properties.Resources.SpcDebugger; break;
case DebugWindow.Sa1Debugger: frm = new frmDebugger(CpuType.Sa1); frm.Icon = Properties.Resources.Sa1Debugger; break;
case DebugWindow.GsuDebugger: frm = new frmDebugger(CpuType.Gsu); frm.Icon = Properties.Resources.GsuDebugger; break;
case DebugWindow.NecDspDebugger: frm = new frmDebugger(CpuType.NecDsp); frm.Icon = Properties.Resources.NecDspDebugger; break;
case DebugWindow.TraceLogger: frm = new frmTraceLogger(); frm.Icon = Properties.Resources.LogWindow; break;
case DebugWindow.MemoryTools: frm = new frmMemoryTools(); frm.Icon = Properties.Resources.CheatCode; break;
case DebugWindow.TileViewer: frm = new frmTileViewer(); frm.Icon = Properties.Resources.VerticalLayout; break;
@ -85,6 +86,7 @@ namespace Mesen.GUI.Debugger
switch(type) {
case CpuType.Cpu: return (frmDebugger)OpenDebugWindow(DebugWindow.Debugger);
case CpuType.Spc: return (frmDebugger)OpenDebugWindow(DebugWindow.SpcDebugger);
case CpuType.NecDsp: return (frmDebugger)OpenDebugWindow(DebugWindow.NecDspDebugger);
case CpuType.Sa1: return (frmDebugger)OpenDebugWindow(DebugWindow.Sa1Debugger);
case CpuType.Gsu: return (frmDebugger)OpenDebugWindow(DebugWindow.GsuDebugger);
}
@ -96,6 +98,7 @@ namespace Mesen.GUI.Debugger
switch(type) {
case CpuType.Cpu: return (frmDebugger)GetExistingSingleInstanceWindow(DebugWindow.Debugger);
case CpuType.Spc: return (frmDebugger)GetExistingSingleInstanceWindow(DebugWindow.SpcDebugger);
case CpuType.NecDsp: return (frmDebugger)GetExistingSingleInstanceWindow(DebugWindow.NecDspDebugger);
case CpuType.Sa1: return (frmDebugger)GetExistingSingleInstanceWindow(DebugWindow.Sa1Debugger);
case CpuType.Gsu: return (frmDebugger)GetExistingSingleInstanceWindow(DebugWindow.GsuDebugger);
}
@ -144,6 +147,7 @@ namespace Mesen.GUI.Debugger
case DebugWindow.SpcDebugger: return _openedWindows.ToList().Find((form) => form.GetType() == typeof(frmDebugger) && ((frmDebugger)form).CpuType == CpuType.Spc);
case DebugWindow.Sa1Debugger: return _openedWindows.ToList().Find((form) => form.GetType() == typeof(frmDebugger) && ((frmDebugger)form).CpuType == CpuType.Sa1);
case DebugWindow.GsuDebugger: return _openedWindows.ToList().Find((form) => form.GetType() == typeof(frmDebugger) && ((frmDebugger)form).CpuType == CpuType.Gsu);
case DebugWindow.NecDspDebugger: return _openedWindows.ToList().Find((form) => form.GetType() == typeof(frmDebugger) && ((frmDebugger)form).CpuType == CpuType.NecDsp);
case DebugWindow.TraceLogger: return _openedWindows.ToList().Find((form) => form.GetType() == typeof(frmTraceLogger));
case DebugWindow.EventViewer: return _openedWindows.ToList().Find((form) => form.GetType() == typeof(frmEventViewer));
case DebugWindow.Profiler: return _openedWindows.ToList().Find((form) => form.GetType() == typeof(frmProfiler));
@ -185,6 +189,7 @@ namespace Mesen.GUI.Debugger
SpcDebugger,
Sa1Debugger,
GsuDebugger,
NecDspDebugger,
MemoryTools,
TraceLogger,
TileViewer,

View file

@ -29,6 +29,7 @@ namespace Mesen.GUI.Debugger.Labels
case SnesMemoryType.SpcRom: sb.Append("SPCROM:"); break;
case SnesMemoryType.BsxPsRam: sb.Append("PSRAM:"); break;
case SnesMemoryType.BsxMemoryPack: sb.Append("MPACK:"); break;
case SnesMemoryType.DspProgramRom: sb.Append("DSPPRG:"); break;
}
sb.Append(Address.ToString("X4"));
@ -64,6 +65,7 @@ namespace Mesen.GUI.Debugger.Labels
case "SPCROM": type = SnesMemoryType.SpcRom; break;
case "PSRAM": type = SnesMemoryType.BsxPsRam; break;
case "MPACK": type = SnesMemoryType.BsxMemoryPack; break;
case "DSPPRG": type = SnesMemoryType.DspProgramRom; break;
default: return null;
}

View file

@ -86,6 +86,7 @@ namespace Mesen.GUI.Debugger.Labels
case SnesMemoryType.GsuWorkRam: return address | ((ulong)8 << 32);
case SnesMemoryType.BsxPsRam: return address | ((ulong)9 << 32);
case SnesMemoryType.BsxMemoryPack: return address | ((ulong)10 << 32);
case SnesMemoryType.DspProgramRom: return address | ((ulong)11 << 32);
}
throw new Exception("Invalid type");
}
@ -184,6 +185,8 @@ namespace Mesen.GUI.Debugger.Labels
{
if(label.MemoryType.ToCpuType() == CpuType.Spc) {
DebugApi.RefreshDisassembly(CpuType.Spc);
} else if(label.MemoryType.ToCpuType() == CpuType.NecDsp) {
DebugApi.RefreshDisassembly(CpuType.NecDsp);
} else {
DebugApi.RefreshDisassembly(CpuType.Cpu);
DebugApi.RefreshDisassembly(CpuType.Sa1);

View file

@ -136,6 +136,7 @@ namespace Mesen.GUI.Debugger.Controls
case SnesMemoryType.Sa1InternalRam: prefix = "IRAM: $"; break;
case SnesMemoryType.BsxPsRam: prefix = "PSRAM: $"; break;
case SnesMemoryType.BsxMemoryPack: prefix = "MPACK: $"; break;
case SnesMemoryType.DspProgramRom: prefix = "DSPPRG: $"; break;
default: throw new Exception("Unsupported type");
}
int relAddress = label.GetRelativeAddress(_cpuType).Address;
@ -238,9 +239,23 @@ namespace Mesen.GUI.Debugger.Controls
private void mnuAdd_Click(object sender, EventArgs e)
{
SnesMemoryType defaultMemType = SnesMemoryType.PrgRom;
switch(_cpuType) {
case CpuType.Cpu:
case CpuType.Sa1:
case CpuType.Gsu:
defaultMemType = SnesMemoryType.PrgRom;
break;
case CpuType.Spc: defaultMemType = SnesMemoryType.SpcRam; break;
case CpuType.NecDsp: defaultMemType = SnesMemoryType.DspProgramRom; break;
default: throw new Exception("Unsupported CPU type");
}
CodeLabel newLabel = new CodeLabel() {
Address = 0,
MemoryType = _cpuType == CpuType.Spc ? SnesMemoryType.SpcRam : SnesMemoryType.PrgRom,
MemoryType = defaultMemType,
Label = "",
Comment = ""
};

View file

@ -55,6 +55,8 @@ namespace Mesen.GUI.Debugger
} else if(cpuType == CpuType.Spc) {
cboType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.SpcRam));
cboType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.SpcRom));
} else if(cpuType == CpuType.NecDsp) {
cboType.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.DspProgramRom));
}
}

View file

@ -19,8 +19,10 @@ namespace Mesen.GUI.Debugger.Workspace
public List<string> SpcWatchValues = new List<string>();
public List<string> Sa1WatchValues = new List<string>();
public List<string> GsuWatchValues = new List<string>();
public List<string> NecDspWatchValues = new List<string>();
public List<CodeLabel> CpuLabels = new List<CodeLabel>();
public List<CodeLabel> SpcLabels = new List<CodeLabel>();
public List<CodeLabel> NecDspLabels = new List<CodeLabel>();
public List<string> TblMappings = null;
private string _filePath;

View file

@ -27,9 +27,11 @@ namespace Mesen.GUI.Debugger.Workspace
_workspace.SpcWatchValues = new List<string>(WatchManager.GetWatchManager(CpuType.Spc).WatchEntries);
_workspace.Sa1WatchValues = new List<string>(WatchManager.GetWatchManager(CpuType.Sa1).WatchEntries);
_workspace.GsuWatchValues = new List<string>(WatchManager.GetWatchManager(CpuType.Gsu).WatchEntries);
_workspace.NecDspWatchValues = new List<string>(WatchManager.GetWatchManager(CpuType.NecDsp).WatchEntries);
_workspace.Breakpoints = new List<Breakpoint>(BreakpointManager.Breakpoints);
_workspace.CpuLabels = new List<CodeLabel>(LabelManager.GetLabels(CpuType.Cpu));
_workspace.SpcLabels = new List<CodeLabel>(LabelManager.GetLabels(CpuType.Spc));
_workspace.NecDspLabels = new List<CodeLabel>(LabelManager.GetLabels(CpuType.NecDsp));
_workspace.Save();
}
}
@ -49,12 +51,15 @@ namespace Mesen.GUI.Debugger.Workspace
_workspace.SpcWatchValues = new List<string>();
_workspace.Sa1WatchValues = new List<string>();
_workspace.GsuWatchValues = new List<string>();
_workspace.NecDspWatchValues = new List<string>();
_workspace.CpuLabels = new List<CodeLabel>();
_workspace.SpcLabels = new List<CodeLabel>();
_workspace.NecDspLabels = new List<CodeLabel>();
WatchManager.GetWatchManager(CpuType.Cpu).WatchEntries = _workspace.WatchValues;
WatchManager.GetWatchManager(CpuType.Spc).WatchEntries = _workspace.SpcWatchValues;
WatchManager.GetWatchManager(CpuType.Sa1).WatchEntries = _workspace.Sa1WatchValues;
WatchManager.GetWatchManager(CpuType.Gsu).WatchEntries = _workspace.GsuWatchValues;
WatchManager.GetWatchManager(CpuType.NecDsp).WatchEntries = _workspace.NecDspWatchValues;
BreakpointManager.SetBreakpoints(_workspace.Breakpoints);
LabelManager.SetDefaultLabels();
LabelManager.RefreshLabels();
@ -68,6 +73,7 @@ namespace Mesen.GUI.Debugger.Workspace
if(_workspace != null) {
_workspace.CpuLabels = new List<CodeLabel>();
_workspace.SpcLabels = new List<CodeLabel>();
_workspace.NecDspLabels = new List<CodeLabel>();
LabelManager.ResetLabels();
LabelManager.SetDefaultLabels();
LabelManager.RefreshLabels();
@ -89,10 +95,12 @@ namespace Mesen.GUI.Debugger.Workspace
WatchManager.GetWatchManager(CpuType.Spc).WatchEntries = _workspace.SpcWatchValues;
WatchManager.GetWatchManager(CpuType.Sa1).WatchEntries = _workspace.Sa1WatchValues;
WatchManager.GetWatchManager(CpuType.Gsu).WatchEntries = _workspace.GsuWatchValues;
WatchManager.GetWatchManager(CpuType.NecDsp).WatchEntries = _workspace.NecDspWatchValues;
LabelManager.ResetLabels();
LabelManager.SetLabels(_workspace.CpuLabels);
LabelManager.SetLabels(_workspace.SpcLabels);
LabelManager.SetLabels(_workspace.NecDspLabels);
LabelManager.SetDefaultLabels();
ImportDbgFile();

View file

@ -61,6 +61,7 @@ namespace Mesen.GUI.Debugger
GetMember(nameof(DebuggerShortcutsConfig.OpenSpcDebugger)),
GetMember(nameof(DebuggerShortcutsConfig.OpenSa1Debugger)),
GetMember(nameof(DebuggerShortcutsConfig.OpenGsuDebugger)),
GetMember(nameof(DebuggerShortcutsConfig.OpenNecDspDebugger)),
};
ctrlDbgShortcutsMemoryViewer.Shortcuts = new FieldInfo[] {

View file

@ -109,7 +109,7 @@
this.mnuBreakOptions = new System.Windows.Forms.ToolStripMenuItem();
this.mnuBreakOnPowerCycleReset = new System.Windows.Forms.ToolStripMenuItem();
this.mnuBreakOnOpen = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem12 = new System.Windows.Forms.ToolStripSeparator();
this.sepBrkCopStpWdm = new System.Windows.Forms.ToolStripSeparator();
this.mnuBreakOnBrk = new System.Windows.Forms.ToolStripMenuItem();
this.mnuBreakOnCop = new System.Windows.Forms.ToolStripMenuItem();
this.mnuBreakOnStp = new System.Windows.Forms.ToolStripMenuItem();
@ -130,12 +130,9 @@
this.mnuConfigureColors = new System.Windows.Forms.ToolStripMenuItem();
this.mnuPreferences = new System.Windows.Forms.ToolStripMenuItem();
this.ctrlSplitContainer = new Mesen.GUI.Controls.ctrlSplitContainer();
this.panel1 = new System.Windows.Forms.Panel();
this.pnlStatus = new System.Windows.Forms.Panel();
this.ctrlLabelList = new Mesen.GUI.Debugger.Controls.ctrlLabelList();
this.ctrlPpuStatus = new Mesen.GUI.Debugger.Controls.ctrlPpuStatus();
this.ctrlGsuStatus = new Mesen.GUI.Debugger.Controls.ctrlGsuStatus();
this.ctrlSpcStatus = new Mesen.GUI.Debugger.Controls.ctrlSpcStatus();
this.ctrlCpuStatus = new Mesen.GUI.Debugger.Controls.ctrlCpuStatus();
this.tlpBottomPanel = new System.Windows.Forms.TableLayoutPanel();
this.grpWatch = new System.Windows.Forms.GroupBox();
this.picWatchHelp = new System.Windows.Forms.PictureBox();
@ -150,7 +147,7 @@
this.ctrlSplitContainer.Panel1.SuspendLayout();
this.ctrlSplitContainer.Panel2.SuspendLayout();
this.ctrlSplitContainer.SuspendLayout();
this.panel1.SuspendLayout();
this.pnlStatus.SuspendLayout();
this.tlpBottomPanel.SuspendLayout();
this.grpWatch.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.picWatchHelp)).BeginInit();
@ -169,10 +166,10 @@
// ctrlMesenMenuStrip1
//
this.ctrlMesenMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.fileToolStripMenuItem,
this.debugToolStripMenuItem,
this.searchToolStripMenuItem,
this.optionsToolStripMenuItem});
this.fileToolStripMenuItem,
this.debugToolStripMenuItem,
this.searchToolStripMenuItem,
this.optionsToolStripMenuItem});
this.ctrlMesenMenuStrip1.Location = new System.Drawing.Point(0, 0);
this.ctrlMesenMenuStrip1.Name = "ctrlMesenMenuStrip1";
this.ctrlMesenMenuStrip1.Size = new System.Drawing.Size(832, 24);
@ -182,16 +179,16 @@
// fileToolStripMenuItem
//
this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuReloadRom,
this.toolStripMenuItem16,
this.mnuSaveRomAs,
this.mnuSaveAsIps,
this.toolStripMenuItem14,
this.importExportToolStripMenuItem,
this.toolStripMenuItem7,
this.codeDataLoggerToolStripMenuItem,
this.toolStripMenuItem13,
this.mnuExit});
this.mnuReloadRom,
this.toolStripMenuItem16,
this.mnuSaveRomAs,
this.mnuSaveAsIps,
this.toolStripMenuItem14,
this.importExportToolStripMenuItem,
this.toolStripMenuItem7,
this.codeDataLoggerToolStripMenuItem,
this.toolStripMenuItem13,
this.mnuExit});
this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
this.fileToolStripMenuItem.Text = "File";
@ -230,10 +227,10 @@
// importExportToolStripMenuItem
//
this.importExportToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuDbgIntegrationSettings,
this.toolStripMenuItem15,
this.mnuImportLabels,
this.mnuExportLabels});
this.mnuDbgIntegrationSettings,
this.toolStripMenuItem15,
this.mnuImportLabels,
this.mnuExportLabels});
this.importExportToolStripMenuItem.Image = global::Mesen.GUI.Properties.Resources.Import;
this.importExportToolStripMenuItem.Name = "importExportToolStripMenuItem";
this.importExportToolStripMenuItem.Size = new System.Drawing.Size(201, 22);
@ -276,9 +273,9 @@
// codeDataLoggerToolStripMenuItem
//
this.codeDataLoggerToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuResetCdlLog,
this.toolStripSeparator1,
this.mnuCdlGenerateRom});
this.mnuResetCdlLog,
this.toolStripSeparator1,
this.mnuCdlGenerateRom});
this.codeDataLoggerToolStripMenuItem.Image = global::Mesen.GUI.Properties.Resources.VerifiedData;
this.codeDataLoggerToolStripMenuItem.Name = "codeDataLoggerToolStripMenuItem";
this.codeDataLoggerToolStripMenuItem.Size = new System.Drawing.Size(201, 22);
@ -300,8 +297,8 @@
// mnuCdlGenerateRom
//
this.mnuCdlGenerateRom.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuCdlStripUnusedData,
this.mnuCdlStripUsedData});
this.mnuCdlStripUnusedData,
this.mnuCdlStripUsedData});
this.mnuCdlGenerateRom.Image = global::Mesen.GUI.Properties.Resources.Copy;
this.mnuCdlGenerateRom.Name = "mnuCdlGenerateRom";
this.mnuCdlGenerateRom.Size = new System.Drawing.Size(197, 22);
@ -335,26 +332,26 @@
// debugToolStripMenuItem
//
this.debugToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuContinue,
this.mnuBreak,
this.toolStripMenuItem3,
this.mnuStepInto,
this.mnuStepOver,
this.mnuStepOut,
this.mnuStepBack,
this.toolStripMenuItem1,
this.mnuReset,
this.mnuPowerCycle,
this.toolStripMenuItem24,
this.mnuToggleBreakpoint,
this.mnuEnableDisableBreakpoint,
this.toolStripMenuItem2,
this.mnuRunPpuCycle,
this.mnuRunScanline,
this.mnuRunOneFrame,
this.toolStripMenuItem8,
this.mnuBreakIn,
this.mnuBreakOn});
this.mnuContinue,
this.mnuBreak,
this.toolStripMenuItem3,
this.mnuStepInto,
this.mnuStepOver,
this.mnuStepOut,
this.mnuStepBack,
this.toolStripMenuItem1,
this.mnuReset,
this.mnuPowerCycle,
this.toolStripMenuItem24,
this.mnuToggleBreakpoint,
this.mnuEnableDisableBreakpoint,
this.toolStripMenuItem2,
this.mnuRunPpuCycle,
this.mnuRunScanline,
this.mnuRunOneFrame,
this.toolStripMenuItem8,
this.mnuBreakIn,
this.mnuBreakOn});
this.debugToolStripMenuItem.Name = "debugToolStripMenuItem";
this.debugToolStripMenuItem.Size = new System.Drawing.Size(54, 20);
this.debugToolStripMenuItem.Text = "Debug";
@ -493,14 +490,14 @@
// searchToolStripMenuItem
//
this.searchToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuGoToAll,
this.toolStripMenuItem11,
this.mnuFind,
this.mnuFindNext,
this.mnuFindPrev,
this.toolStripMenuItem9,
this.mnuFindAllOccurrences,
this.mnuGoTo});
this.mnuGoToAll,
this.toolStripMenuItem11,
this.mnuFind,
this.mnuFindNext,
this.mnuFindPrev,
this.toolStripMenuItem9,
this.mnuFindAllOccurrences,
this.mnuGoTo});
this.searchToolStripMenuItem.Name = "searchToolStripMenuItem";
this.searchToolStripMenuItem.Size = new System.Drawing.Size(54, 20);
this.searchToolStripMenuItem.Text = "Search";
@ -554,15 +551,15 @@
// mnuGoTo
//
this.mnuGoTo.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuGoToAddress,
this.toolStripMenuItem23,
this.mnuGoToProgramCounter,
this.toolStripMenuItem22,
this.mnuGoToResetHandler,
this.mnuGoToIrqHandler,
this.mnuGoToNmiHandler,
this.mnuGoToBrkHandler,
this.mnuGoToCopHandler});
this.mnuGoToAddress,
this.toolStripMenuItem23,
this.mnuGoToProgramCounter,
this.toolStripMenuItem22,
this.mnuGoToResetHandler,
this.mnuGoToIrqHandler,
this.mnuGoToNmiHandler,
this.mnuGoToBrkHandler,
this.mnuGoToCopHandler});
this.mnuGoTo.Name = "mnuGoTo";
this.mnuGoTo.Size = new System.Drawing.Size(183, 22);
this.mnuGoTo.Text = "Go To...";
@ -624,13 +621,13 @@
// optionsToolStripMenuItem
//
this.optionsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuDisassemblyOptions,
this.mnuBreakOptions,
this.toolStripMenuItem5,
this.mnuFontOptions,
this.toolStripMenuItem4,
this.mnuConfigureColors,
this.mnuPreferences});
this.mnuDisassemblyOptions,
this.mnuBreakOptions,
this.toolStripMenuItem5,
this.mnuFontOptions,
this.toolStripMenuItem4,
this.mnuConfigureColors,
this.mnuPreferences});
this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem";
this.optionsToolStripMenuItem.Size = new System.Drawing.Size(61, 20);
this.optionsToolStripMenuItem.Text = "Options";
@ -638,12 +635,12 @@
// mnuDisassemblyOptions
//
this.mnuDisassemblyOptions.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuUnidentifiedData,
this.mnuVerifiedData,
this.toolStripMenuItem6,
this.mnuShowByteCode,
this.mnuUseLowerCaseDisassembly,
this.mnuUseAltSpcOpNames});
this.mnuUnidentifiedData,
this.mnuVerifiedData,
this.toolStripMenuItem6,
this.mnuShowByteCode,
this.mnuUseLowerCaseDisassembly,
this.mnuUseAltSpcOpNames});
this.mnuDisassemblyOptions.Name = "mnuDisassemblyOptions";
this.mnuDisassemblyOptions.Size = new System.Drawing.Size(209, 22);
this.mnuDisassemblyOptions.Text = "Disassembly Options";
@ -651,9 +648,9 @@
// mnuUnidentifiedData
//
this.mnuUnidentifiedData.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuHideUnident,
this.mnuDisassembleUnident,
this.mnuShowUnident});
this.mnuHideUnident,
this.mnuDisassembleUnident,
this.mnuShowUnident});
this.mnuUnidentifiedData.Image = global::Mesen.GUI.Properties.Resources.UnidentifiedData;
this.mnuUnidentifiedData.Name = "mnuUnidentifiedData";
this.mnuUnidentifiedData.Size = new System.Drawing.Size(217, 22);
@ -681,9 +678,9 @@
// mnuVerifiedData
//
this.mnuVerifiedData.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuHideData,
this.mnuDisassembleData,
this.mnuShowData});
this.mnuHideData,
this.mnuDisassembleData,
this.mnuShowData});
this.mnuVerifiedData.Image = global::Mesen.GUI.Properties.Resources.VerifiedData;
this.mnuVerifiedData.Name = "mnuVerifiedData";
this.mnuVerifiedData.Size = new System.Drawing.Size(217, 22);
@ -737,18 +734,18 @@
// mnuBreakOptions
//
this.mnuBreakOptions.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuBreakOnPowerCycleReset,
this.mnuBreakOnOpen,
this.toolStripMenuItem12,
this.mnuBreakOnBrk,
this.mnuBreakOnCop,
this.mnuBreakOnStp,
this.mnuBreakOnWdm,
this.sepBreakOnUnitRead,
this.mnuBreakOnUnitRead,
this.toolStripMenuItem10,
this.mnuBringToFrontOnBreak,
this.mnuBringToFrontOnPause});
this.mnuBreakOnPowerCycleReset,
this.mnuBreakOnOpen,
this.sepBrkCopStpWdm,
this.mnuBreakOnBrk,
this.mnuBreakOnCop,
this.mnuBreakOnStp,
this.mnuBreakOnWdm,
this.sepBreakOnUnitRead,
this.mnuBreakOnUnitRead,
this.toolStripMenuItem10,
this.mnuBringToFrontOnBreak,
this.mnuBringToFrontOnPause});
this.mnuBreakOptions.Name = "mnuBreakOptions";
this.mnuBreakOptions.Size = new System.Drawing.Size(209, 22);
this.mnuBreakOptions.Text = "Break Options";
@ -766,10 +763,10 @@
this.mnuBreakOnOpen.Size = new System.Drawing.Size(261, 22);
this.mnuBreakOnOpen.Text = "Break when debugger is opened";
//
// toolStripMenuItem12
// sepBrkCopStpWdm
//
this.toolStripMenuItem12.Name = "toolStripMenuItem12";
this.toolStripMenuItem12.Size = new System.Drawing.Size(258, 6);
this.sepBrkCopStpWdm.Name = "sepBrkCopStpWdm";
this.sepBrkCopStpWdm.Size = new System.Drawing.Size(258, 6);
//
// mnuBreakOnBrk
//
@ -832,11 +829,11 @@
// mnuFontOptions
//
this.mnuFontOptions.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuIncreaseFontSize,
this.mnuDecreaseFontSize,
this.mnuResetFontSize,
this.toolStripMenuItem21,
this.mnuSelectFont});
this.mnuIncreaseFontSize,
this.mnuDecreaseFontSize,
this.mnuResetFontSize,
this.toolStripMenuItem21,
this.mnuSelectFont});
this.mnuFontOptions.Image = global::Mesen.GUI.Properties.Resources.Font;
this.mnuFontOptions.Name = "mnuFontOptions";
this.mnuFontOptions.Size = new System.Drawing.Size(209, 22);
@ -908,7 +905,7 @@
// ctrlSplitContainer.Panel1
//
this.ctrlSplitContainer.Panel1.Controls.Add(this.ctrlDisassemblyView);
this.ctrlSplitContainer.Panel1.Controls.Add(this.panel1);
this.ctrlSplitContainer.Panel1.Controls.Add(this.pnlStatus);
this.ctrlSplitContainer.Panel1MinSize = 275;
//
// ctrlSplitContainer.Panel2
@ -921,16 +918,13 @@
//
// panel1
//
this.panel1.Controls.Add(this.ctrlLabelList);
this.panel1.Controls.Add(this.ctrlPpuStatus);
this.panel1.Controls.Add(this.ctrlGsuStatus);
this.panel1.Controls.Add(this.ctrlSpcStatus);
this.panel1.Controls.Add(this.ctrlCpuStatus);
this.panel1.Dock = System.Windows.Forms.DockStyle.Right;
this.panel1.Location = new System.Drawing.Point(484, 0);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(348, 433);
this.panel1.TabIndex = 2;
this.pnlStatus.Controls.Add(this.ctrlLabelList);
this.pnlStatus.Controls.Add(this.ctrlPpuStatus);
this.pnlStatus.Dock = System.Windows.Forms.DockStyle.Right;
this.pnlStatus.Location = new System.Drawing.Point(484, 0);
this.pnlStatus.Name = "pnlStatus";
this.pnlStatus.Size = new System.Drawing.Size(348, 433);
this.pnlStatus.TabIndex = 2;
//
// ctrlLabelList
//
@ -951,33 +945,6 @@
this.ctrlPpuStatus.Size = new System.Drawing.Size(348, 47);
this.ctrlPpuStatus.TabIndex = 3;
//
// ctrlGsuStatus
//
this.ctrlGsuStatus.Dock = System.Windows.Forms.DockStyle.Top;
this.ctrlGsuStatus.Location = new System.Drawing.Point(0, 268);
this.ctrlGsuStatus.Name = "ctrlGsuStatus";
this.ctrlGsuStatus.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
this.ctrlGsuStatus.Size = new System.Drawing.Size(348, 236);
this.ctrlGsuStatus.TabIndex = 5;
//
// ctrlSpcStatus
//
this.ctrlSpcStatus.Dock = System.Windows.Forms.DockStyle.Top;
this.ctrlSpcStatus.Location = new System.Drawing.Point(0, 148);
this.ctrlSpcStatus.Name = "ctrlSpcStatus";
this.ctrlSpcStatus.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
this.ctrlSpcStatus.Size = new System.Drawing.Size(348, 120);
this.ctrlSpcStatus.TabIndex = 2;
//
// ctrlCpuStatus
//
this.ctrlCpuStatus.Dock = System.Windows.Forms.DockStyle.Top;
this.ctrlCpuStatus.Location = new System.Drawing.Point(0, 0);
this.ctrlCpuStatus.Name = "ctrlCpuStatus";
this.ctrlCpuStatus.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0);
this.ctrlCpuStatus.Size = new System.Drawing.Size(348, 148);
this.ctrlCpuStatus.TabIndex = 1;
//
// tlpBottomPanel
//
this.tlpBottomPanel.ColumnCount = 3;
@ -1095,7 +1062,7 @@
this.ctrlSplitContainer.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.ctrlSplitContainer)).EndInit();
this.ctrlSplitContainer.ResumeLayout(false);
this.panel1.ResumeLayout(false);
this.pnlStatus.ResumeLayout(false);
this.tlpBottomPanel.ResumeLayout(false);
this.grpWatch.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.picWatchHelp)).EndInit();
@ -1137,7 +1104,6 @@
private System.Windows.Forms.GroupBox grpWatch;
private System.Windows.Forms.GroupBox grpBreakpoints;
private Controls.ctrlBreakpoints ctrlBreakpoints;
private Controls.ctrlCpuStatus ctrlCpuStatus;
private GUI.Controls.ctrlMesenToolStrip tsToolbar;
private System.Windows.Forms.GroupBox grpCallstack;
private Controls.ctrlCallstack ctrlCallstack;
@ -1168,9 +1134,8 @@
private System.Windows.Forms.ToolStripMenuItem mnuSelectFont;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem4;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem5;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Panel pnlStatus;
private Controls.ctrlPpuStatus ctrlPpuStatus;
private Controls.ctrlSpcStatus ctrlSpcStatus;
private Controls.ctrlLabelList ctrlLabelList;
private System.Windows.Forms.ToolStripMenuItem mnuDisassemblyOptions;
private System.Windows.Forms.ToolStripMenuItem mnuUnidentifiedData;
@ -1194,7 +1159,7 @@
private System.Windows.Forms.ToolStripMenuItem mnuBringToFrontOnBreak;
private System.Windows.Forms.ToolStripMenuItem mnuBringToFrontOnPause;
private System.Windows.Forms.ToolStripMenuItem mnuBreakOnPowerCycleReset;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem12;
private System.Windows.Forms.ToolStripSeparator sepBrkCopStpWdm;
private System.Windows.Forms.ToolStripMenuItem mnuBreakOnStp;
private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem importExportToolStripMenuItem;
@ -1204,23 +1169,22 @@
private System.Windows.Forms.ToolStripMenuItem mnuResetCdlLog;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem13;
private System.Windows.Forms.ToolStripMenuItem mnuExit;
private Controls.ctrlGsuStatus ctrlGsuStatus;
private System.Windows.Forms.ToolStripMenuItem mnuUseAltSpcOpNames;
private System.Windows.Forms.ToolStripMenuItem mnuUseLowerCaseDisassembly;
private System.Windows.Forms.ToolStripMenuItem mnuGoToAll;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem11;
private System.Windows.Forms.ToolStripMenuItem mnuConfigureColors;
private System.Windows.Forms.ToolStripMenuItem mnuSaveRomAs;
private System.Windows.Forms.ToolStripMenuItem mnuSaveAsIps;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem14;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
private System.Windows.Forms.ToolStripMenuItem mnuCdlGenerateRom;
private System.Windows.Forms.ToolStripMenuItem mnuCdlStripUnusedData;
private System.Windows.Forms.ToolStripMenuItem mnuCdlStripUsedData;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem15;
private System.Windows.Forms.ToolStripMenuItem mnuImportLabels;
private System.Windows.Forms.ToolStripMenuItem mnuExportLabels;
private System.Windows.Forms.ToolStripMenuItem mnuReloadRom;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem16;
}
private System.Windows.Forms.ToolStripMenuItem mnuUseAltSpcOpNames;
private System.Windows.Forms.ToolStripMenuItem mnuUseLowerCaseDisassembly;
private System.Windows.Forms.ToolStripMenuItem mnuGoToAll;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem11;
private System.Windows.Forms.ToolStripMenuItem mnuConfigureColors;
private System.Windows.Forms.ToolStripMenuItem mnuSaveRomAs;
private System.Windows.Forms.ToolStripMenuItem mnuSaveAsIps;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem14;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
private System.Windows.Forms.ToolStripMenuItem mnuCdlGenerateRom;
private System.Windows.Forms.ToolStripMenuItem mnuCdlStripUnusedData;
private System.Windows.Forms.ToolStripMenuItem mnuCdlStripUsedData;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem15;
private System.Windows.Forms.ToolStripMenuItem mnuImportLabels;
private System.Windows.Forms.ToolStripMenuItem mnuExportLabels;
private System.Windows.Forms.ToolStripMenuItem mnuReloadRom;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem16;
}
}

View file

@ -22,6 +22,11 @@ namespace Mesen.GUI.Debugger
private bool _firstBreak = true;
private int _destAddress = -1;
private ctrlCpuStatus ctrlCpuStatus;
private ctrlSpcStatus ctrlSpcStatus;
private ctrlGsuStatus ctrlGsuStatus;
private ctrlNecDspStatus ctrlNecDspStatus;
public CpuType CpuType { get { return _cpuType; } }
public frmDebugger(CpuType cpuType)
@ -49,6 +54,11 @@ namespace Mesen.GUI.Debugger
ctrlDisassemblyView.Initialize(new CpuDisassemblyManager(), new CpuLineStyleProvider());
ConfigApi.SetDebuggerFlag(DebuggerFlags.CpuDebuggerEnabled, true);
this.Text = "CPU Debugger";
this.ctrlCpuStatus = new ctrlCpuStatus();
this.ctrlCpuStatus.Padding = new Padding(3, 0, 3, 0);
this.ctrlCpuStatus.Dock = DockStyle.Top;
pnlStatus.Controls.Add(this.ctrlCpuStatus);
break;
case CpuType.Spc:
@ -60,12 +70,22 @@ namespace Mesen.GUI.Debugger
sepBreakOnUnitRead.Visible = false;
mnuUseAltSpcOpNames.Visible = true;
this.Text = "SPC Debugger";
this.ctrlSpcStatus = new ctrlSpcStatus();
this.ctrlSpcStatus.Padding = new Padding(3, 0, 3, 0);
this.ctrlSpcStatus.Dock = DockStyle.Top;
pnlStatus.Controls.Add(this.ctrlSpcStatus);
break;
case CpuType.Sa1:
ctrlDisassemblyView.Initialize(new Sa1DisassemblyManager(), new Sa1LineStyleProvider());
ConfigApi.SetDebuggerFlag(DebuggerFlags.Sa1DebuggerEnabled, true);
this.Text = "SA-1 Debugger";
this.ctrlCpuStatus = new ctrlCpuStatus();
this.ctrlCpuStatus.Padding = new Padding(3, 0, 3, 0);
this.ctrlCpuStatus.Dock = DockStyle.Top;
pnlStatus.Controls.Add(this.ctrlCpuStatus);
break;
case CpuType.Gsu:
@ -77,13 +97,43 @@ namespace Mesen.GUI.Debugger
mnuStepOut.Visible = false;
mnuStepInto.Text = "Step";
tlpBottomPanel.ColumnCount = 2;
sepBrkCopStpWdm.Visible = false;
mnuBreakOnWdm.Visible = false;
mnuBreakOnCop.Visible = false;
mnuBreakOnStp.Visible = false;
mnuBreakOnBrk.Visible = false;
sepBreakOnUnitRead.Visible = false;
mnuBreakOnUnitRead.Visible = false;
this.ctrlGsuStatus = new ctrlGsuStatus();
this.ctrlGsuStatus.Padding = new Padding(3, 0, 3, 0);
this.ctrlGsuStatus.Dock = DockStyle.Top;
pnlStatus.Controls.Add(this.ctrlGsuStatus);
break;
case CpuType.NecDsp:
ctrlDisassemblyView.Initialize(new NecDspDisassemblyManager(), new NecDspLineStyleProvider());
ConfigApi.SetDebuggerFlag(DebuggerFlags.NecDspDebuggerEnabled, true);
this.Text = "DSP Debugger";
ctrlCallstack.Visible = false;
mnuStepOver.Visible = false;
mnuStepOut.Visible = false;
mnuStepInto.Text = "Step";
tlpBottomPanel.ColumnCount = 2;
sepBrkCopStpWdm.Visible = false;
mnuBreakOnWdm.Visible = false;
mnuBreakOnCop.Visible = false;
mnuBreakOnStp.Visible = false;
mnuBreakOnBrk.Visible = false;
sepBreakOnUnitRead.Visible = false;
mnuBreakOnUnitRead.Visible = false;
this.ctrlNecDspStatus = new ctrlNecDspStatus();
this.ctrlNecDspStatus.Padding = new Padding(3, 0, 3, 0);
this.ctrlNecDspStatus.Dock = DockStyle.Top;
pnlStatus.Controls.Add(this.ctrlNecDspStatus);
break;
}
@ -119,6 +169,7 @@ namespace Mesen.GUI.Debugger
case CpuType.Spc: ConfigApi.SetDebuggerFlag(DebuggerFlags.SpcDebuggerEnabled, false); break;
case CpuType.Sa1: ConfigApi.SetDebuggerFlag(DebuggerFlags.Sa1DebuggerEnabled, false); break;
case CpuType.Gsu: ConfigApi.SetDebuggerFlag(DebuggerFlags.GsuDebuggerEnabled, false); break;
case CpuType.NecDsp: ConfigApi.SetDebuggerFlag(DebuggerFlags.NecDspDebuggerEnabled, false); break;
}
BreakpointManager.RemoveCpuType(_cpuType);
@ -280,7 +331,7 @@ namespace Mesen.GUI.Debugger
{
tsToolbar.AddItemsToToolbar(mnuContinue, mnuBreak, null);
if(_cpuType != CpuType.Gsu) {
if(_cpuType != CpuType.Gsu && _cpuType != CpuType.NecDsp) {
tsToolbar.AddItemsToToolbar(mnuStepInto, mnuStepOver, mnuStepOut, null);
} else {
tsToolbar.AddItemsToToolbar(mnuStepInto, null);
@ -371,24 +422,13 @@ namespace Mesen.GUI.Debugger
private void UpdateDebugger(DebugState state, int? activeAddress)
{
if(_cpuType == CpuType.Cpu) {
ctrlCpuStatus.UpdateStatus(state.Cpu);
} else if(_cpuType == CpuType.Sa1) {
ctrlCpuStatus.UpdateStatus(state.Sa1);
} else {
ctrlCpuStatus.Visible = false;
}
if(_cpuType == CpuType.Spc) {
ctrlSpcStatus.UpdateStatus(state);
} else {
ctrlSpcStatus.Visible = false;
}
if(_cpuType == CpuType.Gsu) {
ctrlGsuStatus.UpdateStatus(state.Gsu);
} else {
ctrlGsuStatus.Visible = false;
switch(_cpuType) {
case CpuType.Cpu: ctrlCpuStatus.UpdateStatus(state.Cpu); break;
case CpuType.Spc: ctrlSpcStatus.UpdateStatus(state.Spc); break;
case CpuType.NecDsp: ctrlNecDspStatus.UpdateStatus(state.NecDsp); break;
case CpuType.Sa1: ctrlCpuStatus.UpdateStatus(state.Sa1); break;
case CpuType.Gsu: ctrlGsuStatus.UpdateStatus(state.Gsu); break;
default: throw new Exception("Unsupported CPU type");
}
ctrlPpuStatus.UpdateStatus(state);
@ -396,7 +436,7 @@ namespace Mesen.GUI.Debugger
ctrlDisassemblyView.SetActiveAddress(activeAddress);
ctrlWatch.UpdateWatch(true);
if(_cpuType != CpuType.Gsu) {
if(_cpuType != CpuType.Gsu && _cpuType != CpuType.NecDsp) {
ctrlCallstack.UpdateCallstack(_cpuType);
}
}
@ -444,6 +484,10 @@ namespace Mesen.GUI.Debugger
DebugState state = DebugApi.GetState();
this.BeginInvoke((MethodInvoker)(() => {
//Refresh workspace here as well as frmMain to ensure workspace
//is up-to-date no matter which form is notified first.
DebugWorkspaceManager.GetWorkspace();
bool isPowerCycle = e.Parameter.ToInt32() != 0;
if(!isPowerCycle) {
DebugWorkspaceManager.ImportDbgFile();
@ -474,6 +518,7 @@ namespace Mesen.GUI.Debugger
switch(_cpuType) {
case CpuType.Cpu: activeAddress = (int)((state.Cpu.K << 16) | state.Cpu.PC); break;
case CpuType.Spc: activeAddress = (int)state.Spc.PC; break;
case CpuType.NecDsp: activeAddress = (int)(state.NecDsp.PC * 3); break;
case CpuType.Sa1: activeAddress = (int)((state.Sa1.K << 16) | state.Sa1.PC); break;
case CpuType.Gsu: activeAddress = (int)((state.Gsu.ProgramBank << 16) | state.Gsu.R[15]); break;
default: throw new Exception("Unsupported cpu type");

View file

@ -31,6 +31,7 @@
this.mnuMain = new Mesen.GUI.Controls.ctrlMesenMenuStrip();
this.mnuFile = new System.Windows.Forms.ToolStripMenuItem();
this.mnuOpen = new System.Windows.Forms.ToolStripMenuItem();
this.mnuReloadRom = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator();
this.mnuSaveState = new System.Windows.Forms.ToolStripMenuItem();
this.mnuLoadState = new System.Windows.Forms.ToolStripMenuItem();
@ -166,6 +167,7 @@
this.mnuSpcDebugger = new System.Windows.Forms.ToolStripMenuItem();
this.mnuSa1Debugger = new System.Windows.Forms.ToolStripMenuItem();
this.mnuGsuDebugger = new System.Windows.Forms.ToolStripMenuItem();
this.mnuNecDspDebugger = new System.Windows.Forms.ToolStripMenuItem();
this.mnuHelp = new System.Windows.Forms.ToolStripMenuItem();
this.mnuCheckForUpdates = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem20 = new System.Windows.Forms.ToolStripSeparator();
@ -174,7 +176,6 @@
this.mnuAbout = new System.Windows.Forms.ToolStripMenuItem();
this.pnlRenderer = new System.Windows.Forms.Panel();
this.ctrlRecentGames = new Mesen.GUI.Controls.ctrlRecentGames();
this.mnuReloadRom = new System.Windows.Forms.ToolStripMenuItem();
this.mnuMain.SuspendLayout();
this.pnlRenderer.SuspendLayout();
this.SuspendLayout();
@ -224,49 +225,56 @@
//
this.mnuOpen.Image = global::Mesen.GUI.Properties.Resources.Folder;
this.mnuOpen.Name = "mnuOpen";
this.mnuOpen.Size = new System.Drawing.Size(180, 22);
this.mnuOpen.Size = new System.Drawing.Size(140, 22);
this.mnuOpen.Text = "Open";
//
// mnuReloadRom
//
this.mnuReloadRom.Image = global::Mesen.GUI.Properties.Resources.Refresh;
this.mnuReloadRom.Name = "mnuReloadRom";
this.mnuReloadRom.Size = new System.Drawing.Size(140, 22);
this.mnuReloadRom.Text = "Reload ROM";
//
// toolStripMenuItem2
//
this.toolStripMenuItem2.Name = "toolStripMenuItem2";
this.toolStripMenuItem2.Size = new System.Drawing.Size(177, 6);
this.toolStripMenuItem2.Size = new System.Drawing.Size(137, 6);
//
// mnuSaveState
//
this.mnuSaveState.Name = "mnuSaveState";
this.mnuSaveState.Size = new System.Drawing.Size(180, 22);
this.mnuSaveState.Size = new System.Drawing.Size(140, 22);
this.mnuSaveState.Text = "Save State";
this.mnuSaveState.DropDownOpening += new System.EventHandler(this.mnuSaveState_DropDownOpening);
//
// mnuLoadState
//
this.mnuLoadState.Name = "mnuLoadState";
this.mnuLoadState.Size = new System.Drawing.Size(180, 22);
this.mnuLoadState.Size = new System.Drawing.Size(140, 22);
this.mnuLoadState.Text = "Load State";
this.mnuLoadState.DropDownOpening += new System.EventHandler(this.mnuLoadState_DropDownOpening);
//
// toolStripMenuItem10
//
this.toolStripMenuItem10.Name = "toolStripMenuItem10";
this.toolStripMenuItem10.Size = new System.Drawing.Size(177, 6);
this.toolStripMenuItem10.Size = new System.Drawing.Size(137, 6);
//
// mnuRecentFiles
//
this.mnuRecentFiles.Name = "mnuRecentFiles";
this.mnuRecentFiles.Size = new System.Drawing.Size(180, 22);
this.mnuRecentFiles.Size = new System.Drawing.Size(140, 22);
this.mnuRecentFiles.Text = "Recent Files";
//
// toolStripMenuItem6
//
this.toolStripMenuItem6.Name = "toolStripMenuItem6";
this.toolStripMenuItem6.Size = new System.Drawing.Size(177, 6);
this.toolStripMenuItem6.Size = new System.Drawing.Size(137, 6);
//
// mnuExit
//
this.mnuExit.Image = global::Mesen.GUI.Properties.Resources.Exit;
this.mnuExit.Name = "mnuExit";
this.mnuExit.Size = new System.Drawing.Size(180, 22);
this.mnuExit.Size = new System.Drawing.Size(140, 22);
this.mnuExit.Text = "Exit";
//
// mnuGame
@ -288,7 +296,7 @@
this.mnuPause.Enabled = false;
this.mnuPause.Image = global::Mesen.GUI.Properties.Resources.MediaPause;
this.mnuPause.Name = "mnuPause";
this.mnuPause.Size = new System.Drawing.Size(180, 22);
this.mnuPause.Size = new System.Drawing.Size(139, 22);
this.mnuPause.Text = "Pause";
//
// mnuReset
@ -296,7 +304,7 @@
this.mnuReset.Enabled = false;
this.mnuReset.Image = global::Mesen.GUI.Properties.Resources.Refresh;
this.mnuReset.Name = "mnuReset";
this.mnuReset.Size = new System.Drawing.Size(180, 22);
this.mnuReset.Size = new System.Drawing.Size(139, 22);
this.mnuReset.Text = "Reset";
//
// mnuPowerCycle
@ -304,19 +312,19 @@
this.mnuPowerCycle.Enabled = false;
this.mnuPowerCycle.Image = global::Mesen.GUI.Properties.Resources.PowerCycle;
this.mnuPowerCycle.Name = "mnuPowerCycle";
this.mnuPowerCycle.Size = new System.Drawing.Size(180, 22);
this.mnuPowerCycle.Size = new System.Drawing.Size(139, 22);
this.mnuPowerCycle.Text = "Power Cycle";
//
// toolStripMenuItem24
//
this.toolStripMenuItem24.Name = "toolStripMenuItem24";
this.toolStripMenuItem24.Size = new System.Drawing.Size(177, 6);
this.toolStripMenuItem24.Size = new System.Drawing.Size(136, 6);
//
// mnuPowerOff
//
this.mnuPowerOff.Image = global::Mesen.GUI.Properties.Resources.MediaStop;
this.mnuPowerOff.Name = "mnuPowerOff";
this.mnuPowerOff.Size = new System.Drawing.Size(180, 22);
this.mnuPowerOff.Size = new System.Drawing.Size(139, 22);
this.mnuPowerOff.Text = "Power Off";
//
// mnuOptions
@ -1100,7 +1108,8 @@
this.toolStripMenuItem22,
this.mnuSpcDebugger,
this.mnuSa1Debugger,
this.mnuGsuDebugger});
this.mnuGsuDebugger,
this.mnuNecDspDebugger});
this.mnuDebug.Name = "mnuDebug";
this.mnuDebug.Size = new System.Drawing.Size(54, 20);
this.mnuDebug.Text = "Debug";
@ -1227,6 +1236,13 @@
this.mnuGsuDebugger.Size = new System.Drawing.Size(183, 22);
this.mnuGsuDebugger.Text = "GSU Debugger";
//
// mnuNecDspDebugger
//
this.mnuNecDspDebugger.Image = global::Mesen.GUI.Properties.Resources.NecDspDebugger;
this.mnuNecDspDebugger.Name = "mnuNecDspDebugger";
this.mnuNecDspDebugger.Size = new System.Drawing.Size(183, 22);
this.mnuNecDspDebugger.Text = "DSP Debugger";
//
// mnuHelp
//
this.mnuHelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
@ -1295,13 +1311,6 @@
this.ctrlRecentGames.TabIndex = 1;
this.ctrlRecentGames.Visible = false;
//
// mnuReloadRom
//
this.mnuReloadRom.Image = global::Mesen.GUI.Properties.Resources.Refresh;
this.mnuReloadRom.Name = "mnuReloadRom";
this.mnuReloadRom.Size = new System.Drawing.Size(180, 22);
this.mnuReloadRom.Text = "Reload ROM";
//
// frmMain
//
this.AllowDrop = true;
@ -1475,5 +1484,6 @@
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem26;
private System.Windows.Forms.ToolStripMenuItem mnuAssembler;
private System.Windows.Forms.ToolStripMenuItem mnuReloadRom;
private System.Windows.Forms.ToolStripMenuItem mnuNecDspDebugger;
}
}

View file

@ -280,6 +280,7 @@ namespace Mesen.GUI.Forms
mnuSpcDebugger.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenSpcDebugger));
mnuSa1Debugger.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenSa1Debugger));
mnuGsuDebugger.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenGsuDebugger));
mnuNecDspDebugger.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenNecDspDebugger));
mnuMemoryTools.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenMemoryTools));
mnuEventViewer.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenEventViewer));
mnuTilemapViewer.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenTilemapViewer));
@ -342,6 +343,7 @@ namespace Mesen.GUI.Forms
mnuSpcDebugger.Click += (s, e) => { DebugWindowManager.OpenDebugWindow(DebugWindow.SpcDebugger); };
mnuSa1Debugger.Click += (s, e) => { DebugWindowManager.OpenDebugWindow(DebugWindow.Sa1Debugger); };
mnuGsuDebugger.Click += (s, e) => { DebugWindowManager.OpenDebugWindow(DebugWindow.GsuDebugger); };
mnuNecDspDebugger.Click += (s, e) => { DebugWindowManager.OpenDebugWindow(DebugWindow.NecDspDebugger); };
mnuTraceLogger.Click += (s, e) => { DebugWindowManager.OpenDebugWindow(DebugWindow.TraceLogger); };
mnuMemoryTools.Click += (s, e) => { DebugWindowManager.OpenDebugWindow(DebugWindow.MemoryTools); };
mnuTilemapViewer.Click += (s, e) => { DebugWindowManager.OpenDebugWindow(DebugWindow.TilemapViewer); };
@ -435,6 +437,19 @@ namespace Mesen.GUI.Forms
mnuGsuDebugger.Enabled = coprocessor == CoprocessorType.GSU;
mnuGsuDebugger.Visible = coprocessor == CoprocessorType.GSU;
bool isNecDsp = (
coprocessor == CoprocessorType.DSP1 ||
coprocessor == CoprocessorType.DSP1B ||
coprocessor == CoprocessorType.DSP2 ||
coprocessor == CoprocessorType.DSP3 ||
coprocessor == CoprocessorType.DSP4 ||
coprocessor == CoprocessorType.ST010 ||
coprocessor == CoprocessorType.ST011
);
mnuNecDspDebugger.Enabled = isNecDsp;
mnuNecDspDebugger.Visible = isNecDsp;
mnuTraceLogger.Enabled = running;
mnuScriptWindow.Enabled = running;
mnuMemoryTools.Enabled = running;

View file

@ -62,6 +62,7 @@ namespace Mesen.GUI
UseAltSpcOpNames = 0x1000,
UseLowerCaseDisassembly = 0x2000,
NecDspDebuggerEnabled = 0x08000000,
GsuDebuggerEnabled = 0x10000000,
Sa1DebuggerEnabled = 0x20000000,
SpcDebuggerEnabled = 0x40000000,

View file

@ -188,6 +188,7 @@ namespace Mesen.GUI
CpuMemory,
SpcMemory,
Sa1Memory,
NecDspMemory,
GsuMemory,
PrgRom,
WorkRam,
@ -504,7 +505,8 @@ namespace Mesen.GUI
Spc,
NecDsp,
Sa1,
Gsu
Gsu,
Cx4
}
public static class CpuTypeExtensions
@ -514,6 +516,7 @@ namespace Mesen.GUI
switch(cpuType) {
case CpuType.Cpu: return SnesMemoryType.CpuMemory;
case CpuType.Spc: return SnesMemoryType.SpcMemory;
case CpuType.NecDsp: return SnesMemoryType.NecDspMemory;
case CpuType.Sa1: return SnesMemoryType.Sa1Memory;
case CpuType.Gsu: return SnesMemoryType.GsuMemory;
@ -527,6 +530,7 @@ namespace Mesen.GUI
switch(cpuType) {
case CpuType.Cpu: return 6;
case CpuType.Spc: return 4;
case CpuType.NecDsp: return 4;
case CpuType.Sa1: return 6;
case CpuType.Gsu: return 6;

View file

@ -690,6 +690,16 @@ namespace Mesen.GUI.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap NecDspDebugger {
get {
object obj = ResourceManager.GetObject("NecDspDebugger", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>

View file

@ -463,4 +463,7 @@
<data name="CloseWhite" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\CloseWhite.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="NecDspDebugger" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\NecDspDebugger.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 691 B

View file

@ -259,6 +259,8 @@
<Compile Include="Debugger\Breakpoints\InteropBreakpoint.cs" />
<Compile Include="Debugger\Code\BaseStyleProvider.cs" />
<Compile Include="Debugger\Code\CodeHighlighting.cs" />
<Compile Include="Debugger\Code\NecDspLineStyleProvider.cs" />
<Compile Include="Debugger\Code\NecDspDisassemblyManager.cs" />
<Compile Include="Debugger\Code\Sa1LineStyleProvider.cs" />
<Compile Include="Debugger\Code\SymbolCodeDataProvider.cs" />
<Compile Include="Debugger\Code\Sa1DisassemblyManager.cs" />
@ -279,6 +281,12 @@
<Compile Include="Debugger\Config\RegisterViewerConfig.cs" />
<Compile Include="Debugger\Config\TileViewerConfig.cs" />
<Compile Include="Debugger\Config\TilemapViewerConfig.cs" />
<Compile Include="Debugger\Controls\ctrlNecDspStatus.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Debugger\Controls\ctrlNecDspStatus.Designer.cs">
<DependentUpon>ctrlNecDspStatus.cs</DependentUpon>
</Compile>
<Compile Include="Debugger\Controls\ctrlMemoryType.cs">
<SubType>Component</SubType>
</Compile>
@ -971,6 +979,7 @@
<Compile Include="Utilities\RandomGameHelper.cs" />
<Compile Include="Utilities\RomTestHelper.cs" />
<Compile Include="Utilities\XmlColor.cs" />
<None Include="Resources\NecDspDebugger.png" />
<None Include="Dependencies\Satellaview\BSX0120-0.bin">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
@ -1040,6 +1049,9 @@
<EmbeddedResource Include="Debugger\Controls\ctrlCallstack.resx">
<DependentUpon>ctrlCallstack.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Debugger\Controls\ctrlNecDspStatus.resx">
<DependentUpon>ctrlNecDspStatus.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Debugger\MemoryTools\ctrlMemoryAccessCounters.resx">
<DependentUpon>ctrlMemoryAccessCounters.cs</DependentUpon>
</EmbeddedResource>