mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2024-09-19 04:39:42 +02:00
fixed 68k interrupt behavior (prevents interrupts from being executed multiple
time when 68k is halted)
This commit is contained in:
parent
e78d5a7834
commit
c9fb127730
@ -205,9 +205,6 @@ void m68k_update_irq(unsigned int mask)
|
|||||||
#ifdef LOGVDP
|
#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));
|
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
|
#endif
|
||||||
|
|
||||||
/* Check interrupt mask to process IRQ */
|
|
||||||
m68ki_check_interrupts();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void m68k_set_irq(unsigned int int_level)
|
void m68k_set_irq(unsigned int int_level)
|
||||||
@ -218,9 +215,6 @@ void m68k_set_irq(unsigned int int_level)
|
|||||||
#ifdef LOGVDP
|
#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));
|
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
|
#endif
|
||||||
|
|
||||||
/* Check interrupt mask to process IRQ */
|
|
||||||
m68ki_check_interrupts();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* IRQ latency (Fatal Rewind, Sesame's Street Counting Cafe)*/
|
/* 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)
|
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 */
|
/* Make sure we're not stopped */
|
||||||
if (CPU_STOPPED)
|
if (CPU_STOPPED)
|
||||||
{
|
{
|
||||||
@ -268,12 +271,12 @@ void m68k_run(unsigned int cycles)
|
|||||||
return;
|
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 */
|
/* Save end cycles count for when CPU is stopped */
|
||||||
m68k.cycle_end = cycles;
|
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
|
#ifdef LOGVDP
|
||||||
error("[%d][%d] m68k run to %d cycles (%x)\n", v_counter, m68k.cycles, cycles, m68k.pc);
|
error("[%d][%d] m68k run to %d cycles (%x)\n", v_counter, m68k.cycles, cycles, m68k.pc);
|
||||||
#endif
|
#endif
|
||||||
@ -290,8 +293,8 @@ void m68k_run(unsigned int cycles)
|
|||||||
REG_IR = m68ki_read_imm_16();
|
REG_IR = m68ki_read_imm_16();
|
||||||
|
|
||||||
/* Execute instruction */
|
/* Execute instruction */
|
||||||
m68ki_instruction_jump_table[REG_IR](); /* TODO: use labels table with goto */
|
m68ki_instruction_jump_table[REG_IR]();
|
||||||
USE_CYCLES(CYC_INSTRUCTION[REG_IR]); /* TODO: move into instruction handlers */
|
USE_CYCLES(CYC_INSTRUCTION[REG_IR]);
|
||||||
|
|
||||||
/* Trace m68k_exception, if necessary */
|
/* Trace m68k_exception, if necessary */
|
||||||
m68ki_exception_if_trace(); /* auto-disable (see m68kcpu.h) */
|
m68ki_exception_if_trace(); /* auto-disable (see m68kcpu.h) */
|
||||||
|
@ -215,13 +215,19 @@ void s68k_update_irq(unsigned int mask)
|
|||||||
#ifdef LOG_SCD
|
#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);
|
error("[%d][%d] IRQ Level = %d(0x%02x) (%x)\n", v_counter, s68k.cycles, CPU_INT_LEVEL>>8,FLAG_INT_MASK,s68k.pc);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Check interrupt mask to process IRQ */
|
|
||||||
m68ki_check_interrupts();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void s68k_run(unsigned int cycles)
|
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 */
|
/* Make sure we're not stopped */
|
||||||
if (CPU_STOPPED)
|
if (CPU_STOPPED)
|
||||||
{
|
{
|
||||||
@ -229,11 +235,12 @@ void s68k_run(unsigned int cycles)
|
|||||||
return;
|
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) */
|
/* Return point for when we have an address error (TODO: use goto) */
|
||||||
m68ki_set_address_error_trap() /* auto-disable (see m68kcpu.h) */
|
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
|
#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);
|
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
|
#endif
|
||||||
@ -249,10 +256,9 @@ void s68k_run(unsigned int cycles)
|
|||||||
/* Decode next instruction */
|
/* Decode next instruction */
|
||||||
REG_IR = m68ki_read_imm_16();
|
REG_IR = m68ki_read_imm_16();
|
||||||
|
|
||||||
|
|
||||||
/* Execute instruction */
|
/* Execute instruction */
|
||||||
m68ki_instruction_jump_table[REG_IR](); /* TODO: use labels table with goto */
|
m68ki_instruction_jump_table[REG_IR]();
|
||||||
USE_CYCLES(CYC_INSTRUCTION[REG_IR]); /* TODO: move into instruction handlers */
|
USE_CYCLES(CYC_INSTRUCTION[REG_IR]);
|
||||||
|
|
||||||
/* Trace m68k_exception, if necessary */
|
/* Trace m68k_exception, if necessary */
|
||||||
m68ki_exception_if_trace(); /* auto-disable (see m68kcpu.h) */
|
m68ki_exception_if_trace(); /* auto-disable (see m68kcpu.h) */
|
||||||
|
Loading…
Reference in New Issue
Block a user