Debugger: Added CX4 debugger

This commit is contained in:
Sour 2020-02-24 22:00:52 -05:00
parent f8594b23a7
commit dade91a189
39 changed files with 1489 additions and 48 deletions

View file

@ -840,13 +840,6 @@ void Console::ProcessWorkRamWrite(uint32_t addr, uint8_t value)
}
}
void Console::ProcessCx4Exec()
{
if(_debugger) {
_debugger->ProcessCx4Exec();
}
}
void Console::ProcessPpuCycle()
{
if(_debugger) {
@ -878,12 +871,14 @@ template void Console::ProcessMemoryRead<CpuType::Sa1>(uint32_t addr, uint8_t va
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::ProcessMemoryRead<CpuType::Cx4>(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::ProcessMemoryWrite<CpuType::Cx4>(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 ProcessCx4Exec();
void ProcessPpuCycle();
template<CpuType type> void ProcessInterrupt(uint32_t originalPc, uint32_t currentPc, bool forNmi);
void ProcessEvent(EventType type);

View file

@ -59,6 +59,7 @@
<ClInclude Include="CpuBwRamHandler.h" />
<ClInclude Include="CpuDebugger.h" />
<ClInclude Include="Cx4.h" />
<ClInclude Include="Cx4Debugger.h" />
<ClInclude Include="Cx4DisUtils.h" />
<ClInclude Include="Cx4Types.h" />
<ClInclude Include="DebugUtilities.h" />
@ -243,6 +244,7 @@
<ClCompile Include="CpuDisUtils.cpp" />
<ClCompile Include="Cx4.cpp" />
<ClCompile Include="Cx4.Instructions.cpp" />
<ClCompile Include="Cx4Debugger.cpp" />
<ClCompile Include="Cx4DisUtils.cpp" />
<ClCompile Include="Debugger.cpp" />
<ClCompile Include="DebugHud.cpp" />

View file

@ -518,6 +518,9 @@
<ClInclude Include="NecDspDebugger.h">
<Filter>Debugger\Debuggers</Filter>
</ClInclude>
<ClInclude Include="Cx4Debugger.h">
<Filter>Debugger\Debuggers</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="stdafx.cpp" />
@ -833,6 +836,9 @@
<ClCompile Include="NecDspDebugger.cpp">
<Filter>Debugger\Debuggers</Filter>
</ClCompile>
<ClCompile Include="Cx4Debugger.cpp">
<Filter>Debugger\Debuggers</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Filter Include="SNES">

View file

@ -87,8 +87,10 @@ void Cx4::Run()
Stop();
}
} else {
_console->ProcessCx4Exec();
uint16_t opCode = _prgRam[_state.Cache.Page][_state.PC++];
uint16_t opCode = _prgRam[_state.Cache.Page][_state.PC];
uint32_t addr = (_state.Cache.Address[_state.Cache.Page] + (_state.PC * 2)) & 0xFFFFFF;
_console->ProcessMemoryRead<CpuType::Cx4>(addr, (uint8_t)opCode, MemoryOperationType::ExecOpCode);
_state.PC++;
if(_state.PC == 0) {
//If execution reached the end of the page, start loading the next page
@ -257,7 +259,9 @@ uint8_t Cx4::ReadCx4(uint32_t addr)
{
IMemoryHandler* handler = _mappings.GetHandler(addr);
if(handler) {
return handler->Read(addr);
uint8_t value = handler->Read(addr);
_console->ProcessMemoryRead<CpuType::Cx4>(addr, value, MemoryOperationType::Read);
return value;
}
return 0;
}
@ -266,6 +270,7 @@ void Cx4::WriteCx4(uint32_t addr, uint8_t value)
{
IMemoryHandler* handler = _mappings.GetHandler(addr);
if(handler) {
_console->ProcessMemoryWrite<CpuType::Cx4>(addr, value, MemoryOperationType::Write);
handler->Write(addr, value);
}
}

103
Core/Cx4Debugger.cpp Normal file
View file

@ -0,0 +1,103 @@
#include "stdafx.h"
#include "NecDsp.h"
#include "Cx4Debugger.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"
#include "Cx4.h"
#include "MemoryMappings.h"
Cx4Debugger::Cx4Debugger(Debugger* debugger)
{
_debugger = debugger;
_traceLogger = debugger->GetTraceLogger().get();
_disassembler = debugger->GetDisassembler().get();
_cx4 = debugger->GetConsole()->GetCartridge()->GetCx4();
_settings = debugger->GetConsole()->GetSettings().get();
_breakpointManager.reset(new BreakpointManager(debugger, CpuType::Cx4));
_step.reset(new StepRequest());
}
void Cx4Debugger::Reset()
{
}
void Cx4Debugger::ProcessRead(uint32_t addr, uint8_t value, MemoryOperationType type)
{
AddressInfo addressInfo = _cx4->GetMemoryMappings()->GetAbsoluteAddress(addr);
MemoryOperationInfo operation { (uint32_t)addr, value, type };
if(type == MemoryOperationType::ExecOpCode) {
if(_traceLogger->IsCpuLogged(CpuType::Cx4) || _settings->CheckDebuggerFlag(DebuggerFlags::Cx4DebuggerEnabled)) {
_disassembler->BuildCache(addressInfo, 0, CpuType::Cx4);
if(_traceLogger->IsCpuLogged(CpuType::Cx4)) {
DebugState debugState;
_debugger->GetState(debugState, true);
DisassemblyInfo disInfo = _disassembler->GetDisassemblyInfo(addressInfo);
_traceLogger->Log(CpuType::Cx4, debugState, disInfo);
}
}
_prevProgramCounter = addr;
if(_step->StepCount > 0) {
_step->StepCount--;
}
}
_debugger->ProcessBreakConditions(_step->StepCount == 0, GetBreakpointManager(), operation, addressInfo);
}
void Cx4Debugger::ProcessWrite(uint32_t addr, uint8_t value, MemoryOperationType type)
{
AddressInfo addressInfo = _cx4->GetMemoryMappings()->GetAbsoluteAddress(addr);
MemoryOperationInfo operation { (uint32_t)addr, value, type };
_debugger->ProcessBreakConditions(_step->StepCount == 0, GetBreakpointManager(), operation, addressInfo);
}
void Cx4Debugger::Run()
{
_step.reset(new StepRequest());
}
void Cx4Debugger::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> Cx4Debugger::GetCallstackManager()
{
return nullptr;
}
BreakpointManager* Cx4Debugger::GetBreakpointManager()
{
return _breakpointManager.get();
}

40
Core/Cx4Debugger.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 Cx4;
class CallstackManager;
class MemoryAccessCounter;
class MemoryManager;
class BreakpointManager;
class EmuSettings;
class Cx4Debugger final : public IDebugger
{
Debugger* _debugger;
Disassembler* _disassembler;
TraceLogger* _traceLogger;
Cx4* _cx4;
EmuSettings* _settings;
unique_ptr<BreakpointManager> _breakpointManager;
unique_ptr<StepRequest> _step;
uint32_t _prevProgramCounter = 0;
public:
Cx4Debugger(Debugger* debugger);
void Reset();
void ProcessRead(uint32_t addr, uint8_t value, MemoryOperationType type);
void ProcessWrite(uint32_t addr, uint8_t value, MemoryOperationType type);
void Run();
void Step(int32_t stepCount, StepType type);
shared_ptr<CallstackManager> GetCallstackManager();
BreakpointManager* GetBreakpointManager();
};

View file

@ -33,6 +33,7 @@ enum class SnesMemoryType
Sa1Memory,
NecDspMemory,
GsuMemory,
Cx4Memory,
PrgRom,
WorkRam,
SaveRam,

View file

@ -13,8 +13,7 @@ public:
case CpuType::NecDsp: return SnesMemoryType::NecDspMemory;
case CpuType::Sa1: return SnesMemoryType::Sa1Memory;
case CpuType::Gsu: return SnesMemoryType::GsuMemory;
case CpuType::Cx4: break;
case CpuType::Cx4: return SnesMemoryType::Cx4Memory;
}
throw std::runtime_error("Invalid CPU type");
@ -41,6 +40,10 @@ public:
case SnesMemoryType::DspProgramRom:
return CpuType::NecDsp;
case SnesMemoryType::Cx4DataRam:
case SnesMemoryType::Cx4Memory:
return CpuType::Cx4;
default:
return CpuType::Cpu;
}
@ -50,7 +53,7 @@ public:
static constexpr SnesMemoryType GetLastCpuMemoryType()
{
return SnesMemoryType::GsuMemory;
return SnesMemoryType::Cx4Memory;
}
static bool IsPpuMemory(SnesMemoryType memType)

View file

@ -13,6 +13,7 @@
#include "SpcDebugger.h"
#include "GsuDebugger.h"
#include "NecDspDebugger.h"
#include "Cx4Debugger.h"
#include "BaseCartridge.h"
#include "MemoryManager.h"
#include "EmuSettings.h"
@ -60,6 +61,7 @@ Debugger::Debugger(shared_ptr<Console> console)
_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));
_watchExpEval[(int)CpuType::Cx4].reset(new ExpressionEvaluator(this, CpuType::Cx4));
_codeDataLogger.reset(new CodeDataLogger(_cart->DebugGetPrgRomSize(), _memoryManager.get()));
_memoryDumper.reset(new MemoryDumper(this));
@ -79,6 +81,8 @@ Debugger::Debugger(shared_ptr<Console> console)
_gsuDebugger.reset(new GsuDebugger(this));
} else if(_cart->GetDsp()) {
_necDspDebugger.reset(new NecDspDebugger(this));
} else if(_cart->GetCx4()) {
_cx4Debugger.reset(new Cx4Debugger(this));
}
_step.reset(new StepRequest());
@ -131,6 +135,7 @@ void Debugger::ProcessMemoryRead(uint32_t addr, uint8_t value, MemoryOperationTy
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;
case CpuType::Cx4: _cx4Debugger->ProcessRead(addr, value, opType); break;
}
}
@ -143,6 +148,7 @@ void Debugger::ProcessMemoryWrite(uint32_t addr, uint8_t value, MemoryOperationT
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;
case CpuType::Cx4: _cx4Debugger->ProcessWrite(addr, value, opType); break;
}
}
@ -208,24 +214,6 @@ void Debugger::ProcessPpuCycle()
}
}
void Debugger::ProcessCx4Exec()
{
if(_traceLogger->IsCpuLogged(CpuType::Cx4)) {
DebugState debugState;
GetState(debugState, true);
uint32_t addr = (debugState.Cx4.Cache.Address[debugState.Cx4.Cache.Page] + (debugState.Cx4.PC * 2)) & 0xFFFFFF;
AddressInfo addressInfo = _memoryManager->GetMemoryMappings()->GetAbsoluteAddress(addr);
if(addressInfo.Address >= 0) {
_disassembler->BuildCache(addressInfo, 0, CpuType::Cx4);
DisassemblyInfo disInfo = _disassembler->GetDisassemblyInfo(addressInfo);
_traceLogger->Log(CpuType::Cx4, debugState, disInfo);
}
}
}
void Debugger::SleepUntilResume(BreakSource source, MemoryOperationInfo *operation, int breakpointId)
{
if(_suspendRequestCount) {
@ -241,6 +229,8 @@ void Debugger::SleepUntilResume(BreakSource source, MemoryOperationInfo *operati
_disassembler->Disassemble(CpuType::Gsu);
} else if(_cart->GetDsp()) {
_disassembler->Disassemble(CpuType::NecDsp);
} else if(_cart->GetCx4()) {
_disassembler->Disassemble(CpuType::Cx4);
}
_executionStopped = true;
@ -334,6 +324,9 @@ void Debugger::Run()
if(_necDspDebugger) {
_necDspDebugger->Run();
}
if(_cx4Debugger) {
_cx4Debugger->Run();
}
_waitForBreakResume = false;
}
@ -352,8 +345,7 @@ void Debugger::Step(CpuType cpuType, int32_t stepCount, StepType type)
case CpuType::NecDsp: debugger = _necDspDebugger.get(); break;
case CpuType::Sa1: debugger = _sa1Debugger.get(); break;
case CpuType::Gsu: debugger = _gsuDebugger.get(); break;
case CpuType::Cx4:
throw std::runtime_error("Step(): Unsupported CPU type.");
case CpuType::Cx4: debugger = _cx4Debugger.get(); break;
}
debugger->Step(stepCount, type);
break;
@ -377,6 +369,9 @@ void Debugger::Step(CpuType cpuType, int32_t stepCount, StepType type)
if(_necDspDebugger && debugger != _necDspDebugger.get()) {
_necDspDebugger->Run();
}
if(_cx4Debugger && debugger != _cx4Debugger.get()) {
_cx4Debugger->Run();
}
_waitForBreakResume = false;
}
@ -453,6 +448,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::Cx4Memory) {
return _cart->GetCx4()->GetMemoryMappings()->GetAbsoluteAddress(relAddress.Address);
} else if(relAddress.Type == SnesMemoryType::NecDspMemory) {
return { relAddress.Address, SnesMemoryType::DspProgramRom };
}
@ -555,6 +552,9 @@ void Debugger::SetBreakpoints(Breakpoint breakpoints[], uint32_t length)
if(_necDspDebugger) {
_necDspDebugger->GetBreakpointManager()->SetBreakpoints(breakpoints, length);
}
if(_cx4Debugger) {
_cx4Debugger->GetBreakpointManager()->SetBreakpoints(breakpoints, length);
}
}
void Debugger::SaveRomToDisk(string filename, bool saveAsIps, CdlStripOption stripOption)
@ -657,12 +657,14 @@ template void Debugger::ProcessMemoryRead<CpuType::Sa1>(uint32_t addr, uint8_t v
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::ProcessMemoryRead<CpuType::Cx4>(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::ProcessMemoryWrite<CpuType::Cx4>(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

@ -31,6 +31,7 @@ class SpcDebugger;
class CpuDebugger;
class GsuDebugger;
class NecDspDebugger;
class Cx4Debugger;
class Breakpoint;
class Assembler;
@ -55,6 +56,7 @@ private:
unique_ptr<CpuDebugger> _sa1Debugger;
unique_ptr<GsuDebugger> _gsuDebugger;
unique_ptr<NecDspDebugger> _necDspDebugger;
unique_ptr<Cx4Debugger> _cx4Debugger;
shared_ptr<ScriptManager> _scriptManager;
shared_ptr<TraceLogger> _traceLogger;
@ -98,8 +100,6 @@ public:
void ProcessPpuWrite(uint16_t addr, uint8_t value, SnesMemoryType memoryType);
void ProcessPpuCycle();
void ProcessCx4Exec();
template<CpuType type>
void ProcessInterrupt(uint32_t originalPc, uint32_t currentPc, bool forNmi);

View file

@ -7,6 +7,7 @@
#include "NecDsp.h"
#include "Sa1.h"
#include "Gsu.h"
#include "Cx4.h"
#include "BsxCart.h"
#include "BsxMemoryPack.h"
#include "Debugger.h"
@ -114,7 +115,7 @@ vector<DisassemblyResult>& Disassembler::GetDisassemblyList(CpuType type)
case CpuType::NecDsp: return _necDspDisassembly;
case CpuType::Sa1: return _sa1Disassembly;
case CpuType::Gsu: return _gsuDisassembly;
case CpuType::Cx4: break;
case CpuType::Cx4: return _cx4Disassembly;
}
throw std::runtime_error("Disassembly::GetDisassemblyList(): Invalid cpu type");
}
@ -158,10 +159,11 @@ uint32_t Disassembler::BuildCache(AddressInfo &addrInfo, uint8_t cpuFlags, CpuTy
void Disassembler::SetDisassembleFlag(CpuType type)
{
if(type == CpuType::Cpu || type == CpuType::Sa1 || type == CpuType::Gsu) {
if(type == CpuType::Cpu || type == CpuType::Sa1 || type == CpuType::Gsu || type == CpuType::Cx4) {
_needDisassemble[(int)CpuType::Cpu] = true;
_needDisassemble[(int)CpuType::Sa1] = true;
_needDisassemble[(int)CpuType::Gsu] = true;
_needDisassemble[(int)CpuType::Cx4] = true;
} else {
_needDisassemble[(int)type] = true;
}
@ -173,6 +175,7 @@ void Disassembler::ResetPrgCache()
_needDisassemble[(int)CpuType::Cpu] = true;
_needDisassemble[(int)CpuType::Sa1] = true;
_needDisassemble[(int)CpuType::Gsu] = true;
_needDisassemble[(int)CpuType::Cx4] = true;
}
void Disassembler::InvalidateCache(AddressInfo addrInfo, CpuType type)
@ -242,6 +245,13 @@ void Disassembler::Disassemble(CpuType cpuType)
maxAddr = 0xFFFF;
break;
case CpuType::Cx4:
if(!_console->GetCartridge()->GetCx4()) {
return;
}
mappings = _console->GetCartridge()->GetCx4()->GetMemoryMappings();
break;
default: throw std::runtime_error("Disassemble(): Invalid cpu type");
}
@ -562,8 +572,9 @@ bool Disassembler::GetLineData(CpuType type, uint32_t lineIndex, CodeLineData &d
}
case CpuType::NecDsp:
case CpuType::Cx4:
if(!disInfo.IsInitialized()) {
disInfo = DisassemblyInfo(src.Data + result.Address.Address, 0, CpuType::NecDsp);
disInfo = DisassemblyInfo(src.Data + result.Address.Address, 0, lineCpuType);
} else {
data.Flags |= LineFlags::VerifiedCode;
}
@ -572,9 +583,6 @@ bool Disassembler::GetLineData(CpuType type, uint32_t lineIndex, CodeLineData &d
data.EffectiveAddress = -1;
data.ValueSize = 0;
break;
case CpuType::Cx4:
throw std::runtime_error("GetLineData - CPU type not supported");
}
string text;

View file

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

View file

@ -7,6 +7,7 @@
#include "Spc.h"
#include "Sa1.h"
#include "Gsu.h"
#include "Cx4.h"
#include "BaseCartridge.h"
MemoryAccessCounter::MemoryAccessCounter(Debugger* debugger, Console *console)
@ -16,6 +17,7 @@ MemoryAccessCounter::MemoryAccessCounter(Debugger* debugger, Console *console)
_spc = console->GetSpc().get();
_sa1 = console->GetCartridge()->GetSa1();
_gsu = console->GetCartridge()->GetGsu();
_cx4 = console->GetCartridge()->GetCx4();
for(int i = (int)SnesMemoryType::PrgRom; i < (int)SnesMemoryType::Register; i++) {
uint32_t memSize = _debugger->GetMemoryDumper()->GetMemorySize((SnesMemoryType)i);
@ -122,6 +124,15 @@ void MemoryAccessCounter::GetAccessCounts(uint32_t offset, uint32_t length, Snes
}
break;
case SnesMemoryType::Cx4Memory:
for(uint32_t i = 0; i < length; i++) {
AddressInfo info = _cx4->GetMemoryMappings()->GetAbsoluteAddress(offset + i);
if(info.Address >= 0) {
counts[i] = _counters[(int)info.Type][info.Address];
}
}
break;
default:
memcpy(counts, _counters[(int)memoryType].data() + offset, length * sizeof(AddressCounters));
break;

View file

@ -8,6 +8,7 @@ class Spc;
class Console;
class Sa1;
class Gsu;
class Cx4;
struct AddressCounters
{
@ -33,6 +34,7 @@ private:
Spc* _spc;
Sa1* _sa1;
Gsu* _gsu;
Cx4* _cx4;
bool IsAddressUninitialized(AddressInfo &addressInfo);

View file

@ -39,6 +39,7 @@ void MemoryDumper::SetMemoryState(SnesMemoryType type, uint8_t *buffer, uint32_t
case SnesMemoryType::SpcMemory:
case SnesMemoryType::Sa1Memory:
case SnesMemoryType::GsuMemory:
case SnesMemoryType::Cx4Memory:
break;
case SnesMemoryType::PrgRom: memcpy(_cartridge->DebugGetPrgRom(), buffer, length); break;
@ -70,6 +71,7 @@ uint32_t MemoryDumper::GetMemorySize(SnesMemoryType type)
case SnesMemoryType::SpcMemory: return 0x10000;
case SnesMemoryType::Sa1Memory: return 0x1000000;
case SnesMemoryType::GsuMemory: return 0x1000000;
case SnesMemoryType::Cx4Memory: return 0x1000000;
case SnesMemoryType::PrgRom: return _cartridge->DebugGetPrgRomSize();
case SnesMemoryType::WorkRam: return MemoryManager::WorkRamSize;
case SnesMemoryType::SaveRam: return _cartridge->DebugGetSaveRamSize();
@ -121,6 +123,12 @@ void MemoryDumper::GetMemoryState(SnesMemoryType type, uint8_t *buffer)
}
break;
case SnesMemoryType::Cx4Memory:
for(int i = 0; i <= 0xFFFFFF; i += 0x1000) {
_cartridge->GetCx4()->GetMemoryMappings()->PeekBlock(i, buffer + i);
}
break;
case SnesMemoryType::PrgRom: memcpy(buffer, _cartridge->DebugGetPrgRom(), _cartridge->DebugGetPrgRomSize()); break;
case SnesMemoryType::WorkRam: memcpy(buffer, _memoryManager->DebugGetWorkRam(), MemoryManager::WorkRamSize); break;
case SnesMemoryType::SaveRam: memcpy(buffer, _cartridge->DebugGetSaveRam(), _cartridge->DebugGetSaveRamSize()); break;
@ -177,6 +185,7 @@ void MemoryDumper::SetMemoryValue(SnesMemoryType memoryType, uint32_t address, u
case SnesMemoryType::SpcMemory: _spc->DebugWrite(address, value); break;
case SnesMemoryType::Sa1Memory: _cartridge->GetSa1()->GetMemoryMappings()->DebugWrite(address, value); break;
case SnesMemoryType::GsuMemory: _cartridge->GetGsu()->GetMemoryMappings()->DebugWrite(address, value); break;
case SnesMemoryType::Cx4Memory: _cartridge->GetCx4()->GetMemoryMappings()->DebugWrite(address, value); break;
case SnesMemoryType::PrgRom: _cartridge->DebugGetPrgRom()[address] = value; invalidateCache(); break;
case SnesMemoryType::WorkRam: _memoryManager->DebugGetWorkRam()[address] = value; invalidateCache(); break;
@ -213,6 +222,7 @@ uint8_t MemoryDumper::GetMemoryValue(SnesMemoryType memoryType, uint32_t address
case SnesMemoryType::SpcMemory: return _spc->DebugRead(address);
case SnesMemoryType::Sa1Memory: return _cartridge->GetSa1()->GetMemoryMappings()->Peek(address);
case SnesMemoryType::GsuMemory: return _cartridge->GetGsu()->GetMemoryMappings()->Peek(address);
case SnesMemoryType::Cx4Memory: return _cartridge->GetCx4()->GetMemoryMappings()->Peek(address);
case SnesMemoryType::PrgRom: return _cartridge->DebugGetPrgRom()[address];
case SnesMemoryType::WorkRam: return _memoryManager->DebugGetWorkRam()[address];

View file

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

View file

@ -46,6 +46,7 @@ SOURCES_CXX := $(LIBRETRO_DIR)/libretro.cpp \
$(CORE_DIR)/Cx4.cpp \
$(CORE_DIR)/Cx4.Instructions.cpp \
$(CORE_DIR)/Cx4DisUtils.cpp \
$(CORE_DIR)/Cx4Debugger.cpp \
$(CORE_DIR)/Debugger.cpp \
$(CORE_DIR)/DebugHud.cpp \
$(CORE_DIR)/DebugStats.cpp \

View file

@ -37,7 +37,7 @@ namespace Mesen.GUI.Debugger
_cpuType = breakpoint.CpuType;
cboBreakpointType.Items.Clear();
if(_cpuType == CpuType.Cpu || _cpuType == CpuType.Sa1 || _cpuType == CpuType.Gsu) {
if(_cpuType == CpuType.Cpu || _cpuType == CpuType.Sa1 || _cpuType == CpuType.Gsu || _cpuType == CpuType.Cx4) {
cboBreakpointType.Items.Add(ResourceHelper.GetEnumText(_cpuType.ToMemoryType()));
cboBreakpointType.Items.Add("-");

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 Cx4DisassemblyManager : CpuDisassemblyManager
{
public override CpuType CpuType { get { return CpuType.Cx4; } }
public override SnesMemoryType RelativeMemoryType { get { return SnesMemoryType.Cx4Memory; } }
public override int AddressSize { get { return 6; } }
public override int ByteCodeSize { get { return 4; } }
public override bool AllowSourceView { get { return false; } }
public override void RefreshCode(ISymbolProvider symbolProvider, SourceFileInfo file)
{
this._provider = new CodeDataProvider(CpuType.Cx4);
}
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 Cx4LineStyleProvider : BaseStyleProvider
{
public Cx4LineStyleProvider()
{
}
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.Cx4Memory });
foreach(Breakpoint breakpoint in BreakpointManager.Breakpoints) {
if(breakpoint.Matches((uint)cpuAddress, SnesMemoryType.Cx4Memory, CpuType.Cx4) || (absAddress.Address >= 0 && breakpoint.Matches((uint)absAddress.Address, absAddress.Type, CpuType.Cx4))) {
SetBreakpointLineProperties(props, breakpoint);
return;
}
}
}
}
}

View file

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

View file

@ -0,0 +1,883 @@
namespace Mesen.GUI.Debugger.Controls
{
partial class ctrlCx4Status
{
/// <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.grpCx4 = new System.Windows.Forms.GroupBox();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.lblR0 = new System.Windows.Forms.Label();
this.txtR0 = new System.Windows.Forms.TextBox();
this.label5 = new System.Windows.Forms.Label();
this.label16 = new System.Windows.Forms.Label();
this.txtR5 = new System.Windows.Forms.TextBox();
this.txtR15 = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.txtR4 = new System.Windows.Forms.TextBox();
this.txtR1 = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.txtR2 = new System.Windows.Forms.TextBox();
this.label13 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.txtR12 = new System.Windows.Forms.TextBox();
this.txtR3 = new System.Windows.Forms.TextBox();
this.label8 = new System.Windows.Forms.Label();
this.txtR6 = new System.Windows.Forms.TextBox();
this.label14 = new System.Windows.Forms.Label();
this.label9 = new System.Windows.Forms.Label();
this.txtR13 = new System.Windows.Forms.TextBox();
this.txtR7 = new System.Windows.Forms.TextBox();
this.label15 = new System.Windows.Forms.Label();
this.txtR14 = new System.Windows.Forms.TextBox();
this.chkIrq = new System.Windows.Forms.CheckBox();
this.chkOverflow = new System.Windows.Forms.CheckBox();
this.chkNegative = new System.Windows.Forms.CheckBox();
this.chkCarry = new System.Windows.Forms.CheckBox();
this.chkZero = new System.Windows.Forms.CheckBox();
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.txtR11 = new System.Windows.Forms.TextBox();
this.txtR9 = new System.Windows.Forms.TextBox();
this.txtR8 = new System.Windows.Forms.TextBox();
this.txtR10 = new System.Windows.Forms.TextBox();
this.label12 = new System.Windows.Forms.Label();
this.label10 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.label11 = new System.Windows.Forms.Label();
this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();
this.label7 = new System.Windows.Forms.Label();
this.label17 = new System.Windows.Forms.Label();
this.label18 = new System.Windows.Forms.Label();
this.label19 = new System.Windows.Forms.Label();
this.label20 = new System.Windows.Forms.Label();
this.label21 = new System.Windows.Forms.Label();
this.label22 = new System.Windows.Forms.Label();
this.txtPB = new System.Windows.Forms.TextBox();
this.txtMDR = new System.Windows.Forms.TextBox();
this.txtMAR = new System.Windows.Forms.TextBox();
this.txtDPR = new System.Windows.Forms.TextBox();
this.txtP = new System.Windows.Forms.TextBox();
this.txtROM = new System.Windows.Forms.TextBox();
this.txtRAM = new System.Windows.Forms.TextBox();
this.label23 = new System.Windows.Forms.Label();
this.txtPC = new System.Windows.Forms.TextBox();
this.label24 = new System.Windows.Forms.Label();
this.txtA = new System.Windows.Forms.TextBox();
this.label25 = new System.Windows.Forms.Label();
this.txtMult = new System.Windows.Forms.TextBox();
this.grpCx4.SuspendLayout();
this.tableLayoutPanel1.SuspendLayout();
this.tableLayoutPanel2.SuspendLayout();
this.tableLayoutPanel3.SuspendLayout();
this.SuspendLayout();
//
// grpCx4
//
this.grpCx4.Controls.Add(this.tableLayoutPanel2);
this.grpCx4.Controls.Add(this.tableLayoutPanel3);
this.grpCx4.Controls.Add(this.tableLayoutPanel1);
this.grpCx4.Dock = System.Windows.Forms.DockStyle.Top;
this.grpCx4.Location = new System.Drawing.Point(0, 0);
this.grpCx4.Name = "grpCx4";
this.grpCx4.Size = new System.Drawing.Size(342, 226);
this.grpCx4.TabIndex = 0;
this.grpCx4.TabStop = false;
this.grpCx4.Text = "CX4";
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 9;
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.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.Controls.Add(this.lblR0, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.txtR0, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.label5, 2, 1);
this.tableLayoutPanel1.Controls.Add(this.label11, 4, 2);
this.tableLayoutPanel1.Controls.Add(this.label16, 6, 3);
this.tableLayoutPanel1.Controls.Add(this.txtR5, 3, 1);
this.tableLayoutPanel1.Controls.Add(this.txtR10, 5, 2);
this.tableLayoutPanel1.Controls.Add(this.txtR15, 7, 3);
this.tableLayoutPanel1.Controls.Add(this.label3, 2, 0);
this.tableLayoutPanel1.Controls.Add(this.label1, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.txtR4, 3, 0);
this.tableLayoutPanel1.Controls.Add(this.txtR1, 1, 1);
this.tableLayoutPanel1.Controls.Add(this.label4, 4, 0);
this.tableLayoutPanel1.Controls.Add(this.label2, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.txtR8, 5, 0);
this.tableLayoutPanel1.Controls.Add(this.txtR2, 1, 2);
this.tableLayoutPanel1.Controls.Add(this.label13, 6, 0);
this.tableLayoutPanel1.Controls.Add(this.label6, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.txtR12, 7, 0);
this.tableLayoutPanel1.Controls.Add(this.txtR3, 1, 3);
this.tableLayoutPanel1.Controls.Add(this.label10, 4, 1);
this.tableLayoutPanel1.Controls.Add(this.label8, 2, 2);
this.tableLayoutPanel1.Controls.Add(this.txtR9, 5, 1);
this.tableLayoutPanel1.Controls.Add(this.txtR6, 3, 2);
this.tableLayoutPanel1.Controls.Add(this.label14, 6, 1);
this.tableLayoutPanel1.Controls.Add(this.label9, 2, 3);
this.tableLayoutPanel1.Controls.Add(this.txtR13, 7, 1);
this.tableLayoutPanel1.Controls.Add(this.txtR7, 3, 3);
this.tableLayoutPanel1.Controls.Add(this.label15, 6, 2);
this.tableLayoutPanel1.Controls.Add(this.label12, 4, 3);
this.tableLayoutPanel1.Controls.Add(this.txtR14, 7, 2);
this.tableLayoutPanel1.Controls.Add(this.txtR11, 5, 3);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Top;
this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 16);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 5;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(336, 105);
this.tableLayoutPanel1.TabIndex = 0;
//
// lblR0
//
this.lblR0.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblR0.AutoSize = true;
this.lblR0.Location = new System.Drawing.Point(0, 6);
this.lblR0.Margin = new System.Windows.Forms.Padding(0);
this.lblR0.Name = "lblR0";
this.lblR0.Size = new System.Drawing.Size(24, 13);
this.lblR0.TabIndex = 0;
this.lblR0.Text = "R0:";
//
// txtR0
//
this.txtR0.Location = new System.Drawing.Point(24, 3);
this.txtR0.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtR0.Name = "txtR0";
this.txtR0.Size = new System.Drawing.Size(55, 20);
this.txtR0.TabIndex = 1;
this.txtR0.Text = "DDDD";
//
// label5
//
this.label5.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(79, 32);
this.label5.Margin = new System.Windows.Forms.Padding(0);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(24, 13);
this.label5.TabIndex = 19;
this.label5.Text = "R5:";
//
// label16
//
this.label16.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label16.AutoSize = true;
this.label16.Location = new System.Drawing.Point(243, 84);
this.label16.Margin = new System.Windows.Forms.Padding(0);
this.label16.Name = "label16";
this.label16.Size = new System.Drawing.Size(30, 13);
this.label16.TabIndex = 28;
this.label16.Text = "R15:";
//
// txtR5
//
this.txtR5.Location = new System.Drawing.Point(103, 29);
this.txtR5.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtR5.Name = "txtR5";
this.txtR5.Size = new System.Drawing.Size(55, 20);
this.txtR5.TabIndex = 32;
this.txtR5.Text = "DDDD";
//
// txtR15
//
this.txtR15.Location = new System.Drawing.Point(273, 81);
this.txtR15.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtR15.Name = "txtR15";
this.txtR15.Size = new System.Drawing.Size(55, 20);
this.txtR15.TabIndex = 40;
this.txtR15.Text = "DDDD";
//
// label3
//
this.label3.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(79, 6);
this.label3.Margin = new System.Windows.Forms.Padding(0);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(24, 13);
this.label3.TabIndex = 17;
this.label3.Text = "R4:";
//
// label1
//
this.label1.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(0, 32);
this.label1.Margin = new System.Windows.Forms.Padding(0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(24, 13);
this.label1.TabIndex = 2;
this.label1.Text = "R1:";
//
// txtR4
//
this.txtR4.Location = new System.Drawing.Point(103, 3);
this.txtR4.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtR4.Name = "txtR4";
this.txtR4.Size = new System.Drawing.Size(55, 20);
this.txtR4.TabIndex = 29;
this.txtR4.Text = "DDDD";
//
// txtR1
//
this.txtR1.Location = new System.Drawing.Point(24, 29);
this.txtR1.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtR1.Name = "txtR1";
this.txtR1.Size = new System.Drawing.Size(55, 20);
this.txtR1.TabIndex = 4;
//
// label2
//
this.label2.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(0, 58);
this.label2.Margin = new System.Windows.Forms.Padding(0);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(24, 13);
this.label2.TabIndex = 3;
this.label2.Text = "R2:";
//
// txtR2
//
this.txtR2.Location = new System.Drawing.Point(24, 55);
this.txtR2.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtR2.Name = "txtR2";
this.txtR2.Size = new System.Drawing.Size(55, 20);
this.txtR2.TabIndex = 5;
//
// label13
//
this.label13.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label13.AutoSize = true;
this.label13.Location = new System.Drawing.Point(243, 6);
this.label13.Margin = new System.Windows.Forms.Padding(0);
this.label13.Name = "label13";
this.label13.Size = new System.Drawing.Size(30, 13);
this.label13.TabIndex = 25;
this.label13.Text = "R12:";
//
// label6
//
this.label6.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(0, 84);
this.label6.Margin = new System.Windows.Forms.Padding(0);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(24, 13);
this.label6.TabIndex = 12;
this.label6.Text = "R3:";
//
// txtR12
//
this.txtR12.Location = new System.Drawing.Point(273, 3);
this.txtR12.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtR12.Name = "txtR12";
this.txtR12.Size = new System.Drawing.Size(55, 20);
this.txtR12.TabIndex = 31;
this.txtR12.Text = "DDDD";
//
// txtR3
//
this.txtR3.Location = new System.Drawing.Point(24, 81);
this.txtR3.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtR3.Name = "txtR3";
this.txtR3.Size = new System.Drawing.Size(55, 20);
this.txtR3.TabIndex = 13;
this.txtR3.Text = "DDDD";
//
// label8
//
this.label8.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label8.AutoSize = true;
this.label8.Location = new System.Drawing.Point(79, 58);
this.label8.Margin = new System.Windows.Forms.Padding(0);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(24, 13);
this.label8.TabIndex = 20;
this.label8.Text = "R6:";
//
// txtR6
//
this.txtR6.Location = new System.Drawing.Point(103, 55);
this.txtR6.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtR6.Name = "txtR6";
this.txtR6.Size = new System.Drawing.Size(55, 20);
this.txtR6.TabIndex = 35;
this.txtR6.Text = "DDDD";
//
// label14
//
this.label14.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label14.AutoSize = true;
this.label14.Location = new System.Drawing.Point(243, 32);
this.label14.Margin = new System.Windows.Forms.Padding(0);
this.label14.Name = "label14";
this.label14.Size = new System.Drawing.Size(30, 13);
this.label14.TabIndex = 26;
this.label14.Text = "R13:";
//
// label9
//
this.label9.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label9.AutoSize = true;
this.label9.Location = new System.Drawing.Point(79, 84);
this.label9.Margin = new System.Windows.Forms.Padding(0);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(24, 13);
this.label9.TabIndex = 21;
this.label9.Text = "R7:";
//
// txtR13
//
this.txtR13.Location = new System.Drawing.Point(273, 29);
this.txtR13.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtR13.Name = "txtR13";
this.txtR13.Size = new System.Drawing.Size(55, 20);
this.txtR13.TabIndex = 34;
this.txtR13.Text = "DDDD";
//
// txtR7
//
this.txtR7.Location = new System.Drawing.Point(103, 81);
this.txtR7.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtR7.Name = "txtR7";
this.txtR7.Size = new System.Drawing.Size(55, 20);
this.txtR7.TabIndex = 38;
this.txtR7.Text = "DDDD";
//
// label15
//
this.label15.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label15.AutoSize = true;
this.label15.Location = new System.Drawing.Point(243, 58);
this.label15.Margin = new System.Windows.Forms.Padding(0);
this.label15.Name = "label15";
this.label15.Size = new System.Drawing.Size(30, 13);
this.label15.TabIndex = 27;
this.label15.Text = "R14:";
//
// txtR14
//
this.txtR14.Location = new System.Drawing.Point(273, 55);
this.txtR14.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtR14.Name = "txtR14";
this.txtR14.Size = new System.Drawing.Size(55, 20);
this.txtR14.TabIndex = 37;
this.txtR14.Text = "DDDD";
//
// chkIrq
//
this.chkIrq.AutoSize = true;
this.chkIrq.Location = new System.Drawing.Point(159, 3);
this.chkIrq.Name = "chkIrq";
this.chkIrq.Size = new System.Drawing.Size(45, 17);
this.chkIrq.TabIndex = 18;
this.chkIrq.Text = "IRQ";
this.chkIrq.UseVisualStyleBackColor = true;
//
// chkOverflow
//
this.chkOverflow.AutoSize = true;
this.chkOverflow.Location = new System.Drawing.Point(120, 3);
this.chkOverflow.Name = "chkOverflow";
this.chkOverflow.Size = new System.Drawing.Size(33, 17);
this.chkOverflow.TabIndex = 20;
this.chkOverflow.Text = "V";
this.chkOverflow.UseVisualStyleBackColor = true;
//
// chkNegative
//
this.chkNegative.AutoSize = true;
this.chkNegative.Location = new System.Drawing.Point(81, 3);
this.chkNegative.Name = "chkNegative";
this.chkNegative.Size = new System.Drawing.Size(33, 17);
this.chkNegative.TabIndex = 17;
this.chkNegative.Text = "S";
this.chkNegative.UseVisualStyleBackColor = true;
//
// chkCarry
//
this.chkCarry.AutoSize = true;
this.chkCarry.Location = new System.Drawing.Point(42, 3);
this.chkCarry.Name = "chkCarry";
this.chkCarry.Size = new System.Drawing.Size(33, 17);
this.chkCarry.TabIndex = 23;
this.chkCarry.Text = "C";
this.chkCarry.UseVisualStyleBackColor = true;
//
// chkZero
//
this.chkZero.AutoSize = true;
this.chkZero.Location = new System.Drawing.Point(3, 3);
this.chkZero.Name = "chkZero";
this.chkZero.Size = new System.Drawing.Size(33, 17);
this.chkZero.TabIndex = 21;
this.chkZero.Text = "Z";
this.chkZero.UseVisualStyleBackColor = true;
//
// tableLayoutPanel2
//
this.tableLayoutPanel2.ColumnCount = 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.chkZero, 0, 0);
this.tableLayoutPanel2.Controls.Add(this.chkCarry, 1, 0);
this.tableLayoutPanel2.Controls.Add(this.chkNegative, 2, 0);
this.tableLayoutPanel2.Controls.Add(this.chkOverflow, 3, 0);
this.tableLayoutPanel2.Controls.Add(this.chkIrq, 4, 0);
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Top;
this.tableLayoutPanel2.Location = new System.Drawing.Point(3, 194);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 1;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel2.Size = new System.Drawing.Size(336, 20);
this.tableLayoutPanel2.TabIndex = 16;
//
// txtR11
//
this.txtR11.Location = new System.Drawing.Point(188, 81);
this.txtR11.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtR11.Name = "txtR11";
this.txtR11.Size = new System.Drawing.Size(55, 20);
this.txtR11.TabIndex = 39;
this.txtR11.Text = "DDDD";
//
// txtR9
//
this.txtR9.Location = new System.Drawing.Point(188, 29);
this.txtR9.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtR9.Name = "txtR9";
this.txtR9.Size = new System.Drawing.Size(55, 20);
this.txtR9.TabIndex = 33;
this.txtR9.Text = "DDDD";
//
// txtR8
//
this.txtR8.Location = new System.Drawing.Point(188, 3);
this.txtR8.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtR8.Name = "txtR8";
this.txtR8.Size = new System.Drawing.Size(55, 20);
this.txtR8.TabIndex = 30;
this.txtR8.Text = "DDDD";
//
// txtR10
//
this.txtR10.Location = new System.Drawing.Point(188, 55);
this.txtR10.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtR10.Name = "txtR10";
this.txtR10.Size = new System.Drawing.Size(55, 20);
this.txtR10.TabIndex = 36;
this.txtR10.Text = "DDDD";
//
// label12
//
this.label12.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label12.AutoSize = true;
this.label12.Location = new System.Drawing.Point(158, 84);
this.label12.Margin = new System.Windows.Forms.Padding(0);
this.label12.Name = "label12";
this.label12.Size = new System.Drawing.Size(30, 13);
this.label12.TabIndex = 24;
this.label12.Text = "R11:";
//
// label10
//
this.label10.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label10.AutoSize = true;
this.label10.Location = new System.Drawing.Point(158, 32);
this.label10.Margin = new System.Windows.Forms.Padding(0);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(24, 13);
this.label10.TabIndex = 22;
this.label10.Text = "R9:";
//
// label4
//
this.label4.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(158, 6);
this.label4.Margin = new System.Windows.Forms.Padding(0);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(24, 13);
this.label4.TabIndex = 18;
this.label4.Text = "R8:";
//
// label11
//
this.label11.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label11.AutoSize = true;
this.label11.Location = new System.Drawing.Point(158, 58);
this.label11.Margin = new System.Windows.Forms.Padding(0);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(30, 13);
this.label11.TabIndex = 23;
this.label11.Text = "R10:";
//
// tableLayoutPanel3
//
this.tableLayoutPanel3.ColumnCount = 8;
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel3.Controls.Add(this.txtMult, 5, 1);
this.tableLayoutPanel3.Controls.Add(this.label25, 4, 1);
this.tableLayoutPanel3.Controls.Add(this.txtA, 3, 1);
this.tableLayoutPanel3.Controls.Add(this.txtDPR, 7, 0);
this.tableLayoutPanel3.Controls.Add(this.txtMAR, 5, 0);
this.tableLayoutPanel3.Controls.Add(this.txtMDR, 3, 0);
this.tableLayoutPanel3.Controls.Add(this.txtPB, 1, 0);
this.tableLayoutPanel3.Controls.Add(this.label20, 2, 0);
this.tableLayoutPanel3.Controls.Add(this.label21, 4, 0);
this.tableLayoutPanel3.Controls.Add(this.label22, 6, 0);
this.tableLayoutPanel3.Controls.Add(this.txtROM, 3, 2);
this.tableLayoutPanel3.Controls.Add(this.txtRAM, 5, 2);
this.tableLayoutPanel3.Controls.Add(this.label7, 0, 0);
this.tableLayoutPanel3.Controls.Add(this.label23, 2, 2);
this.tableLayoutPanel3.Controls.Add(this.label19, 2, 1);
this.tableLayoutPanel3.Controls.Add(this.label24, 4, 2);
this.tableLayoutPanel3.Controls.Add(this.label17, 0, 2);
this.tableLayoutPanel3.Controls.Add(this.txtPC, 1, 2);
this.tableLayoutPanel3.Controls.Add(this.txtP, 1, 1);
this.tableLayoutPanel3.Controls.Add(this.label18, 0, 1);
this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Top;
this.tableLayoutPanel3.Location = new System.Drawing.Point(3, 121);
this.tableLayoutPanel3.Name = "tableLayoutPanel3";
this.tableLayoutPanel3.RowCount = 3;
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tableLayoutPanel3.Size = new System.Drawing.Size(336, 73);
this.tableLayoutPanel3.TabIndex = 17;
//
// label7
//
this.label7.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label7.AutoSize = true;
this.label7.Location = new System.Drawing.Point(0, 5);
this.label7.Margin = new System.Windows.Forms.Padding(0);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(24, 13);
this.label7.TabIndex = 13;
this.label7.Text = "PB:";
//
// label17
//
this.label17.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label17.AutoSize = true;
this.label17.Location = new System.Drawing.Point(0, 54);
this.label17.Margin = new System.Windows.Forms.Padding(0);
this.label17.Name = "label17";
this.label17.Size = new System.Drawing.Size(24, 13);
this.label17.TabIndex = 14;
this.label17.Text = "PC:";
//
// label18
//
this.label18.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label18.AutoSize = true;
this.label18.Location = new System.Drawing.Point(0, 29);
this.label18.Margin = new System.Windows.Forms.Padding(0);
this.label18.Name = "label18";
this.label18.Size = new System.Drawing.Size(17, 13);
this.label18.TabIndex = 15;
this.label18.Text = "P:";
//
// label19
//
this.label19.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label19.AutoSize = true;
this.label19.Location = new System.Drawing.Point(62, 29);
this.label19.Margin = new System.Windows.Forms.Padding(0);
this.label19.Name = "label19";
this.label19.Size = new System.Drawing.Size(17, 13);
this.label19.TabIndex = 41;
this.label19.Text = "A:";
//
// label20
//
this.label20.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label20.AutoSize = true;
this.label20.Location = new System.Drawing.Point(62, 5);
this.label20.Margin = new System.Windows.Forms.Padding(0);
this.label20.Name = "label20";
this.label20.Size = new System.Drawing.Size(35, 13);
this.label20.TabIndex = 42;
this.label20.Text = "MDR:";
//
// label21
//
this.label21.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label21.AutoSize = true;
this.label21.Location = new System.Drawing.Point(152, 5);
this.label21.Margin = new System.Windows.Forms.Padding(0);
this.label21.Name = "label21";
this.label21.Size = new System.Drawing.Size(34, 13);
this.label21.TabIndex = 43;
this.label21.Text = "MAR:";
//
// label22
//
this.label22.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label22.AutoSize = true;
this.label22.Location = new System.Drawing.Point(247, 5);
this.label22.Margin = new System.Windows.Forms.Padding(0);
this.label22.Name = "label22";
this.label22.Size = new System.Drawing.Size(33, 13);
this.label22.TabIndex = 44;
this.label22.Text = "DPR:";
//
// txtPB
//
this.txtPB.Location = new System.Drawing.Point(24, 3);
this.txtPB.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtPB.Name = "txtPB";
this.txtPB.Size = new System.Drawing.Size(38, 20);
this.txtPB.TabIndex = 45;
this.txtPB.Text = "DDDD";
//
// txtMDR
//
this.txtMDR.Location = new System.Drawing.Point(97, 3);
this.txtMDR.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtMDR.Name = "txtMDR";
this.txtMDR.Size = new System.Drawing.Size(55, 20);
this.txtMDR.TabIndex = 46;
this.txtMDR.Text = "DDDD";
//
// txtMAR
//
this.txtMAR.Location = new System.Drawing.Point(192, 3);
this.txtMAR.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtMAR.Name = "txtMAR";
this.txtMAR.Size = new System.Drawing.Size(55, 20);
this.txtMAR.TabIndex = 47;
this.txtMAR.Text = "DDDD";
//
// txtDPR
//
this.txtDPR.Location = new System.Drawing.Point(280, 3);
this.txtDPR.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtDPR.Name = "txtDPR";
this.txtDPR.Size = new System.Drawing.Size(55, 20);
this.txtDPR.TabIndex = 48;
this.txtDPR.Text = "DDDD";
//
// txtP
//
this.txtP.Location = new System.Drawing.Point(24, 27);
this.txtP.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtP.Name = "txtP";
this.txtP.Size = new System.Drawing.Size(38, 20);
this.txtP.TabIndex = 49;
this.txtP.Text = "DDDD";
//
// txtROM
//
this.txtROM.Location = new System.Drawing.Point(97, 51);
this.txtROM.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtROM.Name = "txtROM";
this.txtROM.Size = new System.Drawing.Size(55, 20);
this.txtROM.TabIndex = 50;
this.txtROM.Text = "DDDD";
//
// txtRAM
//
this.txtRAM.Location = new System.Drawing.Point(192, 51);
this.txtRAM.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtRAM.Name = "txtRAM";
this.txtRAM.Size = new System.Drawing.Size(55, 20);
this.txtRAM.TabIndex = 51;
this.txtRAM.Text = "DDDD";
//
// label23
//
this.label23.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label23.AutoSize = true;
this.label23.Location = new System.Drawing.Point(62, 54);
this.label23.Margin = new System.Windows.Forms.Padding(0);
this.label23.Name = "label23";
this.label23.Size = new System.Drawing.Size(35, 13);
this.label23.TabIndex = 52;
this.label23.Text = "ROM:";
//
// txtPC
//
this.txtPC.Location = new System.Drawing.Point(24, 51);
this.txtPC.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtPC.Name = "txtPC";
this.txtPC.Size = new System.Drawing.Size(21, 20);
this.txtPC.TabIndex = 53;
this.txtPC.Text = "DDDD";
//
// label24
//
this.label24.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label24.AutoSize = true;
this.label24.Location = new System.Drawing.Point(152, 54);
this.label24.Margin = new System.Windows.Forms.Padding(0);
this.label24.Name = "label24";
this.label24.Size = new System.Drawing.Size(34, 13);
this.label24.TabIndex = 54;
this.label24.Text = "RAM:";
//
// txtA
//
this.txtA.Location = new System.Drawing.Point(97, 27);
this.txtA.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtA.Name = "txtA";
this.txtA.Size = new System.Drawing.Size(55, 20);
this.txtA.TabIndex = 55;
this.txtA.Text = "DDDD";
//
// label25
//
this.label25.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label25.AutoSize = true;
this.label25.Location = new System.Drawing.Point(152, 29);
this.label25.Margin = new System.Windows.Forms.Padding(0);
this.label25.Name = "label25";
this.label25.Size = new System.Drawing.Size(40, 13);
this.label25.TabIndex = 56;
this.label25.Text = "MULT:";
//
// txtMult
//
this.tableLayoutPanel3.SetColumnSpan(this.txtMult, 3);
this.txtMult.Location = new System.Drawing.Point(192, 27);
this.txtMult.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3);
this.txtMult.Name = "txtMult";
this.txtMult.Size = new System.Drawing.Size(108, 20);
this.txtMult.TabIndex = 57;
this.txtMult.Text = "DDDD";
//
// ctrlCx4Status
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.grpCx4);
this.Name = "ctrlCx4Status";
this.Size = new System.Drawing.Size(342, 225);
this.grpCx4.ResumeLayout(false);
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.tableLayoutPanel2.ResumeLayout(false);
this.tableLayoutPanel2.PerformLayout();
this.tableLayoutPanel3.ResumeLayout(false);
this.tableLayoutPanel3.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox grpCx4;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label lblR0;
private System.Windows.Forms.TextBox txtR0;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox txtR1;
private System.Windows.Forms.TextBox txtR2;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.TextBox txtR3;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label8;
private System.Windows.Forms.Label label9;
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 txtR4;
private System.Windows.Forms.TextBox txtR12;
private System.Windows.Forms.TextBox txtR5;
private System.Windows.Forms.TextBox txtR13;
private System.Windows.Forms.TextBox txtR6;
private System.Windows.Forms.TextBox txtR14;
private System.Windows.Forms.TextBox txtR7;
private System.Windows.Forms.TextBox txtR15;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3;
private System.Windows.Forms.Label label19;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.Label label17;
private System.Windows.Forms.Label label18;
private System.Windows.Forms.Label label20;
private System.Windows.Forms.Label label21;
private System.Windows.Forms.Label label22;
private System.Windows.Forms.Label label11;
private System.Windows.Forms.TextBox txtR10;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.TextBox txtR8;
private System.Windows.Forms.Label label10;
private System.Windows.Forms.TextBox txtR9;
private System.Windows.Forms.Label label12;
private System.Windows.Forms.TextBox txtR11;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
private System.Windows.Forms.CheckBox chkZero;
private System.Windows.Forms.CheckBox chkCarry;
private System.Windows.Forms.CheckBox chkNegative;
private System.Windows.Forms.CheckBox chkOverflow;
private System.Windows.Forms.CheckBox chkIrq;
private System.Windows.Forms.Label label25;
private System.Windows.Forms.TextBox txtA;
private System.Windows.Forms.Label label24;
private System.Windows.Forms.TextBox txtPC;
private System.Windows.Forms.Label label23;
private System.Windows.Forms.TextBox txtDPR;
private System.Windows.Forms.TextBox txtMAR;
private System.Windows.Forms.TextBox txtMDR;
private System.Windows.Forms.TextBox txtPB;
private System.Windows.Forms.TextBox txtP;
private System.Windows.Forms.TextBox txtROM;
private System.Windows.Forms.TextBox txtRAM;
private System.Windows.Forms.TextBox txtMult;
}
}

View file

@ -0,0 +1,66 @@
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 ctrlCx4Status : BaseControl
{
public ctrlCx4Status()
{
InitializeComponent();
if(IsDesignMode) {
return;
}
}
public void UpdateStatus(Cx4State state)
{
txtR0.Text = state.Regs[0].ToString("X6");
txtR1.Text = state.Regs[1].ToString("X6");
txtR2.Text = state.Regs[2].ToString("X6");
txtR3.Text = state.Regs[3].ToString("X6");
txtR4.Text = state.Regs[4].ToString("X6");
txtR5.Text = state.Regs[5].ToString("X6");
txtR6.Text = state.Regs[6].ToString("X6");
txtR7.Text = state.Regs[7].ToString("X6");
txtR8.Text = state.Regs[8].ToString("X6");
txtR9.Text = state.Regs[9].ToString("X6");
txtR10.Text = state.Regs[10].ToString("X6");
txtR11.Text = state.Regs[11].ToString("X6");
txtR12.Text = state.Regs[12].ToString("X6");
txtR13.Text = state.Regs[13].ToString("X6");
txtR14.Text = state.Regs[14].ToString("X6");
txtR15.Text = state.Regs[15].ToString("X6");
txtPB.Text = state.PB.ToString("X4");
txtP.Text = state.P.ToString("X4");
txtPC.Text = state.PC.ToString("X2");
txtA.Text = state.A.ToString("X6");
txtMAR.Text = state.MemoryAddressReg.ToString("X6");
txtMDR.Text = state.MemoryDataReg.ToString("X6");
txtDPR.Text = state.DataPointerReg.ToString("X6");
int ramBuffer = (state.RamBuffer[2] << 16) | (state.RamBuffer[1] << 8) | state.RamBuffer[0];
txtRAM.Text = ramBuffer.ToString("X6");
txtROM.Text = state.RomBuffer.ToString("X6");
txtMult.Text = state.Mult.ToString("X12");
chkNegative.Checked = state.Negative;
chkZero.Checked = state.Zero;
chkOverflow.Checked = state.Overflow;
chkCarry.Checked = state.Carry;
chkIrq.Checked = state.IrqFlag;
}
}
}

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

@ -52,18 +52,25 @@ namespace Mesen.GUI.Debugger.Controls
if(DebugApi.GetMemorySize(SnesMemoryType.Sa1InternalRam) > 0) {
this.Items.Add("-");
this.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.Sa1Memory));
if(!excludeCpuMemory) {
this.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.Sa1Memory));
}
this.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.Sa1InternalRam));
}
if(DebugApi.GetMemorySize(SnesMemoryType.GsuWorkRam) > 0) {
this.Items.Add("-");
this.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.GsuMemory));
if(!excludeCpuMemory) {
this.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.GsuMemory));
}
this.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.GsuWorkRam));
}
if(DebugApi.GetMemorySize(SnesMemoryType.Cx4DataRam) > 0) {
this.Items.Add("-");
if(!excludeCpuMemory) {
this.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.Cx4Memory));
}
this.Items.Add(ResourceHelper.GetEnumText(SnesMemoryType.Cx4DataRam));
}

