From: Toni Wilen Date: Sat, 25 Feb 2023 15:22:34 +0000 (+0200) Subject: Ultra overscan mode sync pattern updates, more accurate programmed mode register... X-Git-Tag: 5.0.0~131 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=6d8cd95dae67ba1e45a9271f6cdb35cabe826dde;p=francis%2Fwinuae.git Ultra overscan mode sync pattern updates, more accurate programmed mode register updates --- diff --git a/custom.cpp b/custom.cpp index ef661999..e00a083e 100644 --- a/custom.cpp +++ b/custom.cpp @@ -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); } diff --git a/drawing.cpp b/drawing.cpp index 6a3702a1..98a866d6 100644 --- a/drawing.cpp +++ b/drawing.cpp @@ -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