diff options
Diffstat (limited to 'src/devices/cpu/i86/i186.cpp')
-rw-r--r-- | src/devices/cpu/i86/i186.cpp | 29 |
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)); |