PCem

changeset 55:fe47832dfbe4

Fixed stupid bug in DMA length handling - should fix sound clicking on some games.
author TomW
date Thu Dec 19 18:17:37 2013 +0000
parents 5b9067076693
children 772d686a2253
files src/dma.c
diffstat 1 files changed, 31 insertions(+), 32 deletions(-) [+]
line diff
     1.1 --- a/src/dma.c	Wed Dec 18 21:40:58 2013 +0000
     1.2 +++ b/src/dma.c	Thu Dec 19 18:17:37 2013 +0000
     1.3 @@ -267,15 +267,15 @@
     1.4                  if (dma.mode[channel] & 0x20) dma.ac[channel]--;
     1.5                  else                          dma.ac[channel]++;
     1.6                  dma.cc[channel]--;
     1.7 -                if (!dma.cc[channel] && (dma.mode[channel] & 0x10))
     1.8 +                if (dma.cc[channel] < 0)
     1.9                  {
    1.10 -                        dma.cc[channel] = dma.cb[channel] + 1;
    1.11 -                        dma.ac[channel] = dma.ab[channel];
    1.12 -                        dma.stat |= (1 << channel);
    1.13 -                }
    1.14 -                else if (dma.cc[channel]<=-1)
    1.15 -                {
    1.16 -                        dma.m |= (1 << channel);
    1.17 +                        if (dma.mode[channel] & 0x10) /*Auto-init*/
    1.18 +                        {
    1.19 +                                dma.cc[channel] = dma.cb[channel];
    1.20 +                                dma.ac[channel] = dma.ab[channel];
    1.21 +                        }
    1.22 +                        else
    1.23 +                                dma.m |= (1 << channel);
    1.24                          dma.stat |= (1 << channel);
    1.25                  }
    1.26  
    1.27 @@ -297,15 +297,15 @@
    1.28                  if (dma16.mode[channel] & 0x20) dma16.ac[channel]--;
    1.29                  else                            dma16.ac[channel]++;
    1.30                  dma16.cc[channel]--;
    1.31 -                if (!dma16.cc[channel] && (dma16.mode[channel] & 0x10))
    1.32 +                if (dma16.cc[channel] < 0)
    1.33                  {
    1.34 -                        dma16.cc[channel] = dma16.cb[channel] + 1;
    1.35 -                        dma16.ac[channel] = dma16.ab[channel];
    1.36 -                        dma16.stat |= (1 << channel);
    1.37 -                }
    1.38 -                else if (dma16.cc[channel] <= -1)
    1.39 -                {
    1.40 -                        dma16.m |= (1 << channel);
    1.41 +                        if (dma16.mode[channel] & 0x10) /*Auto-init*/
    1.42 +                        {
    1.43 +                                dma16.cc[channel] = dma16.cb[channel];
    1.44 +                                dma16.ac[channel] = dma16.ab[channel];
    1.45 +                        }
    1.46 +                        else
    1.47 +                                dma16.m |= (1 << channel);
    1.48                          dma16.stat |= (1 << channel);
    1.49                  }
    1.50  
    1.51 @@ -332,15 +332,15 @@
    1.52                  if (dma.mode[channel]&0x20) dma.ac[channel]--;
    1.53                  else                        dma.ac[channel]++;
    1.54                  dma.cc[channel]--;
    1.55 -                if (!dma.cc[channel] && (dma.mode[channel] & 0x10))
    1.56 +                if (dma.cc[channel] < 0)
    1.57                  {
    1.58 -                        dma.cc[channel] = dma.cb[channel] + 1;
    1.59 -                        dma.ac[channel] = dma.ab[channel];
    1.60 -                        dma.stat |= (1 << channel);
    1.61 -                }
    1.62 -                else if (dma.cc[channel]<=-1)
    1.63 -                {
    1.64 -                        dma.m    |= (1 << channel);
    1.65 +                        if (dma.mode[channel] & 0x10) /*Auto-init*/
    1.66 +                        {
    1.67 +                                dma.cc[channel] = dma.cb[channel];
    1.68 +                                dma.ac[channel] = dma.ab[channel];
    1.69 +                        }
    1.70 +                        else
    1.71 +                                dma.m |= (1 << channel);
    1.72                          dma.stat |= (1 << channel);
    1.73                  }
    1.74  
    1.75 @@ -361,15 +361,14 @@
    1.76                  if (dma16.mode[channel]&0x20) dma16.ac[channel]--;
    1.77                  else                          dma16.ac[channel]++;
    1.78                  dma16.cc[channel]--;
    1.79 -                if (!dma16.cc[channel] && (dma16.mode[channel] & 0x10))
    1.80 +                if (dma16.cc[channel] < 0)
    1.81                  {
    1.82 -                        dma16.cc[channel] = dma16.cb[channel] + 1;
    1.83 -                        dma16.ac[channel] = dma16.ab[channel];
    1.84 -                        dma16.stat |= (1 << channel);
    1.85 -                }
    1.86 -                else if (dma16.cc[channel] <= -1)
    1.87 -                {
    1.88 -                        dma16.m    |= (1 << channel);
    1.89 +                        if (dma16.mode[channel] & 0x10) /*Auto-init*/
    1.90 +                        {
    1.91 +                                dma16.cc[channel] = dma16.cb[channel] + 1;
    1.92 +                                dma16.ac[channel] = dma16.ab[channel];
    1.93 +                        }
    1.94 +                                dma16.m |= (1 << channel);
    1.95                          dma16.stat |= (1 << channel);
    1.96                  }
    1.97