Add support for fpu and vfpu regs in expressions.

This way you can break based on the value.
This commit is contained in:
Unknown W. Brackets 2013-11-17 01:36:25 -08:00
parent 33d6ee77cb
commit 5f3d7d5c97
4 changed files with 79 additions and 9 deletions

View file

@ -26,6 +26,17 @@
#include "../MIPS/MIPS.h"
#include "../System.h"
enum ReferenceIndexType {
REF_INDEX_PC = 32,
REF_INDEX_HI = 33,
REF_INDEX_LO = 34,
REF_INDEX_FPU = 0x1000,
REF_INDEX_FPU_INT = 0x2000,
REF_INDEX_VFPU = 0x4000,
REF_INDEX_VFPU_INT = 0x8000,
REF_INDEX_IS_FLOAT = REF_INDEX_FPU | REF_INDEX_VFPU,
};
class MipsExpressionFunctions: public IExpressionFunctions
{
@ -37,20 +48,61 @@ public:
for (int i = 0; i < 32; i++)
{
char reg[8];
sprintf(reg,"r%d",i);
sprintf(reg, "r%d", i);
if (strcasecmp(str,reg) == 0 || strcasecmp(str,cpu->GetRegName(0,i)) == 0)
if (strcasecmp(str, reg) == 0 || strcasecmp(str, cpu->GetRegName(0, i)) == 0)
{
referenceIndex = i;
return true;
}
else if (strcasecmp(str, cpu->GetRegName(1, i)) == 0)
{
referenceIndex = REF_INDEX_FPU | i;
return true;
}
sprintf(reg, "fi%d", i);
if (strcasecmp(str, reg) == 0)
{
referenceIndex = REF_INDEX_FPU_INT | i;
return true;
}
}
if (strcasecmp(str,"pc") == 0)
for (int i = 0; i < 128; i++)
{
referenceIndex = 32;
if (strcasecmp(str, cpu->GetRegName(2, i)) == 0)
{
referenceIndex = REF_INDEX_VFPU | i;
return true;
}
char reg[8];
sprintf(reg, "vi%d", i);
if (strcasecmp(str, reg) == 0)
{
referenceIndex = REF_INDEX_VFPU_INT | i;
return true;
}
}
if (strcasecmp(str, "pc") == 0)
{
referenceIndex = REF_INDEX_PC;
return true;
}
}
if (strcasecmp(str, "hi") == 0)
{
referenceIndex = REF_INDEX_HI;
return true;
}
if (strcasecmp(str, "lo") == 0)
{
referenceIndex = REF_INDEX_LO;
return true;
}
return false;
}
@ -62,10 +114,27 @@ public:
virtual uint32 getReferenceValue(uint32 referenceIndex)
{
if (referenceIndex < 32) return cpu->GetRegValue(0,referenceIndex);
if (referenceIndex == 32) return cpu->GetPC();
if (referenceIndex < 32)
return cpu->GetRegValue(0, referenceIndex);
if (referenceIndex == REF_INDEX_PC)
return cpu->GetPC();
if (referenceIndex == REF_INDEX_HI)
return cpu->GetHi();
if (referenceIndex == REF_INDEX_LO)
return cpu->GetLo();
if ((referenceIndex & ~(REF_INDEX_FPU | REF_INDEX_FPU_INT)) < 32)
return cpu->GetRegValue(1, referenceIndex & ~(REF_INDEX_FPU | REF_INDEX_FPU_INT));
if ((referenceIndex & ~(REF_INDEX_VFPU | REF_INDEX_VFPU_INT)) < 128)
return cpu->GetRegValue(2, referenceIndex & ~(REF_INDEX_VFPU | REF_INDEX_VFPU_INT));
return -1;
}
virtual ExpressionType getReferenceType(uint32 referenceIndex) {
if (referenceIndex & REF_INDEX_IS_FLOAT) {
return EXPR_TYPE_FLOAT;
}
return EXPR_TYPE_UINT;
}
virtual bool getMemoryValue(uint32 address, int size, uint32& dest, char* error)
{

View file

@ -103,6 +103,7 @@ public:
{
case 0:
return cpu->r[index];
case 1:
memcpy(&temp, &cpu->f[index], 4);
return temp;

View file

@ -148,7 +148,7 @@ bool BreakpointWindow::fetchDialogData(HWND hwnd)
if (cpu->parseExpression(exp,size) == false)
{
sprintf(errorMessage,"Invalid expression \"%s\".",str);
sprintf(errorMessage,"Invalid expression \"%s\".",exp);
MessageBoxA(hwnd,errorMessage,"Error",MB_OK);
return false;
}

2
native

@ -1 +1 @@
Subproject commit d6304959b0066866bb9802cf51f8ff5f623032eb
Subproject commit d18b42427fa9c6ccb81254adcb1c45119be7b3c8