summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2021-07-09 14:46:17 +0200
committer Olivier Galibert <galibert@pobox.com>2021-07-09 14:46:17 +0200
commit67a24b1924c9025b3b31c2f44d83534eb4ebbea8 (patch)
tree47e297725c66a719d8c04c84502e7e5173a23508
parent1c268bd11613f750a8c7946741f79b17f9c87317 (diff)
mb86233: Fix flags behaviour on -0, seems to fix virtua fighter and motorraid [Ryan Holtz]
-rw-r--r--src/devices/cpu/mb86233/mb86233.cpp55
-rw-r--r--src/devices/cpu/mb86233/mb86233.h1
-rw-r--r--src/mame/drivers/model1.cpp4
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
------------------------------