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