# HG changeset patch # User TomW # Date 1408885697 -3600 # Node ID f6069ee5e9d771323139963a276c985286b4d961 # Parent 55564c65aa15ed152dfed135798d1cad273ef6ff Fixed terminal count on auto-init DMA. Fixed sound on All New World of Lemmings when using GUS. diff -r 55564c65aa15 -r f6069ee5e9d7 src/dma.c --- a/src/dma.c Sat Aug 23 21:32:36 2014 +0100 +++ b/src/dma.c Sun Aug 24 14:08:17 2014 +0100 @@ -251,7 +251,8 @@ int dma_channel_read(int channel) { uint16_t temp; - + int tc = 0; + if (dma.command & 0x04) return DMA_NODATA; @@ -272,6 +273,7 @@ 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 @@ dma.stat |= (1 << channel); } - if (dma.m & (1 << channel)) + if (tc) return temp | DMA_OVER; return temp; } @@ -302,6 +304,7 @@ 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 @@ dma16.stat |= (1 << channel); } - if (dma.m & (1 << channel)) + if (tc) return temp | DMA_OVER; return temp; } diff -r 55564c65aa15 -r f6069ee5e9d7 src/sound_gus.c --- a/src/sound_gus.c Sat Aug 23 21:32:36 2014 +0100 +++ b/src/sound_gus.c Sun Aug 24 14:08:17 2014 +0100 @@ -374,12 +374,17 @@ 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 @@ 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;