View file

@ -31,6 +31,7 @@ namespace Mesen.GUI.Debugger
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.Cx4Debugger: frm = new frmDebugger(CpuType.Cx4); frm.Icon = Properties.Resources.Cx4Debugger; 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;
@ -89,6 +90,7 @@ namespace Mesen.GUI.Debugger
case CpuType.NecDsp: return (frmDebugger)OpenDebugWindow(DebugWindow.NecDspDebugger);
case CpuType.Sa1: return (frmDebugger)OpenDebugWindow(DebugWindow.Sa1Debugger);
case CpuType.Gsu: return (frmDebugger)OpenDebugWindow(DebugWindow.GsuDebugger);
case CpuType.Cx4: return (frmDebugger)OpenDebugWindow(DebugWindow.Cx4Debugger);
}
throw new Exception("Invalid CPU type");
}
@ -101,6 +103,7 @@ namespace Mesen.GUI.Debugger
case CpuType.NecDsp: return (frmDebugger)GetExistingSingleInstanceWindow(DebugWindow.NecDspDebugger);
case CpuType.Sa1: return (frmDebugger)GetExistingSingleInstanceWindow(DebugWindow.Sa1Debugger);
case CpuType.Gsu: return (frmDebugger)GetExistingSingleInstanceWindow(DebugWindow.GsuDebugger);
case CpuType.Cx4: return (frmDebugger)GetExistingSingleInstanceWindow(DebugWindow.Cx4Debugger);
}
throw new Exception("Invalid CPU type");
}
@ -148,6 +151,7 @@ namespace Mesen.GUI.Debugger
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.Cx4Debugger: return _openedWindows.ToList().Find((form) => form.GetType() == typeof(frmDebugger) && ((frmDebugger)form).CpuType == CpuType.Cx4);
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));
@ -190,6 +194,7 @@ namespace Mesen.GUI.Debugger
Sa1Debugger,
GsuDebugger,
NecDspDebugger,
Cx4Debugger,
MemoryTools,
TraceLogger,
TileViewer,

