#endif\r
\r
\r
+static int do_ack(int level)\r
+{\r
+ struct PicoVideo *pv = &Pico.video;\r
+\r
+ elprintf(EL_INTS, "%cack: @ %06x [%u], p=%02x",\r
+ level == 6 ? 'v' : 'h', SekPc, SekCyclesDone(), pv->pending_ints);\r
+ // the VDP doesn't look at the 68k level\r
+ if (pv->pending_ints & pv->reg[1] & 0x20) {\r
+ pv->pending_ints &= ~0x20;\r
+ pv->status &= ~SR_F;\r
+ return (pv->reg[0] & pv->pending_ints & 0x10) >> 2;\r
+ }\r
+ else if (pv->pending_ints & pv->reg[0] & 0x10)\r
+ pv->pending_ints &= ~0x10;\r
+\r
+ return 0;\r
+}\r
+\r
/* callbacks */\r
#ifdef EMU_C68K\r
// interrupt acknowledgment\r
static int SekIntAck(int level)\r
{\r
- // try to emulate VDP's reaction to 68000 int ack\r
- if (level == 4) { Pico.video.pending_ints = 0; elprintf(EL_INTS, "hack: @ %06x [%u]", SekPc, Pico.t.m68c_cnt); }\r
- else if(level == 6) { Pico.video.pending_ints &= ~0x20; elprintf(EL_INTS, "vack: @ %06x [%u]", SekPc, Pico.t.m68c_cnt); }\r
- PicoCpuCM68k.irq = 0;\r
+ PicoCpuCM68k.irq = do_ack(level);\r
return CYCLONE_INT_ACK_AUTOVECTOR;\r
}\r
\r
#ifdef EMU_M68K\r
static int SekIntAckM68K(int level)\r
{\r
- if (level == 4) { Pico.video.pending_ints = 0; elprintf(EL_INTS, "hack: @ %06x [%u]", SekPc, Pico.t.m68c_cnt); }\r
- else if(level == 6) { Pico.video.pending_ints &= ~0x20; elprintf(EL_INTS, "vack: @ %06x [%u]", SekPc, Pico.t.m68c_cnt); }\r
- CPU_INT_LEVEL = 0;\r
+ CPU_INT_LEVEL = do_ack(level) << 8;\r
return M68K_INT_ACK_AUTOVECTOR;\r
}\r
\r
#ifdef EMU_F68K\r
static void SekIntAckF68K(unsigned level)\r
{\r
- if (level == 4) {\r
- Pico.video.pending_ints = 0;\r
- elprintf(EL_INTS, "hack: @ %06x [%u]", SekPc, SekCyclesDone());\r
- }\r
- else if(level == 6) {\r
- Pico.video.pending_ints &= ~0x20;\r
- elprintf(EL_INTS, "vack: @ %06x [%u]", SekPc, SekCyclesDone());\r
- }\r
- PicoCpuFM68k.interrupts[0] = 0;\r
+ PicoCpuFM68k.interrupts[0] = do_ack(level);\r
}\r
#endif\r
\r
}\r
#endif\r
#ifdef EMU_F68K\r
- {\r
- void *oldcontext = g_m68kcontext;\r
- g_m68kcontext = &PicoCpuFM68k;\r
- memset(&PicoCpuFM68k, 0, sizeof(PicoCpuFM68k));\r
- fm68k_init();\r
- PicoCpuFM68k.iack_handler = SekIntAckF68K;\r
- PicoCpuFM68k.sr = 0x2704; // Z flag\r
- g_m68kcontext = oldcontext;\r
- }\r
+ memset(&PicoCpuFM68k, 0, sizeof(PicoCpuFM68k));\r
+ fm68k_init();\r
+ PicoCpuFM68k.iack_handler = SekIntAckF68K;\r
+ PicoCpuFM68k.sr = 0x2704; // Z flag\r
#endif\r
}\r
\r
REG_USP = 0; // ?\r
#endif\r
#ifdef EMU_F68K\r
- {\r
- g_m68kcontext = &PicoCpuFM68k;\r
- fm68k_reset();\r
- }\r
+ fm68k_reset(&PicoCpuFM68k);\r
#endif\r
\r
return 0;\r
#elif defined(EMU_M68K)\r
Pico.t.m68c_cnt += m68k_execute(1);\r
#elif defined(EMU_F68K)\r
- Pico.t.m68c_cnt += fm68k_emulate(1, 0);\r
+ Pico.t.m68c_cnt += fm68k_emulate(&PicoCpuFM68k, 1, 0);\r
#endif\r
}\r
\r
CycloneInitIdle();\r
#endif\r
#ifdef EMU_F68K\r
- fm68k_emulate(0, 1);\r
+ fm68k_idle_install();\r
#endif\r
}\r
\r
(*dst & 0xc1ff) == 0x0038 || // move.x ($xxxx.w), dX\r
(*dst & 0xf13f) == 0xb038) // cmp.x ($xxxx.w), dX\r
return 1;\r
- if (PicoAHW & (PAHW_MCD|PAHW_32X))\r
+ if (PicoIn.AHW & (PAHW_MCD|PAHW_32X))\r
break;\r
// with no addons, there should be no need to wait\r
// for byte change anywhere\r
return 1;\r
break;\r
case 12:\r
- if (PicoAHW & (PAHW_MCD|PAHW_32X))\r
+ if (PicoIn.AHW & (PAHW_MCD|PAHW_32X))\r
break;\r
if ( (*dst & 0xf1f8) == 0x3010 && // move.w (aX), dX\r
(dst[1]&0xf100) == 0x0000 && // arithmetic\r
CycloneFinishIdle();\r
#endif\r
#ifdef EMU_F68K\r
- fm68k_emulate(0, 2);\r
+ fm68k_idle_remove();\r
#endif\r
while (idledet_count > 0)\r
{\r