summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Patrick Mackinlay <pmackinlay@hotmail.com>2020-03-19 11:37:02 +0700
committer Patrick Mackinlay <pmackinlay@hotmail.com>2020-03-19 11:37:02 +0700
commita0a6637f7f550842f2d9091b94d79f70555d3ff5 (patch)
treed106e5ba4937e177945038171d91612a2a759e60
parent2829ffbb019b4a9b34420dcabc6e1809f52e0b50 (diff)
sgi_gr1: simplify stall handling (nw)
Avoids a scheduler assert in debug builds.
-rw-r--r--src/mame/video/sgi_ge5.cpp13
-rw-r--r--src/mame/video/sgi_ge5.h1
-rw-r--r--src/mame/video/sgi_gr1.cpp3
3 files changed, 9 insertions, 8 deletions
diff --git a/src/mame/video/sgi_ge5.cpp b/src/mame/video/sgi_ge5.cpp
index 370913560bf..21c2dbac2e6 100644
--- a/src/mame/video/sgi_ge5.cpp
+++ b/src/mame/video/sgi_ge5.cpp
@@ -194,8 +194,7 @@ void sgi_ge5_device::device_reset()
set_int(false);
- m_state = DECODE;
- suspend(SUSPEND_REASON_HALT, false);
+ m_state = STALL;
}
device_memory_interface::space_config_vector sgi_ge5_device::memory_space_config() const
@@ -218,6 +217,10 @@ void sgi_ge5_device::execute_run()
{
switch (m_state)
{
+ case STALL:
+ m_icount = 0;
+ break;
+
case DECODE:
debugger_instruction_hook(m_pc);
@@ -263,7 +266,6 @@ void sgi_ge5_device::execute_run()
// fifo read stall
m_state = READ;
m_icount = 0;
- suspend(SUSPEND_REASON_TRIGGER, false);
}
else
m_bus = m_fifo_read();
@@ -378,7 +380,7 @@ void sgi_ge5_device::execute_run()
break;
case 0xc: // stall
LOG("stall\n");
- suspend(SUSPEND_REASON_HALT, false);
+ m_state = STALL;
m_icount = 0;
break;
case 0xd: // call less than
@@ -586,7 +588,7 @@ void sgi_ge5_device::command_w(offs_t offset, u16 data, u16 mem_mask)
{
case 0x00: // clear stall
LOG("clear stall\n");
- resume(SUSPEND_REASON_HALT);
+ m_state = DECODE;
debugger_exception_hook(0);
break;
@@ -601,6 +603,7 @@ void sgi_ge5_device::command_w(offs_t offset, u16 data, u16 mem_mask)
break;
}
}
+
template u32 sgi_ge5_device::code_r<false>(offs_t offset);
template u32 sgi_ge5_device::code_r<true>(offs_t offset);
template void sgi_ge5_device::code_w<false>(offs_t offset, u32 data, u32 mem_mask);
diff --git a/src/mame/video/sgi_ge5.h b/src/mame/video/sgi_ge5.h
index b44a78ca00c..c1c8f75b93c 100644
--- a/src/mame/video/sgi_ge5.h
+++ b/src/mame/video/sgi_ge5.h
@@ -90,6 +90,7 @@ private:
int m_icount;
enum ge5_state : unsigned
{
+ STALL,
DECODE, // fetch and decode instruction, update pointers
READ, // read source
CONTROL, // flow control
diff --git a/src/mame/video/sgi_gr1.cpp b/src/mame/video/sgi_gr1.cpp
index a17b8239c91..b0f421a95f6 100644
--- a/src/mame/video/sgi_gr1.cpp
+++ b/src/mame/video/sgi_gr1.cpp
@@ -324,9 +324,6 @@ void sgi_gr1_device::fifo_w(offs_t offset, u32 data, u32 mem_mask)
m_dr3 &= ~DR3_FIFOFULL;
m_int_fifo_cb(ASSERT_LINE);
}
-
- if (m_ge->suspended())
- m_ge->resume(SUSPEND_REASON_TRIGGER);
}
void sgi_gr1_device::reset_w(int state)