]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Ultra overscan mode sync pattern updates, more accurate programmed mode register...
authorToni Wilen <twilen@winuae.net>
Sat, 25 Feb 2023 15:22:34 +0000 (17:22 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 25 Feb 2023 15:22:34 +0000 (17:22 +0200)
custom.cpp
drawing.cpp

index ef661999266bcdcb962e2ecff020abe96667be2d..e00a083eb70b1c2175d12f36e3b253c3b298ec50 100644 (file)
@@ -344,13 +344,13 @@ uae_u16 hbstop, hbstrt;
 static int hsstop_detect, hsstop_detect2;
 static uae_u16 vsstop, vsstrt;
 static uae_u16 vbstop, vbstrt;
-static uae_u16 hcenter, hcenter_v2, hcenter_v2_end;
+static uae_u16 hcenter, hcenter_v2, hcenter_v2_end, hcenter_sync_v2;
 static bool hcenter_active;
-static uae_u16 hbstop_v, hbstrt_v, hbstop_v2, hbstrt_v2;
+static uae_u16 hbstop_v, hbstrt_v, hbstop_v2, hbstrt_v2, hbstop_sync_v2, hbstrt_sync_v2;
 static uae_u16 hsstrt_v2, hsstop_v2;
 static int vsstrt_m, vsstop_m, vbstrt_m, vbstop_m;
 static bool vb_state, vb_end_line;
-static bool vs_state, vs_state_on, vs_state_on_old, vs_state_on_old2, vs_state_hw;
+static bool vs_state_var, vs_state_on, vs_state_on_old, vs_state_hw, vs_state_var_old;
 static bool vb_end_next_line, vb_end_next_line2;
 static int vb_start_line;
 static bool ocs_blanked;
@@ -773,6 +773,10 @@ static int adjust_hr2(int v)
        return v;
 }
 
