fixed a possible deadlock in DrZ80
[picodrive.git] / Pico / sound / sound.c
index c0b3252..ac37c61 100644 (file)
@@ -8,14 +8,9 @@
 \r
 \r
 #include <string.h>\r
-#include "sound.h"\r
 #include "ym2612.h"\r
 #include "sn76496.h"\r
 \r
-#ifndef __GNUC__\r
-#pragma warning (disable:4244)\r
-#endif\r
-\r
 #if defined(_USE_MZ80)\r
 #include "../../cpu/mz80/mz80.h"\r
 #elif defined(_USE_DRZ80)\r
 // master int buffer to mix to\r
 static int PsndBuffer[2*44100/50];\r
 \r
-//int z80CycleAim = 0;\r
-\r
 // dac\r
-short *dac_out;\r
-unsigned short dac_info[312]; // pppppppp ppppllll, p - pos in buff, l - length to write for this sample\r
+static unsigned short dac_info[312]; // pppppppp ppppllll, p - pos in buff, l - length to write for this sample\r
 \r
 // for Pico\r
 int PsndRate=0;\r
@@ -51,7 +43,7 @@ void YM2612TimerHandler(int c,int cnt);
 extern int *sn76496_regs;\r
 \r
 \r
-static void dac_recalculate()\r
+static void dac_recalculate(void)\r
 {\r
   int i, dac_cnt, pos, len, lines = Pico.m.pal ? 312 : 262, mid = Pico.m.pal ? 68 : 93;\r
 \r
@@ -107,7 +99,7 @@ static void dac_recalculate()
 }\r
 \r
 \r
