From a7686784b21ecc6e3575b64e45a7cfc8c1b271a9 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Fri, 20 Mar 2026 18:34:35 +0200 Subject: [PATCH] NTSC fixes (blanking detection, autoscale, always use short line for line length) --- custom.cpp | 15 +++++++++++---- drawing.cpp | 4 ++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/custom.cpp b/custom.cpp index e302981f..5aad8b48 100644 --- a/custom.cpp +++ b/custom.cpp @@ -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()) { diff --git a/drawing.cpp b/drawing.cpp index b6c229b9..c56badc6 100644 --- a/drawing.cpp +++ b/drawing.cpp @@ -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; } } -- 2.47.3