]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
NTSC fixes (blanking detection, autoscale, always use short line for line length)
authorToni Wilen <twilen@winuae.net>
Fri, 20 Mar 2026 16:34:35 +0000 (18:34 +0200)
committerToni Wilen <twilen@winuae.net>
Fri, 20 Mar 2026 16:34:35 +0000 (18:34 +0200)
custom.cpp
drawing.cpp

index e302981fc1a4f6157adc6350c51456c75d5651ef..5aad8b486acb8c6753de44123e03eafd34940ae9 100644 (file)
@@ -2276,6 +2276,9 @@ static void init_beamcon0(void)
 
 static void init_hz_reset(void)
 {
+       lol = 0;
+       linetoggle = !(new_beamcon0 & BEAMCON0_PAL) && !(new_beamcon0 & BEAMCON0_LOLDIS);
+
        linear_vpos = currprefs.ntscmode ? MAXVPOS_NTSC : MAXVPOS_PAL;
        linear_hpos = currprefs.ntscmode ? MAXHPOS_NTSC : MAXHPOS_PAL;
        linear_vpos += lof_store;
@@ -2284,7 +2287,7 @@ static void init_hz_reset(void)
        linear_vpos_prev[1] = linear_vpos;
        linear_vpos_prev[2] = linear_vpos;
        linear_hpos_prev[0] = linear_hpos;
-       linear_hpos_prev[1] = linear_hpos;
+       linear_hpos_prev[1] = linear_hpos + lol;
        linear_hpos_prev[2] = linear_hpos;
        current_linear_vpos = linear_vpos; // +vsync_startline - lof_store;
        current_linear_hpos = linear_hpos;
@@ -5154,6 +5157,10 @@ static void vsync_check_vsyncmode(void)
                                        int ydiff = (prevlofs[0] != prevlofs[1] && prevlofs[0] == prevlofs[2]) ? 2 : 1;
                                        if (abs(hp - current_linear_hpos_temp) >= 2 || abs(vp - current_linear_vpos_temp) >= ydiff) {
                                                current_linear_hpos_temp = hp;
+                                               if (linear_hpos_prev[0] == linear_hpos_prev[2] && abs(linear_hpos_prev[1] - linear_hpos_prev[0]) == 1) {
+                                                       // LOL=1: select shorter line
+                                                       current_linear_hpos_temp = linear_hpos_prev[0] > linear_hpos_prev[1] ? linear_hpos_prev[1] : linear_hpos_prev[0];
+                                               }
                                                current_linear_vpos_temp = vp;
                                                current_linear_temp_change = 2;
                                        }
@@ -10389,7 +10396,7 @@ static void decide_line_end(void)
 {
        linear_hpos_prev[2] = linear_hpos_prev[1];
        linear_hpos_prev[1] = linear_hpos_prev[0];
-       linear_hpos_prev[0] = hsync_ccks;
+       linear_hpos_prev[0] = custom_fastmode ? maxhpos : hsync_ccks;
        linear_hpos = 0;
        hautoscale_check();
        display_hstart_cyclewait_cnt = display_hstart_cyclewait_start;
@@ -11197,8 +11204,8 @@ static void custom_trigger_start(void)
                check_vsyncs_fast();
                linear_hpos_prev[2] = linear_hpos_prev[1];
                linear_hpos_prev[1] = linear_hpos_prev[0];
-               linear_hpos_prev[0] = maxhpos_short;
-               linear_hpos = maxhpos_short;
+               linear_hpos_prev[0] = maxhpos;
+               linear_hpos = maxhpos;
        }
 
        if (!canvhposw()) {
index b6c229b9cbb17c5071dd1c184ed1f02152bcab00..c56badc62a96df923b7e1045e5531bd8c69d0739 100644 (file)
@@ -6192,7 +6192,7 @@ static void draw_denise_line(int gfx_ypos, enum nln_how how, uae_u32 linecnt, in
 
        // detect horizontal blanking
        if (!denise_vblank_active) {
-               linear_denise_frame_hbstrt = hbstrt_offset;
+               linear_denise_frame_hbstrt = hbstrt_offset + (denise_strlong_seen ? lol * 8 : 0);
                linear_denise_frame_hbstop = hbstop_offset;
                //write_log("%d %d\n", linear_denise_frame_hbstrt, linear_denise_frame_hbstop);
 
@@ -6214,7 +6214,7 @@ static void draw_denise_line(int gfx_ypos, enum nln_how how, uae_u32 linecnt, in
                                linear_denise_frame_hbstrt_sel += linear_denise_strobe_offset + 2 * 8;
                                linear_denise_frame_hbstop_sel += linear_denise_strobe_offset + 2 * 8;
                                denise_hbstrt_relative_cnt = 0;
-                               if (ss != linear_denise_frame_hbstrt_sel || ee != linear_denise_frame_hbstop_sel) {
+                               if (abs(ss - linear_denise_frame_hbstrt_sel) >= 16 || abs(ee - linear_denise_frame_hbstop_sel) >= 16) {
                                        denise_blanking_changed = true;
                                }
                        }