diff options
author | R. Belmont <rb6502@users.noreply.github.com> | 2018-04-16 17:00:02 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-16 17:00:02 -0400 |
commit | d209d2460e758c84306262b21b15fc66dda3e4c2 (patch) | |
tree | 29fe00d7f9d9a9a2c8ea7e69a89ea39ca5082025 | |
parent | b00b178510adb6cbf08edb835f57e2270debbd06 (diff) | |
parent | 885b63b00d5f93050337514cbf9adf318a7f5b61 (diff) |
Merge pull request #3462 from sschnelle/hp9k_3xx_basic_boots
hp9k_3xx: workaround double exception during r-m-w operations
-rw-r--r-- | src/mame/drivers/hp9k_3xx.cpp | 46 |
1 files changed, 18 insertions, 28 deletions
diff --git a/src/mame/drivers/hp9k_3xx.cpp b/src/mame/drivers/hp9k_3xx.cpp index 40176f88855..ac1265e3a44 100644 --- a/src/mame/drivers/hp9k_3xx.cpp +++ b/src/mame/drivers/hp9k_3xx.cpp @@ -154,10 +154,10 @@ public: void hp9k3xx_common(address_map &map); void iocpu_map(address_map &map); private: - bool m_in_buserr; bool m_hil_read; uint8_t m_hil_data; uint8_t m_latch_data; + uint32_t m_lastpc; }; uint32_t hp9k3xx_state::hp_medres_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) @@ -294,53 +294,43 @@ INPUT_PORTS_END void hp9k3xx_state::machine_reset() { - m_in_buserr = false; } READ16_MEMBER(hp9k3xx_state::buserror16_r) { - if (!m_in_buserr) - { - m_in_buserr = true; - m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE); - m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE); - m_in_buserr = false; - } + m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE); + m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE); + m_lastpc = machine().device<cpu_device>("maincpu")->pc(); return 0; } WRITE16_MEMBER(hp9k3xx_state::buserror16_w) { - if (!m_in_buserr) - { - m_in_buserr = true; - m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE); - m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE); - m_in_buserr = false; + if (m_lastpc == machine().device<cpu_device>("maincpu")->pc()) { + logerror("%s: ignoring r-m-w double bus error\n", __FUNCTION__); + return; } + + m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE); + m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE); } READ32_MEMBER(hp9k3xx_state::buserror_r) { - if (!m_in_buserr) - { - m_in_buserr = true; - m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE); - m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE); - m_in_buserr = false; - } + m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE); + m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE); + m_lastpc = machine().device<cpu_device>("maincpu")->pc(); return 0; } WRITE32_MEMBER(hp9k3xx_state::buserror_w) { - if (!m_in_buserr) - { - m_in_buserr = true; - m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE); - m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE); - m_in_buserr = false; + if (m_lastpc == machine().device<cpu_device>("maincpu")->pc()) { + logerror("%s: ignoring r-m-w double bus error\n", __FUNCTION__); + return; } + m_maincpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE); + m_maincpu->set_input_line(M68K_LINE_BUSERROR, CLEAR_LINE); } WRITE8_MEMBER(hp9k3xx_state::iocpu_port1_w) |