Fixes Diablo 1 SPU bug properly and remove Diablo hack. (#191)
authorgameblabla <gameblabla@users.noreply.github.com>
Sun, 22 Aug 2021 21:50:09 +0000 (21:50 +0000)
committerGitHub <noreply@github.com>
Sun, 22 Aug 2021 21:50:09 +0000 (00:50 +0300)
(Mostly) inspired by the fixes done in PCSX Redux :
https://github.com/grumpycoders/pcsx-redux/blob/93653ba5281487d3bed57371d7b64c32dfc669f0/src/spu/registers.cc#L504

It seems that there was an attempt to initially implement it
in PCSX Reloaded (hence the bIgnoreLoop in freeze.c) but it was never
implemented properly.

Co-authored-by: Nicolas Noble <nicolasnoble@users.noreply.github.com>
frontend/main.c
frontend/menu.c
maemo/main.c
plugins/dfsound/externals.h
plugins/dfsound/registers.c
plugins/dfsound/spu.c
plugins/dfsound/spu_config.h

index 43a5548..a824fdc 100644 (file)
@@ -138,7 +138,6 @@ void emu_set_default_config(void)
        pl_rearmed_cbs.gpu_peopsgl.iTexGarbageCollection = 1;
 
        spu_config.iUseReverb = 1;
-       spu_config.idiablofix = 0;
        spu_config.iUseInterpolation = 1;
        spu_config.iXAPitch = 0;
        spu_config.iVolume = 768;
index c806aa9..d9fee04 100644 (file)
@@ -443,7 +443,6 @@ static const struct {
        CE_INTVAL_P(gpu_peopsgl.iTexGarbageCollection),
        CE_INTVAL_P(gpu_peopsgl.dwActFixes),
        CE_INTVAL(spu_config.iUseReverb),
-       CE_INTVAL(spu_config.idiablofix),
        CE_INTVAL(spu_config.iXAPitch),
        CE_INTVAL(spu_config.iUseInterpolation),
        CE_INTVAL(spu_config.iTempo),
@@ -1458,7 +1457,6 @@ static menu_entry e_menu_plugin_spu[] =
        mee_range_h   ("Volume boost",              0, volume_boost, -5, 30, h_spu_volboost),
        mee_onoff     ("Reverb",                    0, spu_config.iUseReverb, 1),
        mee_enum      ("Interpolation",             0, spu_config.iUseInterpolation, men_spu_interp),
-       mee_onoff     ("Diablo Music fix",          0, spu_config.idiablofix, 1),
        mee_onoff     ("Adjust XA pitch",           0, spu_config.iXAPitch, 1),
        mee_onoff_h   ("Adjust tempo",              0, spu_config.iTempo, 1, h_spu_tempo),
        mee_end,
index c382c51..564e8ed 100644 (file)
@@ -197,7 +197,6 @@ int main(int argc, char **argv)
        strcpy(Config.Bios, "HLE");
        spu_config.iUseReverb = 1;
        spu_config.iUseInterpolation = 1;
-       spu_config.idiablofix = 0;
        in_type1 = PSE_PAD_TYPE_STANDARD;
        in_type2 = PSE_PAD_TYPE_STANDARD;
 
index 2db75ac..de4b5db 100644 (file)
@@ -110,7 +110,7 @@ typedef struct
  unsigned int      bNoise:1;                           // noise active flag\r
  unsigned int      bFMod:2;                            // freq mod (0=off, 1=sound channel, 2=freq channel)\r
  unsigned int      prevflags:3;                        // flags from previous block\r
-\r
+ unsigned int      bIgnoreLoop:1;                      // Ignore loop\r
  int               iLeftVolume;                        // left volume\r
  int               iRightVolume;                       // right volume\r
  ADSRInfoEx        ADSRX;\r
@@ -232,6 +232,9 @@ typedef struct
  unsigned short  regArea[0x400];\r
 } SPUInfo;\r
 \r
+#define regAreaGet(ch,offset) \\r
+  spu.regArea[((ch<<4)|(offset))>>1]\r
+\r
 ///////////////////////////////////////////////////////////\r
 // SPU.C globals\r
 ///////////////////////////////////////////////////////////\r
@@ -243,9 +246,6 @@ extern SPUInfo spu;
 void do_samples(unsigned int cycles_to, int do_sync);\r
 void schedule_next_irq(void);\r
 \r
-#define regAreaGet(ch,offset) \\r
-  spu.regArea[((ch<<4)|(offset))>>1]\r
-\r
 #define do_samples_if_needed(c, sync) \\r
  do { \\r
   if (sync || (int)((c) - spu.cycles_played) >= 16 * 768) \\r
index d508c06..cc72020 100644 (file)
@@ -112,6 +112,7 @@ void CALLBACK SPUwriteRegister(unsigned long reg, unsigned short val,
      //------------------------------------------------//\r
      case 14:                                          // loop?\r
        spu.s_chan[ch].pLoop=spu.spuMemC+((val&~1)<<3);\r
+       spu.s_chan[ch].bIgnoreLoop = 1;\r
        goto upd_irq;\r
      //------------------------------------------------//\r
     }\r
@@ -351,8 +352,7 @@ static void SoundOn(int start,int end,unsigned short val)
   {\r
    if((val&1) && regAreaGet(ch,6))                     // mmm... start has to be set before key on !?!\r
     {\r
-     spu.s_chan[ch].pCurr=spu.spuMemC+((regAreaGet(ch,6)&~1)<<3); // must be block aligned\r
-     if (spu_config.idiablofix == 0) spu.s_chan[ch].pLoop=spu.spuMemC+((regAreaGet(ch,14)&~1)<<3);\r
+     spu.s_chan[ch].bIgnoreLoop = 0;\r
      spu.dwNewChannel|=(1<<ch);\r
     }\r
   }\r
index 0058ad2..3822e8c 100644 (file)
@@ -247,6 +247,8 @@ static void StartSoundMain(int ch)
  s_chan->iSBPos=27;
  s_chan->spos=0;
 
+ s_chan->pCurr = spu.spuMemC+((regAreaGet(ch,6)&~1)<<3);
+
  spu.dwNewChannel&=~(1<<ch);                           // clear new channel bit
  spu.dwChannelOn|=1<<ch;
  spu.dwChannelDead&=~(1<<ch);
@@ -433,7 +435,7 @@ static int decode_block(void *unused, int ch, int *SB)
  decode_block_data(SB, start + 2, predict_nr, shift_factor);
 
  flags = start[1];
- if (flags & 4)
+ if (flags & 4 && (!s_chan->bIgnoreLoop))
   s_chan->pLoop = start;                   // loop adress
 
  start += 16;
@@ -1489,6 +1491,7 @@ long CALLBACK SPUinit(void)
    spu.s_chan[i].ADSRX.SustainIncrease = 1;
    spu.s_chan[i].pLoop = spu.spuMemC;
    spu.s_chan[i].pCurr = spu.spuMemC;
+   spu.s_chan[i].bIgnoreLoop = 0;
   }
 
  spu.bSpuInit=1;                                       // flag: we are inited
index 6b46bf3..3e88a2c 100644 (file)
@@ -7,7 +7,6 @@ typedef struct
  int        iUseReverb;
  int        iUseInterpolation;
  int        iTempo;
- int        idiablofix;
  int        iUseThread;
  int        iUseFixedUpdates;  // output fixed number of samples/frame