mirror of
https://github.com/0ldsk00l/smsplus.git
synced 2025-04-02 10:32:07 -04:00
119 lines
2.8 KiB
C
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);
|
|
}
|
|
|