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;
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;
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;
}
{
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;
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()) {
// 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);
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;
}
}