From c0a2d627332085f93e544a2206e219b5e6025447 Mon Sep 17 00:00:00 2001 From: hap Date: Fri, 1 Mar 2024 23:52:24 +0100 Subject: [PATCH] h8: fix addx8/subx8 H flag when C=1 --- src/devices/cpu/h8/h8.cpp | 58 ++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/src/devices/cpu/h8/h8.cpp b/src/devices/cpu/h8/h8.cpp index b1b342bedf2..b9bb981b95b 100644 --- a/src/devices/cpu/h8/h8.cpp +++ b/src/devices/cpu/h8/h8.cpp @@ -612,13 +612,14 @@ int h8_device::trapa_setup() u8 h8_device::do_addx8(u8 v1, u8 v2) { - u16 res = v1 + v2 + (m_CCR & F_C ? 1 : 0); + u8 c = (m_CCR & F_C) ? 1 : 0; + u16 res = v1 + v2 + c; m_CCR &= ~(F_N|F_V|F_C); - if(m_has_hc) - { - m_CCR &= ~F_H; - if(((v1 & 0xf) + (v2 & 0xf) + (m_CCR & F_C ? 1 : 0)) & 0x10) + if(m_has_hc) { + if(((v1 & 0xf) + (v2 & 0xf) + c) & 0x10) m_CCR |= F_H; + else + m_CCR &= ~F_H; } if(u8(res)) m_CCR &= ~F_Z; @@ -633,13 +634,14 @@ u8 h8_device::do_addx8(u8 v1, u8 v2) u8 h8_device::do_subx8(u8 v1, u8 v2) { - u16 res = v1 - v2 - (m_CCR & F_C ? 1 : 0); + u8 c = (m_CCR & F_C) ? 1 : 0; + u16 res = v1 - v2 - c; m_CCR &= ~(F_N|F_V|F_C); - if(m_has_hc) - { - m_CCR &= ~F_H; - if(((v1 & 0xf) - (v2 & 0xf) - (m_CCR & F_C ? 1 : 0)) & 0x10) + if(m_has_hc) { + if(((v1 & 0xf) - (v2 & 0xf) - c) & 0x10) m_CCR |= F_H; + else + m_CCR &= ~F_H; } if(u8(res)) m_CCR &= ~F_Z; @@ -695,11 +697,11 @@ u8 h8_device::do_add8(u8 v1, u8 v2) { u16 res = v1 + v2; m_CCR &= ~(F_N|F_V|F_Z|F_C); - if(m_has_hc) - { - m_CCR &= ~F_H; + if(m_has_hc) { if(((v1 & 0xf) + (v2 & 0xf)) & 0x10) m_CCR |= F_H; + else + m_CCR &= ~F_H; } if(!u8(res)) m_CCR |= F_Z; @@ -716,11 +718,11 @@ u16 h8_device::do_add16(u16 v1, u16 v2) { u32 res = v1 + v2; m_CCR &= ~(F_N|F_V|F_Z|F_C); - if(m_has_hc) - { - m_CCR &= ~F_H; + if(m_has_hc) { if(((v1 & 0xfff) + (v2 & 0xfff)) & 0x1000) m_CCR |= F_H; + else + m_CCR &= ~F_H; } if(!u16(res)) m_CCR |= F_Z; @@ -737,11 +739,11 @@ u32 h8_device::do_add32(u32 v1, u32 v2) { u64 res = u64(v1) + u64(v2); m_CCR &= ~(F_N|F_V|F_Z|F_C); - if(m_has_hc) - { - m_CCR &= ~F_H; + if(m_has_hc) { if(((v1 & 0xfffffff) + (v2 & 0xfffffff)) & 0x10000000) m_CCR |= F_H; + else + m_CCR &= ~F_H; } if(!u32(res)) m_CCR |= F_Z; @@ -797,11 +799,11 @@ u8 h8_device::do_sub8(u8 v1, u8 v2) { u16 res = v1 - v2; m_CCR &= ~(F_N|F_V|F_Z|F_C); - if(m_has_hc) - { - m_CCR &= ~F_H; + if(m_has_hc) { if(((v1 & 0xf) - (v2 & 0xf)) & 0x10) m_CCR |= F_H; + else + m_CCR &= ~F_H; } if(!u8(res)) m_CCR |= F_Z; @@ -818,11 +820,11 @@ u16 h8_device::do_sub16(u16 v1, u16 v2) { u32 res = v1 - v2; m_CCR &= ~(F_N|F_V|F_Z|F_C); - if(m_has_hc) - { - m_CCR &= ~F_H; + if(m_has_hc) { if(((v1 & 0xfff) - (v2 & 0xfff)) & 0x1000) m_CCR |= F_H; + else + m_CCR &= ~F_H; } if(!u16(res)) m_CCR |= F_Z; @@ -839,11 +841,11 @@ u32 h8_device::do_sub32(u32 v1, u32 v2) { u64 res = u64(v1) - u64(v2); m_CCR &= ~(F_N|F_V|F_Z|F_C); - if(m_has_hc) - { - m_CCR &= ~F_H; + if(m_has_hc) { if(((v1 & 0xfffffff) - (v2 & 0xfffffff)) & 0x10000000) m_CCR |= F_H; + else + m_CCR &= ~F_H; } if(!u32(res)) m_CCR |= F_Z;