Fixes Diablo 1 SPU bug properly and remove Diablo hack.
authorgameblabla <gameblabla@protonmail.com>
Sat, 21 Aug 2021 15:23:33 +0000 (17:23 +0200)
committergameblabla <gameblabla@protonmail.com>
Sat, 21 Aug 2021 15:23:33 +0000 (17:23 +0200)
(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/libretro.c
frontend/libretro_core_options.h
frontend/libretro_core_options_intl.h
frontend/main.c
frontend/menu.c
plugins/dfsound/externals.h
plugins/dfsound/registers.c
plugins/dfsound/spu.c
plugins/dfsound/spu_config.h

index e071daa..33f2a42 100644 (file)
@@ -1700,17 +1700,6 @@ static void update_variables(bool in_flight)
          Config.RCntFix = 1;
    }
 
-   var.value = NULL;
-   var.key = "pcsx_rearmed_idiablofix";
-
-   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
-   {
-      if (strcmp(var.value, "disabled") == 0)
-         spu_config.idiablofix = 0;
-      else if (strcmp(var.value, "enabled") == 0)
-         spu_config.idiablofix = 1;
-   }
-
    var.value = NULL;
    var.key = "pcsx_rearmed_inuyasha_fix";
 
index 813e30a..1dbcefa 100644 (file)
@@ -887,17 +887,6 @@ struct retro_core_option_definition option_defs_us[] = {
       },
       "simple",
    },
-   {
-      "pcsx_rearmed_idiablofix",
-      "Diablo Music Fix",
-      NULL,
-      {
-         { "disabled", NULL },
-         { "enabled",  NULL },
-         { NULL, NULL },
-      },
-      "disabled",
-   },
    {
       "pcsx_rearmed_pe2_fix",
       "Parasite Eve 2/Vandal Hearts 1/2 Fix",
index 1601ec4..174bb93 100644 (file)
@@ -371,15 +371,6 @@ struct retro_core_option_definition option_defs_tr[] = {
       },
       NULL
    },
-   {
-      "pcsx_rearmed_idiablofix",
-      "Diablo Müzik Düzeltmesi",
-      NULL,
-      {
-         { NULL, NULL },
-      },
-      NULL
-   },
    {
       "pcsx_rearmed_pe2_fix",
       "Parasite Eve 2/Vandal Hearts 1/2 Düzeltmleri",
index d3c7d40..a64e9bb 100644 (file)
@@ -148,7 +148,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 bd56cf4..0f7933d 100644 (file)
@@ -448,7 +448,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),
@@ -1466,7 +1465,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 4fb3b93..c038ea3 100644 (file)
@@ -113,7 +113,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
@@ -235,6 +235,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
@@ -246,9 +249,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 a64927e..e1b8a40 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 28965ab..95c8948 100644 (file)
@@ -10,7 +10,6 @@ typedef struct
  int        iUseReverb;
  int        iUseInterpolation;
  int        iTempo;
- int        idiablofix;
  int        iUseThread;
  int        iUseFixedUpdates;  // output fixed number of samples/frame