struct Pico32x Pico32x;
SH2 sh2s[2];
-static void sh2_irq_cb(int id, int level)
+static int REGPARM(2) sh2_irq_cb(SH2 *sh2, int level)
{
- // diagnostic for now
- elprintf(EL_32X, "%csh2 ack %d @ %08x", id ? 's' : 'm', level, sh2_pc(id));
+ if (sh2->pending_irl > sh2->pending_int_irq) {
+ elprintf(EL_32X, "%csh2 ack/irl %d @ %08x",
+ sh2->is_slave ? 's' : 'm', level, sh2->pc);
+ return 64 + sh2->pending_irl / 2;
+ } else {
+ elprintf(EL_32X, "%csh2 ack/int %d/%d @ %08x",
+ sh2->is_slave ? 's' : 'm', level, sh2->pending_int_vector, sh2->pc);
+ sh2->pending_int_irq = 0; // auto-clear
+ sh2->pending_level = sh2->pending_irl;
+ return sh2->pending_int_vector;
+ }
}
void p32x_update_irls(void)
if (Pico32xMem != NULL)
free(Pico32xMem);
Pico32xMem = NULL;
+ sh2_finish(&msh2);
+ sh2_finish(&ssh2);
PicoAHW &= ~PAHW_32X;
}
static __inline void run_m68k(int cyc)
{
+ pprof_start(m68k);
+
#if defined(EMU_C68K)
PicoCpuCM68k.cycles = cyc;
CycloneRun(&PicoCpuCM68k);
#elif defined(EMU_F68K)
SekCycleCnt += fm68k_emulate(cyc+1, 0, 0);
#endif
+
+ pprof_end(m68k);
}
// ~1463.8, but due to cache misses and slow mem
slice = SekCycleCnt - slice; /* real count from 68k */ \
if (SekCycleCnt < SekCycleAim) \
elprintf(EL_32X, "slice %d", slice); \
- if (!(Pico32x.emu_flags & (P32XF_SSH2POLL|P32XF_SSH2VPOLL))) \
+ if (!(Pico32x.emu_flags & (P32XF_SSH2POLL|P32XF_SSH2VPOLL))) { \
+ pprof_start(ssh2); \
sh2_execute(&ssh2, CYCLES_M68K2SH2(slice)); \
- if (!(Pico32x.emu_flags & (P32XF_MSH2POLL|P32XF_MSH2VPOLL))) \
+ pprof_end(ssh2); \
+ } \
+ if (!(Pico32x.emu_flags & (P32XF_MSH2POLL|P32XF_MSH2VPOLL))) { \
+ pprof_start(msh2); \
sh2_execute(&msh2, CYCLES_M68K2SH2(slice)); \
+ pprof_end(msh2); \
+ } \
+ pprof_start(dummy); \
+ pprof_end(dummy); \
} \
}