IR5900: DUMP_BLOCKS: Symbolize text ptr relative

This commit is contained in:
Ziemas
2026-06-27 14:26:08 -04:00
committed by Ty
parent ef14238b4e
commit 9f3233224e
+113 -78
View File
@@ -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<u32>(address - A(eeMem->Main)));
}
else if (address >= A(eeMem->Scratch) && address < A(eeMem->ROM))
{
len = sprintf(buf, "eeScratchpad+0x%08X", static_cast<u32>(address - A(eeMem->Scratch)));
}
else if (address >= A(&cpuRegs.GPR) && address < A(&cpuRegs.HI))
{
const u32 offset = static_cast<u32>(address - A(&cpuRegs)) % 16u;
if (offset != 0)
len = sprintf(buf, "cpuRegs.GPR.%s+%u", GPR_REG[static_cast<u32>(address - A(&cpuRegs)) / 16u], offset);
else
len = sprintf(buf, "cpuRegs.GPR.%s", GPR_REG[static_cast<u32>(address - A(&cpuRegs)) / 16u]);
}
else if (address >= A(&cpuRegs.HI) && address < A(&cpuRegs.CP0))
{
const u32 offset = static_cast<u32>(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<u32>(address - A(fpuRegs.fpr)) / 4u);
}
else if (address >= A(&VU0.VF[0]) && address < A(&VU0.VI[0]))
{
const u32 offset = static_cast<u32>(address - A(&VU0.VF[0])) % 16u;
if (offset != 0)
len = sprintf(buf, "VU0.VF[%02u]+%u", static_cast<u32>(address - A(&VU0.VF[0])) / 16u, offset);
else
len = sprintf(buf, "VU0.VF[%02u]", static_cast<u32>(address - A(&VU0.VF[0])) / 16u);
}
else if (address >= A(&VU0.VI[0]) && address < A(&VU0.ACC))
{
const u32 offset = static_cast<u32>(address - A(&VU0.VI[0])) % 16u;
const u32 vi = static_cast<u32>(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<u32>(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<u32>(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<u32>(address - A(eeMem->Main)));
}
else if (address >= A(eeMem->Scratch) && address < A(eeMem->ROM))
{
len = snprintf(buf, sizeof(buf), "eeScratchpad+0x%08X", static_cast<u32>(address - A(eeMem->Scratch)));
}
else if (address >= A(&cpuRegs.GPR) && address < A(&cpuRegs.HI))
{
const u32 offset = static_cast<u32>(address - A(&cpuRegs)) % 16u;
if (offset != 0)
len = snprintf(buf, sizeof(buf), "cpuRegs.GPR.%s+%u", GPR_REG[static_cast<u32>(address - A(&cpuRegs)) / 16u], offset);
else
len = snprintf(buf, sizeof(buf), "cpuRegs.GPR.%s", GPR_REG[static_cast<u32>(address - A(&cpuRegs)) / 16u]);
}
else if (address >= A(&cpuRegs.HI) && address < A(&cpuRegs.CP0))
{
const u32 offset = static_cast<u32>(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<u32>(address - A(fpuRegs.fpr)) / 4u);
}
else if (address >= A(&VU0.VF[0]) && address < A(&VU0.VI[0]))
{
const u32 offset = static_cast<u32>(address - A(&VU0.VF[0])) % 16u;
if (offset != 0)
len = snprintf(buf, sizeof(buf), "VU0.VF[%02u]+%u", static_cast<u32>(address - A(&VU0.VF[0])) / 16u, offset);
else
len = snprintf(buf, sizeof(buf), "VU0.VF[%02u]", static_cast<u32>(address - A(&VU0.VF[0])) / 16u);
}
else if (address >= A(&VU0.VI[0]) && address < A(&VU0.ACC))
{
const u32 offset = static_cast<u32>(address - A(&VU0.VI[0])) % 16u;
const u32 vi = static_cast<u32>(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<u32>(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<u32>(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);