Implemented 16-bit DMA support for GUS.
This commit is contained in:
parent
d5335ccb27
commit
69f0f7b01c
1 changed files with 35 additions and 9 deletions
|
|
@ -380,13 +380,27 @@ gus->curx[gus->voice]=(gus->curx[gus->voice]&0xFFF8000)|((val&0x7F)<<8);
|
||||||
while (c<65536)
|
while (c<65536)
|
||||||
{
|
{
|
||||||
int dma_result;
|
int dma_result;
|
||||||
d = gus->ram[gus->dmaaddr];
|
if (val & 0x04)
|
||||||
if (val & 0x80) d ^= 0x80;
|
{
|
||||||
dma_result = dma_channel_write(gus->dma, d);
|
uint32_t gus_addr = (gus->dmaaddr & 0xc0000) | ((gus->dmaaddr & 0x1ffff) << 1);
|
||||||
if (dma_result == DMA_NODATA)
|
d = gus->ram[gus_addr] | (gus->ram[gus_addr + 1] << 8);
|
||||||
break;
|
if (val & 0x80)
|
||||||
|
d ^= 0x8080;
|
||||||
|
dma_result = dma_channel_write(gus->dma, d);
|
||||||
|
if (dma_result == DMA_NODATA)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
d = gus->ram[gus->dmaaddr];
|
||||||
|
if (val & 0x80)
|
||||||
|
d ^= 0x80;
|
||||||
|
dma_result = dma_channel_write(gus->dma, d);
|
||||||
|
if (dma_result == DMA_NODATA)
|
||||||
|
break;
|
||||||
|
}
|
||||||
gus->dmaaddr++;
|
gus->dmaaddr++;
|
||||||
gus->dmaaddr&=0xFFFFF;
|
gus->dmaaddr &= 0xFFFFF;
|
||||||
c++;
|
c++;
|
||||||
if (dma_result & DMA_OVER)
|
if (dma_result & DMA_OVER)
|
||||||
break;
|
break;
|
||||||
|
|
@ -403,10 +417,22 @@ gus->curx[gus->voice]=(gus->curx[gus->voice]&0xFFF8000)|((val&0x7F)<<8);
|
||||||
d = dma_channel_read(gus->dma);
|
d = dma_channel_read(gus->dma);
|
||||||
if (d == DMA_NODATA)
|
if (d == DMA_NODATA)
|
||||||
break;
|
break;
|
||||||
if (val&0x80) d^=0x80;
|
if (val & 0x04)
|
||||||
gus->ram[gus->dmaaddr]=d;
|
{
|
||||||
|
uint32_t gus_addr = (gus->dmaaddr & 0xc0000) | ((gus->dmaaddr & 0x1ffff) << 1);
|
||||||
|
if (val & 0x80)
|
||||||
|
d ^= 0x8080;
|
||||||
|
gus->ram[gus_addr] = d & 0xff;
|
||||||
|
gus->ram[gus_addr +1] = (d >> 8) & 0xff;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (val & 0x80)
|
||||||
|
d ^= 0x80;
|
||||||
|
gus->ram[gus->dmaaddr] = d;
|
||||||
|
}
|
||||||
gus->dmaaddr++;
|
gus->dmaaddr++;
|
||||||
gus->dmaaddr&=0xFFFFF;
|
gus->dmaaddr &= 0xFFFFF;
|
||||||
c++;
|
c++;
|
||||||
if (d & DMA_OVER)
|
if (d & DMA_OVER)
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue