From 8bfa5a599fb8942bdaaeda59bcd9a8d56132ea9b Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 18 Jul 2020 20:58:31 +0200 Subject: 6502: nmi is edge triggered --- src/devices/cpu/m6502/m6502.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'src/devices/cpu/m6502/m6502.cpp') diff --git a/src/devices/cpu/m6502/m6502.cpp b/src/devices/cpu/m6502/m6502.cpp index 7999749153f..f69e672ed31 100644 --- a/src/devices/cpu/m6502/m6502.cpp +++ b/src/devices/cpu/m6502/m6502.cpp @@ -31,7 +31,7 @@ m6502_device::m6502_device(const machine_config &mconfig, device_type type, cons sync_w(*this), program_config("program", ENDIANNESS_LITTLE, 8, 16), sprogram_config("decrypted_opcodes", ENDIANNESS_LITTLE, 8, 16), PPC(0), NPC(0), PC(0), SP(0), TMP(0), TMP2(0), A(0), X(0), Y(0), P(0), IR(0), inst_state_base(0), mintf(nullptr), - inst_state(0), inst_substate(0), icount(0), nmi_state(false), irq_state(false), apu_irq_state(false), v_state(false), irq_taken(false), sync(false), inhibit_interrupts(false) + inst_state(0), inst_substate(0), icount(0), nmi_state(false), irq_state(false), apu_irq_state(false), v_state(false), nmi_pending(false), irq_taken(false), sync(false), inhibit_interrupts(false) { } @@ -82,10 +82,11 @@ void m6502_device::init() save_item(NAME(irq_state)); save_item(NAME(apu_irq_state)); save_item(NAME(v_state)); + save_item(NAME(nmi_pending)); + save_item(NAME(irq_taken)); save_item(NAME(inst_state)); save_item(NAME(inst_substate)); save_item(NAME(inst_state_base)); - save_item(NAME(irq_taken)); save_item(NAME(inhibit_interrupts)); set_icountptr(icount); @@ -103,8 +104,9 @@ void m6502_device::init() nmi_state = false; irq_state = false; apu_irq_state = false; - irq_taken = false; v_state = false; + nmi_pending = false; + irq_taken = false; inst_state = STATE_RESET; inst_substate = 0; inst_state_base = 0; @@ -118,11 +120,12 @@ void m6502_device::device_reset() inst_state = STATE_RESET; inst_substate = 0; inst_state_base = 0; - nmi_state = false; irq_state = false; + nmi_state = false; apu_irq_state = false; - irq_taken = false; v_state = false; + nmi_pending = false; + irq_taken = false; sync = false; sync_w(CLEAR_LINE); inhibit_interrupts = false; @@ -410,7 +413,11 @@ void m6502_device::execute_set_input(int inputnum, int state) switch(inputnum) { case IRQ_LINE: irq_state = state == ASSERT_LINE; break; case APU_IRQ_LINE: apu_irq_state = state == ASSERT_LINE; break; - case NMI_LINE: nmi_state = nmi_state || (state == ASSERT_LINE); break; + case NMI_LINE: + if(!nmi_state && state == ASSERT_LINE) + nmi_pending = true; + nmi_state = state == ASSERT_LINE; + break; case V_LINE: if(!v_state && state == ASSERT_LINE) P |= F_V; @@ -484,7 +491,7 @@ void m6502_device::prefetch() sync = false; sync_w(CLEAR_LINE); - if((nmi_state || ((irq_state || apu_irq_state) && !(P & F_I))) && !inhibit_interrupts) { + if((nmi_pending || ((irq_state || apu_irq_state) && !(P & F_I))) && !inhibit_interrupts) { irq_taken = true; IR = 0x00; } else -- cgit v1.2.3