View file

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

View file

@ -26,6 +26,7 @@ namespace Mesen.GUI.Debugger
private ctrlSpcStatus ctrlSpcStatus;
private ctrlGsuStatus ctrlGsuStatus;
private ctrlNecDspStatus ctrlNecDspStatus;
private ctrlCx4Status ctrlCx4Status;
public CpuType CpuType { get { return _cpuType; } }
@ -135,6 +136,32 @@ namespace Mesen.GUI.Debugger
this.ctrlNecDspStatus.Dock = DockStyle.Top;
pnlStatus.Controls.Add(this.ctrlNecDspStatus);
break;
case CpuType.Cx4:
ctrlDisassemblyView.Initialize(new Cx4DisassemblyManager(), new Cx4LineStyleProvider());
ConfigApi.SetDebuggerFlag(DebuggerFlags.Cx4DebuggerEnabled, true);
this.Text = "CX4 Debugger";
ctrlLabelList.Visible = false;
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.ctrlCx4Status = new ctrlCx4Status();
this.ctrlCx4Status.Padding = new Padding(3, 0, 3, 0);
this.ctrlCx4Status.Dock = DockStyle.Top;
pnlStatus.Controls.Add(this.ctrlCx4Status);
break;
}
ctrlBreakpoints.CpuType = _cpuType;
@ -428,6 +455,7 @@ namespace Mesen.GUI.Debugger
case CpuType.NecDsp: ctrlNecDspStatus.UpdateStatus(state.NecDsp); break;
case CpuType.Sa1: ctrlCpuStatus.UpdateStatus(state.Sa1); break;
case CpuType.Gsu: ctrlGsuStatus.UpdateStatus(state.Gsu); break;
case CpuType.Cx4: ctrlCx4Status.UpdateStatus(state.Cx4); break;
default: throw new Exception("Unsupported CPU type");
}
@ -436,7 +464,7 @@ namespace Mesen.GUI.Debugger
ctrlDisassemblyView.SetActiveAddress(activeAddress);
ctrlWatch.UpdateWatch(true);
if(_cpuType != CpuType.Gsu && _cpuType != CpuType.NecDsp) {
if(_cpuType != CpuType.Gsu && _cpuType != CpuType.NecDsp && _cpuType != CpuType.Cx4) {
ctrlCallstack.UpdateCallstack(_cpuType);
}
}
@ -521,6 +549,7 @@ namespace Mesen.GUI.Debugger
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;
case CpuType.Cx4: activeAddress = (int)((state.Cx4.Cache.Address[state.Cx4.Cache.Page] + (state.Cx4.PC * 2)) & 0xFFFFFF); break;
default: throw new Exception("Unsupported cpu type");
}

