inline void am9517a_device::end_of_process() { // terminal count m_status |= 1 << m_current_channel; m_request &= ~(1 << m_current_channel); if (MODE_AUTOINITIALIZE) { // autoinitialize m_channel[m_current_channel].m_address = m_channel[m_current_channel].m_base_address; m_channel[m_current_channel].m_count = m_channel[m_current_channel].m_base_count; } else { // mask out channel m_mask |= 1 << m_current_channel; } // signal end of process set_eop(0); set_hreq(0); m_current_channel = -1; set_dack(); m_state = STATE_SI; }
void am9517a_device::device_reset() { m_state = STATE_SI; m_command = 0; m_status = 0; m_request = 0; m_mask = 0x0f; m_temp = 0; m_msb = 0; m_current_channel = -1; m_last_channel = 3; set_hreq(0); set_eop(1); set_dack(); }
void i8257_device::device_reset() { m_state = STATE_SI; m_transfer_mode = 0; m_status = 0; m_request = 0; m_msb = 0; m_current_channel = -1; m_last_channel = 3; m_hreq = -1; m_tc = 0; for (int i = 0; i < 4; i++) { m_channel[i].m_address = 0; m_channel[i].m_count = 0; m_channel[i].m_mode = 0; } set_hreq(0); set_dack(); }
void am9517a_device::execute_run() { do { switch (m_state) { case STATE_SI: set_eop(CLEAR_LINE); if (!COMMAND_DISABLE) { int priority[] = { 0, 1, 2, 3 }; if (COMMAND_ROTATING_PRIORITY) { int last_channel = m_last_channel; for (int channel = 3; channel >= 0; channel--) { priority[channel] = last_channel; last_channel--; if (last_channel < 0) last_channel = 3; } } for (int channel = 0; channel < 4; channel++) { if (is_request_active(priority[channel]) || is_software_request_active(priority[channel])) { m_current_channel = m_last_channel = priority[channel]; m_state = STATE_S0; break; } else if (COMMAND_MEM_TO_MEM && BIT(m_request, channel) && ((m_channel[channel].m_mode & 0xc0) == MODE_SINGLE)) { m_current_channel = m_last_channel = priority[channel]; m_state = STATE_S0; break; } } } if(m_state == STATE_SI) { suspend_until_trigger(1, true); m_icount = 0; } break; case STATE_S0: set_hreq(1); if (m_hack) { m_state = (MODE_MASK == MODE_CASCADE) ? STATE_SC : get_state1(true); } else { suspend_until_trigger(1, true); m_icount = 0; } break; case STATE_SC: if (!is_request_active(m_current_channel)) { set_hreq(0); m_current_channel = -1; m_state = STATE_SI; } else { suspend_until_trigger(1, true); m_icount = 0; } set_dack(); break; case STATE_S1: m_state = STATE_S2; break; case STATE_S2: set_dack(); m_state = COMMAND_COMPRESSED_TIMING ? STATE_S4 : STATE_S3; break; case STATE_S3: dma_read(); if (COMMAND_EXTENDED_WRITE) { dma_write(); } m_state = m_ready ? STATE_S4 : STATE_SW; break; case STATE_SW: m_state = m_ready ? STATE_S4 : STATE_SW; break; case STATE_S4: if (COMMAND_COMPRESSED_TIMING) { dma_read(); dma_write(); } else if (!COMMAND_EXTENDED_WRITE) { dma_write(); } dma_advance(); break; case STATE_S11: m_current_channel = 0; m_state = STATE_S12; break; case STATE_S12: m_state = STATE_S13; break; case STATE_S13: m_state = STATE_S14; break; case STATE_S14: dma_read(); m_state = STATE_S21; break; case STATE_S21: m_current_channel = 1; m_state = STATE_S22; break; case STATE_S22: m_state = STATE_S23; break; case STATE_S23: m_state = STATE_S24; break; case STATE_S24: dma_write(); dma_advance(); m_current_channel = 0; m_channel[m_current_channel].m_count--; if (MODE_ADDRESS_DECREMENT) { m_channel[m_current_channel].m_address--; } else { m_channel[m_current_channel].m_address++; } break; } m_icount--; } while (m_icount > 0); }
inline void am9517a_device::dma_advance() { bool msb_changed = false; m_channel[m_current_channel].m_count--; if (m_current_channel || !COMMAND_MEM_TO_MEM || !COMMAND_CH0_ADDRESS_HOLD) { if (MODE_ADDRESS_DECREMENT) { m_channel[m_current_channel].m_address--; if ((m_channel[m_current_channel].m_address & 0xff) == 0xff) { msb_changed = true; } } else { m_channel[m_current_channel].m_address++; if ((m_channel[m_current_channel].m_address & 0xff) == 0x00) { msb_changed = true; } } } if (m_channel[m_current_channel].m_count == 0xffff) { end_of_process(); } else { switch (MODE_MASK) { case MODE_DEMAND: if (!is_request_active(m_current_channel)) { set_hreq(0); set_dack(); m_state = STATE_SI; } else { m_state = get_state1(msb_changed); } break; case MODE_SINGLE: set_hreq(0); set_dack(); m_state = STATE_SI; break; case MODE_BLOCK: m_state = get_state1(msb_changed); break; case MODE_CASCADE: break; } } }
void i8257_device::execute_run() { do { switch (m_state) { case STATE_SI: set_tc(0); if(next_channel()) m_state = STATE_S0; else { suspend_until_trigger(1, true); m_icount = 0; } break; case STATE_S0: set_hreq(1); if (m_hack) { m_state = STATE_S1; } else { suspend_until_trigger(1, true); m_icount = 0; } break; case STATE_S1: set_tc(0); m_state = STATE_S2; break; case STATE_S2: set_dack(); m_state = STATE_S3; break; case STATE_S3: dma_read(); if (MODE_EXTENDED_WRITE) { dma_write(); } m_state = m_ready ? STATE_S4 : STATE_SW; break; case STATE_SW: m_state = m_ready ? STATE_S4 : STATE_SW; break; case STATE_S4: if (!MODE_EXTENDED_WRITE) { dma_write(); } advance(); if(next_channel()) m_state = STATE_S1; else { set_hreq(0); m_current_channel = -1; m_state = STATE_SI; set_dack(); } break; } m_icount--; } while (m_icount > 0); }