Corrected GUS IRQs when GF1 and MIDI IRQs are combined.

Corrected voice playback when rollover is enabled.
Fixes issues with Windows 3.1 GUS drivers.
This commit is contained in:
SarahW 2016-08-16 20:29:12 +01:00
commit a65411466e

View file

@ -527,8 +527,14 @@ gus->curx[gus->voice]=(gus->curx[gus->voice]&0xFFF8000)|((val&0x7F)<<8);
if (gus->latch_enable == 2)
{
gus->irq = gus_irqs[val & 7];
if (val & 0x40)
gus->irq_midi = gus->irq;
{
if (gus->irq == -1)
gus->irq = gus->irq_midi = gus_irqs[(val >> 3) & 7];
else
gus->irq_midi = gus->irq;
}
else
gus->irq_midi = gus_irqs_midi[(val >> 3) & 7];
@ -937,19 +943,18 @@ void gus_poll_wave(void *p)
if (gus->cur[d] <= gus->start[d])
{
int diff = gus->start[d] - gus->cur[d];
if (!(gus->rctrl[d]&4))
if (gus->ctrl[d]&8)
{
if (!(gus->ctrl[d]&8))
{
gus->ctrl[d] |= 1;
gus->cur[d] = (gus->ctrl[d] & 0x40) ? gus->end[d] : gus->start[d];
}
else
{
if (gus->ctrl[d]&0x10) gus->ctrl[d]^=0x40;
gus->cur[d] = (gus->ctrl[d] & 0x40) ? (gus->end[d] - diff) : (gus->start[d] + diff);
}
if (gus->ctrl[d]&0x10) gus->ctrl[d]^=0x40;
gus->cur[d] = (gus->ctrl[d] & 0x40) ? (gus->end[d] - diff) : (gus->start[d] + diff);
}
else if (!(gus->rctrl[d]&4))
{
gus->ctrl[d] |= 1;
gus->cur[d] = (gus->ctrl[d] & 0x40) ? gus->end[d] : gus->start[d];
}
if ((gus->ctrl[d] & 0x20) && !gus->waveirqs[d])
{
gus->waveirqs[d] = 1;
@ -965,19 +970,18 @@ void gus_poll_wave(void *p)
if (gus->cur[d] >= gus->end[d])
{
int diff = gus->cur[d] - gus->end[d];
if (!(gus->rctrl[d]&4))
if (gus->ctrl[d]&8)
{
if (!(gus->ctrl[d]&8))
{
gus->ctrl[d] |= 1;
gus->cur[d] = (gus->ctrl[d] & 0x40) ? gus->end[d] : gus->start[d];
}
else
{
if (gus->ctrl[d]&0x10) gus->ctrl[d]^=0x40;
gus->cur[d] = (gus->ctrl[d] & 0x40) ? (gus->end[d] - diff) : (gus->start[d] + diff);
}
if (gus->ctrl[d]&0x10) gus->ctrl[d]^=0x40;
gus->cur[d] = (gus->ctrl[d] & 0x40) ? (gus->end[d] - diff) : (gus->start[d] + diff);
}
else if (!(gus->rctrl[d]&4))
{
gus->ctrl[d] |= 1;
gus->cur[d] = (gus->ctrl[d] & 0x40) ? gus->end[d] : gus->start[d];
}
if ((gus->ctrl[d] & 0x20) && !gus->waveirqs[d])
{
gus->waveirqs[d] = 1;