View file

@ -957,6 +957,7 @@
<Value ID="SpcMemory">SPC Memory</Value>
<Value ID="Sa1Memory">SA-1 Memory</Value>
<Value ID="GsuMemory">GSU Memory</Value>
<Value ID="Cx4Memory">CX4 Memory</Value>
<Value ID="PrgRom">PRG ROM</Value>
<Value ID="WorkRam">Work RAM</Value>
<Value ID="SaveRam">Save RAM</Value>

View file

@ -176,6 +176,7 @@
this.mnuAbout = new System.Windows.Forms.ToolStripMenuItem();
this.pnlRenderer = new System.Windows.Forms.Panel();
this.ctrlRecentGames = new Mesen.GUI.Controls.ctrlRecentGames();
this.mnuCx4Debugger = new System.Windows.Forms.ToolStripMenuItem();
this.mnuMain.SuspendLayout();
this.pnlRenderer.SuspendLayout();
this.SuspendLayout();
@ -1109,7 +1110,8 @@
this.mnuSpcDebugger,
this.mnuSa1Debugger,
this.mnuGsuDebugger,
this.mnuNecDspDebugger});
this.mnuNecDspDebugger,
this.mnuCx4Debugger});
this.mnuDebug.Name = "mnuDebug";
this.mnuDebug.Size = new System.Drawing.Size(54, 20);
this.mnuDebug.Text = "Debug";
@ -1311,6 +1313,13 @@
this.ctrlRecentGames.TabIndex = 1;
this.ctrlRecentGames.Visible = false;
//
// mnuCx4Debugger
//
this.mnuCx4Debugger.Image = global::Mesen.GUI.Properties.Resources.Cx4Debugger;
this.mnuCx4Debugger.Name = "mnuCx4Debugger";
this.mnuCx4Debugger.Size = new System.Drawing.Size(183, 22);
this.mnuCx4Debugger.Text = "CX4 Debugger";
//
// frmMain
//
this.AllowDrop = true;
@ -1485,5 +1494,6 @@
private System.Windows.Forms.ToolStripMenuItem mnuAssembler;
private System.Windows.Forms.ToolStripMenuItem mnuReloadRom;
private System.Windows.Forms.ToolStripMenuItem mnuNecDspDebugger;
private System.Windows.Forms.ToolStripMenuItem mnuCx4Debugger;
}
}