+STATIC_INLINE bool is_last_line(void)
+{
+       return vpos + 1 == maxvpos + lof_store;
+}
 
 static void alloc_cycle(int hpos, int type)
 {
@@ -983,7 +987,7 @@ static void reset_bpl_vars()
 
 STATIC_INLINE bool line_hidden(void)
 {
-       return vpos >= maxvpos_display_vsync && vpos < minfirstline - 1;
+       return vpos >= maxvpos_display_vsync && vpos < minfirstline - 1 && currprefs.gfx_overscanmode < OVERSCANMODE_ULTRA;
 }
 
 // hblank start = enable border (bitplane not visible until next BPL1DAT)..
@@ -1015,58 +1019,217 @@ static void addccmp(int pos, int reg, int v, int chpos)
 
 static void syncdebugmarkers(int chpos)
 {
+       bool pal = (beamcon0 & BEAMCON0_PAL) != 0;
        if (hsyncdebug == 3) {
-               int ver1 = (beamcon0 & BEAMCON0_PAL) ? 26 : 27;
-               int ver2 = (beamcon0 & BEAMCON0_PAL) ? 140 : 141;
                // CSYNC
-               if (vpos >= 8 || (beamcon0 & BEAMCON0_VARHSYEN)) {
-                       addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, 1, chpos);
-                       addccmp(hsstop_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, 0, chpos);
-               }
+               int con = 1;
+               int coff = 0;
+               if (beamcon0 & BEAMCON0_CSYTRUE) {
+                       con = 0;
+                       coff = 1;
+               }
+               bool varcsy = (beamcon0 & BEAMCON0_VARCSYEN) != 0;
+               bool blanken = (beamcon0 & BEAMCON0_BLANKEN) != 0;
+               int hc1 = 1 + maxhpos;
+               hc1 <<= CCK_SHRES_SHIFT;
+               int nline = pal ? 8 : 10;
                addccmp(hbstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x204, 1, chpos);
                addccmp(hbstop_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x204, 0, chpos);
-               if (!(beamcon0 & BEAMCON0_VARHSYEN)) {
-                       if (vpos == 0 || vpos == 1 || vpos == 5 || vpos == 6) {
-                               addccmp(18 << CCK_SHRES_SHIFT, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, 1, chpos);
-                               addccmp(ver1 << CCK_SHRES_SHIFT, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, 0, chpos);
-                               addccmp(132 << CCK_SHRES_SHIFT, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, 1, chpos);
-                               addccmp(ver2 << CCK_SHRES_SHIFT, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, 0, chpos);
-                       }
-                       if (vpos == 2) {
-                               addccmp((12 + maxhpos) << CCK_SHRES_SHIFT, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, 1, chpos);
-                               addccmp(ver1 << CCK_SHRES_SHIFT, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, 0, chpos);
-                               addccmp(132 << CCK_SHRES_SHIFT, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, 1, chpos);
-                       }
-                       if (vpos == 3 || vpos == 4) {
-                               addccmp((1 + maxhpos) << CCK_SHRES_SHIFT, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, 0, chpos);
-                               addccmp(18 << CCK_SHRES_SHIFT, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, 1, chpos);
-                               addccmp(115 << CCK_SHRES_SHIFT, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, 0, chpos);
-                               addccmp(132 << CCK_SHRES_SHIFT, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, 1, chpos);
+               if (blanken) {
+                       addccmp(hbstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                       addccmp(hbstop_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+               } else if (!varcsy) {
+                       int ver1 = pal ? 26 : 27;
+                       int ver2 = pal ? 140 : 141;
+                       int vr2 = 115;
+                       ver1 <<= CCK_SHRES_SHIFT;
+                       ver2 <<= CCK_SHRES_SHIFT;
+                       vr2 <<= CCK_SHRES_SHIFT;
+                       if (vpos >= nline) {
+                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                               addccmp(hsstop_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                       }
+                       if (pal) {
+                               // PAL
+                               if (lof_display) {
+                                       // EVEN
+                                       if (vpos == 0) {
+                                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(hsstop_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               addccmp(hcenter_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(ver2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               thisline_changed = 1;
+                                       }
+                                       if (vpos == 1 || vpos == 2 || vpos == 6 || vpos == 7) {
+                                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(ver1, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               addccmp(hcenter_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(ver2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               thisline_changed = 1;
+                                       }
+                                       if (vpos == 3 || vpos == 4) {
+                                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(vr2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               addccmp(hcenter_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(hc1, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               thisline_changed = 1;
+                                       }
+                                       if (vpos == 5) {
+                                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(vr2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               addccmp(hcenter_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(ver2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               thisline_changed = 1;
+                                       }
+                               } else {
+                                       // ODD
+                                       if (vpos == 0 || vpos == 1 || vpos == 5 || vpos == 6) {
+                                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(ver1, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               addccmp(hcenter_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(ver2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               thisline_changed = 1;
+                                       }
+                                       if (vpos == 2) {
+                                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(ver1, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               addccmp(hcenter_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(hc1, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               thisline_changed = 1;
+                                       }
+                                       if (vpos == 3 || vpos == 4) {
+                                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(vr2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               addccmp(hcenter_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(hc1, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               thisline_changed = 1;
+                                       }
+                                       if (vpos == 7) {
+                                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(ver1, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               thisline_changed = 1;
+                                       }
+                               }
+                       } else {
+                               // NTSC
+                               if (lof_display) {
+                                       // EVEN
+                                       if (vpos == 0) {
+                                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(hsstop_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               addccmp(hcenter_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(ver2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               thisline_changed = 1;
+                                       }
+                                       if (vpos == 1 || vpos == 2 || vpos == 7 || vpos == 8 || vpos == 9) {
+                                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(ver1, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               addccmp(hcenter_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(hc1, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               thisline_changed = 1;
+                                       }
+                                       if (vpos == 4 || vpos == 5) {
+                                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(vr2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               addccmp(hcenter_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(hc1, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               thisline_changed = 1;
+                                       }
+                                       if (vpos == 3) {
+                                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(hsstop_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               addccmp(hcenter_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(hc1, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               thisline_changed = 1;
+                                       }
+                                       if (vpos == 6) {
+                                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(ver1, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               addccmp(vr2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(hcenter_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               thisline_changed = 1;
+                                       }
+                               } else {
+                                       // ODD
+                                       if (vpos == 0 || vpos == 1 || vpos == 2 || vpos == 6 || vpos == 7 || vpos == 8) {
+                                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(ver1, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               addccmp(hcenter_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(ver2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               thisline_changed = 1;
+                                       }
+                                       if (vpos == 3) {
+                                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(ver1, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               addccmp(hcenter_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(hc1, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               thisline_changed = 1;
+                                       }
+                                       if (vpos == 4 || vpos == 5) {
+                                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(vr2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               addccmp(hcenter_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(hc1, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               thisline_changed = 1;
+                                       }
+                                       if (vpos == 9) {
+                                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                                               addccmp(hsstop_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                                               thisline_changed = 1;
+                                       }
+                               }
                        }
-                       if (vpos == 7) {
-                               addccmp(18 << CCK_SHRES_SHIFT, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, 1, chpos);
-                               addccmp(ver1 << CCK_SHRES_SHIFT, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, 0, chpos);
+               } else {
+                       if (vs_state_var && !vs_state_var_old && lof_display) {
+                               // First VS=1 line, LOF=1: VS=1 at HCENTER start
+                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                               if (hsstop_v2 < hcenter_sync_v2) {
+                                       addccmp(hsstop_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                               }
+                               if (hbstrt_sync_v2 >= hcenter_sync_v2) {
+                                       addccmp(hbstrt_sync_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                               }
+                               if (hbstop_sync_v2 >= hcenter_sync_v2) {
+                                       addccmp(hbstop_sync_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                               }
+                               addccmp(hcenter_sync_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                               thisline_changed = 1;
+                       } else if (vs_state_var) {
+                               addccmp(hbstrt_sync_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                               addccmp(hbstop_sync_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
+                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                               addccmp(hcenter_sync_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                               thisline_changed = 1;
+                       } else {
+                               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, con, chpos);
+                               addccmp(hsstop_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, coff, chpos);
                        }
                }
        } else {
                // H/V SYNC
+               int hon = 1;
+               int hoff = 0;
+               if (beamcon0 & BEAMCON0_HSYTRUE) {
+                       hon = 0;
+                       hoff = 1;
+               }
                if (hcenter_v2 < chpos && hcenter_v2 >= last_recorded_diw_hpos) {
-                       if (beamcon0 & BEAMCON0_PAL) {
-                               if (vs_state_on && !lof_display) {
+                       if (pal) {
+                               if (vs_state_var && !lof_display) {
                                        addcc(hcenter_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x206, 0);
-                               } else if (!vs_state_on && vs_state_on_old && lof_display) {
+                               } else if (!vs_state_var && vs_state_var_old && lof_display) {
                                        addcc(hcenter_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x206, 1);
                                }
                        } else {
-                               if (vs_state_on && lof_display) {
+                               if (vs_state_var && lof_display) {
                                        addcc(hcenter_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x206, 0);
-                               } else if (!vs_state_on && vs_state_on_old && lof_display) {
+                               } else if (!vs_state_var && vs_state_var_old && lof_display) {
                                        addcc(hcenter_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x206, 1);
                                }
                        }
                }
-               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, 1, chpos);
-               addccmp(hsstop_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, 0, chpos);
+               addccmp(hsstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, hon, chpos);
+               addccmp(hsstop_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x202, hoff, chpos);
                addccmp(hbstrt_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x204, 1, chpos);
                addccmp(hbstop_v2, RECORDED_REGISTER_CHANGE_OFFSET + 0x204, 0, chpos);
        }
@@ -1221,11 +1384,8 @@ static void record_color_change2(int hpos, int regno, uae_u32 value)
                                        }
                                }
                        }
-                       color_change *cc1 = &curr_color_changes[start_color_change];
-                       color_change *cc2 = &curr_color_changes[start_color_change];
                }
        }
-
 }
 
 static void sync_color_changes(int hpos)
@@ -5604,7 +5764,7 @@ static void reset_decisions_scanline_start(void)
        }
 
        if (!ecs_denise) {
-               if (agnusa1000 || !ecs_agnus) {
+               if (!ecs_agnus) {
                        if (vb_start_line == 2 + vblank_extraline) {
                                record_color_change2(0, 0, COLOR_CHANGE_BLANK | 1);
                        }
@@ -5726,11 +5886,13 @@ static void reset_decisions_hsync_start(void)
                thisline_decision.vb = VB_NOVB;
                if (new_beamcon0 & BEAMCON0_BLANKEN) {
                        // blanking working same as AGA
-                       thisline_decision.vb = vb_start_line > 1 + vblank_extraline || vb_end_next_line ? 0 : VB_NOVB;
+                       thisline_decision.vb = vb_start_line >= 1 + vblank_extraline || vb_end_next_line ? 0 : VB_NOVB;
                }
-       } else {
+       } else if (ecs_agnus) {
                // Visible vblank end is delayed by 1 line
-               thisline_decision.vb = vb_start_line > 1 + vblank_extraline || vb_end_next_line ? 0 : VB_NOVB;
+               thisline_decision.vb = vb_start_line >= 1 + vblank_extraline || vb_end_next_line ? 0 : VB_NOVB;
+       } else {
+               thisline_decision.vb = vb_start_line >= 2 + vblank_extraline || vb_end_next_line ? 0 : VB_NOVB;
        }
        // if programmed vblank
        if ((new_beamcon0 & BEAMCON0_VARVBEN) && ecs_agnus) {
@@ -5753,7 +5915,7 @@ static void reset_decisions_hsync_start(void)
                if (thisline_decision.vb != VB_NOVB) {
                        thisline_decision.vb = VB_VB | VB_NOVB;
                }
-               if (vs_state_on) {
+               if ((vs_state_var && (new_beamcon0 & BEAMCON0_VARVSYEN)) || (vs_state_hw && !(new_beamcon0 & BEAMCON0_VARVSYEN))) {
                        thisline_decision.vb |= VB_VS;
                }
        }
@@ -6040,6 +6202,7 @@ static void checklacecount(bool lace)
 
 static void set_hcenter(void)
 {
+       hcenter_sync_v2 = (hcenter & 0xff) << CCK_SHRES_SHIFT;
        if (!aga_mode && ecs_denise) {
                if (beamcon0 & bemcon0_vsync_mask) {
                        hcenter_v2 = (hcenter & 0xff) << CCK_SHRES_SHIFT;
@@ -6079,6 +6242,10 @@ static void updateextblk(void)
 
        hbstrt_v = (hbstrt & 0xff) << CCK_SHRES_SHIFT;
        hbstop_v = (hbstop & 0xff) << CCK_SHRES_SHIFT;
+       // Agnus/Alice side HBxxxx, used by VARCSY
+       hbstrt_sync_v2 = hbstrt_v;
+       hbstop_sync_v2 = hbstop_v;
+
        if (aga_mode) {
                // AGA horizontal blanking is simple
                hbstrt_v |= (hbstrt >> 8) & 7;
@@ -6688,17 +6855,17 @@ static void init_hz(bool checkvposw)
                                hsstop_detect += 5;
                        } else if (currprefs.gfx_overscanmode >= OVERSCANMODE_ULTRA) {
                                maxhpos_display += EXTRAWIDTH_ULTRA;
-                               maxvpos_display_vsync += 2;
+                               maxvpos_display_vsync += vsync_startline;
                                minfirstline = 0;
-                               hsstop_detect = hsyncstartpos_start_cycles - 2;
+                               hsstop_detect = hsyncstartpos_start_cycles * 2 - 4;
                        }
                } else {
 
                        if (currprefs.gfx_overscanmode >= OVERSCANMODE_ULTRA) {
                                maxhpos_display += EXTRAWIDTH_ULTRA;
-                               maxvpos_display_vsync += 2;
+                               maxvpos_display_vsync += vsync_startline;
                                hsstop_detect = 18 * 2;
-                               minfirstline = 0;
+                               minfirstline = 1;
                        }
                }
 
@@ -6778,14 +6945,14 @@ static void init_hz(bool checkvposw)
                minfirstline++;
                firstblankedline = vbstrt;
                if (vsstrt > 0 && vsstrt < maxvpos / 2) {
-                       maxvpos_display_vsync += vsstrt;
+                       maxvpos_display_vsync += vsstrt - 1;
                }
        } else if (beamcon0 & bemcon0_vsync_mask) {
                firstblankedline = maxvpos + 1;
        } else if (beamcon0 & BEAMCON0_VARVBEN) {
                firstblankedline = vbstrt;
                if (vsstrt > 0 && vsstrt < maxvpos / 2) {
-                       maxvpos_display_vsync += vsstrt;
+                       maxvpos_display_vsync += vsstrt - 1;
                }
        } else {
                firstblankedline = maxvpos + 1;
@@ -6835,11 +7002,6 @@ static void init_hz(bool checkvposw)
                if (minfirstline < vsync_startline) {
                        minfirstline = vsync_startline;
                }
-               if (currprefs.gfx_overscanmode >= OVERSCANMODE_ULTRA) {
-                       if (minfirstline > vsstrt + 1) {
-                               minfirstline = vsstrt + 1;
-                       }
-               }
        }
 
        if (beamcon0 & BEAMCON0_VARBEAMEN) {
@@ -6867,6 +7029,17 @@ static void init_hz(bool checkvposw)
                hzc = 1;
        }
 
+       // exclude possible extra lines that are inside vertical blank
+       if (currprefs.gfx_overscanmode < OVERSCANMODE_EXTREME) {
+               if (beamcon0 & BEAMCON0_VARBEAMEN) {
+                       if (firstblankedline < maxvpos / 2 && maxvpos_display_vsync > firstblankedline) {
+                               maxvpos_display_vsync = firstblankedline;
+                       } else if (firstblankedline <= maxvpos) {
+                               maxvpos_display_vsync = 0;
+                       }
+               }
+       }
+
        if (maxvpos_nom >= MAXVPOS) {
                maxvpos_nom = MAXVPOS;
        }
@@ -8113,6 +8286,7 @@ static void BEAMCON0(int hpos, uae_u16 v)
 {
        if (ecs_agnus) {
                if (v != new_beamcon0) {
+                       sync_color_changes(hpos);
                        new_beamcon0 = v;
                        write_log(_T("BEAMCON0 = %04X, PC=%08X\n"), v, M68K_GETPC);
                        // not LPENDIS, LOLDIS, PAL, BLANKEN, SYNC INVERT
@@ -9496,7 +9670,11 @@ static bool copper_cant_read(int hpos, uae_u16 alloc)
                        cycle_line_pipe[offset] = CYCLE_PIPE_NONE | CYCLE_PIPE_COPPER;
                        blitter_pipe[offset] = CYCLE_PIPE_COPPER;
 #ifdef DEBUGGER
-                       record_dma_event2(DMA_EVENT2_COPPERUSE, offset, vpos);
+                       int dvpos = vpos + 1;
+                       if (is_last_line()) {
+                               dvpos = 0;
+                       }
+                       record_dma_event2(DMA_EVENT2_COPPERUSE, offset, dvpos);
 #endif
                }
                coffset++;
@@ -11515,7 +11693,12 @@ static void vsync_handler_post(void)
                }
        }
        if (lof_changing) {
-
+               // if not interlace and LOF was changed during previous field but LOF is now same as beginning of previous field: do nothing
+               if (!(bplcon0 & 4) && ((lof_changing > 0 && prevlofs[0]) || (lof_changing < 0 && !prevlofs[0]))) {
+                       lof_changing = 0;
+               }
+       }
+       if (lof_changing) {
                if (lof_store != (prevlofs[0] ? 1 : 0) && prevlofs[0] == prevlofs[1] && prevlofs[1] == prevlofs[2]) {
                        // resync if LOF was not toggling previously
                        nosignal_trigger = true;
@@ -12084,17 +12267,6 @@ static void hsync_handlerh(bool onvsync)
        hpos_hsync_extra = 0;
        estimate_last_fetch_cycle(hpos);
 
-       if (currprefs.gfx_overscanmode >= OVERSCANMODE_ULTRA) {
-               if (beamcon0 & BEAMCON0_PAL) {
-                       if (vs_state_on_old && !vs_state_on_old2 && !lof_display) {
-                               record_color_change2(hpos, RECORDED_REGISTER_CHANGE_OFFSET + 0x206, 1);
-                       }
-               } else {
-                       if (vs_state_on_old && !vs_state_on_old2 && lof_display) {
-                               record_color_change2(hpos, RECORDED_REGISTER_CHANGE_OFFSET + 0x206, 1);
-                       }
-               }
-       }
        if (vb_end_next_line && !ecs_denise) {
                record_color_change2(hpos, 0, COLOR_CHANGE_BLANK | 1);
        }
@@ -12168,6 +12340,10 @@ static void hsync_handler_pre(bool onvsync)
 
        devices_hsync();
 
+       if (hsyncdebug) {
+               sync_color_changes(maxhpos);
+       }
+
        hsync_counter++;
 
        vpos_prev = vpos;
@@ -12221,11 +12397,6 @@ static void hsync_handler_pre(bool onvsync)
        debug_hsync();
 }
 
-STATIC_INLINE bool is_last_line(void)
-{
-       return vpos + 1 == maxvpos + lof_store;
-}
-
 // low latency vsync
 
 #define LLV_DEBUG 0
@@ -13041,6 +13212,7 @@ static void hsync_handler_post(bool onvsync)
                vb_end_next_line = true;
        }
 
+       vs_state_var_old = vs_state_var;
        if (ecs_agnus) {
                if (vsstrt_m == vpos) {
                        vsstrt_m = -1;
@@ -13058,11 +13230,11 @@ static void hsync_handler_post(bool onvsync)
 
                if (vsstrt == vpos) {
                        vsstrt_m = vpos;
-                       vs_state = true;
+                       vs_state_var = true;
                }
                if (vsstop == vpos) {
                        vsstop_m = vpos;
-                       vs_state = false;
+                       vs_state_var = false;
                }
 
                if (new_beamcon0 & BEAMCON0_VARVBEN) {
@@ -13130,10 +13302,9 @@ static void hsync_handler_post(bool onvsync)
                }
        }
 
-       vs_state_on_old2 = vs_state_on_old;
        vs_state_on_old = vs_state_on;
        if (new_beamcon0 & bemcon0_vsync_mask) {
-               vs_state_on = vs_state;
+               vs_state_on = vs_state_var;
        } else {
                vs_state_on = vs_state_hw;
        }
@@ -13491,7 +13662,7 @@ void custom_reset(bool hardreset, bool keyboardreset)
                vb_start_line = 0;
        }
        vb_state = true;
-       vs_state = false;
+       vs_state_var = false;
        vs_state_hw = false;
        vs_state_on = false;
        dmal_htotal_mask = 0xffff;
@@ -14279,12 +14450,14 @@ static int REGPARAM2 custom_wput_1 (int hpos, uaecptr addr, uae_u32 value, int n
        case 0x1DC: BEAMCON0(hpos, value); break;
        case 0x1C0:
                if (htotal != value) {
+                       sync_color_changes(hpos);
                        htotal = value & (MAXHPOS_ROWS - 1);
                        varsync(addr, 1);
                }
                break;
        case 0x1C2:
                if (hsstop != value) {
+                       sync_color_changes(hpos);
                        hsstop = value & (MAXHPOS_ROWS - 1);
                        varsync(addr, 1);
                }
@@ -14311,36 +14484,42 @@ static int REGPARAM2 custom_wput_1 (int hpos, uaecptr addr, uae_u32 value, int n
                break;
        case 0x1CA:
                if (vsstop != value) {
+                       sync_color_changes(hpos);
                        vsstop = value & (MAXVPOS_LINES_ECS - 1);
                        varsync(addr, 1);
                }
                break;
        case 0x1CC:
                if (vbstrt != value) {
+                       sync_color_changes(hpos);
                        vbstrt = value & (MAXVPOS_LINES_ECS - 1);
                        varsync(addr, 0);
                }
                break;
        case 0x1CE:
                if (vbstop != value) {
+                       sync_color_changes(hpos);
                        vbstop = value & (MAXVPOS_LINES_ECS - 1);
                        varsync(addr, 0);
                }
                break;
        case 0x1DE:
                if (hsstrt != value) {
+                       sync_color_changes(hpos);
                        hsstrt = value & (MAXHPOS_ROWS - 1);
                        varsync(addr, 1);
                }
                break;
        case 0x1E0:
                if (vsstrt != value) {
+                       sync_color_changes(hpos);
                        vsstrt = value & (MAXVPOS_LINES_ECS - 1);
                        varsync(addr, 1);
                }
                break;
        case 0x1E2:
                if (hcenter != value) {
+                       sync_color_changes(hpos);
                        hcenter = value & (MAXHPOS_ROWS - 1);
                        varsync(addr, 0);
                }
index 6a3702a12c725e768235dc67d405c356330ece6a..98a866d679e46f2546e2d841257ab4a17eaf36f9 100644 (file)
@@ -606,7 +606,7 @@ int get_vertical_visible_height(bool useoldsize)
        if (interlace_seen && currprefs.gfx_vresolution > 0) {
                h -= 1 << (currprefs.gfx_vresolution - 1);
        }
-       if (syncdebug) {
+       if (!syncdebug) {
                bool hardwired = true;
                if (ecs_agnus) {
                        hardwired = (new_beamcon0 & BEAMCON0_VARVBEN) == 0;
@@ -1159,7 +1159,7 @@ static void set_res_shift(void)
 /* Initialize the variables necessary for drawing a line.
 * This involves setting up start/stop positions and display window
 * borders.  */
-static void pfield_init_linetoscr (int lineno, bool border)
+static void pfield_init_linetoscr (bool border)
 {
        /* First, get data fetch start/stop in DIW coordinates.  */
        int ddf_left = dp_for_drawing->plfleft + DIW_DDF_OFFSET - DDF_OFFSET;
@@ -1586,6 +1586,9 @@ static void pfield_do_darken_line(int start, int stop, int vp)
                        c0 = 0x831;
                        c1 = 0x000;
                }
+               if (hcenter_debug && currprefs.gfx_overscanmode > OVERSCANMODE_ULTRA) {
+                       c0 = 0x381;
+               }
        }
        if (!trans) {
                vp = 0;
@@ -3669,7 +3672,7 @@ static void do_color_changes(line_draw_func worker_border, line_draw_func worker
                        }
                }
 
-               if (i < dip_for_drawing->last_color_change) {
+               if (i != dip_for_drawing->last_color_change) {
                        if (regno >= RECORDED_REGISTER_CHANGE_OFFSET) {
                                pfield_expand_dp_bplconx(regno, value, nextpos, vp);
                        } else if (regno >= 0 && !(value & COLOR_CHANGE_MASK)) {
@@ -3823,7 +3826,7 @@ static void pfield_draw_line(struct vidbuffer *vb, int lineno, int gfx_ypos, int
                pfield_expand_dp_bplcon();
                // must be after pfield_expand_dp_bplcon
                adjust_drawing_colors(dp_for_drawing->ctable, dp_for_drawing->ham_seen || bplehb || ecsshres, true);
-               pfield_init_linetoscr(lineno, false);
+               pfield_init_linetoscr(false);
                pfield_doline(lineno);
 
                /* The problem is that we must call decode_ham() BEFORE we do the sprites. */
@@ -3917,7 +3920,7 @@ static void pfield_draw_line(struct vidbuffer *vb, int lineno, int gfx_ypos, int
                if (dp_for_drawing->bordersprite_seen && !ce_is_borderblank(colors_for_drawing.extra) && dip_for_drawing->nr_sprites) {
                        dosprites = true;
                        pfield_expand_dp_bplcon();
-                       pfield_init_linetoscr(lineno, true);
+                       pfield_init_linetoscr(true);
                        pfield_erase_vborder_sprites();
                }
 #endif