1
0
Fork 0

st(X) can be edited

This commit is contained in:
torusrxxx 2018-06-20 17:00:35 +08:00 committed by Duncan Ogilvie
parent f5395cb318
commit ae9bf8c49e
2 changed files with 137 additions and 50 deletions

View File

@ -2028,6 +2028,7 @@ static bool startsWith(const char* pre, const char* str)
#define XMM_PRE_FIELD_STRING "XMM"
#define YMM_PRE_FIELD_STRING "YMM"
#define x8780BITFPU_PRE_FIELD_STRING "x87r"
#define x8780BITFPU_PRE_FIELD_STRING_ST "st"
#define STRLEN_USING_SIZEOF(string) (sizeof(string) - 1)
/**
@ -2211,6 +2212,56 @@ static void setfpuvalue(const char* string, duint value)
if(found)
SetContextDataEx(hActiveThread, registerindex, value);
}
else if(startsWith(x8780BITFPU_PRE_FIELD_STRING_ST, string))
{
flags = GetContextDataEx(hActiveThread, UE_X87_STATUSWORD);
flags >>= 11;
flags &= 7;
string += STRLEN_USING_SIZEOF(x8780BITFPU_PRE_FIELD_STRING_ST);
bool found = true;
DWORD registerindex;
switch(*string)
{
case '0':
registerindex = flags;
break;
case '1':
registerindex = ((1 + flags) & 7);
break;
case '2':
registerindex = ((2 + flags) & 7);
break;
case '3':
registerindex = ((3 + flags) & 7);
break;
case '4':
registerindex = ((4 + flags) & 7);
break;
case '5':
registerindex = ((5 + flags) & 7);
break;
case '6':
registerindex = ((6 + flags) & 7);
break;
case '7':
registerindex = ((7 + flags) & 7);
break;
default:
found = false;
break;
}
registerindex += UE_x87_r0;
if(found)
SetContextDataEx(hActiveThread, registerindex, value);
}
else if(startsWith(MMX_PRE_FIELD_STRING, string))
{
string += STRLEN_USING_SIZEOF(MMX_PRE_FIELD_STRING);

View File

@ -161,22 +161,44 @@ void RegistersView::InitMappings()
{
offset++;
mRegisterMapping.insert(x87r0, "x87r0");
mRegisterPlaces.insert(x87r0, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87r1, "x87r1");
mRegisterPlaces.insert(x87r1, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87r2, "x87r2");
mRegisterPlaces.insert(x87r2, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87r3, "x87r3");
mRegisterPlaces.insert(x87r3, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87r4, "x87r4");
mRegisterPlaces.insert(x87r4, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87r5, "x87r5");
mRegisterPlaces.insert(x87r5, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87r6, "x87r6");
mRegisterPlaces.insert(x87r6, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87r7, "x87r7");
mRegisterPlaces.insert(x87r7, Register_Position(offset++, 0, 6, 10 * 2));
if(mFpuMode)
{
mRegisterMapping.insert(x87r0, "x87r0");
mRegisterPlaces.insert(x87r0, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87r1, "x87r1");
mRegisterPlaces.insert(x87r1, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87r2, "x87r2");
mRegisterPlaces.insert(x87r2, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87r3, "x87r3");
mRegisterPlaces.insert(x87r3, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87r4, "x87r4");
mRegisterPlaces.insert(x87r4, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87r5, "x87r5");
mRegisterPlaces.insert(x87r5, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87r6, "x87r6");
mRegisterPlaces.insert(x87r6, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87r7, "x87r7");
mRegisterPlaces.insert(x87r7, Register_Position(offset++, 0, 6, 10 * 2));
}
else
{
mRegisterMapping.insert(x87st0, "ST(0)");
mRegisterPlaces.insert(x87st0, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87st1, "ST(1)");
mRegisterPlaces.insert(x87st1, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87st2, "ST(2)");
mRegisterPlaces.insert(x87st2, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87st3, "ST(3)");
mRegisterPlaces.insert(x87st3, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87st4, "ST(4)");
mRegisterPlaces.insert(x87st4, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87st5, "ST(5)");
mRegisterPlaces.insert(x87st5, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87st6, "ST(6)");
mRegisterPlaces.insert(x87st6, Register_Position(offset++, 0, 6, 10 * 2));
mRegisterMapping.insert(x87st7, "ST(7)");
mRegisterPlaces.insert(x87st7, Register_Position(offset++, 0, 6, 10 * 2));
}
offset++;
@ -741,6 +763,15 @@ RegistersView::RegistersView(CPUWidget* parent) : QScrollArea(parent), mVScrollO
mFPU.insert(i);
}
for(REGISTER_NAME i = x87st0; i <= x87st7; i = (REGISTER_NAME)(i + 1))
{
mMODIFYDISPLAY.insert(i);
mUNDODISPLAY.insert(i);
mFPUx87.insert(i);
mFPUx87_80BITSDISPLAY.insert(i);
mFPU.insert(i);
}
mSETONEZEROTOGGLE.insert(x87TagWord);
mFPUx87.insert(x87TagWord);
mMODIFYDISPLAY.insert(x87TagWord);
@ -2165,7 +2196,14 @@ void RegistersView::drawRegister(QPainter* p, REGISTER_NAME reg, char* value)
if(mRegisterUpdates.contains(x87SW_TOP))
p->setPen(ConfigColor("RegistersModifiedColor"));
newText = QString("ST%1 ").arg(((X87FPUREGISTER*) registerValue(&wRegDumpStruct, reg))->st_value);
if(reg >= x87r0 && reg <= x87r7)
{
newText = QString("ST%1 ").arg(((X87FPUREGISTER*) registerValue(&wRegDumpStruct, reg))->st_value);
}
else
{
newText = QString("x87r%1 ").arg((wRegDumpStruct.x87StatusWordFields.TOP + (reg - x87st0)) & 7);
}
width = fontMetrics.width(newText);
p->drawText(x, y, width, mRowHeight, Qt::AlignVCenter, newText);
@ -2175,38 +2213,8 @@ void RegistersView::drawRegister(QPainter* p, REGISTER_NAME reg, char* value)
p->setPen(ConfigColor("RegistersExtraInfoColor"));
if(reg == x87r0 && mRegisterUpdates.contains(x87TW_0))
{
if(reg >= x87r0 && reg <= x87r7 && mRegisterUpdates.contains((REGISTER_NAME)(x87TW_0 + (reg - x87r0))))
p->setPen(ConfigColor("RegistersModifiedColor"));
}
else if(reg == x87r1 && mRegisterUpdates.contains(x87TW_1))
{
p->setPen(ConfigColor("RegistersModifiedColor"));
}
else if(reg == x87r2 && mRegisterUpdates.contains(x87TW_2))
{
p->setPen(ConfigColor("RegistersModifiedColor"));
}
else if(reg == x87r3 && mRegisterUpdates.contains(x87TW_3))
{
p->setPen(ConfigColor("RegistersModifiedColor"));
}
else if(reg == x87r4 && mRegisterUpdates.contains(x87TW_4))
{
p->setPen(ConfigColor("RegistersModifiedColor"));
}
else if(reg == x87r5 && mRegisterUpdates.contains(x87TW_5))
{
p->setPen(ConfigColor("RegistersModifiedColor"));
}
else if(reg == x87r6 && mRegisterUpdates.contains(x87TW_6))
{
p->setPen(ConfigColor("RegistersModifiedColor"));
}
else if(reg == x87r7 && mRegisterUpdates.contains(x87TW_7))
{
p->setPen(ConfigColor("RegistersModifiedColor"));
}
newText += GetTagWordStateString(((X87FPUREGISTER*) registerValue(&wRegDumpStruct, reg))->tag) + QString(" ");
@ -2311,7 +2319,11 @@ void RegistersView::displayEditDialog()
else if(mSelected == x87CW_PC)
MODIFY_FIELDS_DISPLAY(tr("Edit"), "x87CW_PC", ControlWordPCValueStringTable);
else if(mSelected == x87SW_TOP)
{
MODIFY_FIELDS_DISPLAY(tr("Edit"), "x87SW_TOP", StatusWordTOPValueStringTable);
if(mFpuMode == false)
updateRegistersSlot();
}
else if(mFPUYMM.contains(mSelected))
{
EditFloatRegister mEditFloat(256, this);
@ -2682,6 +2694,7 @@ void RegistersView::onCopyAllAction()
appendRegister(text, REGISTER_NAME::SS, "SS : ", "SS : ");
if(mShowFpu)
{
appendRegister(text, REGISTER_NAME::x87r0, "x87r0 : ", "x87r0 : ");
appendRegister(text, REGISTER_NAME::x87r1, "x87r1 : ", "x87r1 : ");
appendRegister(text, REGISTER_NAME::x87r2, "x87r2 : ", "x87r2 : ");
@ -3028,8 +3041,13 @@ void RegistersView::setRegister(REGISTER_NAME reg, duint value)
// is register-id known?
if(mRegisterMapping.contains(reg))
{
// map "cax" to "eax" or "rax"
QString wRegName = mRegisterMapping.constFind(reg).value();
// map x87st0 to x87r0
QString wRegName;
if(reg >= x87st0 && reg <= x87st7)
wRegName = QString().sprintf("st%d", reg - x87st0);
else
// map "cax" to "eax" or "rax"
wRegName = mRegisterMapping.constFind(reg).value();
// flags need to '_' infront
if(mFlags.contains(reg))
@ -3236,6 +3254,23 @@ char* RegistersView::registerValue(const REGDUMP* regd, const REGISTER_NAME reg)
case x87r7:
return (char*) &regd->x87FPURegisters[7];
case x87st0:
return (char*) &regd->x87FPURegisters[regd->x87StatusWordFields.TOP & 7];
case x87st1:
return (char*) &regd->x87FPURegisters[(regd->x87StatusWordFields.TOP + 1) & 7];
case x87st2:
return (char*) &regd->x87FPURegisters[(regd->x87StatusWordFields.TOP + 2) & 7];
case x87st3:
return (char*) &regd->x87FPURegisters[(regd->x87StatusWordFields.TOP + 3) & 7];
case x87st4:
return (char*) &regd->x87FPURegisters[(regd->x87StatusWordFields.TOP + 4) & 7];
case x87st5:
return (char*) &regd->x87FPURegisters[(regd->x87StatusWordFields.TOP + 5) & 7];
case x87st6:
return (char*) &regd->x87FPURegisters[(regd->x87StatusWordFields.TOP + 6) & 7];
case x87st7:
return (char*) &regd->x87FPURegisters[(regd->x87StatusWordFields.TOP + 7) & 7];
case x87TagWord:
return (char*) &regd->regcontext.x87fpu.TagWord;
@ -3456,6 +3491,7 @@ void RegistersView::onSIMDMode()
void RegistersView::onFpuMode()
{
mFpuMode = !mFpuMode;
InitMappings();
emit refresh();
}