View file

@ -281,6 +281,7 @@ namespace Mesen.GUI.Forms
mnuSa1Debugger.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenSa1Debugger));
mnuGsuDebugger.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenGsuDebugger));
mnuNecDspDebugger.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenNecDspDebugger));
mnuCx4Debugger.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenCx4Debugger));
mnuMemoryTools.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenMemoryTools));
mnuEventViewer.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenEventViewer));
mnuTilemapViewer.InitShortcut(this, nameof(DebuggerShortcutsConfig.OpenTilemapViewer));
@ -344,6 +345,7 @@ namespace Mesen.GUI.Forms
mnuSa1Debugger.Click += (s, e) => { DebugWindowManager.OpenDebugWindow(DebugWindow.Sa1Debugger); };
mnuGsuDebugger.Click += (s, e) => { DebugWindowManager.OpenDebugWindow(DebugWindow.GsuDebugger); };
mnuNecDspDebugger.Click += (s, e) => { DebugWindowManager.OpenDebugWindow(DebugWindow.NecDspDebugger); };
mnuCx4Debugger.Click += (s, e) => { DebugWindowManager.OpenDebugWindow(DebugWindow.Cx4Debugger); };
mnuTraceLogger.Click += (s, e) => { DebugWindowManager.OpenDebugWindow(DebugWindow.TraceLogger); };
mnuMemoryTools.Click += (s, e) => { DebugWindowManager.OpenDebugWindow(DebugWindow.MemoryTools); };
mnuTilemapViewer.Click += (s, e) => { DebugWindowManager.OpenDebugWindow(DebugWindow.TilemapViewer); };
@ -450,6 +452,9 @@ namespace Mesen.GUI.Forms
mnuNecDspDebugger.Enabled = isNecDsp;
mnuNecDspDebugger.Visible = isNecDsp;
mnuCx4Debugger.Enabled = coprocessor == CoprocessorType.CX4;
mnuCx4Debugger.Visible = coprocessor == CoprocessorType.CX4;
mnuTraceLogger.Enabled = running;
mnuScriptWindow.Enabled = running;
mnuMemoryTools.Enabled = running;

