mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 07:17:45 -04:00
core, improve save/load (68k cycles)
This commit is contained in:
parent
e45908d734
commit
dfda34424a
2 changed files with 16 additions and 12 deletions
23
pico/sek.c
23
pico/sek.c
|
@ -197,7 +197,7 @@ PICO_INTERNAL void SekPackCpu(unsigned char *cpu, int is_sub)
|
||||||
#if defined(EMU_C68K)
|
#if defined(EMU_C68K)
|
||||||
struct Cyclone *context = is_sub ? &PicoCpuCS68k : &PicoCpuCM68k;
|
struct Cyclone *context = is_sub ? &PicoCpuCS68k : &PicoCpuCM68k;
|
||||||
memcpy(cpu,context->d,0x40);
|
memcpy(cpu,context->d,0x40);
|
||||||
pc=context->pc-context->membase;
|
*(u32 *)(cpu+0x40)=context->pc-context->membase;
|
||||||
*(u32 *)(cpu+0x44)=CycloneGetSr(context);
|
*(u32 *)(cpu+0x44)=CycloneGetSr(context);
|
||||||
*(u32 *)(cpu+0x48)=context->osp;
|
*(u32 *)(cpu+0x48)=context->osp;
|
||||||
cpu[0x4c] = context->irq;
|
cpu[0x4c] = context->irq;
|
||||||
|
@ -206,7 +206,7 @@ PICO_INTERNAL void SekPackCpu(unsigned char *cpu, int is_sub)
|
||||||
void *oldcontext = m68ki_cpu_p;
|
void *oldcontext = m68ki_cpu_p;
|
||||||
m68k_set_context(is_sub ? &PicoCpuMS68k : &PicoCpuMM68k);
|
m68k_set_context(is_sub ? &PicoCpuMS68k : &PicoCpuMM68k);
|
||||||
memcpy(cpu,m68ki_cpu_p->dar,0x40);
|
memcpy(cpu,m68ki_cpu_p->dar,0x40);
|
||||||
pc=m68ki_cpu_p->pc;
|
*(u32 *)(cpu+0x40)=m68ki_cpu_p->pc;
|
||||||
*(u32 *)(cpu+0x44)=m68k_get_reg(NULL, M68K_REG_SR);
|
*(u32 *)(cpu+0x44)=m68k_get_reg(NULL, M68K_REG_SR);
|
||||||
*(u32 *)(cpu+0x48)=m68ki_cpu_p->sp[m68ki_cpu_p->s_flag^SFLAG_SET];
|
*(u32 *)(cpu+0x48)=m68ki_cpu_p->sp[m68ki_cpu_p->s_flag^SFLAG_SET];
|
||||||
cpu[0x4c] = CPU_INT_LEVEL>>8;
|
cpu[0x4c] = CPU_INT_LEVEL>>8;
|
||||||
|
@ -215,16 +215,20 @@ PICO_INTERNAL void SekPackCpu(unsigned char *cpu, int is_sub)
|
||||||
#elif defined(EMU_F68K)
|
#elif defined(EMU_F68K)
|
||||||
M68K_CONTEXT *context = is_sub ? &PicoCpuFS68k : &PicoCpuFM68k;
|
M68K_CONTEXT *context = is_sub ? &PicoCpuFS68k : &PicoCpuFM68k;
|
||||||
memcpy(cpu,context->dreg,0x40);
|
memcpy(cpu,context->dreg,0x40);
|
||||||
pc=context->pc;
|
*(u32 *)(cpu+0x40)=context->pc;
|
||||||
*(u32 *)(cpu+0x44)=context->sr;
|
*(u32 *)(cpu+0x44)=context->sr;
|
||||||
*(u32 *)(cpu+0x48)=context->asp;
|
*(u32 *)(cpu+0x48)=context->asp;
|
||||||
cpu[0x4c] = context->interrupts[0];
|
cpu[0x4c] = context->interrupts[0];
|
||||||
cpu[0x4d] = (context->execinfo & FM68K_HALTED) ? 1 : 0;
|
cpu[0x4d] = (context->execinfo & FM68K_HALTED) ? 1 : 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
*(u32 *)(cpu+0x40) = pc;
|
if (is_sub) {
|
||||||
*(u32 *)(cpu+0x50) =
|
*(u32 *)(cpu+0x50) = SekCycleCntS68k;
|
||||||
is_sub ? SekCycleCntS68k : Pico.t.m68c_cnt;
|
*(s16 *)(cpu+0x4e) = SekCycleCntS68k - SekCycleAimS68k;
|
||||||
|
} else {
|
||||||
|
*(u32 *)(cpu+0x50) = Pico.t.m68c_cnt;
|
||||||
|
*(u32 *)(cpu+0x4e) = Pico.t.m68c_cnt - Pico.t.m68c_aim;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PICO_INTERNAL void SekUnpackCpu(const unsigned char *cpu, int is_sub)
|
PICO_INTERNAL void SekUnpackCpu(const unsigned char *cpu, int is_sub)
|
||||||
|
@ -261,10 +265,13 @@ PICO_INTERNAL void SekUnpackCpu(const unsigned char *cpu, int is_sub)
|
||||||
context->execinfo &= ~FM68K_HALTED;
|
context->execinfo &= ~FM68K_HALTED;
|
||||||
if (cpu[0x4d]&1) context->execinfo |= FM68K_HALTED;
|
if (cpu[0x4d]&1) context->execinfo |= FM68K_HALTED;
|
||||||
#endif
|
#endif
|
||||||
if (is_sub)
|
if (is_sub) {
|
||||||
SekCycleCntS68k = *(u32 *)(cpu+0x50);
|
SekCycleCntS68k = *(u32 *)(cpu+0x50);
|
||||||
else
|
SekCycleAimS68k = SekCycleCntS68k - *(s16 *)(cpu+0x4e);
|
||||||
|
} else {
|
||||||
Pico.t.m68c_cnt = *(u32 *)(cpu+0x50);
|
Pico.t.m68c_cnt = *(u32 *)(cpu+0x50);
|
||||||
|
Pico.t.m68c_aim = Pico.t.m68c_cnt - *(s16 *)(cpu+0x4e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -582,14 +582,11 @@ readend:
|
||||||
z80_unpack(buff_z80);
|
z80_unpack(buff_z80);
|
||||||
|
|
||||||
// due to dep from 68k cycles..
|
// due to dep from 68k cycles..
|
||||||
Pico.t.m68c_frame_start = Pico.t.m68c_aim = Pico.t.m68c_cnt;
|
Pico.t.m68c_frame_start = Pico.t.m68c_aim;
|
||||||
if (PicoIn.AHW & PAHW_32X)
|
if (PicoIn.AHW & PAHW_32X)
|
||||||
Pico32xStateLoaded(0);
|
Pico32xStateLoaded(0);
|
||||||
if (PicoIn.AHW & PAHW_MCD)
|
if (PicoIn.AHW & PAHW_MCD)
|
||||||
{
|
|
||||||
SekCycleAimS68k = SekCycleCntS68k;
|
|
||||||
pcd_state_loaded();
|
pcd_state_loaded();
|
||||||
}
|
|
||||||
|
|
||||||
Pico.m.dirtyPal = 1;
|
Pico.m.dirtyPal = 1;
|
||||||
Pico.video.status &= ~(SR_VB | SR_F);
|
Pico.video.status &= ~(SR_VB | SR_F);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue