summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2020-02-17 10:29:28 +0100
committer Olivier Galibert <galibert@pobox.com>2020-02-17 10:29:44 +0100
commit9ab7babb525134f1148af8c82aee9e38fd8a3e7f (patch)
tree4afd9f08034091dfb30f4ea7a425d9f8f1f5fac4
parentcbd2e2d69c25c7c54507a395885669d1a4eb6988 (diff)
Fix opcodes 20/24 (nw)
-rw-r--r--src/devices/cpu/xavix2/xavix2.cpp4
-rw-r--r--src/devices/cpu/xavix2/xavix2d.cpp13
-rw-r--r--src/devices/cpu/xavix2/xavix2d.h1
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();