From e25c69e54b020e55a4b44fa3f076ae407094f7ff Mon Sep 17 00:00:00 2001 From: NovaSquirrel Date: Sat, 10 Oct 2020 00:22:11 -0400 Subject: [PATCH] Add aliases for processor flags, for conditions --- Core/ExpressionEvaluator.cpp | 52 ++++++++++++++++++++++-- Core/ExpressionEvaluator.h | 18 +++++++- UI/Debugger/Breakpoints/frmBreakpoint.cs | 2 + 3 files changed, 68 insertions(+), 4 deletions(-) diff --git a/Core/ExpressionEvaluator.cpp b/Core/ExpressionEvaluator.cpp index 72ca1b1..5020d21 100644 --- a/Core/ExpressionEvaluator.cpp +++ b/Core/ExpressionEvaluator.cpp @@ -76,8 +76,10 @@ bool ExpressionEvaluator::CheckSpecialTokens(string expression, size_t &pos, str tokenValue = ProcessGsuTokens(token); } else if(_cpuType == CpuType::Gameboy) { tokenValue = ProcessGameboyTokens(token); - } else { - tokenValue = ProcessCpuSpcTokens(token); + } else if(_cpuType == CpuType::Spc) { + tokenValue = ProcessCpuSpcTokens(token, true); + } else { // Cpu or Sa1 + tokenValue = ProcessCpuSpcTokens(token, false); } if(tokenValue != -1) { @@ -108,7 +110,7 @@ bool ExpressionEvaluator::CheckSpecialTokens(string expression, size_t &pos, str } } -int64_t ExpressionEvaluator::ProcessCpuSpcTokens(string token) +int64_t ExpressionEvaluator::ProcessCpuSpcTokens(string token, bool spc700) { if(token == "a") { return EvalValues::RegA; @@ -118,6 +120,32 @@ int64_t ExpressionEvaluator::ProcessCpuSpcTokens(string token) return EvalValues::RegY; } else if(token == "ps") { return EvalValues::RegPS; + } else if (token == "pscarry") { + return EvalValues::RegPS_Carry; + } else if (token == "pszero") { + return EvalValues::RegPS_Zero; + } else if (token == "psinterrupt") { + return EvalValues::RegPS_Interrupt; + } else if (token == "psdecimal") { + return EvalValues::RegPS_Decimal; + } else if (token == "psoverflow") { + return EvalValues::RegPS_Overflow; + } else if (token == "psnegative") { + return EvalValues::RegPS_Negative; + } else if (token == "ps8bit" && !spc700) { + return EvalValues::RegPS_8bit; + } else if (token == "ps8bitindex" && !spc700) { + return EvalValues::RegPS_8bitIndex; + } else if (token == "ps16bit" && !spc700) { + return EvalValues::RegPS_16bit; + } else if (token == "ps16bitindex" && !spc700) { + return EvalValues::RegPS_16bitIndex; + } else if (token == "pshalfcarry" && spc700) { + return EvalValues::RegPS_HalfCarry; + } else if (token == "psbreak" && spc700) { + return EvalValues::RegPS_Break; + } else if (token == "psstackzp" && spc700) { + return EvalValues::RegPS_StackZeropage; } else if(token == "sp") { return EvalValues::RegSP; } else if(token == "pc") { @@ -506,6 +534,16 @@ int32_t ExpressionEvaluator::Evaluate(ExpressionData &data, DebugState &state, E case EvalValues::RegPC: token = state.Cpu.PC; break; case EvalValues::Nmi: token = state.Cpu.NmiFlag; resultType = EvalResultType::Boolean; break; case EvalValues::Irq: token = state.Cpu.IrqSource != 0; resultType = EvalResultType::Boolean; break; + case EvalValues::RegPS_Carry: token = (state.Cpu.PS & 1) != 0; break; + case EvalValues::RegPS_Zero: token = (state.Cpu.PS & 2) != 0; break; + case EvalValues::RegPS_Interrupt: token = (state.Cpu.PS & 4) != 0; break; + case EvalValues::RegPS_Decimal: token = (state.Cpu.PS & 8) != 0; break; + case EvalValues::RegPS_8bitIndex: token = (state.Cpu.PS & 16) != 0; break; + case EvalValues::RegPS_8bit: token = (state.Cpu.PS & 32) != 0; break; + case EvalValues::RegPS_16bitIndex: token = (state.Cpu.PS & 16) == 0; break; + case EvalValues::RegPS_16bit: token = (state.Cpu.PS & 32) == 0; break; + case EvalValues::RegPS_Overflow: token = (state.Cpu.PS & 64) != 0; break; + case EvalValues::RegPS_Negative: token = (state.Cpu.PS & 128) != 0; break; } break; @@ -517,6 +555,14 @@ int32_t ExpressionEvaluator::Evaluate(ExpressionData &data, DebugState &state, E case EvalValues::RegSP: token = state.Spc.SP; break; case EvalValues::RegPS: token = state.Spc.PS; break; case EvalValues::RegPC: token = state.Spc.PC; break; + case EvalValues::RegPS_Carry: token = (state.Cpu.PS & 1) != 0; break; + case EvalValues::RegPS_Zero: token = (state.Cpu.PS & 2) != 0; break; + case EvalValues::RegPS_Interrupt: (state.Cpu.PS & 4) != 0; break; + case EvalValues::RegPS_HalfCarry: (state.Cpu.PS & 8) != 0; break; + case EvalValues::RegPS_Break: (state.Cpu.PS & 16) != 0; break; + case EvalValues::RegPS_StackZeropage: (state.Cpu.PS & 32) != 0; break; + case EvalValues::RegPS_Overflow: (state.Cpu.PS & 64) != 0; break; + case EvalValues::RegPS_Negative: (state.Cpu.PS & 128) != 0; break; } break; diff --git a/Core/ExpressionEvaluator.h b/Core/ExpressionEvaluator.h index 485b9a7..1821cee 100644 --- a/Core/ExpressionEvaluator.h +++ b/Core/ExpressionEvaluator.h @@ -90,6 +90,22 @@ enum EvalValues : int64_t RomBR = 20000000141, RamBR = 20000000142, + RegPS_Carry = 20000000150, + RegPS_Zero = 20000000151, + RegPS_Interrupt = 20000000152, + RegPS_Decimal = 20000000153, + RegPS_8bitIndex = 20000000154, + RegPS_8bit = 20000000155, + RegPS_Overflow = 20000000156, + RegPS_Negative = 20000000157, + RegPS_16bitIndex = 20000000158, + RegPS_16bit = 20000000159, + + // SPC flags + RegPS_HalfCarry = 20000000153, + RegPS_Break = 20000000154, + RegPS_StackZeropage = 20000000155, + RegB = 20000000160, RegC = 20000000161, RegD = 20000000162, @@ -151,7 +167,7 @@ private: bool IsOperator(string token, int &precedence, bool unaryOperator); EvalOperators GetOperator(string token, bool unaryOperator); bool CheckSpecialTokens(string expression, size_t &pos, string &output, ExpressionData &data); - int64_t ProcessCpuSpcTokens(string token); + int64_t ProcessCpuSpcTokens(string token, bool spc); int64_t ProcessSharedTokens(string token); int64_t ProcessGsuTokens(string token); int64_t ProcessGameboyTokens(string token); diff --git a/UI/Debugger/Breakpoints/frmBreakpoint.cs b/UI/Debugger/Breakpoints/frmBreakpoint.cs index 1758798..5a3a543 100644 --- a/UI/Debugger/Breakpoints/frmBreakpoint.cs +++ b/UI/Debugger/Breakpoints/frmBreakpoint.cs @@ -144,6 +144,8 @@ namespace Mesen.GUI.Debugger "Note: Use the $ prefix to denote hexadecimal values." + Environment.NewLine + Environment.NewLine + //"Note 2: Labels assigned to the code can be used (their value will match the label's address in CPU memory)." + Environment.NewLine + Environment.NewLine + "A/X/Y/PS/SP: Value of registers" + Environment.NewLine + + "PsCarry/PsZero/PsInterrupt/PsDecimal/PsOverflow/PsNegative: Processor flags" + Environment.NewLine + + "Ps8bit/Ps16bit/Ps8bitIndex/Ps16bitIndex: Register sizes" + Environment.NewLine + "PC: Program Counter" + Environment.NewLine + "OpPC: Address of the current instruction's first byte" + Environment.NewLine + "PreviousOpPC: Address of the previous instruction's first byte" + Environment.NewLine +