summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/i86/i186.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/i86/i186.cpp')
-rw-r--r--src/devices/cpu/i86/i186.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/devices/cpu/i86/i186.cpp b/src/devices/cpu/i86/i186.cpp
index 7738ee64d6c..48329288bf5 100644
--- a/src/devices/cpu/i86/i186.cpp
+++ b/src/devices/cpu/i86/i186.cpp
@@ -173,6 +173,22 @@ void i80186_cpu_device::execute_run()
{
while(m_icount > 0 )
{
+ if((m_dma[0].drq_state && (m_dma[0].control & ST_STOP)) || (m_dma[1].drq_state && (m_dma[1].control & ST_STOP)))
+ {
+ int channel = m_last_dma ? 0 : 1;
+ m_last_dma = !m_last_dma;
+ if(!(m_dma[1].drq_state && (m_dma[1].control & ST_STOP)))
+ channel = 0;
+ else if(!(m_dma[0].drq_state && (m_dma[0].control & ST_STOP)))
+ channel = 1;
+ else if((m_dma[0].control & CHANNEL_PRIORITY) && !(m_dma[1].control & CHANNEL_PRIORITY))
+ channel = 0;
+ else if((m_dma[1].control & CHANNEL_PRIORITY) && !(m_dma[0].control & CHANNEL_PRIORITY))
+ channel = 1;
+ m_icount--;
+ drq_callback(channel);
+ continue;
+ }
if ( m_seg_prefix_next )
{
m_seg_prefix = true;
@@ -587,6 +603,18 @@ void i80186_cpu_device::device_start()
state_add( I80186_T_COUNT + 2, "T2_COUNT", m_timer[2].count ).formatstr("%04X");
state_add( I80186_T_MAX_A + 2, "T2_MAX", m_timer[2].maxA ).formatstr("%04X");
state_add( I80186_T_CONTROL + 2, "T2_CONTROL", m_timer[2].control ).formatstr("%04X");
+ state_add( I80186_ISR, "ISR", m_intr.in_service ).formatstr("%04X");
+ state_add( I80186_IRR, "IRR", m_intr.request ).formatstr("%04X");
+ state_add( I80186_PMR, "PMR", m_intr.priority_mask ).formatstr("%04X");
+ state_add( I80186_ICSR, "ICSR", m_intr.status ).formatstr("%04X");
+ state_add( I80186_TMRCR, "TMRCR", m_intr.timer ).formatstr("%04X");
+ state_add( I80186_D0CR, "D0CR", m_intr.dma[0] ).formatstr("%04X");
+ state_add( I80186_D1CR, "D1CR", m_intr.dma[1] ).formatstr("%04X");
+ state_add( I80186_I0CR, "I0CR", m_intr.ext[0] ).formatstr("%04X");
+ state_add( I80186_I1CR, "I1CR", m_intr.ext[1] ).formatstr("%04X");
+ state_add( I80186_I2CR, "I2CR", m_intr.ext[2] ).formatstr("%04X");
+ state_add( I80186_I3CR, "I3CR", m_intr.ext[3] ).formatstr("%04X");
+ state_add( I80186_POLL, "POLL", m_intr.poll_status ).formatstr("%04X");
// register for savestates
save_item(NAME(m_timer[0].control));
@@ -627,6 +655,7 @@ void i80186_cpu_device::device_start()
save_item(NAME(m_mem.middle_size));
save_item(NAME(m_mem.peripheral));
save_item(NAME(m_reloc));
+ save_item(NAME(m_last_dma));
// zerofill
memset(m_timer, 0, sizeof(m_timer));