mirror of
https://github.com/holub/mame
synced 2025-07-06 18:39:28 +03:00
arkanoid: confirm MCU reset also resets semaphore flags [Lord Nightmare, Vas Crabb]
This commit is contained in:
parent
35dd85a748
commit
a90ccab72e
@ -393,7 +393,8 @@ READ8_MEMBER(arkanoid_mcu_device_base::data_r)
|
|||||||
WRITE8_MEMBER(arkanoid_mcu_device_base::data_w)
|
WRITE8_MEMBER(arkanoid_mcu_device_base::data_w)
|
||||||
{
|
{
|
||||||
// set host semaphore flag and latch data
|
// set host semaphore flag and latch data
|
||||||
m_host_flag = true;
|
if (!m_reset_input)
|
||||||
|
m_host_flag = true;
|
||||||
m_host_latch = data;
|
m_host_latch = data;
|
||||||
m_mcu->set_input_line(M68705_IRQ_LINE, ASSERT_LINE);
|
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)
|
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);
|
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)
|
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
|
// PC3 sets the MCU semaphore when low
|
||||||
if (!BIT(data, 3))
|
if (!BIT(data, 3))
|
||||||
{
|
{
|
||||||
m_mcu_flag = true;
|
if (!m_reset_input)
|
||||||
|
m_mcu_flag = true;
|
||||||
|
|
||||||
// data is latched on falling edge
|
// data is latched on falling edge
|
||||||
if (BIT(m_pc_output, 3))
|
if (BIT(m_pc_output, 3))
|
||||||
@ -470,6 +478,7 @@ arkanoid_mcu_device_base::arkanoid_mcu_device_base(
|
|||||||
, m_mcu(*this, "mcu")
|
, m_mcu(*this, "mcu")
|
||||||
, m_semaphore_cb(*this)
|
, m_semaphore_cb(*this)
|
||||||
, m_portb_r_cb(*this)
|
, m_portb_r_cb(*this)
|
||||||
|
, m_reset_input(false)
|
||||||
, m_host_flag(false)
|
, m_host_flag(false)
|
||||||
, m_mcu_flag(false)
|
, m_mcu_flag(false)
|
||||||
, m_host_latch(0xff)
|
, m_host_latch(0xff)
|
||||||
@ -484,6 +493,7 @@ void arkanoid_mcu_device_base::device_start()
|
|||||||
m_semaphore_cb.resolve_safe();
|
m_semaphore_cb.resolve_safe();
|
||||||
m_portb_r_cb.resolve_safe(0xff);
|
m_portb_r_cb.resolve_safe(0xff);
|
||||||
|
|
||||||
|
save_item(NAME(m_reset_input));
|
||||||
save_item(NAME(m_host_flag));
|
save_item(NAME(m_host_flag));
|
||||||
save_item(NAME(m_mcu_flag));
|
save_item(NAME(m_mcu_flag));
|
||||||
save_item(NAME(m_host_latch));
|
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_pa_output));
|
||||||
save_item(NAME(m_pc_output));
|
save_item(NAME(m_pc_output));
|
||||||
|
|
||||||
|
m_reset_input = false;
|
||||||
m_host_latch = 0xff;
|
m_host_latch = 0xff;
|
||||||
m_mcu_latch = 0xff;
|
m_mcu_latch = 0xff;
|
||||||
m_pa_output = 0xff;
|
m_pa_output = 0xff;
|
||||||
|
@ -135,6 +135,7 @@ protected:
|
|||||||
devcb_write_line m_semaphore_cb;
|
devcb_write_line m_semaphore_cb;
|
||||||
devcb_read8 m_portb_r_cb;
|
devcb_read8 m_portb_r_cb;
|
||||||
|
|
||||||
|
bool m_reset_input;
|
||||||
bool m_host_flag;
|
bool m_host_flag;
|
||||||
bool m_mcu_flag;
|
bool m_mcu_flag;
|
||||||
u8 m_host_latch;
|
u8 m_host_latch;
|
||||||
|
@ -53,12 +53,8 @@ WRITE8_MEMBER(arkanoid_state::arkanoid_d008_w)
|
|||||||
m_bg_tilemap->mark_all_dirty();
|
m_bg_tilemap->mark_all_dirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* BM: bit 7 is suspected to be MCU reset, the evidence for this is that
|
// bit 7 resets the MCU and semaphore flipflops
|
||||||
the games tilt mode reset sequence shows the main CPU must be able to
|
// This bit is flipped early in bootup just prior to accessing the MCU for the first time.
|
||||||
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. */
|
|
||||||
if (m_mcuintf.found()) // Bootlegs don't have the MCU but still set this bit
|
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);
|
m_mcuintf->reset_w(BIT(data, 7) ? CLEAR_LINE : ASSERT_LINE);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user