mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2025-01-14 12:19:06 +01:00
improved savestate stability & compatibility
This commit is contained in:
parent
4f7bfcb0c9
commit
ef8efa2c10
@ -159,9 +159,7 @@ void sound_reset(void)
|
|||||||
|
|
||||||
int sound_context_save(uint8 *state)
|
int sound_context_save(uint8 *state)
|
||||||
{
|
{
|
||||||
int bufferptr = 0;
|
int bufferptr = YM2612SaveContext(state);
|
||||||
|
|
||||||
save_param(YM2612GetContextPtr(),YM2612GetContextSize());
|
|
||||||
save_param(SN76489_GetContextPtr(),SN76489_GetContextSize());
|
save_param(SN76489_GetContextPtr(),SN76489_GetContextSize());
|
||||||
save_param(&fm_cycles_count,sizeof(fm_cycles_count));
|
save_param(&fm_cycles_count,sizeof(fm_cycles_count));
|
||||||
save_param(&psg_cycles_count,sizeof(psg_cycles_count));
|
save_param(&psg_cycles_count,sizeof(psg_cycles_count));
|
||||||
@ -171,16 +169,14 @@ int sound_context_save(uint8 *state)
|
|||||||
|
|
||||||
int sound_context_load(uint8 *state, char *version)
|
int sound_context_load(uint8 *state, char *version)
|
||||||
{
|
{
|
||||||
int bufferptr = 0;
|
int bufferptr = YM2612LoadContext(state, version);
|
||||||
|
|
||||||
YM2612Restore(&state[bufferptr]);
|
|
||||||
bufferptr += YM2612GetContextSize();
|
|
||||||
load_param(SN76489_GetContextPtr(),SN76489_GetContextSize());
|
load_param(SN76489_GetContextPtr(),SN76489_GetContextSize());
|
||||||
|
|
||||||
if (version[15] > 0x30)
|
if (version[15] > 0x30)
|
||||||
{
|
{
|
||||||
load_param(&fm_cycles_count,sizeof(fm_cycles_count));
|
load_param(&fm_cycles_count,sizeof(fm_cycles_count));
|
||||||
load_param(&psg_cycles_count,sizeof(psg_cycles_count));
|
load_param(&psg_cycles_count,sizeof(psg_cycles_count));
|
||||||
|
fm_cycles_count = psg_cycles_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
return bufferptr;
|
return bufferptr;
|
||||||
|
@ -2189,7 +2189,7 @@ void YM2612Restore(unsigned char *buffer)
|
|||||||
/* restore internal state */
|
/* restore internal state */
|
||||||
memcpy(&ym2612, buffer, sizeof(YM2612));
|
memcpy(&ym2612, buffer, sizeof(YM2612));
|
||||||
|
|
||||||
/* restore current timings */
|
/* keep current timings */
|
||||||
ym2612.OPN.ST.clock = clock;
|
ym2612.OPN.ST.clock = clock;
|
||||||
ym2612.OPN.ST.rate = rate;
|
ym2612.OPN.ST.rate = rate;
|
||||||
OPNSetPres(6*24);
|
OPNSetPres(6*24);
|
||||||
@ -2202,6 +2202,57 @@ void YM2612Restore(unsigned char *buffer)
|
|||||||
setup_connection(&ym2612.CH[4],4);
|
setup_connection(&ym2612.CH[4],4);
|
||||||
setup_connection(&ym2612.CH[5],5);
|
setup_connection(&ym2612.CH[5],5);
|
||||||
|
|
||||||
/* restore TL table (in case DAC precision has changed) */
|
/* restore TL table (DAC resolution might have been modified) */
|
||||||
init_tables();
|
init_tables();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int YM2612LoadContext(unsigned char *state, char *version)
|
||||||
|
{
|
||||||
|
int bufferptr = sizeof(YM2612);
|
||||||
|
|
||||||
|
/* restore YM2612 context */
|
||||||
|
YM2612Restore(state);
|
||||||
|
|
||||||
|
/* extended state */
|
||||||
|
if (version[15] > 0x31)
|
||||||
|
{
|
||||||
|
int c,s;
|
||||||
|
uint8 index;
|
||||||
|
|
||||||
|
/* restore DT table address pointer for each channel slots */
|
||||||
|
for( c = 0 ; c < 6 ; c++ )
|
||||||
|
{
|
||||||
|
for(s = 0 ; s < 4 ; s++ )
|
||||||
|
{
|
||||||
|
load_param(&index,sizeof(index));
|
||||||
|
bufferptr += sizeof(index);
|
||||||
|
ym2612.CH[c].SLOT[s].DT = ym2612.OPN.ST.dt_tab[index&7];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return bufferptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
int YM2612SaveContext(unsigned char *state)
|
||||||
|
{
|
||||||
|
int c,s;
|
||||||
|
uint8 index;
|
||||||
|
int bufferptr = sizeof(YM2612);
|
||||||
|
|
||||||
|
/* save YM2612 context */
|
||||||
|
memcpy(state, &ym2612, sizeof(YM2612));
|
||||||
|
|
||||||
|
/* save DT table index for each channel slots */
|
||||||
|
for( c = 0 ; c < 6 ; c++ )
|
||||||
|
{
|
||||||
|
for(s = 0 ; s < 4 ; s++ )
|
||||||
|
{
|
||||||
|
index = (ym2612.CH[c].SLOT[s].DT - ym2612.OPN.ST.dt_tab[0]) >> 5;
|
||||||
|
save_param(&index,sizeof(index));
|
||||||
|
bufferptr += sizeof(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return bufferptr;
|
||||||
|
}
|
||||||
|
@ -10,8 +10,8 @@
|
|||||||
**
|
**
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _H_FM_FM_
|
#ifndef _H_YM2612_
|
||||||
#define _H_FM_FM_
|
#define _H_YM2612_
|
||||||
|
|
||||||
/* compiler dependence */
|
/* compiler dependence */
|
||||||
#ifndef INLINE
|
#ifndef INLINE
|
||||||
@ -27,5 +27,8 @@ extern unsigned int YM2612Read(void);
|
|||||||
extern unsigned char *YM2612GetContextPtr(void);
|
extern unsigned char *YM2612GetContextPtr(void);
|
||||||
extern unsigned int YM2612GetContextSize(void);
|
extern unsigned int YM2612GetContextSize(void);
|
||||||
extern void YM2612Restore(unsigned char *buffer);
|
extern void YM2612Restore(unsigned char *buffer);
|
||||||
|
extern int YM2612LoadContext(unsigned char *state, char *version);
|
||||||
|
extern int YM2612SaveContext(unsigned char *state);
|
||||||
|
|
||||||
#endif /* _H_FM_FM_ */
|
|
||||||
|
#endif /* _YM2612_ */
|
||||||
|
@ -79,6 +79,7 @@ int state_load(unsigned char *buffer)
|
|||||||
|
|
||||||
// IO
|
// IO
|
||||||
load_param(io_reg, sizeof(io_reg));
|
load_param(io_reg, sizeof(io_reg));
|
||||||
|
io_reg[0] = region_code | 0x20 | (config.tmss & 1);
|
||||||
|
|
||||||
// VDP
|
// VDP
|
||||||
bufferptr += vdp_context_load(&state[bufferptr], version);
|
bufferptr += vdp_context_load(&state[bufferptr], version);
|
||||||
@ -111,6 +112,7 @@ int state_load(unsigned char *buffer)
|
|||||||
|
|
||||||
// Z80
|
// Z80
|
||||||
load_param(&Z80, sizeof(Z80_Regs));
|
load_param(&Z80, sizeof(Z80_Regs));
|
||||||
|
Z80.irq_callback = z80_irq_callback;
|
||||||
|
|
||||||
// Cartridge HW
|
// Cartridge HW
|
||||||
bufferptr += cart_hw_context_load(&state[bufferptr], version);
|
bufferptr += cart_hw_context_load(&state[bufferptr], version);
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
#define _STATE_H_
|
#define _STATE_H_
|
||||||
|
|
||||||
#define STATE_SIZE 0x48100
|
#define STATE_SIZE 0x48100
|
||||||
#define STATE_VERSION "GENPLUS-GX 1.4.1"
|
#define STATE_VERSION "GENPLUS-GX 1.4.2"
|
||||||
|
|
||||||
#define load_param(param, size) \
|
#define load_param(param, size) \
|
||||||
memcpy(param, &state[bufferptr], size); \
|
memcpy(param, &state[bufferptr], size); \
|
||||||
|
@ -163,7 +163,6 @@ void vdp_reset(void)
|
|||||||
vint_pending = 0;
|
vint_pending = 0;
|
||||||
irq_status = 0;
|
irq_status = 0;
|
||||||
hvc_latch = 0;
|
hvc_latch = 0;
|
||||||
v_counter = 0;
|
|
||||||
dmafill = 0;
|
dmafill = 0;
|
||||||
fill_data = 0;
|
fill_data = 0;
|
||||||
dma_length = 0;
|
dma_length = 0;
|
||||||
@ -178,6 +177,7 @@ void vdp_reset(void)
|
|||||||
cached_write = -1;
|
cached_write = -1;
|
||||||
|
|
||||||
vc_max = 0xEA + 24*vdp_pal;
|
vc_max = 0xEA + 24*vdp_pal;
|
||||||
|
v_counter = lines_per_frame - 1;
|
||||||
|
|
||||||
status = vdp_pal | 0x200; /* FIFO empty flag */
|
status = vdp_pal | 0x200; /* FIFO empty flag */
|
||||||
|
|
||||||
@ -296,6 +296,9 @@ int vdp_context_load(uint8 *state, char *version)
|
|||||||
vc_max += (28 - 20*vdp_pal);
|
vc_max += (28 - 20*vdp_pal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* keep current region mode */
|
||||||
|
status = (status & ~1) | vdp_pal;
|
||||||
|
|
||||||
/* restore FIFO timings */
|
/* restore FIFO timings */
|
||||||
fifo_latency = (reg[12] & 1) ? 190 : 214;
|
fifo_latency = (reg[12] & 1) ? 190 : 214;
|
||||||
if ((code & 0x0F) == 0x01)
|
if ((code & 0x0F) == 0x01)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user