diff --git a/pcsx2/x86/ix86-32/iR5900.cpp b/pcsx2/x86/ix86-32/iR5900.cpp index a75e23c448..f58f9ec0fd 100644 --- a/pcsx2/x86/ix86-32/iR5900.cpp +++ b/pcsx2/x86/ix86-32/iR5900.cpp @@ -121,6 +121,116 @@ static void pauseAAA() #ifdef DUMP_BLOCKS static ZydisFormatterFunc s_old_print_address; +static ZydisFormatterFunc s_old_print_disp; + +static int Address2Symbol(u64 address, char* buf) +{ + u32 len = 0; + +#define A(x) ((u64)(x)) + + if (address >= A(eeMem->Main) && address < A(eeMem->Scratch)) + { + len = sprintf(buf, "eeMem+0x%08X", static_cast(address - A(eeMem->Main))); + } + else if (address >= A(eeMem->Scratch) && address < A(eeMem->ROM)) + { + len = sprintf(buf, "eeScratchpad+0x%08X", static_cast(address - A(eeMem->Scratch))); + } + else if (address >= A(&cpuRegs.GPR) && address < A(&cpuRegs.HI)) + { + const u32 offset = static_cast(address - A(&cpuRegs)) % 16u; + if (offset != 0) + len = sprintf(buf, "cpuRegs.GPR.%s+%u", GPR_REG[static_cast(address - A(&cpuRegs)) / 16u], offset); + else + len = sprintf(buf, "cpuRegs.GPR.%s", GPR_REG[static_cast(address - A(&cpuRegs)) / 16u]); + } + else if (address >= A(&cpuRegs.HI) && address < A(&cpuRegs.CP0)) + { + const u32 offset = static_cast(address - A(&cpuRegs.HI)) % 16u; + if (offset != 0) + len = sprintf(buf, "cpuRegs.%s+%u", (address >= A(&cpuRegs.LO) ? "LO" : "HI"), offset); + else + len = sprintf(buf, "cpuRegs.%s", (address >= A(&cpuRegs.LO) ? "LO" : "HI")); + } + else if (address == A(&cpuRegs.pc)) + { + len = sprintf(buf, "cpuRegs.pc"); + } + else if (address == A(&cpuRegs.cycle)) + { + len = sprintf(buf, "cpuRegs.cycle"); + } + else if (address == A(&cpuRegs.nextEventCycle)) + { + len = sprintf(buf, "cpuRegs.nextEventCycle"); + } + else if (address >= A(fpuRegs.fpr) && address < A(fpuRegs.fprc)) + { + len = sprintf(buf, "fpuRegs.f%02u", static_cast(address - A(fpuRegs.fpr)) / 4u); + } + else if (address >= A(&VU0.VF[0]) && address < A(&VU0.VI[0])) + { + const u32 offset = static_cast(address - A(&VU0.VF[0])) % 16u; + if (offset != 0) + len = sprintf(buf, "VU0.VF[%02u]+%u", static_cast(address - A(&VU0.VF[0])) / 16u, offset); + else + len = sprintf(buf, "VU0.VF[%02u]", static_cast(address - A(&VU0.VF[0])) / 16u); + } + else if (address >= A(&VU0.VI[0]) && address < A(&VU0.ACC)) + { + const u32 offset = static_cast(address - A(&VU0.VI[0])) % 16u; + const u32 vi = static_cast(address - A(&VU0.VI[0])) / 16u; + if (offset != 0) + len = sprintf(buf, "VU0.%s+%u", COP2_REG_CTL[vi], offset); + else + len = sprintf(buf, "VU0.%s", COP2_REG_CTL[vi]); + } + else if (address >= A(&VU0.ACC) && address < A(&VU0.q)) + { + const u32 offset = static_cast(address - A(&VU0.ACC)); + if (offset != 0) + len = sprintf(buf, "VU0.ACC+%u", offset); + else + len = sprintf(buf, "VU0.ACC"); + } + else if (address >= A(&VU0.q) && address < A(&VU0.idx)) + { + const u32 offset = static_cast(address - A(&VU0.q)) % 16u; + const char* reg = (address >= A(&VU0.p)) ? "p" : "q"; + if (offset != 0) + len = sprintf(buf, "VU0.%s+%u", reg, offset); + else + len = sprintf(buf, "VU0.%s", reg); + } + +#undef A + + return len; +} + +static ZyanStatus ZydisFormatterPrintDisplacement(const ZydisFormatter* formatter, + ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) +{ + char buf[128]; + u32 len = 0; + u64 address = (u64)R5900_TEXTPTR + context->operand->mem.disp.value; + + // hardcoded RTEXTPTR + if (context->operand->mem.base == ZYDIS_REGISTER_RBX) { + len = Address2Symbol(address, buf); + } + + if (len > 0) + { + ZYAN_CHECK(ZydisFormatterBufferAppend(buffer, ZYDIS_TOKEN_SYMBOL)); + ZyanString* string; + ZYAN_CHECK(ZydisFormatterBufferGetString(buffer, &string)); + return ZyanStringAppendFormat(string, "-%s+&%s", "R5900_TEXTPTR", buf); + } + + return s_old_print_disp(formatter, buffer, context); +} static ZyanStatus ZydisFormatterPrintAddressAbsolute(const ZydisFormatter* formatter, ZydisFormatterBuffer* buffer, ZydisFormatterContext* context) @@ -132,84 +242,7 @@ static ZyanStatus ZydisFormatterPrintAddressAbsolute(const ZydisFormatter* forma char buf[128]; u32 len = 0; -#define A(x) ((u64)(x)) - - if (address >= A(eeMem->Main) && address < A(eeMem->Scratch)) - { - len = snprintf(buf, sizeof(buf), "eeMem+0x%08X", static_cast(address - A(eeMem->Main))); - } - else if (address >= A(eeMem->Scratch) && address < A(eeMem->ROM)) - { - len = snprintf(buf, sizeof(buf), "eeScratchpad+0x%08X", static_cast(address - A(eeMem->Scratch))); - } - else if (address >= A(&cpuRegs.GPR) && address < A(&cpuRegs.HI)) - { - const u32 offset = static_cast(address - A(&cpuRegs)) % 16u; - if (offset != 0) - len = snprintf(buf, sizeof(buf), "cpuRegs.GPR.%s+%u", GPR_REG[static_cast(address - A(&cpuRegs)) / 16u], offset); - else - len = snprintf(buf, sizeof(buf), "cpuRegs.GPR.%s", GPR_REG[static_cast(address - A(&cpuRegs)) / 16u]); - } - else if (address >= A(&cpuRegs.HI) && address < A(&cpuRegs.CP0)) - { - const u32 offset = static_cast(address - A(&cpuRegs.HI)) % 16u; - if (offset != 0) - len = snprintf(buf, sizeof(buf), "cpuRegs.%s+%u", (address >= A(&cpuRegs.LO) ? "LO" : "HI"), offset); - else - len = snprintf(buf, sizeof(buf), "cpuRegs.%s", (address >= A(&cpuRegs.LO) ? "LO" : "HI")); - } - else if (address == A(&cpuRegs.pc)) - { - len = snprintf(buf, sizeof(buf), "cpuRegs.pc"); - } - else if (address == A(&cpuRegs.cycle)) - { - len = snprintf(buf, sizeof(buf), "cpuRegs.cycle"); - } - else if (address == A(&cpuRegs.nextEventCycle)) - { - len = snprintf(buf, sizeof(buf), "cpuRegs.nextEventCycle"); - } - else if (address >= A(fpuRegs.fpr) && address < A(fpuRegs.fprc)) - { - len = snprintf(buf, sizeof(buf), "fpuRegs.f%02u", static_cast(address - A(fpuRegs.fpr)) / 4u); - } - else if (address >= A(&VU0.VF[0]) && address < A(&VU0.VI[0])) - { - const u32 offset = static_cast(address - A(&VU0.VF[0])) % 16u; - if (offset != 0) - len = snprintf(buf, sizeof(buf), "VU0.VF[%02u]+%u", static_cast(address - A(&VU0.VF[0])) / 16u, offset); - else - len = snprintf(buf, sizeof(buf), "VU0.VF[%02u]", static_cast(address - A(&VU0.VF[0])) / 16u); - } - else if (address >= A(&VU0.VI[0]) && address < A(&VU0.ACC)) - { - const u32 offset = static_cast(address - A(&VU0.VI[0])) % 16u; - const u32 vi = static_cast(address - A(&VU0.VI[0])) / 16u; - if (offset != 0) - len = snprintf(buf, sizeof(buf), "VU0.%s+%u", COP2_REG_CTL[vi], offset); - else - len = snprintf(buf, sizeof(buf), "VU0.%s", COP2_REG_CTL[vi]); - } - else if (address >= A(&VU0.ACC) && address < A(&VU0.q)) - { - const u32 offset = static_cast(address - A(&VU0.ACC)); - if (offset != 0) - len = snprintf(buf, sizeof(buf), "VU0.ACC+%u", offset); - else - len = snprintf(buf, sizeof(buf), "VU0.ACC"); - } - else if (address >= A(&VU0.q) && address < A(&VU0.idx)) - { - const u32 offset = static_cast(address - A(&VU0.q)) % 16u; - const char* reg = (address >= A(&VU0.p)) ? "p" : "q"; - if (offset != 0) - len = snprintf(buf, sizeof(buf), "VU0.%s+%u", reg, offset); - else - len = snprintf(buf, sizeof(buf), "VU0.%s", reg); - } - -#undef A + len = Address2Symbol(address, buf); if (len > 0) { @@ -2562,6 +2595,8 @@ StartRecomp: s_old_print_address = (ZydisFormatterFunc)&ZydisFormatterPrintAddressAbsolute; ZydisFormatterSetHook(&disas_formatter, ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS, (const void**)&s_old_print_address); + s_old_print_disp = (ZydisFormatterFunc)&ZydisFormatterPrintDisplacement; + ZydisFormatterSetHook(&disas_formatter, ZYDIS_FORMATTER_FUNC_PRINT_DISP, (const void**)&s_old_print_disp); #if 0 const bool dump_block = (startpc == 0x00000000);