From 631e01d984c935f859245e842f859bc2b9e411d2 Mon Sep 17 00:00:00 2001 From: Ricardo Barreira Date: Tue, 21 Nov 2017 21:33:18 +0000 Subject: [PATCH 1/2] Added some more unknown instructions. --- src/devices/cpu/hcd62121/hcd62121.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/devices/cpu/hcd62121/hcd62121.cpp b/src/devices/cpu/hcd62121/hcd62121.cpp index 34f3bb4ff1b..79b101e6cf3 100644 --- a/src/devices/cpu/hcd62121/hcd62121.cpp +++ b/src/devices/cpu/hcd62121/hcd62121.cpp @@ -1480,10 +1480,10 @@ void hcd62121_cpu_device::execute_run() } break; - case 0xC0: /* movb reg,i8 */ // TODO - test + //case 0xC0: /* movb reg,i8 */ // TODO - test case 0xC1: /* movw reg,i16 */ - case 0xC2: /* movw reg,i64 */ // TODO - test - case 0xC3: /* movw reg,i80 */ // TODO - test + //case 0xC2: /* movw reg,i64 */ // TODO - test + //case 0xC3: /* movw reg,i80 */ // TODO - test { int size = datasize(op); u8 reg = read_op(); @@ -1669,7 +1669,12 @@ void hcd62121_cpu_device::execute_run() break; case 0xE3: /* movb reg,dsize */ - m_reg[read_op() & 0x7f] = m_dsize; + { + u8 reg = read_op(); + if (reg & 0x80) + fatalerror("%02x:%04x: unimplemented instruction %02x encountered with (arg & 0x80) != 0\n", m_cseg, m_ip-1, op); + m_reg[reg & 0x7f] = m_dsize; + } break; case 0xE4: /* movb reg,f */ @@ -1719,9 +1724,7 @@ void hcd62121_cpu_device::execute_run() case 0xF1: /* unk_F1 reg/i8 (out?) */ case 0xF3: /* unk_F3 reg/i8 (out?) */ - case 0xF4: /* unk_F4 reg/i8 (out?) */ case 0xF5: /* unk_F5 reg/i8 (out?) */ - case 0xF6: /* unk_F6 reg/i8 (out?) */ case 0xF7: /* unk_F7 reg/i8 (out?) */ logerror("%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op); read_op(); From 3fd99bb3bbc160c7436d5bed7a66c34b46cd93b8 Mon Sep 17 00:00:00 2001 From: Ricardo Barreira Date: Thu, 23 Nov 2017 00:45:54 +0000 Subject: [PATCH 2/2] hcd62121: Fixed some silly mistakes in CL flag calculations. --- src/devices/cpu/hcd62121/hcd62121.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/devices/cpu/hcd62121/hcd62121.cpp b/src/devices/cpu/hcd62121/hcd62121.cpp index 79b101e6cf3..2c42e7881f6 100644 --- a/src/devices/cpu/hcd62121/hcd62121.cpp +++ b/src/devices/cpu/hcd62121/hcd62121.cpp @@ -701,10 +701,12 @@ inline void hcd62121_cpu_device::op_addb(int size) bool zero_low = true; u8 carry = 0; - set_cl_flag((m_temp1[size-1] & 0x0f) + (m_temp2[size-1] & 0x0f) > 9); - for (int i = 0; i < size; i++) { + if (i == size - 1) { + set_cl_flag((m_temp1[i] & 0x0f) + (m_temp2[i] & 0x0f) + carry > 9); + } + int num1 = (m_temp1[i] & 0x0f) + ((m_temp1[i] & 0xf0) >> 4) * 10; int num2 = (m_temp2[i] & 0x0f) + ((m_temp2[i] & 0xf0) >> 4) * 10; @@ -734,10 +736,12 @@ inline void hcd62121_cpu_device::op_subb(int size) bool zero_low = true; u8 carry = 0; - set_cl_flag((m_temp1[size-1] & 0x0f) < (m_temp2[size-1] & 0x0f)); - for (int i = 0; i < size; i++) { + if (i == size - 1) { + set_cl_flag((m_temp1[i] & 0x0f) - (m_temp2[i] & 0x0f) - carry < 0); + } + int num1 = (m_temp1[i] & 0x0f) + ((m_temp1[i] & 0xf0) >> 4) * 10; int num2 = (m_temp2[i] & 0x0f) + ((m_temp2[i] & 0xf0) >> 4) * 10; @@ -766,8 +770,6 @@ inline void hcd62121_cpu_device::op_sub(int size) bool zero_low = true; u8 carry = 0; - set_cl_flag((m_temp1[0] & 0x0f) < (m_temp2[0] & 0x0f)); - for (int i = 0; i < size; i++) { if (i == size - 1) {