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