summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Patrick Mackinlay <pmackinlay@hotmail.com>2021-05-09 15:58:34 +0700
committer Patrick Mackinlay <pmackinlay@hotmail.com>2021-05-09 15:58:34 +0700
commit7501f7fb68ed057f3746a935d90006b6574e5540 (patch)
tree98505a6e4696054512ebc80d73d76d25a1623707
parent6536c3ce88c2f772de88cd60ff6760c7d3a186b7 (diff)
ns32000: fix spr instruction
-rw-r--r--src/devices/cpu/ns32000/ns32000.cpp54
1 files changed, 25 insertions, 29 deletions
diff --git a/src/devices/cpu/ns32000/ns32000.cpp b/src/devices/cpu/ns32000/ns32000.cpp
index 3ba143d03ba..66ecc538ff1 100644
--- a/src/devices/cpu/ns32000/ns32000.cpp
+++ b/src/devices/cpu/ns32000/ns32000.cpp
@@ -28,25 +28,25 @@ DEFINE_DEVICE_TYPE(NS32032, ns32032_device, "ns32032", "National Semiconductor N
enum psr_mask : u16
{
// accessible in user mode
- PSR_C = 0x0001, // carry/borrow condition
- PSR_T = 0x0002, // trace trap enable
- PSR_L = 0x0004, // less than condition
- // unused
- // unused
- PSR_F = 0x0020, // general condition
- PSR_Z = 0x0040, // zero condition
- PSR_N = 0x0080, // negative condition
+ PSR_C = 0x0001, // carry/borrow condition
+ PSR_T = 0x0002, // trace trap enable
+ PSR_L = 0x0004, // less than condition
+ // unused
+ // unused
+ PSR_F = 0x0020, // general condition
+ PSR_Z = 0x0040, // zero condition
+ PSR_N = 0x0080, // negative condition
// accessible in supervisor mode
- PSR_U = 0x0100, // user mode
- PSR_S = 0x0200, // stack pointer select
- PSR_P = 0x0400, // prevent multiple trace trap
- PSR_I = 0x0800, // interrupt enable
- // unused
- // unused
- // unused
- // unused
- PSR_M = 0x0fe7, // write mask
+ PSR_U = 0x0100, // user mode
+ PSR_S = 0x0200, // stack pointer select
+ PSR_P = 0x0400, // prevent multiple trace trap
+ PSR_I = 0x0800, // interrupt enable
+ // unused
+ // unused
+ // unused
+ // unused
+ PSR_MSK = 0x0fe7, // write mask
};
enum cfg_mask : u32
@@ -720,12 +720,9 @@ template <int Width> void ns32000_device<Width>::execute_run()
sp += 4;
m_mod = space(0).read_word_unaligned(sp);
sp += 2;
- m_psr = space(0).read_word_unaligned(sp) & PSR_M;
+ m_psr = space(0).read_word_unaligned(sp) & PSR_MSK;
sp += 2;
- // FIXME: turn off trace trap pending
- m_psr &= ~PSR_P;
-
m_sb = space(0).read_dword_unaligned(m_mod);
SP += constant;
@@ -747,7 +744,7 @@ template <int Width> void ns32000_device<Width>::execute_run()
sp += 4;
m_mod = space(0).read_word_unaligned(sp);
sp += 2;
- m_psr = space(0).read_word_unaligned(sp) & PSR_M;
+ m_psr = space(0).read_word_unaligned(sp) & PSR_MSK;
sp += 2;
m_sb = space(0).read_dword_unaligned(m_mod);
@@ -948,9 +945,8 @@ template <int Width> void ns32000_device<Width>::execute_run()
switch (quick)
{
- case 0x0: // US
- // TODO: user stack pointer?
- gen_write(mode[0], m_sp1);
+ case 0x0: // UPSR
+ gen_write(mode[0], u8(m_psr));
break;
case 0x8: // FP
gen_write(mode[0], m_fp);
@@ -1042,7 +1038,7 @@ template <int Width> void ns32000_device<Width>::execute_run()
switch (quick)
{
case 0x0: // UPSR
- m_psr = ((m_psr & 0xff00) | u8(gen_read(mode[0]))) & PSR_M;
+ m_psr = ((m_psr & 0xff00) | u8(gen_read(mode[0]))) & PSR_MSK;
break;
case 0x8: // FP
m_fp = gen_read(mode[0]);
@@ -1059,9 +1055,9 @@ template <int Width> void ns32000_device<Width>::execute_run()
u32 const src = gen_read(mode[0]);
if (size == SIZE_B)
- m_psr = ((m_psr & 0xff00) | u8(src)) & PSR_M;
+ m_psr = ((m_psr & 0xff00) | u8(src)) & PSR_MSK;
else
- m_psr = src & PSR_M;
+ m_psr = src & PSR_MSK;
}
else
interrupt(ILL, m_pc);
@@ -1167,7 +1163,7 @@ template <int Width> void ns32000_device<Width>::execute_run()
{
u16 const src = gen_read(mode[0]);
- m_psr |= src;
+ m_psr |= src & PSR_MSK;
tex = mode[0].tea + ((size == SIZE_B) ? 18 : 30);
}