static int dma8237_do_operation(int which, int channel) { int done; UINT8 data; UINT8 mode; mode = dma[which].chan[channel].mode; switch(DMA_MODE_OPERATION(mode)) { case 1: data = dma[which].intf->channel_read_func[channel](); dma[which].intf->memory_write_func(channel, dma[which].chan[channel].address, data); dma[which].chan[channel].address += DMA_MODE_DIRECTION(mode); dma[which].chan[channel].count--; done = (dma[which].chan[channel].count == 0xFFFF); break; case 2: data = dma[which].intf->memory_read_func(channel, dma[which].chan[channel].address); dma[which].intf->channel_write_func[channel](data); dma[which].chan[channel].address += DMA_MODE_DIRECTION(mode); dma[which].chan[channel].count--; done = (dma[which].chan[channel].count == 0xFFFF); break; default: done = TRUE; break; } return done; }
void i8237_device::i8237_advance() { int channel = m_service_channel; int mode = m_chan[channel].m_mode; switch ( DMA_MODE_OPERATION( mode ) ) { case DMA8237_VERIFY_TRANSFER: case DMA8237_WRITE_TRANSFER: case DMA8237_READ_TRANSFER: m_chan[channel].m_high_address_changed = 0; if ( DMA_MODE_DIRECTION( mode ) ) { m_chan[channel].m_address -= 1; if ( ( m_chan[channel].m_address & 0xFF ) == 0xFF ) { m_chan[channel].m_high_address_changed = 1; } } else { m_chan[channel].m_address += 1; if ( ( m_chan[channel].m_address & 0xFF ) == 0x00 ) { m_chan[channel].m_high_address_changed = 1; } } m_chan[channel].m_count--; if ( m_chan[channel].m_count == 0xFFFF ) { /* Set TC bit for this channel */ m_status |= ( 0x01 << channel ); if ( DMA_MODE_AUTO_INIT( mode ) ) { m_chan[channel].m_address = m_chan[channel].m_base_address; m_chan[channel].m_count = m_chan[channel].m_base_count; m_chan[channel].m_high_address_changed = 1; } else { m_mask |= ( 0x01 << channel ); } } break; case DMA8237_ILLEGAL_TRANSFER: break; } }