From eb1006704a9884523d9136eee083685bfe855faa Mon Sep 17 00:00:00 2001 From: Vladimir Kononovich Date: Mon, 12 Oct 2020 18:19:46 +0300 Subject: [PATCH] Implemented CPU flags changing. --- Core/Cpu.cpp | 55 ++++++++------------------- Core/Cpu.h | 1 + Core/Debugger.cpp | 5 +++ Core/Debugger.h | 1 + InteropDLL/DebugApiWrapper.cpp | 1 + UI/Debugger/Controls/ctrlCpuStatus.cs | 11 +++++- UI/Interop/DebugApi.cs | 1 + 7 files changed, 34 insertions(+), 41 deletions(-) diff --git a/Core/Cpu.cpp b/Core/Cpu.cpp index b461e9b..131dbb0 100644 --- a/Core/Cpu.cpp +++ b/Core/Cpu.cpp @@ -121,45 +121,20 @@ void Cpu::Write(uint32_t addr, uint8_t value, MemoryOperationType type) void Cpu::SetReg(CpuRegister reg, uint16_t value) { switch (reg) { - case CpuRegister::CpuRegA: - { - _state.A = value; - } break; - case CpuRegister::CpuRegX: - { - _state.X = value; - } break; - case CpuRegister::CpuRegY: - { - _state.Y = value; - } break; - case CpuRegister::CpuRegSP: - { - _state.SP = value; - } break; - case CpuRegister::CpuRegD: - { - _state.D = value; - } break; - case CpuRegister::CpuRegPC: - { - _state.PC = value; - } break; - case CpuRegister::CpuRegK: - { - _state.K = value & 0xFF; - } break; - case CpuRegister::CpuRegDBR: - { - _state.DBR = value & 0xFF; - } break; - case CpuRegister::CpuRegPS: - { - _state.PS = value & 0xFF; - } break; - case CpuRegister::CpuRegNmiFlag: - { - _state.NmiFlag = value != 0; - } break; + case CpuRegister::CpuRegA: { _state.A = value; } break; + case CpuRegister::CpuRegX: { _state.X = value; } break; + case CpuRegister::CpuRegY: { _state.Y = value; } break; + case CpuRegister::CpuRegSP: { _state.SP = value; } break; + case CpuRegister::CpuRegD: { _state.D = value; } break; + case CpuRegister::CpuRegPC: { _state.PC = value; } break; + case CpuRegister::CpuRegK: { _state.K = value & 0xFF; } break; + case CpuRegister::CpuRegDBR: { _state.DBR = value & 0xFF; } break; + case CpuRegister::CpuRegPS: { _state.PS = value & 0xFF; } break; + case CpuRegister::CpuFlagNmi: { _state.NmiFlag = value != 0; } break; } } + +void Cpu::SetCpuProcFlag(ProcFlags::ProcFlags flag, bool set) +{ + _state.PS = set ? (_state.PS | static_cast(flag)) : (_state.PS & ~static_cast(flag)); +} diff --git a/Core/Cpu.h b/Core/Cpu.h index e636acd..018e707 100644 --- a/Core/Cpu.h +++ b/Core/Cpu.h @@ -347,6 +347,7 @@ public: void Serialize(Serializer &s) override; void SetReg(CpuRegister reg, uint16_t value); + void SetCpuProcFlag(ProcFlags::ProcFlags flag, bool set); #ifdef DUMMYCPU private: diff --git a/Core/Debugger.cpp b/Core/Debugger.cpp index b015c26..2ab1a42 100644 --- a/Core/Debugger.cpp +++ b/Core/Debugger.cpp @@ -516,6 +516,11 @@ void Debugger::SetCpuRegister(CpuRegister reg, uint16_t value) _cpu->SetReg(reg, value); } +void Debugger::SetCpuProcFlag(ProcFlags::ProcFlags flag, bool set) +{ + _cpu->SetCpuProcFlag(flag, set); +} + void Debugger::SetCx4Register(Cx4Register reg, uint32_t value) { _cart->GetCx4()->SetReg(reg, value); diff --git a/Core/Debugger.h b/Core/Debugger.h index df65147..42b1229 100644 --- a/Core/Debugger.h +++ b/Core/Debugger.h @@ -130,6 +130,7 @@ public: void GetState(DebugState& state, bool partialPpuState); void SetCpuRegister(CpuRegister reg, uint16_t value); + void SetCpuProcFlag(ProcFlags::ProcFlags flag, bool set); void SetCx4Register(Cx4Register reg, uint32_t value); void SetGameboyRegister(GbRegister reg, uint16_t value); void SetGsuRegister(GsuRegister reg, uint16_t value); diff --git a/InteropDLL/DebugApiWrapper.cpp b/InteropDLL/DebugApiWrapper.cpp index 62fbf0f..7fb263a 100644 --- a/InteropDLL/DebugApiWrapper.cpp +++ b/InteropDLL/DebugApiWrapper.cpp @@ -69,6 +69,7 @@ extern "C" DllExport void __stdcall GetState(DebugState& state) { GetDebugger()->GetState(state, false); } DllExport void __stdcall SetCpuRegister(CpuRegister reg, uint16_t value) { GetDebugger()->SetCpuRegister(reg, value); } + DllExport void __stdcall SetCpuProcFlag(ProcFlags::ProcFlags flag, bool set) { GetDebugger()->SetCpuProcFlag(flag, set); }; DllExport void __stdcall SetSpcRegister(SpcRegister reg, uint16_t value) { GetDebugger()->SetSpcRegister(reg, value); } DllExport void __stdcall SetNecDspRegister(NecDspRegister reg, uint16_t value) { GetDebugger()->SetNecDspRegister(reg, value); } DllExport void __stdcall SetSa1Register(CpuRegister reg, uint16_t value) { GetDebugger()->SetSa1Register(reg, value); } diff --git a/UI/Debugger/Controls/ctrlCpuStatus.cs b/UI/Debugger/Controls/ctrlCpuStatus.cs index 443fc7b..d6b1fc4 100644 --- a/UI/Debugger/Controls/ctrlCpuStatus.cs +++ b/UI/Debugger/Controls/ctrlCpuStatus.cs @@ -34,7 +34,16 @@ namespace Mesen.GUI.Debugger.Controls _cpuBinder.AddBinding(nameof(CpuState.SP), txtS, onEditHandler: (s, e) => { DebugApi.SetCpuRegister(CpuRegister.CpuRegSP, UInt16.Parse(txtS.Text, NumberStyles.HexNumber)); }); _cpuBinder.AddBinding(nameof(CpuState.PS), txtP, onEditHandler: (s, e) => { DebugApi.SetCpuRegister(CpuRegister.CpuRegPS, UInt16.Parse(txtP.Text, NumberStyles.HexNumber)); }); - _cpuBinder.AddBinding(nameof(CpuState.NmiFlag), chkNmi, onEditHandler: (s, e) => { DebugApi.SetCpuRegister(CpuRegister.CpuRegNmiFlag, (UInt16)(chkNmi.Checked ? 1 : 0)); }); + _cpuBinder.AddBinding(nameof(CpuState.NmiFlag), chkNmi, onEditHandler: (s, e) => { DebugApi.SetCpuRegister(CpuRegister.CpuFlagNmi, (UInt16)(chkNmi.Checked ? 1 : 0)); }); + + chkIndex.CheckedChanged += (s, e) => { DebugApi.SetCpuProcFlag(ProcFlags.IndexMode8, chkIndex.Checked); }; + chkCarry.CheckedChanged += (s, e) => { DebugApi.SetCpuProcFlag(ProcFlags.Carry, chkCarry.Checked); }; + chkDecimal.CheckedChanged += (s, e) => { DebugApi.SetCpuProcFlag(ProcFlags.Decimal, chkDecimal.Checked); }; + chkInterrupt.CheckedChanged += (s, e) => { DebugApi.SetCpuProcFlag(ProcFlags.IrqDisable, chkInterrupt.Checked); }; + chkNegative.CheckedChanged += (s, e) => { DebugApi.SetCpuProcFlag(ProcFlags.Negative, chkNegative.Checked); }; + chkOverflow.CheckedChanged += (s, e) => { DebugApi.SetCpuProcFlag(ProcFlags.Overflow, chkOverflow.Checked); }; + chkMemory.CheckedChanged += (s, e) => { DebugApi.SetCpuProcFlag(ProcFlags.MemoryMode8, chkMemory.Checked); }; + chkZero.CheckedChanged += (s, e) => { DebugApi.SetCpuProcFlag(ProcFlags.Zero, chkZero.Checked); }; } public void UpdateStatus(CpuState state) diff --git a/UI/Interop/DebugApi.cs b/UI/Interop/DebugApi.cs index a5eb3a6..b0a9e4c 100644 --- a/UI/Interop/DebugApi.cs +++ b/UI/Interop/DebugApi.cs @@ -59,6 +59,7 @@ namespace Mesen.GUI } [DllImport(DllPath)] public static extern void SetCpuRegister(CpuRegister reg, UInt16 value); + [DllImport(DllPath)] public static extern void SetCpuProcFlag(ProcFlags flag, [MarshalAs(UnmanagedType.I1)]bool set); [DllImport(DllPath)] public static extern void SetSpcRegister(SpcRegister reg, UInt16 value); [DllImport(DllPath)] public static extern void SetNecDspRegister(NecDspRegister reg, UInt16 value); [DllImport(DllPath)] public static extern void SetSa1Register(CpuRegister reg, UInt16 value);