summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
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
commitd209d2460e758c84306262b21b15fc66dda3e4c2 (patch)
tree29fe00d7f9d9a9a2c8ea7e69a89ea39ca5082025
parentb00b178510adb6cbf08edb835f57e2270debbd06 (diff)
parent885b63b00d5f93050337514cbf9adf318a7f5b61 (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.cpp46
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)