Add aliases for processor flags, for conditions

This commit is contained in:
NovaSquirrel 2020-10-10 00:22:11 -04:00
parent 7853aaef77
commit e25c69e54b
3 changed files with 68 additions and 4 deletions

View file

@ -76,8 +76,10 @@ bool ExpressionEvaluator::CheckSpecialTokens(string expression, size_t &pos, str
tokenValue = ProcessGsuTokens(token); tokenValue = ProcessGsuTokens(token);
} else if(_cpuType == CpuType::Gameboy) { } else if(_cpuType == CpuType::Gameboy) {
tokenValue = ProcessGameboyTokens(token); tokenValue = ProcessGameboyTokens(token);
} else { } else if(_cpuType == CpuType::Spc) {
tokenValue = ProcessCpuSpcTokens(token); tokenValue = ProcessCpuSpcTokens(token, true);
} else { // Cpu or Sa1
tokenValue = ProcessCpuSpcTokens(token, false);
} }
if(tokenValue != -1) { 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") { if(token == "a") {
return EvalValues::RegA; return EvalValues::RegA;
@ -118,6 +120,32 @@ int64_t ExpressionEvaluator::ProcessCpuSpcTokens(string token)
return EvalValues::RegY; return EvalValues::RegY;
} else if(token == "ps") { } else if(token == "ps") {
return EvalValues::RegPS; 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") { } else if(token == "sp") {
return EvalValues::RegSP; return EvalValues::RegSP;
} else if(token == "pc") { } 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::RegPC: token = state.Cpu.PC; break;
case EvalValues::Nmi: token = state.Cpu.NmiFlag; resultType = EvalResultType::Boolean; 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::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; break;
@ -517,6 +555,14 @@ int32_t ExpressionEvaluator::Evaluate(ExpressionData &data, DebugState &state, E
case EvalValues::RegSP: token = state.Spc.SP; break; case EvalValues::RegSP: token = state.Spc.SP; break;
case EvalValues::RegPS: token = state.Spc.PS; break; case EvalValues::RegPS: token = state.Spc.PS; break;
case EvalValues::RegPC: token = state.Spc.PC; 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; break;

View file

@ -90,6 +90,22 @@ enum EvalValues : int64_t
RomBR = 20000000141, RomBR = 20000000141,
RamBR = 20000000142, 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, RegB = 20000000160,
RegC = 20000000161, RegC = 20000000161,
RegD = 20000000162, RegD = 20000000162,
@ -151,7 +167,7 @@ private:
bool IsOperator(string token, int &precedence, bool unaryOperator); bool IsOperator(string token, int &precedence, bool unaryOperator);
EvalOperators GetOperator(string token, bool unaryOperator); EvalOperators GetOperator(string token, bool unaryOperator);
bool CheckSpecialTokens(string expression, size_t &pos, string &output, ExpressionData &data); 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 ProcessSharedTokens(string token);
int64_t ProcessGsuTokens(string token); int64_t ProcessGsuTokens(string token);
int64_t ProcessGameboyTokens(string token); int64_t ProcessGameboyTokens(string token);

View file

@ -144,6 +144,8 @@ namespace Mesen.GUI.Debugger
"Note: Use the $ prefix to denote hexadecimal values." + Environment.NewLine + Environment.NewLine + "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 + //"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 + "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 + "PC: Program Counter" + Environment.NewLine +
"OpPC: Address of the current instruction's first byte" + Environment.NewLine + "OpPC: Address of the current instruction's first byte" + Environment.NewLine +
"PreviousOpPC: Address of the previous instruction's first byte" + Environment.NewLine + "PreviousOpPC: Address of the previous instruction's first byte" + Environment.NewLine +