From 67a24b1924c9025b3b31c2f44d83534eb4ebbea8 Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Fri, 9 Jul 2021 14:46:17 +0200 Subject: mb86233: Fix flags behaviour on -0, seems to fix virtua fighter and motorraid [Ryan Holtz] --- src/devices/cpu/mb86233/mb86233.cpp | 55 ++++++++++++++++++++----------------- src/devices/cpu/mb86233/mb86233.h | 1 + src/mame/drivers/model1.cpp | 4 --- 3 files changed, 31 insertions(+), 29 deletions(-) diff --git a/src/devices/cpu/mb86233/mb86233.cpp b/src/devices/cpu/mb86233/mb86233.cpp index b69cad9639c..3434faa7fbc 100644 --- a/src/devices/cpu/mb86233/mb86233.cpp +++ b/src/devices/cpu/mb86233/mb86233.cpp @@ -277,6 +277,11 @@ void mb86233_device::testdz() m_st &= ~F_SGD; } +void mb86233_device::stset_set_sz(u32 val) +{ + m_alu_stset = (val & 0x7fffffff) ? (val & 0x80000000 ? F_SGD : 0) : F_ZRD; +} + void mb86233_device::alu_pre(u32 alu) { switch(alu) { @@ -286,7 +291,7 @@ void mb86233_device::alu_pre(u32 alu) // andd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = m_d & m_a; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } @@ -294,15 +299,15 @@ void mb86233_device::alu_pre(u32 alu) // orad m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = m_d | m_a; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } case 0x03: { // eord m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; - m_alu_r1 = m_d ^ m_a; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + m_alu_r1 = m_d ^ m_a; + stset_set_sz(m_alu_r1); break; } @@ -310,7 +315,7 @@ void mb86233_device::alu_pre(u32 alu) // notd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = ~m_d; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } @@ -318,7 +323,7 @@ void mb86233_device::alu_pre(u32 alu) // fcpd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; u32 r = f2u(u2f(m_d) - u2f(m_a)); - m_alu_stset = r ? r & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(r); break; } @@ -326,7 +331,7 @@ void mb86233_device::alu_pre(u32 alu) // fmad m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = f2u(u2f(m_d) + u2f(m_a)); - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } @@ -334,7 +339,7 @@ void mb86233_device::alu_pre(u32 alu) // fsbd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = f2u(u2f(m_d) - u2f(m_a)); - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } @@ -351,7 +356,7 @@ void mb86233_device::alu_pre(u32 alu) m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = f2u(u2f(m_d) + u2f(m_p)); m_alu_r2 = f2u(u2f(m_a) * u2f(m_b)); - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } @@ -360,7 +365,7 @@ void mb86233_device::alu_pre(u32 alu) m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = f2u(u2f(m_d) - u2f(m_p)); m_alu_r2 = f2u(u2f(m_a) * u2f(m_b)); - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } @@ -368,7 +373,7 @@ void mb86233_device::alu_pre(u32 alu) // fabd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = m_d & 0x7fffffff; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } @@ -376,7 +381,7 @@ void mb86233_device::alu_pre(u32 alu) // fsmd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = f2u(u2f(m_d) + u2f(m_p)); - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } @@ -385,7 +390,7 @@ void mb86233_device::alu_pre(u32 alu) m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = m_p; m_alu_r2 = f2u(u2f(m_a) * u2f(m_b)); - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } @@ -393,7 +398,7 @@ void mb86233_device::alu_pre(u32 alu) // cxfd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = f2u(s32(m_d)); - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } @@ -406,7 +411,7 @@ void mb86233_device::alu_pre(u32 alu) case 2: m_alu_r1 = s32(floorf(u2f(m_d))); break; case 3: m_alu_r1 = s32(u2f(m_d)); break; } - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } @@ -414,7 +419,7 @@ void mb86233_device::alu_pre(u32 alu) // fdvd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = f2u(u2f(m_d) / u2f(m_a)); - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } @@ -422,7 +427,7 @@ void mb86233_device::alu_pre(u32 alu) // fned m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = m_d ? m_d ^ 0x80000000 : 0; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } @@ -430,7 +435,7 @@ void mb86233_device::alu_pre(u32 alu) // d = b + a m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = f2u(u2f(m_b) + u2f(m_a)); - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } @@ -438,7 +443,7 @@ void mb86233_device::alu_pre(u32 alu) // d = b - a m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = f2u(u2f(m_b) - u2f(m_a)); - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } @@ -446,7 +451,7 @@ void mb86233_device::alu_pre(u32 alu) // lsrd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = m_d >> m_sft; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } @@ -454,7 +459,7 @@ void mb86233_device::alu_pre(u32 alu) // lsld m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = m_d << m_sft; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } @@ -462,7 +467,7 @@ void mb86233_device::alu_pre(u32 alu) // asrd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = s32(m_d) >> m_sft; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } @@ -470,7 +475,7 @@ void mb86233_device::alu_pre(u32 alu) // asld m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = s32(m_d) << m_sft; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } @@ -478,7 +483,7 @@ void mb86233_device::alu_pre(u32 alu) // addd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = m_d + m_a; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } @@ -486,7 +491,7 @@ void mb86233_device::alu_pre(u32 alu) // subd m_alu_stmask = F_ZRD|F_SGD|F_CPD|F_OVD|F_DVZD; m_alu_r1 = m_d - m_a; - m_alu_stset = m_alu_r1 ? m_alu_r1 & 0x80000000 ? F_SGD : 0 : F_ZRD; + stset_set_sz(m_alu_r1); break; } diff --git a/src/devices/cpu/mb86233/mb86233.h b/src/devices/cpu/mb86233/mb86233.h index 611eb1e5b33..1da3750f5fc 100644 --- a/src/devices/cpu/mb86233/mb86233.h +++ b/src/devices/cpu/mb86233/mb86233.h @@ -120,6 +120,7 @@ private: void ea_post_1(u32 r); void pcs_push(); void pcs_pop(); + inline void stset_set_sz(u32 val); u32 read_reg(u32 r); void write_reg(u32 r, u32 v); diff --git a/src/mame/drivers/model1.cpp b/src/mame/drivers/model1.cpp index cb233c62586..25be0afe5db 100644 --- a/src/mame/drivers/model1.cpp +++ b/src/mame/drivers/model1.cpp @@ -7,10 +7,6 @@ Known functional issues: * After recent changes, ship models periodically disappear for a frame or two during attract mode and while in-game. * There are indeterminate issues with the analog controls in-game. -- Virtua Fighter - * Gameplay mechanics - specifically, collision detection - are significantly broken due to - imperfect TGP RAM port emulation or hookup. This is observable in both attract mode and - in-game. It seems to break when both characters attack at the same time. Sega Model 1 Hardware Overview ------------------------------ -- cgit v1.2.3