smsplus/state.c
2016-09-21 19:54:51 -04:00

119 lines
2.8 KiB
C

/*
state.c --
Save state management.
*/
#include "shared.h"
void system_save_state(void *fd)
{
char *id = STATE_HEADER;
uint16 version = STATE_VERSION;
/* Write header */
fwrite(id, sizeof(id), 1, fd);
fwrite(&version, sizeof(version), 1, fd);
/* Save VDP context */
fwrite(&vdp, sizeof(vdp_t), 1, fd);
/* Save SMS context */
fwrite(&sms, sizeof(sms_t), 1, fd);
fputc(cart.fcr[0], fd);
fputc(cart.fcr[1], fd);
fputc(cart.fcr[2], fd);
fputc(cart.fcr[3], fd);
fwrite(cart.sram, 0x8000, 1, fd);
/* Save Z80 context */
fwrite(Z80_Context, sizeof(Z80_Regs), 1, fd);
fwrite(&after_EI, sizeof(int), 1, fd);
/* Save YM2413 context */
fwrite(FM_GetContextPtr(), FM_GetContextSize(), 1, fd);
/* Save SN76489 context */
fwrite(SN76489_GetContextPtr(0), SN76489_GetContextSize(), 1, fd);
}
void system_load_state(void *fd)
{
int i;
uint8 *buf;
char id[4];
uint16 version;
/* Initialize everything */
z80_reset(0);
z80_set_irq_callback(sms_irq_callback);
system_reset();
if(snd.enabled)
sound_reset();
/* Read header */
fread(id, 4, 1, fd);
fread(&version, 2, 1, fd);
/* Load VDP context */
fread(&vdp, sizeof(vdp_t), 1, fd);
/* Load SMS context */
fread(&sms, sizeof(sms_t), 1, fd);
cart.fcr[0] = fgetc(fd);
cart.fcr[1] = fgetc(fd);
cart.fcr[2] = fgetc(fd);
cart.fcr[3] = fgetc(fd);
fread(cart.sram, 0x8000, 1, fd);
/* Load Z80 context */
fread(Z80_Context, sizeof(Z80_Regs), 1, fd);
fread(&after_EI, sizeof(int), 1, fd);
/* Load YM2413 context */
buf = malloc(FM_GetContextSize());
fread(buf, FM_GetContextSize(), 1, fd);
FM_SetContext(buf);
free(buf);
/* Load SN76489 context */
buf = malloc(SN76489_GetContextSize());
fread(buf, SN76489_GetContextSize(), 1, fd);
SN76489_SetContext(0, buf);
free(buf);
/* Restore callbacks */
z80_set_irq_callback(sms_irq_callback);
for(i = 0x00; i <= 0x2F; i++)
{
cpu_readmap[i] = &cart.rom[(i & 0x1F) << 10];
cpu_writemap[i] = dummy_write;
}
for(i = 0x30; i <= 0x3F; i++)
{
cpu_readmap[i] = &sms.wram[(i & 0x07) << 10];
cpu_writemap[i] = &sms.wram[(i & 0x07) << 10];
}
sms_mapper_w(3, cart.fcr[3]);
sms_mapper_w(2, cart.fcr[2]);
sms_mapper_w(1, cart.fcr[1]);
sms_mapper_w(0, cart.fcr[0]);
/* Force full pattern cache update */
bg_list_index = 0x200;
for(i = 0; i < 0x200; i++)
{
bg_name_list[i] = i;
bg_name_dirty[i] = -1;
}
/* Restore palette */
for(i = 0; i < PALETTE_SIZE; i++)
palette_sync(i, 1);
}