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

View File

@ -757,33 +757,58 @@ WRITE8_MEMBER(xavix_state::mult_param_w)
if (offset == 2) if (offset == 2)
{ {
// assume 0 is upper bits, might be 'mode' instead, check // 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; int signmode = (m_multparams[0] & 0x3f);
if (signparam2) param2 = -param2;
#endif
uint16_t result = 0; uint16_t result = 0;
// rad_madf uses this mode (add to previous result) // rad_madf uses this mode (add to previous result)
if ((m_multparams[0] & 0xc0) == 0xc0) if ((m_multparams[0] & 0xc0) == 0xc0)
{ {
result = param1 * param2; 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]; uint16_t oldresult = (m_multresults[1] << 8) | m_multresults[0];
result = oldresult + result; result = oldresult + result;
} }
else if ((m_multparams[0] & 0xc0) == 0x00) 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; result = param1 * param2;
} }
else 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; m_multresults[1] = (result >> 8) & 0xff;