X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=pico%2Fstate.c;h=f9a7f839f63177aedd80bde33df692746b92d1dc;hb=cfae1ae17956a94d7deae336ce6b9571b3f825f1;hp=cb340695eaa1e7724d28c7482b7fe79d92d03ef3;hpb=cff531af94bd9c9c89ae162e80f48ddc26a4e504;p=picodrive.git diff --git a/pico/state.c b/pico/state.c index cb34069..f9a7f83 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; @@ -174,12 +170,17 @@ typedef enum { CHUNK_SDRAM, CHUNK_DRAM, CHUNK_32XPAL, + CHUNK_32X_EVT, + CHUNK_32X_FIRST = CHUNK_MSH2, + CHUNK_32X_LAST = CHUNK_32X_EVT, + // add new stuff here + CHUNK_CD_EVT = 50, // CHUNK_DEFAULT_COUNT, - CHUNK_CARTHW_ = CHUNK_CARTHW, // defined in PicoInt + CHUNK_CARTHW_ = CHUNK_CARTHW, // 64 (defined in PicoInt) } chunk_name_e; -static const char * const chunk_names[] = { +static const char * const chunk_names[CHUNK_DEFAULT_COUNT] = { "INVALID!", "M68K state", "RAM", @@ -222,6 +223,7 @@ static const char * const chunk_names[] = { "SDRAM", "DRAM", "PAL", + "events", }; static int write_chunk(chunk_name_e name, int len, void *data, void *file) @@ -235,7 +237,7 @@ static int write_chunk(chunk_name_e name, int len, void *data, void *file) } #define CHECKED_WRITE(name,len,data) { \ - if (PicoStateProgressCB && name < CHUNK_DEFAULT_COUNT) { \ + if (PicoStateProgressCB && name < CHUNK_DEFAULT_COUNT && chunk_names[name]) { \ strncpy(sbuff + 9, chunk_names[name], sizeof(sbuff) - 9); \ PicoStateProgressCB(sbuff); \ } \ @@ -243,7 +245,7 @@ static int write_chunk(chunk_name_e name, int len, void *data, void *file) } #define CHECKED_WRITE_BUFF(name,buff) { \ - if (PicoStateProgressCB && name < CHUNK_DEFAULT_COUNT) { \ + if (PicoStateProgressCB && name < CHUNK_DEFAULT_COUNT && chunk_names[name]) { \ strncpy(sbuff + 9, chunk_names[name], sizeof(sbuff) - 9); \ PicoStateProgressCB(sbuff); \ } \ @@ -290,7 +292,8 @@ static int state_save(void *file) SekPackCpu(buff, 1); if (Pico_mcd->s68k_regs[3] & 4) // 1M mode? wram_1M_to_2M(Pico_mcd->word_ram2M); - Pico_mcd->m.hint_vector = *(unsigned short *)(Pico_mcd->bios + 0x72); + memcpy(&Pico_mcd->m.hint_vector, Pico_mcd->bios + 0x72, + sizeof(Pico_mcd->m.hint_vector)); CHECKED_WRITE_BUFF(CHUNK_S68K, buff); CHECKED_WRITE_BUFF(CHUNK_PRG_RAM, Pico_mcd->prg_ram); @@ -304,6 +307,9 @@ static int state_save(void *file) CHECKED_WRITE_BUFF(CHUNK_SCD, Pico_mcd->scd); CHECKED_WRITE_BUFF(CHUNK_RC, Pico_mcd->rot_comp); CHECKED_WRITE_BUFF(CHUNK_MISC_CD, Pico_mcd->m); + memset(buff, 0, 0x40); + memcpy(buff, pcd_event_times, sizeof(pcd_event_times)); + CHECKED_WRITE(CHUNK_CD_EVT, 0x40, buff); if (Pico_mcd->s68k_regs[3] & 4) // convert back wram_2M_to_1M(Pico_mcd->word_ram2M); @@ -318,13 +324,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); @@ -333,6 +339,10 @@ static int state_save(void *file) CHECKED_WRITE_BUFF(CHUNK_SDRAM, Pico32xMem->sdram); CHECKED_WRITE_BUFF(CHUNK_DRAM, Pico32xMem->dram); CHECKED_WRITE_BUFF(CHUNK_32XPAL, Pico32xMem->pal); + + memset(buff, 0, 0x40); + memcpy(buff, p32x_event_times, sizeof(p32x_event_times)); + CHECKED_WRITE(CHUNK_32X_EVT, 0x40, buff); } #endif @@ -382,6 +392,7 @@ static int state_load(void *file) unsigned char buff_m68k[0x60], buff_s68k[0x60]; unsigned char buff_z80[Z80_STATE_SIZE]; unsigned char buff_sh2[SH2_STATE_SIZE]; + unsigned char buff[0x40]; unsigned char chunk; void *ym2612_regs; char header[8]; @@ -397,6 +408,9 @@ static int state_load(void *file) R_ERROR_RETURN("bad header"); CHECKED_READ(4, &ver); + memset(pcd_event_times, 0, sizeof(pcd_event_times)); + memset(p32x_event_times, 0, sizeof(p32x_event_times)); + while (!areaEof(file)) { CHECKED_READ(1, &chunk); @@ -404,8 +418,8 @@ static int state_load(void *file) if (len < 0 || len > 1024*512) R_ERROR_RETURN("bad length"); if (CHUNK_S68K <= chunk && chunk <= CHUNK_MISC_CD && !(PicoAHW & PAHW_MCD)) R_ERROR_RETURN("cd chunk in non CD state?"); - if (CHUNK_MSH2 <= chunk && chunk <= CHUNK_32XPAL && !(PicoAHW & PAHW_32X)) - R_ERROR_RETURN("32x chunk in non 32x state?"); + if (CHUNK_32X_FIRST <= chunk && chunk <= CHUNK_32X_LAST && !(PicoAHW & PAHW_32X)) + Pico32xStartup(); switch (chunk) { @@ -453,6 +467,11 @@ static int state_load(void *file) case CHUNK_RC: CHECKED_READ_BUFF(Pico_mcd->rot_comp); break; case CHUNK_MISC_CD: CHECKED_READ_BUFF(Pico_mcd->m); break; + case CHUNK_CD_EVT: + CHECKED_READ_BUFF(buff); + memcpy(pcd_event_times, buff, sizeof(pcd_event_times)); + break; + // 32x stuff #ifndef NO_32X case CHUNK_MSH2: @@ -465,10 +484,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; @@ -476,6 +495,11 @@ static int state_load(void *file) case CHUNK_SDRAM: CHECKED_READ_BUFF(Pico32xMem->sdram); break; case CHUNK_DRAM: CHECKED_READ_BUFF(Pico32xMem->dram); break; case CHUNK_32XPAL: CHECKED_READ_BUFF(Pico32xMem->pal); break; + + case CHUNK_32X_EVT: + CHECKED_READ_BUFF(buff); + memcpy(p32x_event_times, buff, sizeof(p32x_event_times)); + break; #endif default: if (carthw_chunks != NULL) @@ -499,24 +523,29 @@ readend: if (PicoAHW & PAHW_SMS) PicoStateLoadedMS(); - if (PicoAHW & PAHW_MCD) - { - PicoMemStateLoaded(); - - if (!(Pico_mcd->s68k_regs[0x36] & 1) && (Pico_mcd->scd.Status_CDC & 1)) - cdda_start_play(); - - SekUnpackCpu(buff_s68k, 1); - } + if (PicoAHW & PAHW_32X) + Pico32xStateLoaded(1); // must unpack 68k and z80 after banks are set up if (!(PicoAHW & PAHW_SMS)) SekUnpackCpu(buff_m68k, 0); + if (PicoAHW & PAHW_MCD) + SekUnpackCpu(buff_s68k, 1); z80_unpack(buff_z80); + // due to dep from 68k cycles.. + SekCycleAim = SekCycleCnt; if (PicoAHW & PAHW_32X) - Pico32xStateLoaded(); + Pico32xStateLoaded(0); + if (PicoAHW & PAHW_MCD) + { + SekCycleAimS68k = SekCycleCntS68k; + pcd_state_loaded(); + + if (!(Pico_mcd->s68k_regs[0x36] & 1) && (Pico_mcd->scd.Status_CDC & 1)) + cdda_start_play(); + } return 0; } @@ -576,15 +605,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 { @@ -599,10 +623,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; @@ -690,4 +739,4 @@ void PicoTmpStateRestore(void *data) #endif } -// vim:shiftwidth=2:expandtab +// vim:shiftwidth=2:ts=2:expandtab