Xavix - CPU flag fixes (improves ttv_mx road) (#4303)

* Xavix - CPU flag fixes (improves ttv_mx road)

* fix road properly (nw)
This commit is contained in:
David Haywood 2018-11-16 15:44:04 +00:00 committed by R. Belmont
parent 74859c84e1
commit 0c74c62a5e
2 changed files with 60 additions and 23 deletions

View File

@ -174,22 +174,26 @@ stam_imp
ldaj_imp
read_pc_noinc();
A = m_j; // TODO: flags
A = m_j;
set_nz(A);
prefetch();
ldak_imp
read_pc_noinc();
A = m_k; // TODO: flags
A = m_k;
set_nz(A);
prefetch();
ldal_imp
read_pc_noinc();
A = m_l; // TODO: flags
A = m_l;
set_nz(A);
prefetch();
ldam_imp
read_pc_noinc();
A = m_m; // TODO: flags
A = m_m;
set_nz(A);
prefetch();
cmpj_imp
@ -239,7 +243,8 @@ spa0_imp
lpa0_imp
read_pc_noinc();
A = (m_pa & 0x0000ff) >> 0; // TODO: Flags?
A = (m_pa & 0x0000ff) >> 0;
set_nz(A);
prefetch();
spa1_imp
@ -249,7 +254,8 @@ spa1_imp
lpa1_imp
read_pc_noinc();
A = (m_pa & 0x00ff00) >> 8; // TODO: Flags?
A = (m_pa & 0x00ff00) >> 8;
set_nz(A);
prefetch();
spa2_imp
@ -259,37 +265,41 @@ spa2_imp
lpa2_imp
read_pc_noinc();
A = (m_pa & 0xff0000) >> 16; // TODO: Flags?
A = (m_pa & 0xff0000) >> 16;
set_nz(A);
prefetch();
spb0_imp
read_pc_noinc();
m_pb = (m_pb & 0xffff00) | A; // TODO: Flags?
m_pb = (m_pb & 0xffff00) | A;
prefetch();
lpb0_imp
read_pc_noinc();
A = (m_pb & 0x0000ff) >> 0; // TODO: Flags?
A = (m_pb & 0x0000ff) >> 0;
set_nz(A);
prefetch();
spb1_imp
read_pc_noinc();
m_pb = (m_pb & 0xff00ff) | (A << 8); // TODO: Flags?
m_pb = (m_pb & 0xff00ff) | (A << 8);
prefetch();
lpb1_imp
read_pc_noinc();
A = (m_pb & 0x00ff00) >> 8; // TODO: Flags?
A = (m_pb & 0x00ff00) >> 8;
set_nz(A);
prefetch();
spb2_imp
read_pc_noinc();
m_pb = (m_pb & 0x00ffff) | (A << 16); // TODO: Flags?
m_pb = (m_pb & 0x00ffff) | (A << 16);
prefetch();
lpb2_imp
read_pc_noinc();
A = (m_pb & 0xff0000) >> 16; // TODO: Flags?
A = (m_pb & 0xff0000) >> 16;
set_nz(A);
prefetch();
incpa_imp
@ -341,6 +351,7 @@ stapa_imp
ldapa_imp
A = read_full_data_sp(m_pa);
set_nz(A);
prefetch();
cmppa_imp
@ -377,6 +388,7 @@ stapb_imp
ldapb_imp
A = read_full_data_sp(m_pb);
set_nz(A);
prefetch();
cmppb_imp

View File

@ -757,33 +757,58 @@ WRITE8_MEMBER(xavix_state::mult_param_w)
if (offset == 2)
{
// assume 0 is upper bits, might be 'mode' instead, check
int param1 = m_multparams[1];
int param2 = m_multparams[2];
#if 0
int signparam1 = (m_multparams[0] & 0x02) >> 1;
int signparam2 = (m_multparams[0] & 0x01) >> 0;
if (signparam1) param1 = -param1;
if (signparam2) param2 = -param2;
#endif
int signmode = (m_multparams[0] & 0x3f);
uint16_t result = 0;
// rad_madf uses this mode (add to previous result)
if ((m_multparams[0] & 0xc0) == 0xc0)
{
if (signmode == 0x0)
{
uint8_t param1 = m_multparams[1];
uint8_t param2 = m_multparams[2];
result = param1 * param2;
}
else
{
popmessage("unknown signmode %02x", m_multparams[0] & 0x3f);
}
uint16_t oldresult = (m_multresults[1] << 8) | m_multresults[0];
result = oldresult + result;
}
else if ((m_multparams[0] & 0xc0) == 0x00)
{
int param1 = 0, param2 = 0;
if (signmode == 0x0)
{
param1 = (uint8_t)m_multparams[1];
param2 = (uint8_t)m_multparams[2];
}
else if (signmode == 0x2)
{
param1 = (int8_t)m_multparams[1];
param2 = (uint8_t)m_multparams[2];
}
else if (signmode == 0x1)
{
param1 = (uint8_t)m_multparams[1];
param2 = (int8_t)m_multparams[2];
}
else
{
popmessage("unknown signmode %02x", m_multparams[0] & 0x3f);
}
result = param1 * param2;
}
else
{
popmessage("unknown multiplier mode %02n", m_multparams[0] & 0xc0);
popmessage("unknown multiplier mode %02x", m_multparams[0] & 0xc0);
}
m_multresults[1] = (result >> 8) & 0xff;