notaz.gp2x.de
/
picodrive.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
32x: simplify logging a bit
[picodrive.git]
/
pico
/
state.c
diff --git
a/pico/state.c
b/pico/state.c
index
dbed8b9
..
de2d8ab
100644
(file)
--- a/
pico/state.c
+++ b/
pico/state.c
@@
-1,24
+1,21
@@
-// (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
\r
#include "../cpu/sh2/sh2.h"
\r
#include "sound/ym2612.h"
\r
\r
#include "pico_int.h"
\r
#include <zlib/zlib.h>
\r
\r
#include "../cpu/sh2/sh2.h"
\r
#include "sound/ym2612.h"
\r
+#include "state.h"
\r
\r
// sn76496
\r
extern int *sn76496_regs;
\r
\r
\r
// sn76496
\r
extern int *sn76496_regs;
\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
@@
-173,6
+170,9
@@
typedef enum {
CHUNK_SDRAM,
\r
CHUNK_DRAM,
\r
CHUNK_32XPAL,
\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
//
\r
CHUNK_DEFAULT_COUNT,
\r
CHUNK_CARTHW_ = CHUNK_CARTHW, // defined in PicoInt
\r
@@
-221,6
+221,7
@@
static const char * const chunk_names[] = {
"SDRAM",
\r
"DRAM",
\r
"PAL",
\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
};
\r
\r
static int write_chunk(chunk_name_e name, int len, void *data, void *file)
\r
@@
-317,13
+318,13
@@
static int state_save(void *file)
\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
@@
-332,6
+333,10
@@
static int state_save(void *file)
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, event_times, sizeof(event_times));
\r
+ CHECKED_WRITE(CHUNK_32X_EVT, 0x40, buff);
\r
}
\r
#endif
\r
\r
}
\r
#endif
\r
\r
@@
-381,6
+386,7
@@
static int state_load(void *file)
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
+ unsigned char buff[0x40];
\r
unsigned char chunk;
\r
void *ym2612_regs;
\r
char header[8];
\r
unsigned char chunk;
\r
void *ym2612_regs;
\r
char header[8];
\r
@@
-403,8
+409,8
@@
static int state_load(void *file)
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
- 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
switch (chunk)
\r
{
\r
@@
-464,10
+470,10
@@
static int state_load(void *file)
sh2_unpack(&sh2s[1], buff_sh2);
\r
break;
\r
\r
sh2_unpack(&sh2s[1], buff_sh2);
\r
break;
\r
\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
@@
-475,6
+481,11
@@
static int state_load(void *file)
case CHUNK_SDRAM: CHECKED_READ_BUFF(Pico32xMem->sdram); break;
\r
case CHUNK_DRAM: CHECKED_READ_BUFF(Pico32xMem->dram); break;
\r
case CHUNK_32XPAL: CHECKED_READ_BUFF(Pico32xMem->pal); break;
\r
case CHUNK_SDRAM: CHECKED_READ_BUFF(Pico32xMem->sdram); 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_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
#endif
\r
default:
\r
if (carthw_chunks != NULL)
\r
@@
-504,18
+515,22
@@
readend:
\r
if (!(Pico_mcd->s68k_regs[0x36] & 1) && (Pico_mcd->scd.Status_CDC & 1))
\r
cdda_start_play();
\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
\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
// 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
\r
z80_unpack(buff_z80);
\r
\r
+ // due to dep from 68k cycles..
\r
if (PicoAHW & PAHW_32X)
\r
if (PicoAHW & PAHW_32X)
\r
- Pico32xStateLoaded();
\r
+ Pico32xStateLoaded(
0
);
\r
\r
return 0;
\r
}
\r
\r
return 0;
\r
}
\r
@@
-575,15
+590,10
@@
readend:
return 0;
\r
}
\r
\r
return 0;
\r
}
\r
\r
-
int PicoState(const char *fnam
e, int is_save)
\r
+
static int pico_state_internal(void *afil
e, int is_save)
\r
{
\r
{
\r
- void *afile = NULL;
\r
int ret;
\r
\r
int ret;
\r
\r
- afile = open_save_file(fname, is_save);
\r
- if (afile == NULL)
\r
- return -1;
\r
-
\r
if (is_save)
\r
ret = state_save(afile);
\r
else {
\r
if (is_save)
\r
ret = state_save(afile);
\r
else {
\r
@@
-598,10
+608,35
@@
int PicoState(const char *fname, int is_save)
Pico.m.dirtyPal = 1;
\r
}
\r
\r
Pico.m.dirtyPal = 1;
\r
}
\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
areaClose(afile);
\r
return ret;
\r
}
\r
\r
areaClose(afile);
\r
return ret;
\r
}
\r
\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
int PicoStateLoadGfx(const char *fname)
\r
{
\r
void *afile;
\r
int PicoStateLoadGfx(const char *fname)
\r
{
\r
void *afile;
\r
@@
-689,4
+724,4
@@
void PicoTmpStateRestore(void *data)
#endif
\r
}
\r
\r
#endif
\r
}
\r
\r
-// vim:shiftwidth=2:expandtab
\r
+// vim:shiftwidth=2:
ts=2:
expandtab
\r