| 4974 | } |
| 4975 | |
| 4976 | static void vsync_check_vsyncmode(void) |
| 4977 | { |
| 4978 | if (linear_vpos_prev[2] == linear_vpos_prev[0] || linear_vpos_prev[1] == linear_vpos_prev[0]) { |
| 4979 | if (linear_hpos_prev[2] == linear_hpos_prev[0] || linear_hpos_prev[1] == linear_hpos_prev[0]) { |
| 4980 | if (linear_hpos_prev[2] == linear_hpos_prev[0] || linear_hpos_prev[1] == linear_hpos_prev[0]) { |
| 4981 | if (linear_hpos_prev[2] == linear_hpos_prev[0] || linear_hpos_prev[1] == linear_hpos_prev[0]) { |
| 4982 | int hp = linear_hpos_prev[0] > linear_hpos_prev[2] ? linear_hpos_prev[0] : linear_hpos_prev[2]; |
| 4983 | int vp = linear_vpos_prev[0] > linear_vpos_prev[2] ? linear_vpos_prev[0] : linear_vpos_prev[2]; |
| 4984 | int ydiff = (prevlofs[0] != prevlofs[1] && prevlofs[0] == prevlofs[2]) ? 2 : 1; |
| 4985 | if (abs(hp - current_linear_hpos_temp) >= 2 || abs(vp - current_linear_vpos_temp) >= ydiff) { |
| 4986 | current_linear_hpos_temp = hp; |
| 4987 | if (linear_hpos_prev[0] == linear_hpos_prev[2] && abs(linear_hpos_prev[1] - linear_hpos_prev[0]) == 1) { |
| 4988 | // LOL=1: select shorter line |
| 4989 | current_linear_hpos_temp = linear_hpos_prev[0] > linear_hpos_prev[1] ? linear_hpos_prev[1] : linear_hpos_prev[0]; |
| 4990 | } |
| 4991 | current_linear_vpos_temp = vp; |
| 4992 | current_linear_temp_change = 2; |
| 4993 | } |
| 4994 | } |
| 4995 | } |
| 4996 | } |
| 4997 | } |
| 4998 | if (!current_linear_temp_change && !agnus_afterreset) { |
| 4999 | if (abs(current_linear_vblank_lines - linear_vpos_vblank_lines) >= 2 || |
| 5000 | abs(current_linear_vpos_vb_end - linear_vpos_vblank_end) >= 2 || |
| 5001 | abs(current_linear_vpos_vb_start - linear_vpos_vblank_start) >= 2 || |
| 5002 | abs(current_linear_vpos_vb_vsync - linear_vpos_vblank_vsync) >= 2 || |
| 5003 | abs(current_linear_hpos - current_linear_hpos_temp) >= 1 || |
| 5004 | abs(current_linear_vpos - current_linear_vpos_temp) >= 2) |
| 5005 | { |
| 5006 | current_linear_temp_change = 2; |
| 5007 | } |
| 5008 | } |
| 5009 | |
| 5010 | if (!current_linear_temp_change && denise_get_hbstate(false) && currprefs.cs_hvcsync < HVSYNC_SYNCPOS) { |
| 5011 | current_linear_temp_change = 2; |
| 5012 | } |
| 5013 | |
| 5014 | bool framesync = false; |
| 5015 | if (current_linear_temp_change > 0) { |
| 5016 | current_linear_temp_change--; |
| 5017 | if (current_linear_temp_change == 0) { |
| 5018 | bool changed = false; |
| 5019 | // Horizontal check immediately |
| 5020 | if (current_linear_hpos != current_linear_hpos_temp) { |
| 5021 | changed = true; |
| 5022 | } |
| 5023 | // vertical values: ignore single field glitches |
| 5024 | if (current_linear_vpos != current_linear_vpos_temp || |
| 5025 | current_linear_vblank_lines != linear_vpos_vblank_lines || |
| 5026 | current_linear_vpos_vb_end != linear_vpos_vblank_end || |
| 5027 | current_linear_vpos_vb_start != linear_vpos_vblank_start || |
| 5028 | current_linear_vpos_vb_vsync != linear_vpos_vblank_vsync) { |
| 5029 | if (linear_vpos_values_changed) { |
| 5030 | changed = true; |
| 5031 | } else { |
| 5032 | linear_vpos_values_changed++; |
| 5033 | } |
no test coverage detected