-// (c) Copyright 2004 Dave, All rights reserved.\r
-// (c) Copyright 2006-2010 notaz, All rights reserved.\r
-// Free for non-commercial use.\r
-\r
-// For commercial use, separate licencing terms must be obtained.\r
-\r
+/*\r
+ * PicoDrive\r
+ * (C) notaz, 2010\r
+ *\r
+ * This work is licensed under the terms of MAME license.\r
+ * See COPYING file in the top-level directory.\r
+ */\r
-typedef size_t (arearw)(void *p, size_t _size, size_t _n, void *file);\r
-typedef size_t (areaeof)(void *file);\r
-typedef int (areaseek)(void *file, long offset, int whence);\r
-typedef int (areaclose)(void *file);\r
-\r
static arearw *areaRead;\r
static arearw *areaWrite;\r
static areaeof *areaEof;\r
static arearw *areaRead;\r
static arearw *areaWrite;\r
static areaeof *areaEof;\r
};\r
\r
static int write_chunk(chunk_name_e name, int len, void *data, void *file)\r
};\r
\r
static int write_chunk(chunk_name_e name, int len, void *data, void *file)\r
strncpy(sbuff + 9, chunk_names[name], sizeof(sbuff) - 9); \\r
PicoStateProgressCB(sbuff); \\r
} \\r
strncpy(sbuff + 9, chunk_names[name], sizeof(sbuff) - 9); \\r
PicoStateProgressCB(sbuff); \\r
} \\r
strncpy(sbuff + 9, chunk_names[name], sizeof(sbuff) - 9); \\r
PicoStateProgressCB(sbuff); \\r
} \\r
strncpy(sbuff + 9, chunk_names[name], sizeof(sbuff) - 9); \\r
PicoStateProgressCB(sbuff); \\r
} \\r
\r
CHECKED_WRITE_BUFF(CHUNK_S68K, buff);\r
CHECKED_WRITE_BUFF(CHUNK_PRG_RAM, Pico_mcd->prg_ram);\r
\r
CHECKED_WRITE_BUFF(CHUNK_S68K, buff);\r
CHECKED_WRITE_BUFF(CHUNK_PRG_RAM, Pico_mcd->prg_ram);\r
CHECKED_WRITE_BUFF(CHUNK_SCD, Pico_mcd->scd);\r
CHECKED_WRITE_BUFF(CHUNK_RC, Pico_mcd->rot_comp);\r
CHECKED_WRITE_BUFF(CHUNK_MISC_CD, Pico_mcd->m);\r
CHECKED_WRITE_BUFF(CHUNK_SCD, Pico_mcd->scd);\r
CHECKED_WRITE_BUFF(CHUNK_RC, Pico_mcd->rot_comp);\r
CHECKED_WRITE_BUFF(CHUNK_MISC_CD, Pico_mcd->m);\r
+ memset(buff, 0, 0x40);\r
+ memcpy(buff, pcd_event_times, sizeof(pcd_event_times));\r
+ CHECKED_WRITE(CHUNK_CD_EVT, 0x40, buff);\r
\r
sh2_pack(&sh2s[0], cpubuff);\r
CHECKED_WRITE_BUFF(CHUNK_MSH2, cpubuff);\r
\r
sh2_pack(&sh2s[0], cpubuff);\r
CHECKED_WRITE_BUFF(CHUNK_MSH2, cpubuff);\r
- CHECKED_WRITE_BUFF(CHUNK_MSH2_DATA, Pico32xMem->data_array[0]);\r
- CHECKED_WRITE_BUFF(CHUNK_MSH2_PERI, Pico32xMem->sh2_peri_regs[0]);\r
+ CHECKED_WRITE_BUFF(CHUNK_MSH2_DATA, sh2s[0].data_array);\r
+ CHECKED_WRITE_BUFF(CHUNK_MSH2_PERI, sh2s[0].peri_regs);\r
\r
sh2_pack(&sh2s[1], cpubuff);\r
CHECKED_WRITE_BUFF(CHUNK_SSH2, cpubuff);\r
\r
sh2_pack(&sh2s[1], cpubuff);\r
CHECKED_WRITE_BUFF(CHUNK_SSH2, cpubuff);\r
- CHECKED_WRITE_BUFF(CHUNK_SSH2_DATA, Pico32xMem->data_array[1]);\r
- CHECKED_WRITE_BUFF(CHUNK_SSH2_PERI, Pico32xMem->sh2_peri_regs[1]);\r
+ CHECKED_WRITE_BUFF(CHUNK_SSH2_DATA, sh2s[1].data_array);\r
+ CHECKED_WRITE_BUFF(CHUNK_SSH2_PERI, sh2s[1].peri_regs);\r
\r
CHECKED_WRITE_BUFF(CHUNK_32XSYS, Pico32x);\r
CHECKED_WRITE_BUFF(CHUNK_M68K_BIOS, Pico32xMem->m68k_rom);\r
\r
CHECKED_WRITE_BUFF(CHUNK_32XSYS, Pico32x);\r
CHECKED_WRITE_BUFF(CHUNK_M68K_BIOS, Pico32xMem->m68k_rom);\r
CHECKED_WRITE_BUFF(CHUNK_SDRAM, Pico32xMem->sdram);\r
CHECKED_WRITE_BUFF(CHUNK_DRAM, Pico32xMem->dram);\r
CHECKED_WRITE_BUFF(CHUNK_32XPAL, Pico32xMem->pal);\r
CHECKED_WRITE_BUFF(CHUNK_SDRAM, Pico32xMem->sdram);\r
CHECKED_WRITE_BUFF(CHUNK_DRAM, Pico32xMem->dram);\r
CHECKED_WRITE_BUFF(CHUNK_32XPAL, Pico32xMem->pal);\r
+\r
+ memset(buff, 0, 0x40);\r
+ memcpy(buff, p32x_event_times, sizeof(p32x_event_times));\r
+ CHECKED_WRITE(CHUNK_32X_EVT, 0x40, buff);\r
unsigned char buff_m68k[0x60], buff_s68k[0x60];\r
unsigned char buff_z80[Z80_STATE_SIZE];\r
unsigned char buff_sh2[SH2_STATE_SIZE];\r
unsigned char buff_m68k[0x60], buff_s68k[0x60];\r
unsigned char buff_z80[Z80_STATE_SIZE];\r
unsigned char buff_sh2[SH2_STATE_SIZE];\r
if (len < 0 || len > 1024*512) R_ERROR_RETURN("bad length");\r
if (CHUNK_S68K <= chunk && chunk <= CHUNK_MISC_CD && !(PicoAHW & PAHW_MCD))\r
R_ERROR_RETURN("cd chunk in non CD state?");\r
if (len < 0 || len > 1024*512) R_ERROR_RETURN("bad length");\r
if (CHUNK_S68K <= chunk && chunk <= CHUNK_MISC_CD && !(PicoAHW & PAHW_MCD))\r
R_ERROR_RETURN("cd chunk in non CD state?");\r
case CHUNK_RC: CHECKED_READ_BUFF(Pico_mcd->rot_comp); break;\r
case CHUNK_MISC_CD: CHECKED_READ_BUFF(Pico_mcd->m); break;\r
\r
case CHUNK_RC: CHECKED_READ_BUFF(Pico_mcd->rot_comp); break;\r
case CHUNK_MISC_CD: CHECKED_READ_BUFF(Pico_mcd->m); break;\r
\r
case CHUNK_MSH2:\r
CHECKED_READ_BUFF(buff_sh2);\r
sh2_unpack(&sh2s[0], buff_sh2);\r
case CHUNK_MSH2:\r
CHECKED_READ_BUFF(buff_sh2);\r
sh2_unpack(&sh2s[0], buff_sh2);\r
- case CHUNK_MSH2_DATA: CHECKED_READ_BUFF(Pico32xMem->data_array[0]); break;\r
- case CHUNK_MSH2_PERI: CHECKED_READ_BUFF(Pico32xMem->sh2_peri_regs[0]); break;\r
- case CHUNK_SSH2_DATA: CHECKED_READ_BUFF(Pico32xMem->data_array[1]); break;\r
- case CHUNK_SSH2_PERI: CHECKED_READ_BUFF(Pico32xMem->sh2_peri_regs[1]); break;\r
+ case CHUNK_MSH2_DATA: CHECKED_READ_BUFF(sh2s[0].data_array); break;\r
+ case CHUNK_MSH2_PERI: CHECKED_READ_BUFF(sh2s[0].peri_regs); break;\r
+ case CHUNK_SSH2_DATA: CHECKED_READ_BUFF(sh2s[1].data_array); break;\r
+ case CHUNK_SSH2_PERI: CHECKED_READ_BUFF(sh2s[1].peri_regs); break;\r
case CHUNK_32XSYS: CHECKED_READ_BUFF(Pico32x); break;\r
case CHUNK_M68K_BIOS: CHECKED_READ_BUFF(Pico32xMem->m68k_rom); break;\r
case CHUNK_MSH2_BIOS: CHECKED_READ_BUFF(Pico32xMem->sh2_rom_m); break;\r
case CHUNK_32XSYS: CHECKED_READ_BUFF(Pico32x); break;\r
case CHUNK_M68K_BIOS: CHECKED_READ_BUFF(Pico32xMem->m68k_rom); break;\r
case CHUNK_MSH2_BIOS: CHECKED_READ_BUFF(Pico32xMem->sh2_rom_m); break;\r
case CHUNK_DRAM: CHECKED_READ_BUFF(Pico32xMem->dram); break;\r
case CHUNK_32XPAL: CHECKED_READ_BUFF(Pico32xMem->pal); break;\r
\r
case CHUNK_DRAM: CHECKED_READ_BUFF(Pico32xMem->dram); break;\r
case CHUNK_32XPAL: CHECKED_READ_BUFF(Pico32xMem->pal); break;\r
\r
- if (PicoAHW & PAHW_MCD)\r
- {\r
- PicoMemStateLoaded();\r
-\r
- if (!(Pico_mcd->s68k_regs[0x36] & 1) && (Pico_mcd->scd.Status_CDC & 1))\r
- cdda_start_play();\r
-\r
- SekUnpackCpu(buff_s68k, 1);\r
- }\r
+ if (PicoAHW & PAHW_32X)\r
+ Pico32xStateLoaded(1);\r
\r
// must unpack 68k and z80 after banks are set up\r
if (!(PicoAHW & PAHW_SMS))\r
SekUnpackCpu(buff_m68k, 0);\r
\r
// must unpack 68k and z80 after banks are set up\r
if (!(PicoAHW & PAHW_SMS))\r
SekUnpackCpu(buff_m68k, 0);\r
- Pico32xStateLoaded();\r
+ Pico32xStateLoaded(0);\r
+ if (PicoAHW & PAHW_MCD)\r
+ {\r
+ SekCycleAimS68k = SekCycleCntS68k;\r
+ pcd_state_loaded();\r
+\r
+ if (!(Pico_mcd->s68k_regs[0x36] & 1) && (Pico_mcd->scd.Status_CDC & 1))\r
+ cdda_start_play();\r
+ }\r
case CHUNK_VSRAM: CHECKED_READ_BUFF(Pico.vsram); found++; break;\r
case CHUNK_VIDEO: CHECKED_READ_BUFF(Pico.video); found++; break;\r
\r
case CHUNK_VSRAM: CHECKED_READ_BUFF(Pico.vsram); found++; break;\r
case CHUNK_VIDEO: CHECKED_READ_BUFF(Pico.video); found++; break;\r
\r
+ return ret;\r
+}\r
+\r
+int PicoState(const char *fname, int is_save)\r
+{\r
+ void *afile = NULL;\r
+ int ret;\r
+\r
+ afile = open_save_file(fname, is_save);\r
+ if (afile == NULL)\r
+ return -1;\r
+\r
+ ret = pico_state_internal(afile, is_save);\r
+int PicoStateFP(void *afile, int is_save,\r
+ arearw *read, arearw *write, areaeof *eof, areaseek *seek)\r
+{\r
+ areaRead = read;\r
+ areaWrite = write;\r
+ areaEof = eof;\r
+ areaSeek = seek;\r
+ areaClose = NULL;\r
+\r
+ return pico_state_internal(afile, is_save);\r
+}\r
+\r
memcpy(t->vsram, Pico.vsram, sizeof(Pico.vsram));\r
memcpy(&t->video, &Pico.video, sizeof(Pico.video));\r
\r
memcpy(t->vsram, Pico.vsram, sizeof(Pico.vsram));\r
memcpy(&t->video, &Pico.video, sizeof(Pico.video));\r
\r
if (PicoAHW & PAHW_32X) {\r
memcpy(&t->t32x.p32x, &Pico32x, sizeof(Pico32x));\r
memcpy(t->t32x.dram, Pico32xMem->dram, sizeof(Pico32xMem->dram));\r
memcpy(t->t32x.pal, Pico32xMem->pal, sizeof(Pico32xMem->pal));\r
}\r
if (PicoAHW & PAHW_32X) {\r
memcpy(&t->t32x.p32x, &Pico32x, sizeof(Pico32x));\r
memcpy(t->t32x.dram, Pico32xMem->dram, sizeof(Pico32xMem->dram));\r
memcpy(t->t32x.pal, Pico32xMem->pal, sizeof(Pico32xMem->pal));\r
}\r
if (PicoAHW & PAHW_32X) {\r
memcpy(&Pico32x, &t->t32x.p32x, sizeof(Pico32x));\r
memcpy(Pico32xMem->dram, t->t32x.dram, sizeof(Pico32xMem->dram));\r
memcpy(Pico32xMem->pal, t->t32x.pal, sizeof(Pico32xMem->pal));\r
Pico32x.dirty_pal = 1;\r
}\r
if (PicoAHW & PAHW_32X) {\r
memcpy(&Pico32x, &t->t32x.p32x, sizeof(Pico32x));\r
memcpy(Pico32xMem->dram, t->t32x.dram, sizeof(Pico32xMem->dram));\r
memcpy(Pico32xMem->pal, t->t32x.pal, sizeof(Pico32xMem->pal));\r
Pico32x.dirty_pal = 1;\r
}\r