Exemple #1
0
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;
}
Exemple #2
0
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;
	}
}