psp snd output improved
[picodrive.git] / Pico / sound / sound.c
index 5f9836b..aa2acb2 100644 (file)
@@ -220,8 +220,14 @@ PICO_INTERNAL void PsndClear(void)
 {\r
   int len = PsndLen;\r
   if (PsndLen_exc_add) len++;\r
-  if (PicoOpt & 8) memset32((int *) PsndOut, 0, len); // clear both channels at once\r
-  else memset(PsndOut, 0, len<<1);\r
+  if (PicoOpt & 8)\r
+    memset32((int *) PsndOut, 0, len); // assume PsndOut to be aligned\r
+  else {\r
+    short *out = PsndOut;\r
+    if ((int)out & 2) { *out++ = 0; len--; }\r
+    memset32((int *) out, 0, len/2);\r
+    if (len & 1) out[len-1] = 0;\r
+  }\r
 }\r
 \r
 \r
@@ -248,9 +254,9 @@ PICO_INTERNAL int PsndRender(int offset, int length)
     SN76496Update(PsndOut+offset, length, stereo);\r
 \r
   // Add in the stereo FM buffer\r
-  if (PicoOpt & 1) {\r
+  if (PicoOpt & 1)\r
     buf32_updated = YM2612UpdateOne(buf32, length, stereo, 1);\r
-  else\r
+  else\r
     memset32(buf32, 0, length<<stereo);\r
 \r
 //printf("active_chs: %02x\n", buf32_updated);\r
@@ -448,7 +454,8 @@ PICO_INTERNAL void z80_pack(unsigned char *data)
   memcpy(data+4, &drZ80, 0x54);\r
 #elif defined(_USE_CZ80)\r
   *(int *)data = 0x00007a43; // "Cz"\r
-  memcpy(data+4, &CZ80, (INT32)&CZ80.BasePC - (INT32)&CZ80);\r
+  *(int *)(data+4) = Cz80_Get_Reg(&CZ80, CZ80_PC);\r
+  memcpy(data+8, &CZ80, (INT32)&CZ80.BasePC - (INT32)&CZ80);\r
 #endif\r
 }\r
 \r
@@ -476,9 +483,10 @@ PICO_INTERNAL void z80_unpack(unsigned char *data)
     z80_int(); // try to goto int handler, maybe we won't execute trash there?\r
   }\r
 #elif defined(_USE_CZ80)\r
-  if (*(int *)data == 0x00007a43) // "Cz" save?\r
-    memcpy(&CZ80, data+4, (INT32)&CZ80.BasePC - (INT32)&CZ80);\r
-  else {\r
+  if (*(int *)data == 0x00007a43) { // "Cz" save?\r
+    memcpy(&CZ80, data+8, (INT32)&CZ80.BasePC - (INT32)&CZ80);\r
+    Cz80_Set_Reg(&CZ80, CZ80_PC, *(int *)(data+4));\r
+  } else {\r
     z80_reset();\r
     z80_int();\r
   }\r