diff --git a/src/mame/machine/taito68705interface.cpp b/src/mame/machine/taito68705interface.cpp index d84d1cf142d..e4a6296f554 100644 --- a/src/mame/machine/taito68705interface.cpp +++ b/src/mame/machine/taito68705interface.cpp @@ -393,7 +393,8 @@ READ8_MEMBER(arkanoid_mcu_device_base::data_r) WRITE8_MEMBER(arkanoid_mcu_device_base::data_w) { // set host semaphore flag and latch data - m_host_flag = true; + if (!m_reset_input) + m_host_flag = true; m_host_latch = data; m_mcu->set_input_line(M68705_IRQ_LINE, ASSERT_LINE); } @@ -406,8 +407,14 @@ CUSTOM_INPUT_MEMBER(arkanoid_mcu_device_base::semaphore_r) WRITE_LINE_MEMBER(arkanoid_mcu_device_base::reset_w) { + m_reset_input = ASSERT_LINE == state; + if (CLEAR_LINE != state) + { + m_host_flag = false; + m_mcu_flag = false; + m_semaphore_cb(CLEAR_LINE); + } m_mcu->set_input_line(INPUT_LINE_RESET, state); - // TODO: determine whether host CPU controlled reset also clears the semaphore flags } READ8_MEMBER(arkanoid_mcu_device_base::mcu_pa_r) @@ -445,7 +452,8 @@ WRITE8_MEMBER(arkanoid_mcu_device_base::mcu_pc_w) // PC3 sets the MCU semaphore when low if (!BIT(data, 3)) { - m_mcu_flag = true; + if (!m_reset_input) + m_mcu_flag = true; // data is latched on falling edge if (BIT(m_pc_output, 3)) @@ -470,6 +478,7 @@ arkanoid_mcu_device_base::arkanoid_mcu_device_base( , m_mcu(*this, "mcu") , m_semaphore_cb(*this) , m_portb_r_cb(*this) + , m_reset_input(false) , m_host_flag(false) , m_mcu_flag(false) , m_host_latch(0xff) @@ -484,6 +493,7 @@ void arkanoid_mcu_device_base::device_start() m_semaphore_cb.resolve_safe(); m_portb_r_cb.resolve_safe(0xff); + save_item(NAME(m_reset_input)); save_item(NAME(m_host_flag)); save_item(NAME(m_mcu_flag)); save_item(NAME(m_host_latch)); @@ -491,6 +501,7 @@ void arkanoid_mcu_device_base::device_start() save_item(NAME(m_pa_output)); save_item(NAME(m_pc_output)); + m_reset_input = false; m_host_latch = 0xff; m_mcu_latch = 0xff; m_pa_output = 0xff; diff --git a/src/mame/machine/taito68705interface.h b/src/mame/machine/taito68705interface.h index 462e85e4f7a..226c755b5f0 100644 --- a/src/mame/machine/taito68705interface.h +++ b/src/mame/machine/taito68705interface.h @@ -135,6 +135,7 @@ protected: devcb_write_line m_semaphore_cb; devcb_read8 m_portb_r_cb; + bool m_reset_input; bool m_host_flag; bool m_mcu_flag; u8 m_host_latch; diff --git a/src/mame/video/arkanoid.cpp b/src/mame/video/arkanoid.cpp index 916069100cf..41afed17191 100644 --- a/src/mame/video/arkanoid.cpp +++ b/src/mame/video/arkanoid.cpp @@ -53,12 +53,8 @@ WRITE8_MEMBER(arkanoid_state::arkanoid_d008_w) m_bg_tilemap->mark_all_dirty(); } - /* BM: bit 7 is suspected to be MCU reset, the evidence for this is that - the games tilt mode reset sequence shows the main CPU must be able to - directly control the reset line of the MCU, else the game will crash - leaving the tilt screen (as the MCU is now out of sync with main CPU - which resets itself). This bit is the likely candidate as it is flipped - early in bootup just prior to accessing the MCU for the first time. */ + // bit 7 resets the MCU and semaphore flipflops + // This bit is flipped early in bootup just prior to accessing the MCU for the first time. if (m_mcuintf.found()) // Bootlegs don't have the MCU but still set this bit m_mcuintf->reset_w(BIT(data, 7) ? CLEAR_LINE : ASSERT_LINE); }