From c9fb127730fb19e0c1b084a94f6d1e558b28321e Mon Sep 17 00:00:00 2001 From: EkeEke Date: Fri, 19 Apr 2013 16:55:34 +0200 Subject: [PATCH] fixed 68k interrupt behavior (prevents interrupts from being executed multiple time when 68k is halted) --- source/m68k/m68kcpu.c | 25 ++++++++++++++----------- source/m68k/s68kcpu.c | 22 ++++++++++++++-------- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/source/m68k/m68kcpu.c b/source/m68k/m68kcpu.c index dd709b1..7c042e1 100644 --- a/source/m68k/m68kcpu.c +++ b/source/m68k/m68kcpu.c @@ -205,9 +205,6 @@ void m68k_update_irq(unsigned int mask) #ifdef LOGVDP error("[%d(%d)][%d(%d)] IRQ Level = %d(0x%02x) (%x)\n", v_counter, m68k.cycles/3420, m68k.cycles, m68k.cycles%3420,CPU_INT_LEVEL>>8,FLAG_INT_MASK,m68k_get_reg(M68K_REG_PC)); #endif - - /* Check interrupt mask to process IRQ */ - m68ki_check_interrupts(); } void m68k_set_irq(unsigned int int_level) @@ -218,9 +215,6 @@ void m68k_set_irq(unsigned int int_level) #ifdef LOGVDP error("[%d(%d)][%d(%d)] IRQ Level = %d(0x%02x) (%x)\n", v_counter, m68k.cycles/3420, m68k.cycles, m68k.cycles%3420,CPU_INT_LEVEL>>8,FLAG_INT_MASK,m68k_get_reg(M68K_REG_PC)); #endif - - /* Check interrupt mask to process IRQ */ - m68ki_check_interrupts(); } /* IRQ latency (Fatal Rewind, Sesame's Street Counting Cafe)*/ @@ -261,6 +255,15 @@ void m68k_set_irq_delay(unsigned int int_level) void m68k_run(unsigned int cycles) { + /* Make sure CPU is not already ahead */ + if (m68k.cycles >= cycles) + { + return; + } + + /* Check interrupt mask to process IRQ if needed */ + m68ki_check_interrupts(); + /* Make sure we're not stopped */ if (CPU_STOPPED) { @@ -268,12 +271,12 @@ void m68k_run(unsigned int cycles) return; } - /* Return point for when we have an address error (TODO: use goto) */ - m68ki_set_address_error_trap() /* auto-disable (see m68kcpu.h) */ - /* Save end cycles count for when CPU is stopped */ m68k.cycle_end = cycles; + /* Return point for when we have an address error (TODO: use goto) */ + m68ki_set_address_error_trap() /* auto-disable (see m68kcpu.h) */ + #ifdef LOGVDP error("[%d][%d] m68k run to %d cycles (%x)\n", v_counter, m68k.cycles, cycles, m68k.pc); #endif @@ -290,8 +293,8 @@ void m68k_run(unsigned int cycles) REG_IR = m68ki_read_imm_16(); /* Execute instruction */ - m68ki_instruction_jump_table[REG_IR](); /* TODO: use labels table with goto */ - USE_CYCLES(CYC_INSTRUCTION[REG_IR]); /* TODO: move into instruction handlers */ + m68ki_instruction_jump_table[REG_IR](); + USE_CYCLES(CYC_INSTRUCTION[REG_IR]); /* Trace m68k_exception, if necessary */ m68ki_exception_if_trace(); /* auto-disable (see m68kcpu.h) */ diff --git a/source/m68k/s68kcpu.c b/source/m68k/s68kcpu.c index 4fe7312..40ff145 100644 --- a/source/m68k/s68kcpu.c +++ b/source/m68k/s68kcpu.c @@ -215,13 +215,19 @@ void s68k_update_irq(unsigned int mask) #ifdef LOG_SCD error("[%d][%d] IRQ Level = %d(0x%02x) (%x)\n", v_counter, s68k.cycles, CPU_INT_LEVEL>>8,FLAG_INT_MASK,s68k.pc); #endif - - /* Check interrupt mask to process IRQ */ - m68ki_check_interrupts(); } void s68k_run(unsigned int cycles) { + /* Make sure CPU is not already ahead */ + if (s68k.cycles >= cycles) + { + return; + } + + /* Check interrupt mask to process IRQ if needed */ + m68ki_check_interrupts(); + /* Make sure we're not stopped */ if (CPU_STOPPED) { @@ -229,11 +235,12 @@ void s68k_run(unsigned int cycles) return; } + /* Save end cycles count for when CPU is stopped */ + s68k.cycle_end = cycles; + /* Return point for when we have an address error (TODO: use goto) */ m68ki_set_address_error_trap() /* auto-disable (see m68kcpu.h) */ - /* Save end cycles count for when CPU is stopped */ - s68k.cycle_end = cycles; #ifdef LOG_SCD error("[%d][%d] s68k run to %d cycles (%x), irq mask = %x (%x)\n", v_counter, s68k.cycles, cycles, s68k.pc,FLAG_INT_MASK, CPU_INT_LEVEL); #endif @@ -249,10 +256,9 @@ void s68k_run(unsigned int cycles) /* Decode next instruction */ REG_IR = m68ki_read_imm_16(); - /* Execute instruction */ - m68ki_instruction_jump_table[REG_IR](); /* TODO: use labels table with goto */ - USE_CYCLES(CYC_INSTRUCTION[REG_IR]); /* TODO: move into instruction handlers */ + m68ki_instruction_jump_table[REG_IR](); + USE_CYCLES(CYC_INSTRUCTION[REG_IR]); /* Trace m68k_exception, if necessary */ m68ki_exception_if_trace(); /* auto-disable (see m68kcpu.h) */