X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=pico%2Fstate.c;h=de2d8ab69fc5c47c2ba6c26fbddf99b1b92808d1;hb=8e5639bc3da6c24c45620505a2bf3533478b1e60;hp=11eee6f75a23590300734a8093d25c3d79f45ec9;hpb=27e2627380215963acbf38bf899a4a864446d826;p=picodrive.git diff --git a/pico/state.c b/pico/state.c index 11eee6f..de2d8ab 100644 --- a/pico/state.c +++ b/pico/state.c @@ -11,15 +11,11 @@ #include "../cpu/sh2/sh2.h" #include "sound/ym2612.h" +#include "state.h" // sn76496 extern int *sn76496_regs; -typedef size_t (arearw)(void *p, size_t _size, size_t _n, void *file); -typedef size_t (areaeof)(void *file); -typedef int (areaseek)(void *file, long offset, int whence); -typedef int (areaclose)(void *file); - static arearw *areaRead; static arearw *areaWrite; static areaeof *areaEof; @@ -322,13 +318,13 @@ static int state_save(void *file) sh2_pack(&sh2s[0], cpubuff); CHECKED_WRITE_BUFF(CHUNK_MSH2, cpubuff); - CHECKED_WRITE_BUFF(CHUNK_MSH2_DATA, Pico32xMem->data_array[0]); - CHECKED_WRITE_BUFF(CHUNK_MSH2_PERI, Pico32xMem->sh2_peri_regs[0]); + CHECKED_WRITE_BUFF(CHUNK_MSH2_DATA, sh2s[0].data_array); + CHECKED_WRITE_BUFF(CHUNK_MSH2_PERI, sh2s[0].peri_regs); sh2_pack(&sh2s[1], cpubuff); CHECKED_WRITE_BUFF(CHUNK_SSH2, cpubuff); - CHECKED_WRITE_BUFF(CHUNK_SSH2_DATA, Pico32xMem->data_array[1]); - CHECKED_WRITE_BUFF(CHUNK_SSH2_PERI, Pico32xMem->sh2_peri_regs[1]); + CHECKED_WRITE_BUFF(CHUNK_SSH2_DATA, sh2s[1].data_array); + CHECKED_WRITE_BUFF(CHUNK_SSH2_PERI, sh2s[1].peri_regs); CHECKED_WRITE_BUFF(CHUNK_32XSYS, Pico32x); CHECKED_WRITE_BUFF(CHUNK_M68K_BIOS, Pico32xMem->m68k_rom); @@ -474,10 +470,10 @@ static int state_load(void *file) sh2_unpack(&sh2s[1], buff_sh2); break; - case CHUNK_MSH2_DATA: CHECKED_READ_BUFF(Pico32xMem->data_array[0]); break; - case CHUNK_MSH2_PERI: CHECKED_READ_BUFF(Pico32xMem->sh2_peri_regs[0]); break; - case CHUNK_SSH2_DATA: CHECKED_READ_BUFF(Pico32xMem->data_array[1]); break; - case CHUNK_SSH2_PERI: CHECKED_READ_BUFF(Pico32xMem->sh2_peri_regs[1]); break; + case CHUNK_MSH2_DATA: CHECKED_READ_BUFF(sh2s[0].data_array); break; + case CHUNK_MSH2_PERI: CHECKED_READ_BUFF(sh2s[0].peri_regs); break; + case CHUNK_SSH2_DATA: CHECKED_READ_BUFF(sh2s[1].data_array); break; + case CHUNK_SSH2_PERI: CHECKED_READ_BUFF(sh2s[1].peri_regs); break; case CHUNK_32XSYS: CHECKED_READ_BUFF(Pico32x); break; case CHUNK_M68K_BIOS: CHECKED_READ_BUFF(Pico32xMem->m68k_rom); break; case CHUNK_MSH2_BIOS: CHECKED_READ_BUFF(Pico32xMem->sh2_rom_m); break; @@ -594,15 +590,10 @@ readend: return 0; } -int PicoState(const char *fname, int is_save) +static int pico_state_internal(void *afile, int is_save) { - void *afile = NULL; int ret; - afile = open_save_file(fname, is_save); - if (afile == NULL) - return -1; - if (is_save) ret = state_save(afile); else { @@ -617,10 +608,35 @@ int PicoState(const char *fname, int is_save) Pico.m.dirtyPal = 1; } + return ret; +} + +int PicoState(const char *fname, int is_save) +{ + void *afile = NULL; + int ret; + + afile = open_save_file(fname, is_save); + if (afile == NULL) + return -1; + + ret = pico_state_internal(afile, is_save); areaClose(afile); return ret; } +int PicoStateFP(void *afile, int is_save, + arearw *read, arearw *write, areaeof *eof, areaseek *seek) +{ + areaRead = read; + areaWrite = write; + areaEof = eof; + areaSeek = seek; + areaClose = NULL; + + return pico_state_internal(afile, is_save); +} + int PicoStateLoadGfx(const char *fname) { void *afile;