#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
+ 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