diff --git a/src/emu/cpu/m68000/m68kcpu.c b/src/emu/cpu/m68000/m68kcpu.c index 5e986798758..183e2b389cd 100644 --- a/src/emu/cpu/m68000/m68kcpu.c +++ b/src/emu/cpu/m68000/m68kcpu.c @@ -790,6 +790,8 @@ int m68k_execute(int num_cycles) SET_CYCLES(num_cycles); m68ki_initial_cycles = num_cycles; + m68ki_check_interrupts(); + /* ASG: update cycles */ USE_CYCLES(CPU_INT_CYCLES); CPU_INT_CYCLES = 0; @@ -877,9 +879,7 @@ void m68k_set_irq(unsigned int int_level) /* A transition from < 7 to 7 always interrupts (NMI) */ /* Note: Level 7 can also level trigger like a normal IRQ */ if(old_level != 0x0700 && CPU_INT_LEVEL == 0x0700) - m68ki_exception_interrupt(7); /* Edge triggered level 7 (NMI) */ - else - m68ki_check_interrupts(); /* Level triggered (IRQ) */ + m68ki_cpu.nmi_pending = TRUE; } void m68k_set_virq(unsigned int level, unsigned int active) diff --git a/src/emu/cpu/m68000/m68kcpu.h b/src/emu/cpu/m68000/m68kcpu.h index fa13ad7b383..eb70ddf7ac3 100644 --- a/src/emu/cpu/m68000/m68kcpu.h +++ b/src/emu/cpu/m68000/m68kcpu.h @@ -899,6 +899,7 @@ struct _m68ki_cpu_core /* Virtual IRQ lines state */ uint virq_state; + uint nmi_pending; const uint8* cyc_instruction; const uint8* cyc_exception; @@ -2038,7 +2039,12 @@ void m68ki_exception_interrupt(uint int_level) /* ASG: Check for interrupts */ INLINE void m68ki_check_interrupts(void) { - if(CPU_INT_LEVEL > FLAG_INT_MASK) + if(m68ki_cpu.nmi_pending) + { + m68ki_cpu.nmi_pending = FALSE; + m68ki_exception_interrupt(7); + } + else if(CPU_INT_LEVEL > FLAG_INT_MASK) m68ki_exception_interrupt(CPU_INT_LEVEL>>8); } diff --git a/src/emu/cpuint.c b/src/emu/cpuint.c index fe88f0e7f88..6ee3fe88938 100644 --- a/src/emu/cpuint.c +++ b/src/emu/cpuint.c @@ -283,6 +283,58 @@ void cpunum_set_input_line_vector(int cpunum, int line, int vector) void cpunum_set_input_line_and_vector(running_machine *machine, int cpunum, int line, int state, int vector) { +#ifdef MAME_DEBUG + /* catch errors where people use PULSE_LINE for CPUs that don't support it */ + if (state == PULSE_LINE && line != INPUT_LINE_NMI && line != INPUT_LINE_RESET) + { + switch (machine->config->cpu[cpunum].type) + { + case CPU_Z80: + case CPU_Z180: + case CPU_M68000: + case CPU_M68008: + case CPU_M68010: + case CPU_M68EC020: + case CPU_M68020: + case CPU_M68040: + case CPU_R4600BE: + case CPU_R4600LE: + case CPU_R4650BE: + case CPU_R4650LE: + case CPU_R4700BE: + case CPU_R4700LE: + case CPU_R5000BE: + case CPU_R5000LE: + case CPU_QED5271BE: + case CPU_QED5271LE: + case CPU_RM7000BE: + case CPU_RM7000LE: + case CPU_PPC403GA: + case CPU_PPC403GCX: + case CPU_PPC601: + case CPU_PPC602: + case CPU_PPC603: + case CPU_PPC603E: + case CPU_PPC603R: + case CPU_PPC604: + case CPU_I8035: + case CPU_I8041: + case CPU_I8048: + case CPU_I8648: + case CPU_I8748: + case CPU_MB8884: + case CPU_N7751: + case CPU_TMS34010: + case CPU_TMS34020: + case CPU_TMS32010: + case CPU_TMS32025: + case CPU_TMS32026: + fatalerror("CPU %s: PULSE_LINE used with level-detected IRQ %d\n", machine->config->cpu[cpunum].tag, line); + break; + } + } +#endif + if (line >= 0 && line < MAX_INPUT_LINES) { INT32 input_event = (state & 0xff) | (vector << 8);