]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Reset blitter before stateload, pending final D reset does not happen immediately...
authorToni Wilen <twilen@winuae.net>
Thu, 30 Dec 2021 19:10:30 +0000 (21:10 +0200)
committerToni Wilen <twilen@winuae.net>
Thu, 30 Dec 2021 19:10:30 +0000 (21:10 +0200)
blitter.cpp
devices.cpp
include/blitter.h

index 68eb86bcea3c65d0caf629f21c536dac9ec3a4ee..f10c76750f910d57212e5736ea2c774e6ea3101d 100644 (file)
@@ -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();
index 4c58a13ab3a03b9fb3cb1b24a6d1f37503123d95..439c1724ae837775143027b165259a8ee3724a13 100644 (file)
@@ -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++) {
index e87f2a1cb79130cfade6daf79d26ccf5bbafdca7..eea3aefd088d2e8eb1a80cab5c5f57a9e57ad1dd 100644 (file)
@@ -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];