View file

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

View file

@ -190,6 +190,7 @@ namespace Mesen.GUI
Sa1Memory,
NecDspMemory,
GsuMemory,
Cx4Memory,
PrgRom,
WorkRam,
SaveRam,
@ -519,6 +520,7 @@ namespace Mesen.GUI
case CpuType.NecDsp: return SnesMemoryType.NecDspMemory;
case CpuType.Sa1: return SnesMemoryType.Sa1Memory;
case CpuType.Gsu: return SnesMemoryType.GsuMemory;
case CpuType.Cx4: return SnesMemoryType.Cx4Memory;
default:
throw new Exception("Invalid CPU type");
@ -533,6 +535,7 @@ namespace Mesen.GUI
case CpuType.NecDsp: return 4;
case CpuType.Sa1: return 6;
case CpuType.Gsu: return 6;
case CpuType.Cx4: return 6;
default:
throw new Exception("Invalid CPU type");

View file

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

View file

@ -466,4 +466,7 @@
<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>
<data name="Cx4Debugger" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Cx4Debugger.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: 666 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\Cx4DisassemblyManager.cs" />
<Compile Include="Debugger\Code\Cx4LineStyleProvider.cs" />
<Compile Include="Debugger\Code\NecDspLineStyleProvider.cs" />
<Compile Include="Debugger\Code\NecDspDisassemblyManager.cs" />
<Compile Include="Debugger\Code\Sa1LineStyleProvider.cs" />
@ -281,6 +283,12 @@
<Compile Include="Debugger\Config\RegisterViewerConfig.cs" />
<Compile Include="Debugger\Config\TileViewerConfig.cs" />
<Compile Include="Debugger\Config\TilemapViewerConfig.cs" />
<Compile Include="Debugger\Controls\ctrlCx4Status.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Debugger\Controls\ctrlCx4Status.Designer.cs">
<DependentUpon>ctrlCx4Status.cs</DependentUpon>
</Compile>
<Compile Include="Debugger\Controls\ctrlNecDspStatus.cs">
<SubType>UserControl</SubType>
</Compile>
@ -979,6 +987,7 @@
<Compile Include="Utilities\RandomGameHelper.cs" />
<Compile Include="Utilities\RomTestHelper.cs" />
<Compile Include="Utilities\XmlColor.cs" />
<None Include="Resources\Cx4Debugger.png" />
<None Include="Resources\NecDspDebugger.png" />
<None Include="Dependencies\Satellaview\BSX0120-0.bin">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
@ -1049,6 +1058,9 @@
<EmbeddedResource Include="Debugger\Controls\ctrlCallstack.resx">
<DependentUpon>ctrlCallstack.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Debugger\Controls\ctrlCx4Status.resx">
<DependentUpon>ctrlCx4Status.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Debugger\Controls\ctrlNecDspStatus.resx">
<DependentUpon>ctrlNecDspStatus.cs</DependentUpon>
</EmbeddedResource>