sound: fix ym2612 address handling
authornotaz <notasas@gmail.com>
Mon, 12 Jun 2023 20:55:50 +0000 (23:55 +0300)
committeririxxxx <31696370+irixxxx@users.noreply.github.com>
Tue, 13 Jun 2023 09:05:19 +0000 (11:05 +0200)
I already fixed this back in 2017 with
151df6adf9d63c9b8c8a61946243800610ac3a65, but forgot about
ym2612_write_local(). Fixes missing sounds in Overdrive2.

pico/memory.c
pico/sound/ym2612.c

index 3cc2fee..7462829 100644 (file)
@@ -1112,31 +1112,20 @@ static int ym2612_write_local(u32 a, u32 d, int is_from_z80)
   int addr;\r
 \r
   a &= 3;\r
-  if (a == 1 && ym2612.OPN.ST.address == 0x2a) /* DAC data */\r
-  {\r
-    int cycles = is_from_z80 ? z80_cyclesDone() : z80_cycles_from_68k();\r
-    //elprintf(EL_STATUS, "%03i dac w %08x z80 %i", cycles, d, is_from_z80);\r
-    if (ym2612.dacen)\r
-      PsndDoDAC(cycles);\r
-    ym2612.dacout = ((int)d - 0x80) << 6;\r
-    return 0;\r
-  }\r
-\r
   switch (a)\r
   {\r
     case 0: /* address port 0 */\r
+    case 2: /* address port 1 */\r
       ym2612.OPN.ST.address = d;\r
-      ym2612.addr_A1 = 0;\r
+      ym2612.addr_A1 = (a & 2) >> 1;\r
 #ifdef __GP2X__\r
       if (PicoIn.opt & POPT_EXT_FM) YM2612Write_940(a, d, -1);\r
 #endif\r
       return 0;\r
 \r
     case 1: /* data port 0    */\r
-      if (ym2612.addr_A1 != 0)\r
-        return 0;\r
-\r
-      addr = ym2612.OPN.ST.address;\r
+    case 3: /* data port 1    */\r
+      addr = ym2612.OPN.ST.address | ((int)ym2612.addr_A1 << 8);\r
       ym2612.REGS[addr] = d;\r
 \r
       switch (addr)\r
@@ -1201,6 +1190,14 @@ static int ym2612_write_local(u32 a, u32 d, int is_from_z80)
           }\r
           return 0;\r
         }\r
+        case 0x2a: { /* DAC data */\r
+          int cycles = is_from_z80 ? z80_cyclesDone() : z80_cycles_from_68k();\r
+          //elprintf(EL_STATUS, "%03i dac w %08x z80 %i", cycles, d, is_from_z80);\r
+          if (ym2612.dacen)\r
+            PsndDoDAC(cycles);\r
+          ym2612.dacout = ((int)d - 0x80) << 6;\r
+          return 0;\r
+        }\r
         case 0x2b: { /* DAC Sel  (YM2612) */\r
           ym2612.dacen = d & 0x80;\r
 #ifdef __GP2X__\r
@@ -1210,22 +1207,6 @@ static int ym2612_write_local(u32 a, u32 d, int is_from_z80)
         }\r
       }\r
       break;\r
-\r
-    case 2: /* address port 1 */\r
-      ym2612.OPN.ST.address = d;\r
-      ym2612.addr_A1 = 1;\r
-#ifdef __GP2X__\r
-      if (PicoIn.opt & POPT_EXT_FM) YM2612Write_940(a, d, -1);\r
-#endif\r
-      return 0;\r
-\r
-    case 3: /* data port 1    */\r
-      if (ym2612.addr_A1 != 1)\r
-        return 0;\r
-\r
-      addr = ym2612.OPN.ST.address | 0x100;\r
-      ym2612.REGS[addr] = d;\r
-      break;\r
   }\r
 \r
 #ifdef __GP2X__\r
index 219aacd..39958f5 100644 (file)
@@ -1886,6 +1886,7 @@ int YM2612Write_(unsigned int a, unsigned int v)
        switch( a & 3 ){\r
        case 0: /* address port 0 */\r
        case 2: /* address port 1 */\r
+               /* reminder: this is not used, see ym2612_write_local() */\r
                ym2612.OPN.ST.address = v;\r
                ym2612.addr_A1 = (a & 2) >> 1;\r
                ret = 0;\r