From f47a764a895df7eb7d3284d0026d5c79b0501c2a Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Thu, 30 Dec 2021 21:10:30 +0200 Subject: [PATCH] Reset blitter before stateload, pending final D reset does not happen immediately after BLTSIZE write. --- blitter.cpp | 19 +++++++++++++++---- devices.cpp | 1 + include/blitter.h | 1 + 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/blitter.cpp b/blitter.cpp index 68eb86bc..f10c7675 100644 --- a/blitter.cpp +++ b/blitter.cpp @@ -913,7 +913,7 @@ static void blit_bltset(int con) if (con & 2) { blitdesc = bltcon1 & 2; - if (blit_warned > 0) { + if (!savestate_state && blit_warned > 0) { if ((bltcon1 & 1) && !blitline_started) { write_log(_T("BLITTER: linedraw enabled when blitter is active! %08x\n"), M68K_GETPC); blit_warned--; @@ -1002,7 +1002,7 @@ static void blit_bltset(int con) activate_debugger(); } - if (blit_changed && blit_warned > 0) { + if (blit_changed && blit_warned > 0 && !savestate_state) { blitshifterdebug(bltcon0, false); } @@ -1581,6 +1581,8 @@ static bool decide_blitter_maybe_write2(int until_hpos, uaecptr addr, uae_u32 va blit_cyclecounter++; if (blit_cyclecounter == 0) { shifter_first = 1; + // clear possible still pending final D write + blt_info.blit_finald = 0; blitter_next_cycle(); } int c = get_current_channel(); @@ -1816,8 +1818,6 @@ void do_blitter(int hpos, int copper, uaecptr pc) blit_cyclecounter = 0; blit_totalcyclecounter = 0; blt_info.blit_pending = 1; - // pending finald gets cleared when new blit starts - blt_info.blit_finald = 0; blitter_start_init(); @@ -2053,10 +2053,21 @@ void blitter_reset (void) bltptxpos = -1; blitter_cycle_exact = currprefs.blitter_cycle_exact; immediate_blits = currprefs.immediate_blits; + shifter[0] = shifter[1] = shifter[2] = shifter[3] = 0; + shifter_skip_b = false; + shifter_skip_y = false; + bltcon0 = 0; + bltcon1 = 0; + blitter_start_init(); } #ifdef SAVESTATE +void restore_blitter_start(void) +{ + blitter_reset(); +} + void restore_blitter_finish (void) { record_dma_reset(); diff --git a/devices.cpp b/devices.cpp index 4c58a13a..439c1724 100644 --- a/devices.cpp +++ b/devices.cpp @@ -384,6 +384,7 @@ void devices_restore_start(void) { restore_cia_start(); restore_blkdev_start(); + restore_blitter_start(); changed_prefs.bogomem.size = 0; changed_prefs.chipmem.size = 0; for (int i = 0; i < MAX_RAM_BOARDS; i++) { diff --git a/include/blitter.h b/include/blitter.h index e87f2a1c..eea3aefd 100644 --- a/include/blitter.h +++ b/include/blitter.h @@ -51,6 +51,7 @@ extern void blitter_check_start(void); extern void blitter_reset(void); extern void blitter_debugdump(void); extern bool blit_steal_cycle(int hpos); +extern void restore_blitter_start(void); extern uae_u16 blitter_pipe[256]; -- 2.47.3