final fixes for UIQ3
[picodrive.git] / Pico / cd / Area.c
index c8c1d91..164d272 100644 (file)
@@ -101,7 +101,7 @@ PICO_INTERNAL int PicoCdSaveState(void *file)
        unsigned char buff[0x60];
        void *ym2612_regs = YM2612GetRegs();
 
-       areaWrite("PicoSMCD", 1, 8, file);
+       areaWrite("PicoSEXT", 1, 8, file);
        areaWrite(&PicoVer, 1, 4, file);
 
        memset(buff, 0, sizeof(buff));
@@ -121,12 +121,13 @@ PICO_INTERNAL int PicoCdSaveState(void *file)
        }
        if (PicoOpt&3)
                CHECKED_WRITE(CHUNK_PSG, 28*4, sn76496_regs);
-       if (PicoOpt&1)
+       if (PicoOpt&1) {
+               ym2612_pack_state();
                CHECKED_WRITE(CHUNK_FM, 0x200+4, ym2612_regs);
+       }
 
-       if (PicoMCD & 1)
+       if (PicoAHW & PAHW_MCD)
        {
-               Pico_mcd->m.audio_offset = mp3_get_offset();
                memset(buff, 0, sizeof(buff));
                PicoAreaPackCpu(buff, 1);
                if (Pico_mcd->s68k_regs[3]&4) // 1M mode?
@@ -173,7 +174,7 @@ static int g_read_offs = 0;
 // when is eof really set?
 #define CHECKED_READ(len,data) \
        if (areaRead(data, 1, len, file) != len) { \
-               if (len == 1 && areaEof(file)) return 0; \
+               if (len == 1 && areaEof(file)) goto readend; \
                R_ERROR_RETURN("areaRead: premature EOF\n"); \
                return 1; \
        } \
@@ -191,13 +192,14 @@ static int g_read_offs = 0;
 
 PICO_INTERNAL int PicoCdLoadState(void *file)
 {
-       unsigned char buff[0x60];
+       unsigned char buff[0x60], buff_m68k[0x60], buff_s68k[0x60];
        int ver, len;
        void *ym2612_regs = YM2612GetRegs();
 
        g_read_offs = 0;
        CHECKED_READ(8, buff);
-       if (strncmp((char *)buff, "PicoSMCD", 8)) R_ERROR_RETURN("bad header");
+       if (strncmp((char *)buff, "PicoSMCD", 8) && strncmp((char *)buff, "PicoSEXT", 8))
+               R_ERROR_RETURN("bad header");
        CHECKED_READ(4, &ver);
 
        while (!areaEof(file))
@@ -205,14 +207,13 @@ PICO_INTERNAL int PicoCdLoadState(void *file)
                CHECKED_READ(1, buff);
                CHECKED_READ(4, &len);
                if (len < 0 || len > 1024*512) R_ERROR_RETURN("bad length");
-               if (buff[0] > CHUNK_FM && buff[0] <= CHUNK_MISC_CD && !(PicoMCD & 1))
+               if (buff[0] > CHUNK_FM && buff[0] <= CHUNK_MISC_CD && !(PicoAHW & PAHW_MCD))
                        R_ERROR_RETURN("cd chunk in non CD state?");
 
                switch (buff[0])
                {
                        case CHUNK_M68K:
-                               CHECKED_READ_BUFF(buff);
-                               PicoAreaUnpackCpu(buff, 0);
+                               CHECKED_READ_BUFF(buff_m68k);
                                break;
 
                        case CHUNK_Z80:
@@ -230,13 +231,12 @@ PICO_INTERNAL int PicoCdLoadState(void *file)
                        case CHUNK_PSG:   CHECKED_READ2(28*4, sn76496_regs); break;
                        case CHUNK_FM:
                                CHECKED_READ2(0x200+4, ym2612_regs);
-                               YM2612PicoStateLoad();
+                               ym2612_unpack_state();
                                break;
 
                        // cd stuff
                        case CHUNK_S68K:
-                               CHECKED_READ_BUFF(buff);
-                               PicoAreaUnpackCpu(buff, 1);
+                               CHECKED_READ_BUFF(buff_s68k);
                                break;
 
                        case CHUNK_PRG_RAM:     CHECKED_READ_BUFF(Pico_mcd->prg_ram); break;
@@ -269,7 +269,8 @@ PICO_INTERNAL int PicoCdLoadState(void *file)
                breakswitch:;
        }
 
-       if (PicoMCD & 1)
+readend:
+       if (PicoAHW & PAHW_MCD)
        {
                /* after load events */
                if (Pico_mcd->s68k_regs[3]&4) // 1M mode?
@@ -279,11 +280,15 @@ PICO_INTERNAL int PicoCdLoadState(void *file)
                if (Pico_mcd->s68k_regs[3]&4)
                        PicoMemResetCDdecode(Pico_mcd->s68k_regs[3]);
 #endif
-               if (Pico_mcd->m.audio_track > 0 && Pico_mcd->m.audio_track < Pico_mcd->TOC.Last_Track)
-                       mp3_start_play(Pico_mcd->TOC.Tracks[Pico_mcd->m.audio_track].F, Pico_mcd->m.audio_offset);
+               if (!(Pico_mcd->s68k_regs[0x36] & 1) && (Pico_mcd->scd.Status_CDC & 1))
+                       cdda_start_play();
                // restore hint vector
                *(unsigned short *)(Pico_mcd->bios + 0x72) = Pico_mcd->m.hint_vector;
+
+               // must unpack after other CD stuff is loaded
+               PicoAreaUnpackCpu(buff_s68k, 1);
        }
+       PicoAreaUnpackCpu(buff_m68k, 0);
 
        return 0;
 }
@@ -296,7 +301,8 @@ int PicoCdLoadStateGfx(void *file)
 
        g_read_offs = 0;
        CHECKED_READ(8, buff);
-       if (strncmp(buff, "PicoSMCD", 8)) R_ERROR_RETURN("bad header");
+       if (strncmp((char *)buff, "PicoSMCD", 8) && strncmp((char *)buff, "PicoSEXT", 8))
+               R_ERROR_RETURN("bad header");
        CHECKED_READ(4, &ver);
 
        while (!areaEof(file) && found < 4)
@@ -304,7 +310,7 @@ int PicoCdLoadStateGfx(void *file)
                CHECKED_READ(1, buff);
                CHECKED_READ(4, &len);
                if (len < 0 || len > 1024*512) R_ERROR_RETURN("bad length");
-               if (buff[0] > CHUNK_FM && buff[0] <= CHUNK_MISC_CD && !(PicoMCD & 1))
+               if (buff[0] > CHUNK_FM && buff[0] <= CHUNK_MISC_CD && !(PicoAHW & PAHW_MCD))
                        R_ERROR_RETURN("cd chunk in non CD state?");
 
                switch (buff[0])
@@ -319,6 +325,7 @@ int PicoCdLoadStateGfx(void *file)
                }
        }
 
+readend:
        return 0;
 }