Fixed stupid bug in DMA length handling - should fix sound clicking on some games.
This commit is contained in:
parent
8ccd4544ec
commit
d83683c6db
1 changed files with 31 additions and 32 deletions
37
src/dma.c
37
src/dma.c
|
|
@ -267,14 +267,14 @@ int dma_channel_read(int channel)
|
||||||
if (dma.mode[channel] & 0x20) dma.ac[channel]--;
|
if (dma.mode[channel] & 0x20) dma.ac[channel]--;
|
||||||
else dma.ac[channel]++;
|
else dma.ac[channel]++;
|
||||||
dma.cc[channel]--;
|
dma.cc[channel]--;
|
||||||
if (!dma.cc[channel] && (dma.mode[channel] & 0x10))
|
if (dma.cc[channel] < 0)
|
||||||
{
|
{
|
||||||
dma.cc[channel] = dma.cb[channel] + 1;
|
if (dma.mode[channel] & 0x10) /*Auto-init*/
|
||||||
|
{
|
||||||
|
dma.cc[channel] = dma.cb[channel];
|
||||||
dma.ac[channel] = dma.ab[channel];
|
dma.ac[channel] = dma.ab[channel];
|
||||||
dma.stat |= (1 << channel);
|
|
||||||
}
|
}
|
||||||
else if (dma.cc[channel]<=-1)
|
else
|
||||||
{
|
|
||||||
dma.m |= (1 << channel);
|
dma.m |= (1 << channel);
|
||||||
dma.stat |= (1 << channel);
|
dma.stat |= (1 << channel);
|
||||||
}
|
}
|
||||||
|
|
@ -297,14 +297,14 @@ int dma_channel_read(int channel)
|
||||||
if (dma16.mode[channel] & 0x20) dma16.ac[channel]--;
|
if (dma16.mode[channel] & 0x20) dma16.ac[channel]--;
|
||||||
else dma16.ac[channel]++;
|
else dma16.ac[channel]++;
|
||||||
dma16.cc[channel]--;
|
dma16.cc[channel]--;
|
||||||
if (!dma16.cc[channel] && (dma16.mode[channel] & 0x10))
|
if (dma16.cc[channel] < 0)
|
||||||
{
|
{
|
||||||
dma16.cc[channel] = dma16.cb[channel] + 1;
|
if (dma16.mode[channel] & 0x10) /*Auto-init*/
|
||||||
|
{
|
||||||
|
dma16.cc[channel] = dma16.cb[channel];
|
||||||
dma16.ac[channel] = dma16.ab[channel];
|
dma16.ac[channel] = dma16.ab[channel];
|
||||||
dma16.stat |= (1 << channel);
|
|
||||||
}
|
}
|
||||||
else if (dma16.cc[channel] <= -1)
|
else
|
||||||
{
|
|
||||||
dma16.m |= (1 << channel);
|
dma16.m |= (1 << channel);
|
||||||
dma16.stat |= (1 << channel);
|
dma16.stat |= (1 << channel);
|
||||||
}
|
}
|
||||||
|
|
@ -332,14 +332,14 @@ int dma_channel_write(int channel, uint16_t val)
|
||||||
if (dma.mode[channel]&0x20) dma.ac[channel]--;
|
if (dma.mode[channel]&0x20) dma.ac[channel]--;
|
||||||
else dma.ac[channel]++;
|
else dma.ac[channel]++;
|
||||||
dma.cc[channel]--;
|
dma.cc[channel]--;
|
||||||
if (!dma.cc[channel] && (dma.mode[channel] & 0x10))
|
if (dma.cc[channel] < 0)
|
||||||
{
|
{
|
||||||
dma.cc[channel] = dma.cb[channel] + 1;
|
if (dma.mode[channel] & 0x10) /*Auto-init*/
|
||||||
|
{
|
||||||
|
dma.cc[channel] = dma.cb[channel];
|
||||||
dma.ac[channel] = dma.ab[channel];
|
dma.ac[channel] = dma.ab[channel];
|
||||||
dma.stat |= (1 << channel);
|
|
||||||
}
|
}
|
||||||
else if (dma.cc[channel]<=-1)
|
else
|
||||||
{
|
|
||||||
dma.m |= (1 << channel);
|
dma.m |= (1 << channel);
|
||||||
dma.stat |= (1 << channel);
|
dma.stat |= (1 << channel);
|
||||||
}
|
}
|
||||||
|
|
@ -361,14 +361,13 @@ int dma_channel_write(int channel, uint16_t val)
|
||||||
if (dma16.mode[channel]&0x20) dma16.ac[channel]--;
|
if (dma16.mode[channel]&0x20) dma16.ac[channel]--;
|
||||||
else dma16.ac[channel]++;
|
else dma16.ac[channel]++;
|
||||||
dma16.cc[channel]--;
|
dma16.cc[channel]--;
|
||||||
if (!dma16.cc[channel] && (dma16.mode[channel] & 0x10))
|
if (dma16.cc[channel] < 0)
|
||||||
|
{
|
||||||
|
if (dma16.mode[channel] & 0x10) /*Auto-init*/
|
||||||
{
|
{
|
||||||
dma16.cc[channel] = dma16.cb[channel] + 1;
|
dma16.cc[channel] = dma16.cb[channel] + 1;
|
||||||
dma16.ac[channel] = dma16.ab[channel];
|
dma16.ac[channel] = dma16.ab[channel];
|
||||||
dma16.stat |= (1 << channel);
|
|
||||||
}
|
}
|
||||||
else if (dma16.cc[channel] <= -1)
|
|
||||||
{
|
|
||||||
dma16.m |= (1 << channel);
|
dma16.m |= (1 << channel);
|
||||||
dma16.stat |= (1 << channel);
|
dma16.stat |= (1 << channel);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue