mirror of
https://github.com/holub/mame
synced 2025-04-22 08:22:15 +03:00
mb86233: Fix flags behaviour on -0, seems to fix virtua fighter and motorraid [Ryan Holtz]
This commit is contained in:
parent
1c268bd116
commit
67a24b1924
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
------------------------------
|
||||
|
Loading…
Reference in New Issue
Block a user