-// (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
\r
#include "pico_int.h"\r
#include <zlib/zlib.h>\r
CHUNK_SDRAM,\r
CHUNK_DRAM,\r
CHUNK_32XPAL,\r
+ CHUNK_32X_EVT,\r
+ CHUNK_32X_FIRST = CHUNK_MSH2,\r
+ CHUNK_32X_LAST = CHUNK_32X_EVT,\r
//\r
CHUNK_DEFAULT_COUNT,\r
CHUNK_CARTHW_ = CHUNK_CARTHW, // defined in PicoInt\r
"SDRAM",\r
"DRAM",\r
"PAL",\r
+ "events",\r
};\r
\r
static int write_chunk(chunk_name_e name, int len, void *data, void *file)\r
wram_2M_to_1M(Pico_mcd->word_ram2M);\r
}\r
\r
+#ifndef NO_32X\r
if (PicoAHW & PAHW_32X)\r
{\r
unsigned char cpubuff[SH2_STATE_SIZE];\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, event_times, sizeof(event_times));\r
+ CHECKED_WRITE(CHUNK_32X_EVT, 0x40, buff);\r
}\r
+#endif\r
\r
if (carthw_chunks != NULL)\r
{\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[0x40];\r
unsigned char chunk;\r
void *ym2612_regs;\r
char header[8];\r
int ver, len;\r
\r
+ memset(buff_m68k, 0, sizeof(buff_m68k));\r
+ memset(buff_s68k, 0, sizeof(buff_s68k));\r
+ memset(buff_z80, 0, sizeof(buff_z80));\r
+\r
g_read_offs = 0;\r
CHECKED_READ(8, header);\r
if (strncmp(header, "PicoSMCD", 8) && strncmp(header, "PicoSEXT", 8))\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 (CHUNK_MSH2 <= chunk && chunk <= CHUNK_32XPAL && !(PicoAHW & PAHW_32X))\r
- R_ERROR_RETURN("32x chunk in non 32x state?");\r
+ if (CHUNK_32X_FIRST <= chunk && chunk <= CHUNK_32X_LAST && !(PicoAHW & PAHW_32X))\r
+ Pico32xStartup();\r
\r
switch (chunk)\r
{\r
\r
case CHUNK_Z80:\r
CHECKED_READ_BUFF(buff_z80);\r
- z80_unpack(buff_z80);\r
break;\r
\r
case CHUNK_RAM: CHECKED_READ_BUFF(Pico.ram); break;\r
case CHUNK_MISC_CD: CHECKED_READ_BUFF(Pico_mcd->m); break;\r
\r
// 32x stuff\r
+#ifndef NO_32X\r
case CHUNK_MSH2:\r
CHECKED_READ_BUFF(buff_sh2);\r
sh2_unpack(&sh2s[0], buff_sh2);\r
case CHUNK_DRAM: CHECKED_READ_BUFF(Pico32xMem->dram); break;\r
case CHUNK_32XPAL: CHECKED_READ_BUFF(Pico32xMem->pal); break;\r
\r
+ case CHUNK_32X_EVT:\r
+ CHECKED_READ_BUFF(buff);\r
+ memcpy(event_times, buff, sizeof(event_times));\r
+ break;\r
+#endif\r
default:\r
if (carthw_chunks != NULL)\r
{\r
\r
if (!(Pico_mcd->s68k_regs[0x36] & 1) && (Pico_mcd->scd.Status_CDC & 1))\r
cdda_start_play();\r
-\r
- // must unpack after mem is set up\r
- SekUnpackCpu(buff_s68k, 1);\r
}\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
+ if (PicoAHW & PAHW_MCD)\r
+ SekUnpackCpu(buff_s68k, 1);\r
+\r
+ z80_unpack(buff_z80);\r
\r
+ // due to dep from 68k cycles..\r
if (PicoAHW & PAHW_32X)\r
- Pico32xStateLoaded();\r
+ Pico32xStateLoaded(0);\r
\r
return 0;\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
+#ifndef NO_32X\r
case CHUNK_DRAM:\r
if (Pico32xMem != NULL)\r
CHECKED_READ_BUFF(Pico32xMem->dram);\r
case CHUNK_32XSYS:\r
CHECKED_READ_BUFF(Pico32x);\r
break;\r
-\r
+#endif\r
default:\r
areaSeek(file, len, SEEK_CUR);\r
break;\r
memcpy(t->vsram, Pico.vsram, sizeof(Pico.vsram));\r
memcpy(&t->video, &Pico.video, sizeof(Pico.video));\r
\r
+#ifndef NO_32X\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
+#endif\r
\r
return t;\r
}\r
memcpy(&Pico.video, &t->video, sizeof(Pico.video));\r
Pico.m.dirtyPal = 1;\r
\r
+#ifndef NO_32X\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
+#endif\r
}\r
\r
-// vim:shiftwidth=2:expandtab\r
+// vim:shiftwidth=2:ts=2:expandtab\r