summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/x86log.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/x86log.cpp')
-rw-r--r--src/devices/cpu/x86log.cpp30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/devices/cpu/x86log.cpp b/src/devices/cpu/x86log.cpp
index 03552877128..b97f2553f11 100644
--- a/src/devices/cpu/x86log.cpp
+++ b/src/devices/cpu/x86log.cpp
@@ -96,6 +96,30 @@ void x86log_mark_as_data(x86log_context *log, x86code *base, x86code *end, int s
of code and reset accumulated information
-------------------------------------------------*/
+namespace {
+ class x86_buf : public util::disasm_interface::data_buffer {
+ public:
+ x86_buf(offs_t _base_pc, const u8 *_buf) : base_pc(_base_pc), buf(_buf) {}
+ ~x86_buf() = default;
+
+ // We know we're on a x86, so we can go short
+ virtual u8 r8 (offs_t pc) const override { return *(u8 *)(buf + pc - base_pc); }
+ virtual u16 r16(offs_t pc) const override { return *(u16 *)(buf + pc - base_pc); }
+ virtual u32 r32(offs_t pc) const override { return *(u32 *)(buf + pc - base_pc); }
+ virtual u64 r64(offs_t pc) const override { return *(u64 *)(buf + pc - base_pc); }
+
+ private:
+ offs_t base_pc;
+ const u8 *buf;
+ };
+
+ class x86_config : public i386_disassembler::config {
+ public:
+ ~x86_config() = default;
+ virtual int get_mode() const override { return sizeof(void *) * 8; };
+ };
+}
+
void x86log_disasm_code_range(x86log_context *log, const char *label, x86code *start, x86code *stop)
{
const log_comment *lastcomment = &log->comment_list[log->comment_count];
@@ -147,7 +171,11 @@ void x86log_disasm_code_range(x86log_context *log, const char *label, x86code *s
else
{
std::stringstream strbuffer;
- bytes = i386_dasm_one_ex(strbuffer, (uintptr_t)cur, cur, sizeof(void *) * 8) & DASMFLAG_LENGTHMASK;
+ offs_t pc = (uintptr_t)cur;
+ x86_buf buf(pc, cur);
+ x86_config conf;
+ i386_disassembler dis(&conf);
+ bytes = dis.disassemble(strbuffer, pc, buf, buf) & util::disasm_interface::LENGTHMASK;
buffer = strbuffer.str();
}