full ym2612 save/load for 940
[picodrive.git] / Pico / Memory.c
index fe87ab9..755b5b5 100644 (file)
@@ -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