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.cpp138
1 files changed, 138 insertions, 0 deletions
diff --git a/src/devices/cpu/pps41/mm78op.cpp b/src/devices/cpu/pps41/mm78op.cpp
index 35f9980b212..6b5ef774481 100644
--- a/src/devices/cpu/pps41/mm78op.cpp
+++ b/src/devices/cpu/pps41/mm78op.cpp
@@ -11,4 +11,142 @@
// changed opcodes
+void mm78_device::op_lba()
+{
+ // LBA: no RAM delay
+ mm76_device::op_lba();
+ m_ram_delay = false;
+}
+
+void mm78_device::op_acsk()
+{
+ // ACSK: skip logic is inverted
+ mm76_device::op_acsk();
+ m_skip = !m_skip;
+}
+
+void mm78_device::op_aisk()
+{
+ // AISK x: don't skip if x=6 (aka DC opcode)
+ mm76_device::op_aisk();
+ if ((m_op & 0xf) == 6)
+ m_skip = false;
+}
+
+void mm78_device::op_sb()
+{
+ // SB x: SB/SOS opcodes are separated
+ ram_w(ram_r() | (1 << (m_op & 3)));
+}
+
+void mm78_device::op_rb()
+{
+ // RB x: RB/ROS opcodes are separated
+ ram_w(ram_r() & ~(1 << (m_op & 3)));
+}
+
+void mm78_device::op_skbf()
+{
+ // SKBF x: SKBF/SKISL opcodes are separated
+ m_skip = !BIT(ram_r(), m_op & 3);
+}
+
+void mm78_device::op_sos()
+{
+ // SOS: SB/SOS opcodes are separated
+ op_todo();
+}
+
+void mm78_device::op_ros()
+{
+ // ROS: RB/ROS opcodes are separated
+ op_todo();
+}
+
+void mm78_device::op_skisl()
+{
+ // SKISL: SKBF/SKISL opcodes are separated
+ op_todo();
+}
+
+
// new opcodes
+
+void mm78_device::op_sag()
+{
+ // SAG: set Bu to 3 for the next cycle
+ m_sag = true;
+}
+
+void mm78_device::op_lxa()
+{
+ // LXA: load X from A
+ m_x = m_a;
+}
+
+void mm78_device::op_xax()
+{
+ // XAX: exchange A with X
+ u8 a = m_a;
+ m_a = m_x;
+ m_x = a;
+}
+
+void mm78_device::op_tlb()
+{
+ // TLB x: transfer long banked
+ op_tl();
+ m_pc |= 0x400;
+}
+
+void mm78_device::op_tmlb()
+{
+ // TMLB x: transfer and mark long banked
+ op_tml();
+ m_pc |= 0x400;
+}
+
+void mm78_device::op_tab()
+{
+ // TAB: table look up transfer
+ m_skip_count = m_a + 1;
+ m_a = 0xf;
+}
+
+void mm78_device::op_ix()
+{
+ // IX: input to X from channel X(aka B)
+ op_todo();
+}
+
+void mm78_device::op_ox()
+{
+ // OX: output from X to channel X(aka B)
+ op_todo();
+}
+
+void mm78_device::op_ioa()
+{
+ // IOA: exchange A with channel A
+ op_todo();
+}
+
+void mm78_device::op_i1sk()
+{
+ // I1SK: add channel 1 to A, skip on no overflow
+ m_a += m_read_p() & 0xf;
+ m_skip = !(m_a & 0x10);
+ m_a &= 0xf;
+}
+
+void mm78_device::op_int0h()
+{
+ // INT0H: skip on INT0 high
+ m_skip = bool(m_int_line[0]);
+}
+
+void mm78_device::op_int1l()
+{
+ // INT1L: skip on INT1 low
+ m_skip = !m_int_line[1];
+}