From: Toni Wilen Date: Wed, 5 Feb 2025 17:47:29 +0000 (+0200) Subject: Exit SVGA emulation loop immediately if board interrupt was activated. X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=de4b4e0a792ba1d3208e33409f32c1074ea54516;p=francis%2Fwinuae.git Exit SVGA emulation loop immediately if board interrupt was activated. --- diff --git a/gfxboard.cpp b/gfxboard.cpp index 9bced2a2..71da64b5 100644 --- a/gfxboard.cpp +++ b/gfxboard.cpp @@ -487,6 +487,7 @@ struct rtggfxboard int resolutionchange; uae_u8 *gfxboard_surface, *fakesurface_surface; bool gfxboard_intreq; + bool gfxboard_intreq_status; bool gfxboard_intreq_marked; bool gfxboard_external_interrupt; int gfxboard_intena; @@ -969,6 +970,7 @@ static void gfxboard_hsync_handler(void) } if (gb->pcemdev && gb->pcemobject2 && !gb->pcem_vblank) { static int pollcnt; + bool pirq = gb->gfxboard_intreq_status; int total = svga_get_vtotal(gb->pcemobject2); if (total <= 0) total = p96syncrate; @@ -980,6 +982,12 @@ static void gfxboard_hsync_handler(void) pollcnt &= 0xff; break; } + bool nirq = gb->gfxboard_intreq_status; + // exit immediately if new interrupt was generated. It might be used for screen split. + if (!pirq && nirq) { + pollcnt &= 0xff; + break; + } pollcnt -= 256; } } @@ -1661,6 +1669,7 @@ void gfxboard_intreq(void *p, int act, bool safe) struct rtggfxboard *gb = (struct rtggfxboard*)p; if (act) { if (gb->board->irq && gb->gfxboard_intena) { + gb->gfxboard_intreq_status = true; if (gb->board->irq > 0) { gb->gfxboard_intreq = 1; gb->gfxboard_intreq_marked = 1; @@ -1670,6 +1679,7 @@ void gfxboard_intreq(void *p, int act, bool safe) } } else { gb->gfxboard_intreq = 0; + gb->gfxboard_intreq_status = false; if (gb->board->irq < 0) { gb->pcibs->irq_callback(gb->pcibs, false); }