diff --git a/Core/MIPS/MIPSDebugInterface.cpp b/Core/MIPS/MIPSDebugInterface.cpp index d8e5962e35..156d18bdd4 100644 --- a/Core/MIPS/MIPSDebugInterface.cpp +++ b/Core/MIPS/MIPSDebugInterface.cpp @@ -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) { diff --git a/Core/MIPS/MIPSDebugInterface.h b/Core/MIPS/MIPSDebugInterface.h index 8014720bb4..39b6bc5eba 100644 --- a/Core/MIPS/MIPSDebugInterface.h +++ b/Core/MIPS/MIPSDebugInterface.h @@ -103,6 +103,7 @@ public: { case 0: return cpu->r[index]; + case 1: memcpy(&temp, &cpu->f[index], 4); return temp; diff --git a/Windows/Debugger/BreakpointWindow.cpp b/Windows/Debugger/BreakpointWindow.cpp index 0cb98099f6..b019318bdb 100644 --- a/Windows/Debugger/BreakpointWindow.cpp +++ b/Windows/Debugger/BreakpointWindow.cpp @@ -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; } diff --git a/native b/native index d6304959b0..d18b42427f 160000 --- a/native +++ b/native @@ -1 +1 @@ -Subproject commit d6304959b0066866bb9802cf51f8ff5f623032eb +Subproject commit d18b42427fa9c6ccb81254adcb1c45119be7b3c8