ns32000: undefined operation assumptions

This commit is contained in:
Patrick Mackinlay 2020-10-06 08:55:27 +07:00
parent 9ac23897b9
commit a538585b98

View File

@ -1001,7 +1001,7 @@ template <int Width> void ns32000_device<Width>::execute_run()
{ {
u32 const src = gen_read(mode[0]); u32 const src = gen_read(mode[0]);
if (size == 0) if (size == SIZE_B)
m_psr = (m_psr & 0xff00) | u8(src); m_psr = (m_psr & 0xff00) | u8(src);
else else
m_psr = src; m_psr = src;
@ -1057,16 +1057,20 @@ template <int Width> void ns32000_device<Width>::execute_run()
mode[0].read_i(size); mode[0].read_i(size);
decode(mode, bytes); decode(mode, bytes);
if (size == 0 || !(m_psr & PSR_U)) if (size < SIZE_D)
{ {
// FIXME: read.D? if (size == SIZE_B || !(m_psr & PSR_U))
u16 const src = gen_read(mode[0]); {
u16 const src = gen_read(mode[0]);
m_psr &= ~src; m_psr &= ~src;
m_pc += bytes; m_pc += bytes;
}
else
interrupt(ILL, m_pc);
} }
else else
interrupt(ILL, m_pc); interrupt(UND, m_pc);
break; break;
case 0x4: case 0x4:
// JUMP dst // JUMP dst
@ -1085,17 +1089,20 @@ template <int Width> void ns32000_device<Width>::execute_run()
mode[0].read_i(size); mode[0].read_i(size);
decode(mode, bytes); decode(mode, bytes);
if (size == 0 || !(m_psr & PSR_U)) if (size < SIZE_D)
{ {
// FIXME: read.D? if (size == SIZE_B || !(m_psr & PSR_U))
{
u16 const src = gen_read(mode[0]);
u16 const src = gen_read(mode[0]); m_psr |= src;
m_pc += bytes;
m_psr |= src; }
m_pc += bytes; else
interrupt(ILL, m_pc);
} }
else else
interrupt(ILL, m_pc); interrupt(UND, m_pc);
break; break;
case 0xa: case 0xa:
// ADJSPi src // ADJSPi src
@ -2558,7 +2565,9 @@ template <int Width> void ns32000_device<Width>::execute_run()
break; break;
case 0x3: case 0x3:
// Trap(SLAVE) // Trap(SLAVE)
// FIXME: operand access classes? // operands from ns32532 datasheet
mode[0].read_f(size_f);
mode[1].read_f(size_f);
decode(mode, bytes); decode(mode, bytes);
if (!slave(mode[0], mode[1])) if (!slave(mode[0], mode[1]))
@ -2607,7 +2616,9 @@ template <int Width> void ns32000_device<Width>::execute_run()
break; break;
case 0x9: case 0x9:
// Trap(SLAVE) // Trap(SLAVE)
// FIXME: operand access classes? // operands from ns32532 datasheet
mode[0].read_f(size_f);
mode[1].write_f(size_f);
decode(mode, bytes); decode(mode, bytes);
if (!slave(mode[0], mode[1])) if (!slave(mode[0], mode[1]))