+// poll detection
+#define POLL_THRESHOLD 6
+
+struct poll_det {
+ int addr, pc, cnt, flag;
+};
+static struct poll_det m68k_poll, sh2_poll[2];
+
+static int p32x_poll_detect(struct poll_det *pd, u32 a, u32 pc, int is_vdp)
+{
+ int ret = 0, flag = pd->flag;
+
+ if (is_vdp)
+ flag <<= 3;
+
+ if (a - 2 <= pd->addr && pd->addr <= a + 2 && pd->pc == pc) {
+ pd->cnt++;
+ if (pd->cnt > POLL_THRESHOLD) {
+ if (!(Pico32x.emu_flags & flag)) {
+ elprintf(EL_32X, "%s poll addr %08x @ %06x",
+ flag == P32XF_68KPOLL ? "m68k" : (flag == P32XF_MSH2POLL ? "msh2" : "ssh2"), a, pc);
+ ret = 1;
+ }
+ Pico32x.emu_flags |= flag;
+ }
+ }
+ else
+ pd->cnt = 0;
+ pd->addr = a;
+ pd->pc = pc;
+
+ return ret;
+}
+
+static int p32x_poll_undetect(struct poll_det *pd, int is_vdp)
+{
+ int ret = 0, flag = pd->flag;
+ if (is_vdp)
+ flag <<= 3;
+ if (pd->cnt > POLL_THRESHOLD)
+ ret = 1;
+ pd->addr = pd->cnt = 0;
+ Pico32x.emu_flags &= ~flag;
+ return ret;
+}
+
+void p32x_poll_event(int is_vdp)
+{
+ p32x_poll_undetect(&sh2_poll[0], is_vdp);
+ p32x_poll_undetect(&sh2_poll[1], is_vdp);
+}
+