+// poll detection
+struct poll_det {
+ int addr, pc, cnt;
+};
+static struct poll_det m68k_poll;
+static struct poll_det msh2_poll;
+
+#define POLL_THRESHOLD 6
+
+static int poll_detect(struct poll_det *pd, u32 a, u32 pc, int flag)
+{
+ int ret = 0;
+
+ 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 poll_undetect(struct poll_det *pd, int flag)
+{
+ int ret = 0;
+ if (pd->cnt > POLL_THRESHOLD)
+ ret = 1;
+ pd->addr = pd->cnt = 0;
+ Pico32x.emu_flags &= ~flag;
+ return ret;
+}
+