summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/m6502/m6502.cpp
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2020-07-18 20:58:31 +0200
committer hap <happppp@users.noreply.github.com>2020-07-18 20:58:31 +0200
commit8bfa5a599fb8942bdaaeda59bcd9a8d56132ea9b (patch)
tree10d6411c9811405b0293cada8c9edf77f2bd9c72 /src/devices/cpu/m6502/m6502.cpp
parent5716df3b90022ff46abed1a8e6e24dc4f6a70908 (diff)
6502: nmi is edge triggered
Diffstat (limited to 'src/devices/cpu/m6502/m6502.cpp')
-rw-r--r--src/devices/cpu/m6502/m6502.cpp21
1 files changed, 14 insertions, 7 deletions
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