return afile;\r
}\r
\r
-// legacy savestate loading\r
-#define SCANP(f, x) areaRead(&Pico.x, sizeof(Pico.x), 1, f)\r
-\r
-static int state_load_legacy(void *file)\r
-{\r
- unsigned char head[32];\r
- unsigned char cpu[0x60];\r
- unsigned char cpu_z80[Z80_STATE_SIZE];\r
- void *ym2612_regs;\r
- int ok;\r
-\r
- memset(&cpu,0,sizeof(cpu));\r
- memset(&cpu_z80,0,sizeof(cpu_z80));\r
-\r
- memset(head, 0, sizeof(head));\r
- areaRead(head, sizeof(head), 1, file);\r
- if (strcmp((char *)head, "Pico") != 0)\r
- return -1;\r
-\r
- elprintf(EL_STATUS, "legacy savestate");\r
-\r
- // Scan all the memory areas:\r
- SCANP(file, ram);\r
- SCANP(file, vram);\r
- SCANP(file, zram);\r
- SCANP(file, cram);\r
- SCANP(file, vsram);\r
-\r
- // Pack, scan and unpack the cpu data:\r
- areaRead(cpu, sizeof(cpu), 1, file);\r
- SekUnpackCpu(cpu, 0);\r
-\r
- SCANP(file, m);\r
- SCANP(file, video);\r
-\r
- ok = areaRead(cpu_z80, sizeof(cpu_z80), 1, file) == sizeof(cpu_z80);\r
- // do not unpack if we fail to load z80 state\r
- if (!ok) z80_reset();\r
- else z80_unpack(cpu_z80);\r
-\r
- ym2612_regs = YM2612GetRegs();\r
- areaRead(sn76496_regs, 28*4, 1, file);\r
- areaRead(ym2612_regs, 0x200+4, 1, file);\r
- ym2612_unpack_state();\r
-\r
- return 0;\r
-}\r
-\r
// ---------------------------------------------------------------------------\r
\r
typedef enum {\r
areaWrite("PicoSEXT", 1, 8, file);\r
areaWrite(&ver, 1, 4, file);\r
\r
- if (!(PicoAHW & PAHW_SMS)) {\r
+ if (!(PicoIn.AHW & PAHW_SMS)) {\r
+ // the patches can cause incompatible saves with no-idle\r
+ SekFinishIdleDet();\r
+\r
memset(buff, 0, sizeof(buff));\r
SekPackCpu(buff, 0);\r
CHECKED_WRITE_BUFF(CHUNK_M68K, buff);\r
- CHECKED_WRITE_BUFF(CHUNK_RAM, Pico.ram);\r
- CHECKED_WRITE_BUFF(CHUNK_VSRAM, Pico.vsram);\r
- CHECKED_WRITE_BUFF(CHUNK_IOPORTS, Pico.ioports);\r
+ CHECKED_WRITE_BUFF(CHUNK_RAM, PicoMem.ram);\r
+ CHECKED_WRITE_BUFF(CHUNK_VSRAM, PicoMem.vsram);\r
+ CHECKED_WRITE_BUFF(CHUNK_IOPORTS, PicoMem.ioports);\r
ym2612_pack_state();\r
CHECKED_WRITE(CHUNK_FM, 0x200+4, ym2612_regs);\r
+\r
+ if (!(PicoIn.opt & POPT_DIS_IDLE_DET))\r
+ SekInitIdleDet();\r
}\r
else {\r
CHECKED_WRITE_BUFF(CHUNK_SMS, Pico.ms);\r
}\r
\r
- CHECKED_WRITE_BUFF(CHUNK_VRAM, Pico.vram);\r
- CHECKED_WRITE_BUFF(CHUNK_ZRAM, Pico.zram);\r
- CHECKED_WRITE_BUFF(CHUNK_CRAM, Pico.cram);\r
+ CHECKED_WRITE_BUFF(CHUNK_VRAM, PicoMem.vram);\r
+ CHECKED_WRITE_BUFF(CHUNK_ZRAM, PicoMem.zram);\r
+ CHECKED_WRITE_BUFF(CHUNK_CRAM, PicoMem.cram);\r
CHECKED_WRITE_BUFF(CHUNK_MISC, Pico.m);\r
CHECKED_WRITE_BUFF(CHUNK_VIDEO, Pico.video);\r
\r
CHECKED_WRITE_BUFF(CHUNK_Z80, buff_z80);\r
CHECKED_WRITE(CHUNK_PSG, 28*4, sn76496_regs);\r
\r
- if (PicoAHW & PAHW_MCD)\r
+ if (PicoIn.AHW & PAHW_MCD)\r
{\r
buf2 = malloc(CHUNK_LIMIT_W);\r
if (buf2 == NULL)\r
}\r
\r
#ifndef NO_32X\r
- if (PicoAHW & PAHW_32X)\r
+ if (PicoIn.AHW & PAHW_32X)\r
{\r
unsigned char cpubuff[SH2_STATE_SIZE];\r
\r
CHECKED_READ(1, &chunk);\r
CHECKED_READ(4, &len);\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
+ if (CHUNK_S68K <= chunk && chunk <= CHUNK_MISC_CD && !(PicoIn.AHW & PAHW_MCD))\r
R_ERROR_RETURN("cd chunk in non CD state?");\r
- if (CHUNK_32X_FIRST <= chunk && chunk <= CHUNK_32X_LAST && !(PicoAHW & PAHW_32X))\r
+ if (CHUNK_32X_FIRST <= chunk && chunk <= CHUNK_32X_LAST && !(PicoIn.AHW & PAHW_32X))\r
Pico32xStartup();\r
\r
switch (chunk)\r
CHECKED_READ_BUFF(buff_z80);\r
break;\r
\r
- case CHUNK_RAM: CHECKED_READ_BUFF(Pico.ram); break;\r
- case CHUNK_VRAM: CHECKED_READ_BUFF(Pico.vram); break;\r
- case CHUNK_ZRAM: CHECKED_READ_BUFF(Pico.zram); break;\r
- case CHUNK_CRAM: CHECKED_READ_BUFF(Pico.cram); break;\r
- case CHUNK_VSRAM: CHECKED_READ_BUFF(Pico.vsram); break;\r
+ case CHUNK_RAM: CHECKED_READ_BUFF(PicoMem.ram); break;\r
+ case CHUNK_VRAM: CHECKED_READ_BUFF(PicoMem.vram); break;\r
+ case CHUNK_ZRAM: CHECKED_READ_BUFF(PicoMem.zram); break;\r
+ case CHUNK_CRAM: CHECKED_READ_BUFF(PicoMem.cram); break;\r
+ case CHUNK_VSRAM: CHECKED_READ_BUFF(PicoMem.vsram); break;\r
case CHUNK_MISC: CHECKED_READ_BUFF(Pico.m); break;\r
case CHUNK_VIDEO: CHECKED_READ_BUFF(Pico.video); break;\r
- case CHUNK_IOPORTS: CHECKED_READ_BUFF(Pico.ioports); break;\r
+ case CHUNK_IOPORTS: CHECKED_READ_BUFF(PicoMem.ioports); break;\r
case CHUNK_PSG: CHECKED_READ2(28*4, sn76496_regs); break;\r
case CHUNK_FM:\r
ym2612_regs = YM2612GetRegs();\r
}\r
\r
readend:\r
- if (PicoAHW & PAHW_SMS)\r
+ if (PicoIn.AHW & PAHW_SMS)\r
PicoStateLoadedMS();\r
\r
- if (PicoAHW & PAHW_32X)\r
+ if (PicoIn.AHW & PAHW_32X)\r
Pico32xStateLoaded(1);\r
\r
if (PicoLoadStateHook != NULL)\r
PicoLoadStateHook();\r
\r
// must unpack 68k and z80 after banks are set up\r
- if (!(PicoAHW & PAHW_SMS))\r
+ if (!(PicoIn.AHW & PAHW_SMS))\r
SekUnpackCpu(buff_m68k, 0);\r
- if (PicoAHW & PAHW_MCD)\r
+ if (PicoIn.AHW & PAHW_MCD)\r
SekUnpackCpu(buff_s68k, 1);\r
\r
z80_unpack(buff_z80);\r
\r
// due to dep from 68k cycles..\r
- SekCycleAim = SekCycleCnt;\r
- if (PicoAHW & PAHW_32X)\r
+ Pico.t.m68c_aim = Pico.t.m68c_cnt;\r
+ if (PicoIn.AHW & PAHW_32X)\r
Pico32xStateLoaded(0);\r
- if (PicoAHW & PAHW_MCD)\r
+ if (PicoIn.AHW & PAHW_MCD)\r
{\r
SekCycleAimS68k = SekCycleCntS68k;\r
pcd_state_loaded();\r
}\r
\r
+ Pico.m.dirtyPal = 1;\r
+ Pico.video.status &= ~(SR_VB | SR_F);\r
+ Pico.video.status |= ((Pico.video.reg[1] >> 3) ^ SR_VB) & SR_VB;\r
+ Pico.video.status |= (Pico.video.pending_ints << 2) & SR_F;\r
+\r
retval = 0;\r
\r
out:\r
int ver, len, found = 0, to_find = 4;\r
char buff[8];\r
\r
- if (PicoAHW & PAHW_32X)\r
+ if (PicoIn.AHW & PAHW_32X)\r
to_find += 2;\r
\r
g_read_offs = 0;\r
CHECKED_READ(1, buff);\r
CHECKED_READ(4, &len);\r
if (len < 0 || len > 1024*512) R_ERROR_RETURN("bad length");\r
- if (buff[0] > CHUNK_FM && buff[0] <= CHUNK_MISC_CD && !(PicoAHW & PAHW_MCD))\r
+ if (buff[0] > CHUNK_FM && buff[0] <= CHUNK_MISC_CD && !(PicoIn.AHW & PAHW_MCD))\r
R_ERROR_RETURN("cd chunk in non CD state?");\r
\r
switch (buff[0])\r
{\r
- case CHUNK_VRAM: CHECKED_READ_BUFF(Pico.vram); found++; break;\r
- case CHUNK_CRAM: CHECKED_READ_BUFF(Pico.cram); found++; break;\r
- case CHUNK_VSRAM: CHECKED_READ_BUFF(Pico.vsram); found++; break;\r
+ case CHUNK_VRAM: CHECKED_READ_BUFF(PicoMem.vram); found++; break;\r
+ case CHUNK_CRAM: CHECKED_READ_BUFF(PicoMem.cram); found++; break;\r
+ case CHUNK_VSRAM: CHECKED_READ_BUFF(PicoMem.vsram); found++; break;\r
case CHUNK_VIDEO: CHECKED_READ_BUFF(Pico.video); found++; break;\r
\r
#ifndef NO_32X\r
\r
if (is_save)\r
ret = state_save(afile);\r
- else {\r
+ else\r
ret = state_load(afile);\r
- if (ret != 0) {\r
- areaSeek(afile, 0, SEEK_SET);\r
- ret = state_load_legacy(afile);\r
- }\r
-\r
- Pico.m.dirtyPal = 1;\r
- }\r
\r
return ret;\r
}\r
if (ret != 0) {\r
// assume legacy\r
areaSeek(afile, 0x10020, SEEK_SET); // skip header and RAM\r
- areaRead(Pico.vram, 1, sizeof(Pico.vram), afile);\r
+ areaRead(PicoMem.vram, 1, sizeof(PicoMem.vram), afile);\r
areaSeek(afile, 0x2000, SEEK_CUR);\r
- areaRead(Pico.cram, 1, sizeof(Pico.cram), afile);\r
- areaRead(Pico.vsram, 1, sizeof(Pico.vsram), afile);\r
+ areaRead(PicoMem.cram, 1, sizeof(PicoMem.cram), afile);\r
+ areaRead(PicoMem.vsram, 1, sizeof(PicoMem.vsram), afile);\r
areaSeek(afile, 0x221a0, SEEK_SET);\r
areaRead(&Pico.video, 1, sizeof(Pico.video), afile);\r
}\r
if (t == NULL)\r
return NULL;\r
\r
- memcpy(t->vram, Pico.vram, sizeof(Pico.vram));\r
- memcpy(t->cram, Pico.cram, sizeof(Pico.cram));\r
- memcpy(t->vsram, Pico.vsram, sizeof(Pico.vsram));\r
+ memcpy(t->vram, PicoMem.vram, sizeof(PicoMem.vram));\r
+ memcpy(t->cram, PicoMem.cram, sizeof(PicoMem.cram));\r
+ memcpy(t->vsram, PicoMem.vsram, sizeof(PicoMem.vsram));\r
memcpy(&t->video, &Pico.video, sizeof(Pico.video));\r
\r
#ifndef NO_32X\r
- if (PicoAHW & PAHW_32X) {\r
+ if (PicoIn.AHW & 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
if (t == NULL)\r
return;\r
\r
- memcpy(Pico.vram, t->vram, sizeof(Pico.vram));\r
- memcpy(Pico.cram, t->cram, sizeof(Pico.cram));\r
- memcpy(Pico.vsram, t->vsram, sizeof(Pico.vsram));\r
+ memcpy(PicoMem.vram, t->vram, sizeof(PicoMem.vram));\r
+ memcpy(PicoMem.cram, t->cram, sizeof(PicoMem.cram));\r
+ memcpy(PicoMem.vsram, t->vsram, sizeof(PicoMem.vsram));\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
+ if (PicoIn.AHW & 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