From db37036a123de99986c8c295865a46ae3ccd4e71 Mon Sep 17 00:00:00 2001 From: Patrick Mackinlay Date: Thu, 11 Jan 2024 11:33:25 +0700 Subject: [PATCH] ns32000: implement addp/subp instructions --- src/devices/cpu/ns32000/ns32000.cpp | 76 +++++++++++++++++++++++++++-- 1 file changed, 72 insertions(+), 4 deletions(-) diff --git a/src/devices/cpu/ns32000/ns32000.cpp b/src/devices/cpu/ns32000/ns32000.cpp index 4893f3b5610..b4076283c3c 100644 --- a/src/devices/cpu/ns32000/ns32000.cpp +++ b/src/devices/cpu/ns32000/ns32000.cpp @@ -2261,9 +2261,43 @@ template void ns32000_device::execute_run() // SUBPi src,dst // gen,gen // read.i,rmw.i - fatalerror("unimplemented: subp (%s)\n", machine().describe_context()); + { + mode[0].read_i(size); + mode[1].rmw_i(size); + decode(mode, bytes); - // TODO: tcy 16/18 + u32 const src1 = gen_read(mode[0]); + u32 const src2 = gen_read(mode[1]); + + // binary coded decimal subtraction with carry + // TODO: CHECK + u32 dst = 0; + bool carry = m_psr & PSR_C; + unsigned const tcy = carry ? 18 : 16; + for (unsigned digit = 0; digit < (size + 1) * 2; digit++) + { + signed sum = BIT(src2, digit * 4, 4) - BIT(src1, digit * 4, 4) - carry; + + if (sum < 0) + { + sum = sum + 10; + carry = true; + } + else + carry = false; + + dst |= sum << digit * 4; + } + + if (carry) + m_psr |= PSR_C; + else + m_psr &= ~PSR_C; + + gen_write(mode[1], dst); + + tex = mode[0].tea + mode[1].tea + tcy; + } break; case 0xc: // ABSi src,dst @@ -2346,9 +2380,43 @@ template void ns32000_device::execute_run() // ADDPi src,dst // gen,gen // read.i,rmw.i - fatalerror("unimplemented: addp (%s)\n", machine().describe_context()); + { + mode[0].read_i(size); + mode[1].rmw_i(size); + decode(mode, bytes); - // TODO: tcy 16/18 + u32 const src1 = gen_read(mode[0]); + u32 const src2 = gen_read(mode[1]); + + // binary coded decimal addition with carry + // TODO: CHECK + u32 dst = 0; + bool carry = m_psr & PSR_C; + unsigned const tcy = carry ? 18 : 16; + for (unsigned digit = 0; digit < (size + 1) * 2; digit++) + { + unsigned sum = BIT(src1, digit * 4, 4) + BIT(src2, digit * 4, 4) + carry; + + if (sum > 9) + { + sum = sum - 10; + carry = true; + } + else + carry = false; + + dst |= sum << digit * 4; + } + + if (carry) + m_psr |= PSR_C; + else + m_psr &= ~PSR_C; + + gen_write(mode[1], dst); + + tex = mode[0].tea + mode[1].tea + tcy; + } break; } }