Credit Miodrag Milanovic: Implement autoload mode in 8257

* added support for autoload mode
* fixed bug in calculating count
This commit is contained in:
Couriersud 2008-05-27 19:45:27 +00:00
parent 0689a9586e
commit 26e4f50fc0

View File

@ -4,6 +4,11 @@
For datasheet http://www.threedee.com/jcm/library/index.html For datasheet http://www.threedee.com/jcm/library/index.html
2008/05 Miodrag Milanovic
- added support for autoload mode
- fixed bug in calculating count
2007/11 couriersud 2007/11 couriersud
- architecture copied from 8237 DMA - architecture copied from 8237 DMA
@ -165,6 +170,12 @@ static int dma8257_do_operation(int which, int channel)
} }
if (done) if (done)
{ {
if ((channel==2) && DMA_MODE_AUTOLOAD(dma[which].mode)) {
/* in case of autoload at the end channel 3 info is */
/* copied to channel 2 info */
dma[which].registers[4] = dma[which].registers[6];
dma[which].registers[5] = dma[which].registers[7];
}
if (dma[which].intf->out_tc_func[channel]) if (dma[which].intf->out_tc_func[channel])
dma[which].intf->out_tc_func[channel](CLEAR_LINE); dma[which].intf->out_tc_func[channel](CLEAR_LINE);
} }
@ -305,13 +316,25 @@ static void dma8257_write(int which, offs_t offset, UINT8 data)
dma[which].registers[offset] |= ((UINT16) data) << 8; dma[which].registers[offset] |= ((UINT16) data) << 8;
else else
dma[which].registers[offset] = data; dma[which].registers[offset] = data;
if (DMA_MODE_AUTOLOAD(dma[which].mode)) {
/* in case of autoload when inserting channel 2 info */
/* it is automaticaly copied to channel 3 info */
switch(offset) {
case 4:
case 5:
if (dma[which].msb)
dma[which].registers[offset+2] |= ((UINT16) data) << 8;
else
dma[which].registers[offset+2] = data;
}
}
prepare_msb_flip(which); prepare_msb_flip(which);
break; break;
case 8: case 8:
/* DMA mode register */ /* DMA mode register */
if (DMA_MODE_AUTOLOAD(data) )
fatalerror("8257: Autoload not supported!\n");
dma[which].mode = data; dma[which].mode = data;
break; break;
@ -334,7 +357,7 @@ static TIMER_CALLBACK( dma8257_drq_write_callback )
{ {
dma[which].drq |= 0x01 << channel; dma[which].drq |= 0x01 << channel;
dma[which].address[channel] = dma[which].registers[channel * 2]; dma[which].address[channel] = dma[which].registers[channel * 2];
dma[which].count[channel] = dma[which].registers[channel * 2 + 1] & 0x3FF; dma[which].count[channel] = dma[which].registers[channel * 2 + 1] & 0x3FFF;
dma[which].rwmode[channel] = dma[which].registers[channel * 2 + 1] >> 14; dma[which].rwmode[channel] = dma[which].registers[channel * 2 + 1] >> 14;
/* clear channel TC */ /* clear channel TC */
dma[which].status &= ~(0x01 << channel); dma[which].status &= ~(0x01 << channel);