From 9ab7babb525134f1148af8c82aee9e38fd8a3e7f Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Mon, 17 Feb 2020 10:29:28 +0100 Subject: Fix opcodes 20/24 (nw) --- src/devices/cpu/xavix2/xavix2.cpp | 4 ++-- src/devices/cpu/xavix2/xavix2d.cpp | 13 +++++++++++-- src/devices/cpu/xavix2/xavix2d.h | 1 + 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/devices/cpu/xavix2/xavix2.cpp b/src/devices/cpu/xavix2/xavix2.cpp index c8c93d62530..670195ac48e 100644 --- a/src/devices/cpu/xavix2/xavix2.cpp +++ b/src/devices/cpu/xavix2/xavix2.cpp @@ -233,9 +233,9 @@ void xavix2_device::execute_run() case 0x1c: case 0x1d: m_program->write_word(m_r[r2(opcode)] + val19s(opcode), m_r[r1(opcode)]); break; case 0x1e: case 0x1f: m_program->write_dword(m_r[r2(opcode)] + val19s(opcode), m_r[r1(opcode)]); break; - case 0x20: case 0x21: m_r[r1(opcode)] = do_add(m_r[r1(opcode)], val14s(opcode)); break; + case 0x20: case 0x21: m_r[r1(opcode)] = do_add(m_r[r2(opcode)], val11s(opcode)); break; case 0x22: case 0x23: m_r[r1(opcode)] = val14h(opcode); break; - case 0x24: case 0x25: m_r[r1(opcode)] = do_sub(m_r[r1(opcode)], val14s(opcode)); break; + case 0x24: case 0x25: m_r[r1(opcode)] = do_sub(m_r[r2(opcode)], val11s(opcode)); break; case 0x26: case 0x27: do_sub(m_r[r1(opcode)], val14s(opcode)); break; case 0x28: npc = m_pc + val16s(opcode); break; case 0x29: m_r[7] = npc; npc = m_pc + val16s(opcode); break; diff --git a/src/devices/cpu/xavix2/xavix2d.cpp b/src/devices/cpu/xavix2/xavix2d.cpp index fe4a24a244c..f9c0d085a8a 100644 --- a/src/devices/cpu/xavix2/xavix2d.cpp +++ b/src/devices/cpu/xavix2/xavix2d.cpp @@ -86,6 +86,15 @@ std::string xavix2_disassembler::val14sa() return util::string_format("%04x", r); } +std::string xavix2_disassembler::val11s() +{ + u16 r = (m_opcode >> 8) & 0x7ff; + if(r & 0x400) + return util::string_format("-%03x", 0x800 - r); + else + return util::string_format("%03x", r); +} + std::string xavix2_disassembler::val11u() { return util::string_format("%03x", (m_opcode >> 8) & 0x7ff); @@ -214,9 +223,9 @@ offs_t xavix2_disassembler::disassemble(std::ostream &stream, offs_t pc, const d case 0x1c: case 0x1d: util::stream_format(stream, "(%s%s).w = %s", r2(), off19s(), r1()); break; case 0x1e: case 0x1f: util::stream_format(stream, "(%s%s).l = %s", r2(), off19s(), r1()); break; - case 0x20: case 0x21: util::stream_format(stream, "%s += %s", r1(), val14s()); break; + case 0x20: case 0x21: util::stream_format(stream, "%s = %s + %s", r1(), r2(), val11s()); break; case 0x22: case 0x23: util::stream_format(stream, "%s = %s", r1(), val14h()); break; - case 0x24: case 0x25: util::stream_format(stream, "%s -= %s", r1(), val14s()); break; + case 0x24: case 0x25: util::stream_format(stream, "%s = %s - %s", r1(), r2(), val11s()); break; case 0x26: case 0x27: util::stream_format(stream, "cmp %s, %s", r1(), val14s()); break; case 0x28: util::stream_format(stream, "bra %s", rel16()); break; case 0x29: util::stream_format(stream, "bsr %s", rel16()); flags = STEP_OVER; break; diff --git a/src/devices/cpu/xavix2/xavix2d.h b/src/devices/cpu/xavix2/xavix2d.h index 4ec772f012c..cd049e423fd 100644 --- a/src/devices/cpu/xavix2/xavix2d.h +++ b/src/devices/cpu/xavix2/xavix2d.h @@ -34,6 +34,7 @@ private: std::string val14u(); std::string val14s(); std::string val14sa(); + std::string val11s(); std::string val11u(); std::string val6u(); std::string val6s(); -- cgit v1.2.3