diff options
author | 2022-09-03 23:55:53 +0200 | |
---|---|---|
committer | 2022-09-06 19:04:46 +0200 | |
commit | ef8ac6eee82fb1c033cf32925ffdcdac146b51f1 (patch) | |
tree | cc18d3622e64ab62679ccf1aa6b447bb397bbc0e /src/devices/cpu/m6502/m6502mtu.cpp | |
parent | 6563dfe9cf93c4e39b3ea9caa73c050147644075 (diff) |
* new WORKING machine
----
MTU-130 [Olivier Galibert, David Williams, Disk Blitz, Eric Wright]
Diffstat (limited to 'src/devices/cpu/m6502/m6502mtu.cpp')
-rw-r--r-- | src/devices/cpu/m6502/m6502mtu.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/devices/cpu/m6502/m6502mtu.cpp b/src/devices/cpu/m6502/m6502mtu.cpp new file mode 100644 index 00000000000..917ca93158e --- /dev/null +++ b/src/devices/cpu/m6502/m6502mtu.cpp @@ -0,0 +1,76 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + m6502mtu.cpp + + M6502 with MTU external banking hardware + +***************************************************************************/ + +#include "emu.h" +#include "m6502mtu.h" + +DEFINE_DEVICE_TYPE(M6502MTU, m6502mtu_device, "m6502mtu", "M6502 with MTU banking") + +m6502mtu_device::m6502mtu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + m6502_device(mconfig, M6502MTU, tag, owner, clock) +{ + program_config.m_addr_width = 18; + sprogram_config.m_addr_width = 18; +} + +void m6502mtu_device::device_start() +{ + mintf = nullptr; + space(AS_PROGRAM).specific(cprogram); + space(has_space(AS_OPCODES) ? AS_OPCODES : AS_PROGRAM).specific(csprogram); + + save_item(NAME(low_instruction)); + save_item(NAME(interrupt_mode)); + save_item(NAME(pbank)); + save_item(NAME(dbank)); + + init(); +} + +void m6502mtu_device::device_reset() +{ + m6502_device::device_reset(); + pbank = 0; + dbank = 0; + low_instruction = false; + interrupt_mode = false; +} + + +void m6502mtu_device::prefetchd() +{ + sync = true; + sync_w(ASSERT_LINE); + NPC = PC; + low_instruction = PC < 0x200; + IR = csprogram.read_byte(low_instruction || interrupt_mode ? PC : PC | pbank); + sync = false; + sync_w(CLEAR_LINE); + + if((nmi_pending || ((irq_state || apu_irq_state) && !(P & F_I))) && !inhibit_interrupts) { + irq_taken = true; + IR = 0x00; + } else + PC++; +} + +void m6502mtu_device::prefetchd_noirq() +{ + sync = true; + sync_w(ASSERT_LINE); + NPC = PC; + low_instruction = PC < 0x200; + IR = csprogram.read_byte(low_instruction || interrupt_mode ? PC : PC | pbank); + sync = false; + sync_w(CLEAR_LINE); + PC++; +} + +#include "cpu/m6502/m6502mtu.hxx" |