]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Switch to normal emulation if BPLDAT1 is written to even if line is blanked.
authorToni Wilen <twilen@winuae.net>
Sun, 26 Oct 2025 14:30:38 +0000 (16:30 +0200)
committerToni Wilen <twilen@winuae.net>
Sun, 26 Oct 2025 14:30:38 +0000 (16:30 +0200)
drawing.cpp

index 9a365eedab58501a56c5c5412ad48de4fc1c881a..533c16d3cd628a1be0e66fd82510b70d941c3d7a 100644 (file)
@@ -517,6 +517,7 @@ static int internal_pixel_cnt, internal_pixel_start_cnt;
 static bool no_denise_lol, denise_strlong_seen;
 #define STRLONG_SEEN_DELAY 2
 static int denise_strlong_seen_delay;
+static bool denise_vsync_bpl_detect;
 
 void set_inhibit_frame(int monid, int bit)
 {
@@ -3738,6 +3739,7 @@ static void expand_drga_early(struct denise_rga *rd)
                                aga_unalign1 += 2;
                        }
                }
+               denise_vsync_bpl_detect = false;
                break;
        }
 
@@ -5507,6 +5509,7 @@ static void draw_denise_vsync(int erase)
                center_y_erase = false;
                resetfulllinestate();
        }
+       denise_vsync_bpl_detect = true;
 }
 
 static void denise_draw_update(void)
@@ -5712,15 +5715,23 @@ static void draw_denise_line(int gfx_ypos, enum nln_how how, uae_u32 linecnt, in
        bool blankedline = (this_line->linear_vpos >= denise_vblank_extra_bottom || this_line->linear_vpos < denise_vblank_extra_top) && currprefs.gfx_overscanmode < OVERSCANMODE_EXTREME && !programmedmode;
        bool line_is_blanked = false;
 
-       if (denise_pixtotal_max == -0x7fffffff || blankedline || blanked) {
+       if ((denise_pixtotal_max == -0x7fffffff && denise_vsync_bpl_detect) || blankedline || blanked) {
 
                // don't draw vertical blanking if not ultra extreme overscan
                internal_pixel_cnt = -1;
                line_is_blanked = true;
                while (denise_cck < denise_endcycle) {
+                       // start drawing normally if BPLDAT1 gets written to, even if line is blanked
+                       if (!denise_vsync_bpl_detect) {
+                               while (denise_cck < denise_endcycle) {
+                                       lts();
+                                       lts_changed = false;
+                               }
+                               break;
+                       }
                        while (denise_cck < denise_endcycle) {
                                do_denise_cck(denise_linecnt, denise_startpos, denise_cck);
-                               if (lts_changed) {
+                               if (lts_changed || !denise_vsync_bpl_detect) {
                                        break;
                                }
                                if (aga_mode) {
@@ -5753,6 +5764,7 @@ static void draw_denise_line(int gfx_ypos, enum nln_how how, uae_u32 linecnt, in
                                                *debug_dma_dhpos_odd = denise_hcounter;
 #endif
                                                denise_hcounter_cmp++;
+                                               denise_hcounter &= 511;
                                                denise_hcounter++;
                                                denise_hcounter &= 511;
                                                denise_hcounter_next++;