summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/pps41/mm78op.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/pps41/mm78op.cpp')
-rw-r--r--src/devices/cpu/pps41/mm78op.cpp54
1 files changed, 51 insertions, 3 deletions
diff --git a/src/devices/cpu/pps41/mm78op.cpp b/src/devices/cpu/pps41/mm78op.cpp
index 82ec94aa449..05c2dac9d36 100644
--- a/src/devices/cpu/pps41/mm78op.cpp
+++ b/src/devices/cpu/pps41/mm78op.cpp
@@ -54,19 +54,67 @@ void mm78_device::op_skbf()
void mm78_device::op_sos()
{
// SOS: SB/SOS opcodes are separated
- op_todo();
+
+ // B7 must be low
+ if (m_ram_addr & 0x40)
+ {
+ logerror("SOS invalid access at $%03X\n", m_prev_pc);
+ return;
+ }
+
+ u8 bl = m_ram_addr & 0xf;
+ if (bl < 10)
+ {
+ m_d_output = (m_d_output | (1 << bl)) & m_d_mask;
+ m_write_d(m_d_output);
+ }
+ else if (bl < 12)
+ m_int_ff[~bl & 1] = 1;
+ else
+ logerror("SOS invalid pin %d at $%03X\n", bl, m_prev_pc);
}
void mm78_device::op_ros()
{
// ROS: RB/ROS opcodes are separated
- op_todo();
+
+ // B7 must be low
+ if (m_ram_addr & 0x40)
+ {
+ logerror("ROS invalid access at $%03X\n", m_prev_pc);
+ return;
+ }
+
+ u8 bl = m_ram_addr & 0xf;
+ if (bl < 10)
+ {
+ m_d_output = m_d_output & ~(1 << bl);
+ m_write_d(m_d_output);
+ }
+ else if (bl < 12)
+ m_int_ff[~bl & 1] = 0;
+ else
+ logerror("ROS invalid pin %d at $%03X\n", bl, m_prev_pc);
}
void mm78_device::op_skisl()
{
// SKISL: SKBF/SKISL opcodes are separated
- op_todo();
+
+ // B7 must be low
+ if (m_ram_addr & 0x40)
+ {
+ logerror("SKISL invalid access at $%03X\n", m_prev_pc);
+ return;
+ }
+
+ u8 bl = m_ram_addr & 0xf;
+ if (bl < 10)
+ m_skip = !BIT((m_d_output | m_read_d()) & m_d_mask, bl);
+ else if (bl < 12)
+ m_skip = !m_int_ff[~bl & 1];
+ else
+ logerror("SKISL invalid pin %d at $%03X\n", bl, m_prev_pc);
}