diff --git a/src/devices/cpu/m6502/oxavix2000.lst b/src/devices/cpu/m6502/oxavix2000.lst index ba0089e7c18..c51b0263e1a 100644 --- a/src/devices/cpu/m6502/oxavix2000.lst +++ b/src/devices/cpu/m6502/oxavix2000.lst @@ -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 diff --git a/src/mame/machine/xavix.cpp b/src/mame/machine/xavix.cpp index f09cba15606..97ad3993018 100644 --- a/src/mame/machine/xavix.cpp +++ b/src/mame/machine/xavix.cpp @@ -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) { - 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]; 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;