click noise fixed when 940 was used
[picodrive.git] / Pico / Memory.c
index fe87ab9..88e3a32 100644 (file)
@@ -798,7 +798,7 @@ int ym2612_write_local(u32 a, u32 d, int is_from_z80)
             ym2612.OPN.ST.TA = TAnew;\r
             //ym2612.OPN.ST.TAC = (1024-TAnew)*18;\r
             //ym2612.OPN.ST.TAT = 0;\r
-            timer_a_step = timer_a_offset = 16466 * (1024 - TAnew);\r
+            timer_a_step = timer_a_offset = TIMER_A_TICK_ZCYCLES * (1024 - TAnew);\r
             if (ym2612.OPN.ST.mode & 1) {\r
               int cycles = is_from_z80 ? z80_cyclesDone() : cycles_68k_to_z80(SekCyclesDone());\r
               timer_a_next_oflow = (cycles << 8) + timer_a_step;\r
@@ -813,7 +813,7 @@ int ym2612_write_local(u32 a, u32 d, int is_from_z80)
             ym2612.OPN.ST.TB = d;\r
             //ym2612.OPN.ST.TBC = (256-d) * 288;\r
             //ym2612.OPN.ST.TBT  = 0;\r
-            timer_b_step = timer_b_offset = 262800 * (256 - d); // 262881\r
+            timer_b_step = timer_b_offset = TIMER_B_TICK_ZCYCLES * (256 - d); // 262800\r
             if (ym2612.OPN.ST.mode & 2) {\r
               int cycles = is_from_z80 ? z80_cyclesDone() : cycles_68k_to_z80(SekCyclesDone());\r
               timer_b_next_oflow = (cycles << 8) + timer_b_step;\r
@@ -839,7 +839,7 @@ int ym2612_write_local(u32 a, u32 d, int is_from_z80)
 \r
           if ((d ^ old_mode) & 0xc0) {\r
 #ifdef __GP2X__\r
-            if (PicoOpt & POPT_EXT_FM) YM2612Write_940(a, d, get_scanline(is_from_z80));\r
+            if (PicoOpt & POPT_EXT_FM) return YM2612Write_940(a, d, get_scanline(is_from_z80));\r
 #endif\r
             return 1;\r
           }\r
@@ -925,7 +925,7 @@ void ym2612_pack_state(void)
 \r
 #ifdef __GP2X__\r
   if (PicoOpt & POPT_EXT_FM)\r
-    /*YM2612PicoStateSave2_940(tat, tbt)*/;\r
+    YM2612PicoStateSave2_940(tat, tbt);\r
   else\r
 #endif\r
     YM2612PicoStateSave2(tat, tbt);\r
@@ -937,22 +937,37 @@ void ym2612_unpack_state(void)
   YM2612PicoStateLoad();\r
 \r
   // feed all the registers and update internal state\r
-  for (i = 0x20; i < 0xB8; i++) {\r
+  for (i = 0x20; i < 0xA0; i++) {\r
     ym2612_write_local(0, i, 0);\r
     ym2612_write_local(1, ym2612.REGS[i], 0);\r
   }\r
-  for (i = 0x30; i < 0xB8; i++) {\r
+  for (i = 0x30; i < 0xA0; i++) {\r
+    ym2612_write_local(2, i, 0);\r
+    ym2612_write_local(3, ym2612.REGS[i|0x100], 0);\r
+  }\r
+  for (i = 0xAF; i >= 0xA0; i--) { // must apply backwards\r
+    ym2612_write_local(2, i, 0);\r
+    ym2612_write_local(3, ym2612.REGS[i|0x100], 0);\r
+    ym2612_write_local(0, i, 0);\r
+    ym2612_write_local(1, ym2612.REGS[i], 0);\r
+  }\r
+  for (i = 0xB0; i < 0xB8; i++) {\r
+    ym2612_write_local(0, i, 0);\r
+    ym2612_write_local(1, ym2612.REGS[i], 0);\r
     ym2612_write_local(2, i, 0);\r
     ym2612_write_local(3, ym2612.REGS[i|0x100], 0);\r
   }\r
 \r
 #ifdef __GP2X__\r
   if (PicoOpt & POPT_EXT_FM)\r
-    /*ret = YM2612PicoStateLoad2_940(&tat, &tbt)*/;\r
+    ret = YM2612PicoStateLoad2_940(&tat, &tbt);\r
   else\r
 #endif\r
     ret = YM2612PicoStateLoad2(&tat, &tbt);\r
-  if (ret != 0) return; // no saved timers\r
+  if (ret != 0) {\r
+    elprintf(EL_STATUS, "old ym2612 state");\r
+    return; // no saved timers\r
+  }\r
 \r
   tac = (1024 - ym2612.OPN.ST.TA) << 16;\r
   tbc = (256  - ym2612.OPN.ST.TB) << 16;\r