diff options
Diffstat (limited to 'src/devices/cpu/pps41/mm78op.cpp')
-rw-r--r-- | src/devices/cpu/pps41/mm78op.cpp | 54 |
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); } |