From a2b7ca2961e084876bb5142761c270e7db45e5e8 Mon Sep 17 00:00:00 2001 From: Michael Zapf Date: Mon, 21 Oct 2013 21:43:41 +0000 Subject: [PATCH] Fixed broken MID interrupt handling. [Michael Zapf] --- src/emu/cpu/tms9900/tms9995.c | 10 +++++++--- src/emu/cpu/tms9900/tms9995.h | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/emu/cpu/tms9900/tms9995.c b/src/emu/cpu/tms9900/tms9995.c index 098dc2ebcf9..82893d6955f 100644 --- a/src/emu/cpu/tms9900/tms9995.c +++ b/src/emu/cpu/tms9900/tms9995.c @@ -175,6 +175,7 @@ void tms9995_device::device_start() m_int_pending = 0; m_mid_flag = false; + m_mid_active = false; m_nmi_active = false; m_int_overflow = false; m_int_decrementer = false; @@ -1294,7 +1295,7 @@ void tms9995_device::decode(UINT16 inst) int dindex = (m_instindex==0)? 1:0; - m_mid_flag = false; + m_mid_active = false; while (!complete) { @@ -1437,6 +1438,7 @@ void tms9995_device::next_command() if (m_decoded[next].command == MID) { m_mid_flag = true; + m_mid_active = true; service_interrupt(); } else @@ -1523,12 +1525,13 @@ void tms9995_device::service_interrupt() } else { - if (m_mid_flag) + if (m_mid_active) { vectorpos = 0x0008; m_intmask = 0x0001; PC = (PC + 2) & 0xfffe; if (VERBOSE>7) LOG("tms9995: ***** MID pending\n"); + m_mid_active = false; } else { @@ -1913,7 +1916,7 @@ void tms9995_device::cru_output_operation() if (m_cru_address == 0x1fda) { - // [1], section 2.3.3.2.2: "setting the MID to one with a CRU instruction + // [1], section 2.3.3.2.2: "setting the MID flag to one with a CRU instruction // will not cause the MID interrupt to be requested." m_check_ready = false; m_mid_flag = (m_cru_value & 0x01); @@ -3291,6 +3294,7 @@ void tms9995_device::alu_int() m_from_reset = false; ST &= 0x01ff; m_mid_flag = false; + m_mid_active = false; // FLAG0 and FLAG1 are also set to zero after RESET ([1], sect. 2.3.1.2.2) for (int i=0; i < 5; i++) m_flag[i] = false; m_check_hold = true; diff --git a/src/emu/cpu/tms9900/tms9995.h b/src/emu/cpu/tms9900/tms9995.h index 3b443bbf122..303d98a8d1a 100644 --- a/src/emu/cpu/tms9900/tms9995.h +++ b/src/emu/cpu/tms9900/tms9995.h @@ -171,6 +171,7 @@ private: bool m_reset; bool m_from_reset; bool m_mid_flag; + bool m_mid_active; // Flag field int m_int_pending;