summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/unsp/unsp_fxxx.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/unsp/unsp_fxxx.cpp')
-rw-r--r--src/devices/cpu/unsp/unsp_fxxx.cpp59
1 files changed, 38 insertions, 21 deletions
diff --git a/src/devices/cpu/unsp/unsp_fxxx.cpp b/src/devices/cpu/unsp/unsp_fxxx.cpp
index f8456d3ef1a..4c1f41245ad 100644
--- a/src/devices/cpu/unsp/unsp_fxxx.cpp
+++ b/src/devices/cpu/unsp/unsp_fxxx.cpp
@@ -109,55 +109,72 @@ inline void unsp_device::execute_fxxx_001_group(uint16_t op)
if (d)
{
+ const uint32_t addr = imm16 | (get_ds() << 16);
+ const uint16_t orig = read16(addr);
+
+ // manual seems to indicate that the zero flag always gets changed based on original value
+ // even for opcodes other than tstb
+ m_core->m_r[REG_SR] &= ~UNSP_Z;
+ m_core->m_r[REG_SR] |= BIT(orig, offset) ? 0 : UNSP_Z;
+
switch (bitop)
{
case 0x0: // tstb
- logerror("tstb ds:[%04x],%d\n", imm16, offset);
- unimplemented_opcode(op);
+ {
+ // handled above
break;
-
- case 0x1: // setb
- logerror("setb ds:[%04x],%d\n", imm16, offset);
- unimplemented_opcode(op);
+ }
+ case 0x1: // setb (bkrankp uses this)
+ {
+ write16(addr, orig | (1 << offset));
break;
-
+ }
case 0x2: // clrb
- logerror("clrb ds:[%04x],%d\n", imm16, offset);
- unimplemented_opcode(op);
+ {
+ write16(addr, orig & ~(1 << offset));
break;
+ }
case 0x3: // invb
- logerror("invb ds:[%04x],%d\n", imm16, offset);
- unimplemented_opcode(op);
+ {
+ write16(addr, orig ^ (1 << offset));
break;
}
+ }
}
else
{
+ const uint16_t orig = read16(imm16);
+
+ // manual seems to indicate that the zero flag always gets changed based on original value
+ // even for opcodes other than tstb
+ m_core->m_r[REG_SR] &= ~UNSP_Z;
+ m_core->m_r[REG_SR] |= BIT(orig, offset) ? 0 : UNSP_Z;
+
switch (bitop)
{
case 0x0: // tstb
- logerror("tstb [%04x],%d\n", imm16, offset);
- unimplemented_opcode(op);
+ {
+ // handled above
break;
-
+ }
case 0x1: // setb (bkrankp uses this)
{
- uint16_t temp = read16(imm16);
- temp |= (1 << offset);
- write16(imm16, temp);
+ write16(imm16, orig | (1 << offset));
break;
}
case 0x2: // clrb
- logerror("clrb [%04x],%d\n", imm16, offset);
- unimplemented_opcode(op);
+ {
+ write16(imm16, orig & ~(1 << offset));
break;
+ }
case 0x3: // invb
- logerror("invb [%04x],%d\n", imm16, offset);
- unimplemented_opcode(op);
+ {
+ write16(imm16, orig ^ (1 << offset));
break;
}
+ }
}
return;