fix emulated cpu crash being able to crash mame

This commit is contained in:
Michaël Banaan Ananas 2014-02-19 21:26:00 +00:00
parent 27651e74ab
commit 14f17d9546
2 changed files with 19 additions and 12 deletions

View File

@ -54,6 +54,7 @@ mn10200_device::mn10200_device(const machine_config &mconfig, const char *tag, d
void mn10200_device::device_start() void mn10200_device::device_start()
{ {
m_p4 = 0xf; m_p4 = 0xf;
m_irq_semaphore = false;
m_program = &space(AS_PROGRAM); m_program = &space(AS_PROGRAM);
m_io = &space(AS_IO); m_io = &space(AS_IO);
@ -218,6 +219,7 @@ void mn10200_device::device_reset()
void mn10200_device::take_irq(int level, int group) void mn10200_device::take_irq(int level, int group)
{ {
m_irq_semaphore = true;
m_cycles -= 7; m_cycles -= 7;
write_mem24(m_a[3] - 4, m_pc); write_mem24(m_a[3] - 4, m_pc);
@ -226,12 +228,18 @@ void mn10200_device::take_irq(int level, int group)
change_pc(0x80008); change_pc(0x80008);
m_psw = (m_psw & 0xf0ff) | (level << 8); m_psw = (m_psw & 0xf0ff) | (level << 8);
m_iagr = group; m_iagr = group;
m_irq_semaphore = false;
} }
bool mn10200_device::check_irq() void mn10200_device::check_irq()
{ {
// don't recurse
if (m_irq_semaphore)
return;
if (!m_nmicr && !(m_psw & FLAG_IE)) if (!m_nmicr && !(m_psw & FLAG_IE))
return false; return;
int level = m_psw >> 8 & 7; int level = m_psw >> 8 & 7;
int group = 0; int group = 0;
@ -253,10 +261,8 @@ bool mn10200_device::check_irq()
take_irq(0, 0); take_irq(0, 0);
else if (group) else if (group)
take_irq(level, group); take_irq(level, group);
else
return false;
return true; return;
} }
void mn10200_device::check_ext_irq() void mn10200_device::check_ext_irq()
@ -366,6 +372,12 @@ void mn10200_device::refresh_timer(int tmr)
} }
} }
void mn10200_device::refresh_all_timers()
{
for (int tmr = 0; tmr < MN10200_NUM_TIMERS_8BIT; tmr++)
refresh_timer(tmr);
}
TIMER_CALLBACK_MEMBER( mn10200_device::simple_timer_cb ) TIMER_CALLBACK_MEMBER( mn10200_device::simple_timer_cb )
{ {
int tmr = param; int tmr = param;
@ -380,12 +392,6 @@ TIMER_CALLBACK_MEMBER( mn10200_device::simple_timer_cb )
refresh_timer(tmr); refresh_timer(tmr);
} }
void mn10200_device::refresh_all_timers()
{
for (int tmr = 0; tmr < MN10200_NUM_TIMERS_8BIT; tmr++)
refresh_timer(tmr);
}
// opcode handlers // opcode handlers

View File

@ -143,6 +143,7 @@ private:
UINT8 m_ddr[8]; UINT8 m_ddr[8];
bool m_irq_semaphore;
attotime m_sysclock_base; attotime m_sysclock_base;
int m_cycles; int m_cycles;
@ -165,7 +166,7 @@ private:
inline void change_pc(UINT32 pc) { m_pc = pc & 0xffffff; } inline void change_pc(UINT32 pc) { m_pc = pc & 0xffffff; }
void take_irq(int level, int group); void take_irq(int level, int group);
bool check_irq(); void check_irq();
void check_ext_irq(); void check_ext_irq();
void refresh_timer(int tmr); void refresh_timer(int tmr);
void refresh_all_timers(); void refresh_all_timers();