rpcsx/rpcs3/Emu/CPU/CPUDisAsm.h

65 lines
1.1 KiB
C
Raw Normal View History

#pragma once
enum CPUDisAsmMode
{
CPUDisAsm_DumpMode,
CPUDisAsm_InterpreterMode,
//CPUDisAsm_NormalMode,
CPUDisAsm_CompilerElfMode,
};
class CPUDisAsm
{
protected:
const CPUDisAsmMode m_mode;
virtual void Write(const std::string& value)
{
switch(m_mode)
{
case CPUDisAsm_DumpMode:
last_opcode = fmt::format("\t%08x:\t%02x %02x %02x %02x\t%s\n", dump_pc,
2014-08-22 16:21:55 +02:00
offset[dump_pc],
offset[dump_pc + 1],
offset[dump_pc + 2],
offset[dump_pc + 3], value);
break;
case CPUDisAsm_InterpreterMode:
last_opcode = fmt::format("[%08x] %02x %02x %02x %02x: %s", dump_pc,
2014-08-22 16:21:55 +02:00
offset[dump_pc],
offset[dump_pc + 1],
offset[dump_pc + 2],
offset[dump_pc + 3], value);
break;
case CPUDisAsm_CompilerElfMode:
last_opcode = value + "\n";
break;
}
}
public:
std::string last_opcode;
2014-09-15 00:17:24 +02:00
u32 dump_pc;
const u8* offset;
protected:
CPUDisAsm(CPUDisAsmMode mode)
: m_mode(mode)
, offset(0)
{
}
2016-04-14 00:59:00 +02:00
virtual u32 DisAsmBranchTarget(const s32 imm) = 0;
std::string FixOp(std::string op)
{
2016-04-14 00:59:00 +02:00
op.resize(std::max<std::size_t>(op.length(), 10), ' ');
return op;
}
2016-04-14 00:59:00 +02:00
public:
virtual u32 disasm(u32 pc) = 0;
2013-11-19 11:30:58 +01:00
};