-void sound_reset()\r
+PICO_INTERNAL void sound_reset(void)\r
 {\r
   void *ym2612_regs;\r
 \r
@@ -125,7 +117,7 @@ void sound_reset()
 // to be called after changing sound rate or chips\r
 void sound_rerate(int preserve_state)\r
 {\r
-  unsigned int state[28];\r
+  void *state = NULL;\r
   int target_fps = Pico.m.pal ? 50 : 60;\r
 \r
   // not all rates are supported in MCD mode due to mp3 decoder limitations\r
@@ -135,12 +127,16 @@ void sound_rerate(int preserve_state)
   }\r
 \r
   if (preserve_state) {\r
+    state = malloc(0x200);\r
+    if (state == NULL) return;\r
+    memcpy(state, YM2612GetRegs(), 0x200);\r
     if ((PicoMCD & 1) && Pico_mcd->m.audio_track)\r
       Pico_mcd->m.audio_offset = mp3_get_offset();\r
   }\r
   YM2612Init(Pico.m.pal ? OSC_PAL/7 : OSC_NTSC/7, PsndRate);\r
   if (preserve_state) {\r
     // feed it back it's own registers, just like after loading state\r
+    memcpy(YM2612GetRegs(), state, 0x200);\r
     YM2612PicoStateLoad();\r
     if ((PicoMCD & 1) && Pico_mcd->m.audio_track)\r
       mp3_start_play(Pico_mcd->TOC.Tracks[Pico_mcd->m.audio_track].F, Pico_mcd->m.audio_offset);\r
@@ -150,6 +146,9 @@ void sound_rerate(int preserve_state)
   SN76496_init(Pico.m.pal ? OSC_PAL/15 : OSC_NTSC/15, PsndRate);\r
   if (preserve_state) memcpy(sn76496_regs, state, 28*4); // restore old state\r
 \r
+  if (state)\r
+    free(state);\r
+\r
   // calculate PsndLen\r
   PsndLen=PsndRate / target_fps;\r
   PsndLen_exc_add=((PsndRate - PsndLen*target_fps)<<16) / target_fps;\r
@@ -169,7 +168,7 @@ void sound_rerate(int preserve_state)
 \r
 \r
 // This is called once per raster (aka line), but not necessarily for every line\r
-void sound_timers_and_dac(int raster)\r
+PICO_INTERNAL void sound_timers_and_dac(int raster)\r
 {\r
   int pos, len;\r
   int do_dac = PsndOut && (PicoOpt&1) && *ym2612_dacen;\r
@@ -217,7 +216,7 @@ void sound_timers_and_dac(int raster)
 }\r
 \r
 \r
-void sound_clear(void)\r
+PICO_INTERNAL void sound_clear(void)\r
 {\r
   int len = PsndLen;\r
   if (PsndLen_exc_add) len++;\r
@@ -226,7 +225,7 @@ void sound_clear(void)
 }\r
 \r
 \r
-int sound_render(int offset, int length)\r
+PICO_INTERNAL int sound_render(int offset, int length)\r
 {\r
   int  buf32_updated = 0;\r
   int *buf32 = PsndBuffer+offset;\r
@@ -318,11 +317,13 @@ static unsigned int DrZ80_rebaseSP(unsigned short a)
 \r
 static unsigned char DrZ80_in(unsigned short p)\r
 {\r
+  elprintf(EL_ANOMALY, "Z80 port %04x read", p);\r
   return 0xff;\r
 }\r
 \r
 static void DrZ80_out(unsigned short p,unsigned char d)\r
 {\r
+  elprintf(EL_ANOMALY, "Z80 port %04x write %02x", p, d);\r
 }\r
 \r
 static void DrZ80_irq_callback()\r
@@ -333,7 +334,7 @@ static void DrZ80_irq_callback()
 #endif\r
 \r
 // z80 functionality wrappers\r
-void z80_init()\r
+PICO_INTERNAL void z80_init(void)\r
 {\r
 #if defined(_USE_MZ80)\r
   struct mz80context z80;\r
@@ -367,7 +368,7 @@ void z80_init()
 #endif\r
 }\r
 \r
-void z80_reset()\r
+PICO_INTERNAL void z80_reset(void)\r
 {\r
 #if defined(_USE_MZ80)\r
   mz80reset();\r
@@ -384,14 +385,14 @@ void z80_reset()
   Pico.m.z80_fakeval = 0; // for faking when Z80 is disabled\r
 }\r
 \r
-void z80_resetCycles()\r
+PICO_INTERNAL void z80_resetCycles(void)\r
 {\r
 #if defined(_USE_MZ80)\r
   mz80GetElapsedTicks(1);\r
 #endif\r
 }\r
 \r
-void z80_int()\r
+PICO_INTERNAL void z80_int(void)\r
 {\r
 #if defined(_USE_MZ80)\r
   mz80int(0);\r
@@ -402,7 +403,7 @@ void z80_int()
 }\r
 \r
 // returns number of cycles actually executed\r
-int z80_run(int cycles)\r
+PICO_INTERNAL int z80_run(int cycles)\r
 {\r
 #if defined(_USE_MZ80)\r
   int ticks_pre = mz80GetElapsedTicks(0);\r
@@ -415,7 +416,7 @@ int z80_run(int cycles)
 #endif\r
 }\r
 \r
-void z80_pack(unsigned char *data)\r
+PICO_INTERNAL void z80_pack(unsigned char *data)\r
 {\r
 #if defined(_USE_MZ80)\r
   struct mz80context mz80;\r
@@ -430,7 +431,7 @@ void z80_pack(unsigned char *data)
 #endif\r
 }\r
 \r
-void z80_unpack(unsigned char *data)\r
+PICO_INTERNAL void z80_unpack(unsigned char *data)\r
 {\r
 #if defined(_USE_MZ80)\r
   if(*(int *)data == 0x00005A6D) { // "mZ" save?\r
@@ -456,7 +457,7 @@ void z80_unpack(unsigned char *data)
 #endif\r
 }\r
 \r
-void z80_exit()\r
+PICO_INTERNAL void z80_exit(void)\r
 {\r
 #if defined(_USE_MZ80)\r
   mz80shutdown();\r
@@ -464,7 +465,7 @@ void z80_exit()
 }\r
 \r
 #if defined(__DEBUG_PRINT) || defined(__GP2X__)\r
-void z80_debug(char *dstr)\r
+PICO_INTERNAL void z80_debug(char *dstr)\r
 {\r
 #if defined(_USE_DRZ80)\r
   sprintf(dstr, "Z80 state: PC: %04x SP: %04x\n", drZ80.Z80PC-drZ80.Z80PC_BASE, drZ80.Z80SP-drZ80.Z80SP_BASE);\r