Partially revert 3e6ace480a to simplify calling update_nzsc() & fix s flag calculation so it's correct in all cases (the previous commit was wrong for sbc, prior to that it was only correct for cmp). (nw)

This commit is contained in:
smf- 2020-02-09 11:53:08 +00:00
parent e2ed5d1008
commit 3c2b7ffc27
3 changed files with 8 additions and 14 deletions

View File

@ -393,10 +393,10 @@ void unsp_device::state_import(const device_state_entry &entry)
/*****************************************************************************/ /*****************************************************************************/
void unsp_device::update_nzsc(uint32_t value, int32_t svalue) void unsp_device::update_nzsc(uint32_t value, uint16_t r0, uint16_t r1)
{ {
m_core->m_r[REG_SR] &= ~(UNSP_N | UNSP_Z | UNSP_S | UNSP_C); m_core->m_r[REG_SR] &= ~(UNSP_N | UNSP_Z | UNSP_S | UNSP_C);
if (svalue < 0) if (BIT(value, 16) != BIT((r0 ^ r1), 15))
m_core->m_r[REG_SR] |= UNSP_S; m_core->m_r[REG_SR] |= UNSP_S;
if (BIT(value, 15)) if (BIT(value, 15))
m_core->m_r[REG_SR] |= UNSP_N; m_core->m_r[REG_SR] |= UNSP_N;

View File

@ -234,7 +234,7 @@ protected:
uint16_t pop(uint32_t *reg); uint16_t pop(uint32_t *reg);
void update_nz(uint32_t value); void update_nz(uint32_t value);
void update_nzsc(uint32_t value, int32_t svalue); void update_nzsc(uint32_t value, uint16_t r0, uint16_t r1);
bool do_basic_alu_ops(const uint16_t& op0, uint32_t& lres, uint16_t& r0, uint16_t& r1, uint32_t& r2, bool update_flags); bool do_basic_alu_ops(const uint16_t& op0, uint32_t& lres, uint16_t& r0, uint16_t& r1, uint32_t& r2, bool update_flags);
private: private:

View File

@ -281,46 +281,40 @@ void unsp_device::execute_remaining(const uint16_t op)
bool unsp_device::do_basic_alu_ops(const uint16_t &op0, uint32_t &lres, uint16_t &r0, uint16_t &r1, uint32_t &r2, bool update_flags) bool unsp_device::do_basic_alu_ops(const uint16_t &op0, uint32_t &lres, uint16_t &r0, uint16_t &r1, uint32_t &r2, bool update_flags)
{ {
int32_t sres = 0;
switch (op0) switch (op0)
{ {
case 0x00: // Add case 0x00: // Add
{ {
lres = r0 + r1; lres = r0 + r1;
sres = (int16_t)r0 + (int16_t)r1;
if (update_flags) if (update_flags)
update_nzsc(lres, sres); update_nzsc(lres, r0, r1);
break; break;
} }
case 0x01: // Add w/ carry case 0x01: // Add w/ carry
{ {
uint32_t c = (m_core->m_r[REG_SR] & UNSP_C) ? 1 : 0; uint32_t c = (m_core->m_r[REG_SR] & UNSP_C) ? 1 : 0;
lres = r0 + r1 + c; lres = r0 + r1 + c;
sres = (int16_t)r0 + (int16_t)r1 + (int16_t)c;
if (update_flags) if (update_flags)
update_nzsc(lres, sres); update_nzsc(lres, r0, r1);
break; break;
} }
case 0x02: // Subtract case 0x02: // Subtract
lres = r0 + (uint16_t)(~r1) + uint32_t(1); lres = r0 + (uint16_t)(~r1) + uint32_t(1);
sres = (int16_t)r0 - (int16_t)r1;
if (update_flags) if (update_flags)
update_nzsc(lres, sres); update_nzsc(lres, r0, ~r1);
break; break;
case 0x03: // Subtract w/ carry case 0x03: // Subtract w/ carry
{ {
uint32_t c = (m_core->m_r[REG_SR] & UNSP_C) ? 1 : 0; uint32_t c = (m_core->m_r[REG_SR] & UNSP_C) ? 1 : 0;
lres = r0 + (uint16_t)(~r1) + c; lres = r0 + (uint16_t)(~r1) + c;
sres = (int16_t)r0 - ((int16_t)r1 - (int16_t)c);
if (update_flags) if (update_flags)
update_nzsc(lres, sres); update_nzsc(lres, r0, ~r1);
break; break;
} }
case 0x04: // Compare case 0x04: // Compare
lres = r0 + (uint16_t)(~r1) + uint32_t(1); lres = r0 + (uint16_t)(~r1) + uint32_t(1);
sres = (int16_t)r0 - (int16_t)r1;
if (update_flags) if (update_flags)
update_nzsc(lres, sres); update_nzsc(lres, r0, ~r1);
return false; return false;
case 0x06: // Negate case 0x06: // Negate
lres = -r1; lres = -r1;