diff --git a/src/dma.c b/src/dma.c index f10e4bb..9de650e 100644 --- a/src/dma.c +++ b/src/dma.c @@ -251,7 +251,8 @@ void _dma_write(uint32_t addr, uint8_t val) int dma_channel_read(int channel) { uint16_t temp; - + int tc = 0; + if (dma.command & 0x04) return DMA_NODATA; @@ -272,6 +273,7 @@ int dma_channel_read(int channel) dma.cc[channel]--; if (dma.cc[channel] < 0) { + tc = 1; if (dma.mode[channel] & 0x10) /*Auto-init*/ { dma.cc[channel] = dma.cb[channel]; @@ -282,7 +284,7 @@ int dma_channel_read(int channel) dma.stat |= (1 << channel); } - if (dma.m & (1 << channel)) + if (tc) return temp | DMA_OVER; return temp; } @@ -302,6 +304,7 @@ int dma_channel_read(int channel) dma16.cc[channel]--; if (dma16.cc[channel] < 0) { + tc = 1; if (dma16.mode[channel] & 0x10) /*Auto-init*/ { dma16.cc[channel] = dma16.cb[channel]; @@ -312,7 +315,7 @@ int dma_channel_read(int channel) dma16.stat |= (1 << channel); } - if (dma.m & (1 << channel)) + if (tc) return temp | DMA_OVER; return temp; } diff --git a/src/sound_gus.c b/src/sound_gus.c index b801923..87e3837 100644 --- a/src/sound_gus.c +++ b/src/sound_gus.c @@ -374,12 +374,17 @@ gus->curx[gus->voice]=(gus->curx[gus->voice]&0xFFF8000)|((val&0x7F)<<8); c=0; while (c<65536) { + int dma_result; d = gus->ram[gus->dmaaddr]; if (val & 0x80) d ^= 0x80; - if (dma_channel_write(gus->dma, d) == DMA_NODATA) break; + dma_result = dma_channel_write(gus->dma, d); + if (dma_result == DMA_NODATA) + break; gus->dmaaddr++; gus->dmaaddr&=0xFFFFF; c++; + if (dma_result & DMA_OVER) + break; } // printf("GUS->MEM Transferred %i bytes\n",c); gus->dmactrl=val&~0x40; @@ -391,12 +396,15 @@ gus->curx[gus->voice]=(gus->curx[gus->voice]&0xFFF8000)|((val&0x7F)<<8); while (c<65536) { d = dma_channel_read(gus->dma); - if (d == DMA_NODATA) break; + if (d == DMA_NODATA) + break; if (val&0x80) d^=0x80; gus->ram[gus->dmaaddr]=d; gus->dmaaddr++; gus->dmaaddr&=0xFFFFF; c++; + if (d & DMA_OVER) + break; } // printf("MEM->GUS Transferred %i bytes\n",c); gus->dmactrl=val&~0x40;