From: Toni Wilen Date: Fri, 19 May 2023 18:54:50 +0000 (+0300) Subject: Reset blitter fully, linemode sign-bit fix. X-Git-Tag: 5.0.0~30 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=a39e1a28fcaa3bbc9da6802391ef223598d9f300;p=francis%2Fwinuae.git Reset blitter fully, linemode sign-bit fix. --- diff --git a/blitter.cpp b/blitter.cpp index d4ea3fd9..fca77c1e 100644 --- a/blitter.cpp +++ b/blitter.cpp @@ -734,18 +734,17 @@ static void blitter_line_write(void) static void blitter_line_minterm(uae_u16 dat) { - int ashift = bltcon0 >> 12; - int bshift = bltcon1 >> 12; - uae_u16 mask = blt_info.bltafwm; if (dat & BLITTER_PIPELINE_LAST) { mask &= blt_info.bltalwm; } + int ashift = bltcon0 >> 12; uae_u16 blitahold = (blt_info.bltadat & mask) >> ashift; if (bltcon0 & BLTCHB) { // B special case if enabled + int bshift = bltcon1 >> 12; blineb = (((uae_u32)blt_info.bltbold << 16) | blt_info.bltbdat) >> bshift; } blt_info.bltbhold = (blineb & 0x0001) ? 0xFFFF : 0; @@ -775,13 +774,24 @@ static void blitter_line_adat(void) static void blitter_line_proc_apt(void) { if (bltcon0 & BLTCHA) { - if (bltcon1 & BLTSIGN) + bool sign = (bltcon1 & BLTSIGN) != 0; + if (sign) bltapt += (uae_s16)blt_info.bltbmod; else bltapt += (uae_s16)blt_info.bltamod; } } +static void blitter_line_ovf(void) +{ + uae_u16 ashift = bltcon0 >> 12; + ashift += blit_ovf; + ashift &= 15; + bltcon0 &= 0x0fff; + bltcon0 |= ashift << 12; + blit_ovf = 0; +} + static void blitter_line_incx(void) { uae_u16 ashift = bltcon0 >> 12; @@ -800,16 +810,6 @@ static void blitter_line_decx(void) blit_ovf = -1; } -static void blitter_line_ovf(void) -{ - uae_u16 ashift = bltcon0 >> 12; - ashift += blit_ovf; - ashift &= 15; - bltcon0 &= 0x0fff; - bltcon0 |= ashift << 12; - blit_ovf = 0; -} - static void blitter_line_decy(void) { if (bltcon0 & BLTCHC) { @@ -828,7 +828,9 @@ static void blitter_line_incy(void) static void blitter_line_proc_cpt_y(void) { - if (!(bltcon1 & BLTSIGN)) { + bool sign = (bltcon1 & BLTSIGN) != 0; + + if (!sign) { if (bltcon1 & BLTSUD) { if (bltcon1 & BLTSUL) blitter_line_decy(); @@ -846,7 +848,9 @@ static void blitter_line_proc_cpt_y(void) static void blitter_line_proc_cpt_x(void) { - if (!(bltcon1 & BLTSIGN)) { + bool sign = (bltcon1 & BLTSIGN) != 0; + + if (!sign) { if (!(bltcon1 & BLTSUD)) { if (bltcon1 & BLTSUL) blitter_line_decx(); @@ -897,7 +901,6 @@ static void actually_do_blit (void) if (blitline) { do { blitter_line_proc_status(); - blitter_line_sign(); blitter_line_proc_apt(); if (blt_info.hblitsize > 1) { blitter_line_read_b(); @@ -906,7 +909,7 @@ static void actually_do_blit (void) blitter_line_proc_cpt_x(); } if (blt_info.hblitsize > 2) { - if (!(bltcon1 & BLTSUD) && blitlineloop) { + if (blitlineloop && !(bltcon1 & BLTSUD)) { blitter_line_proc_cpt_y(); blitlineloop = 0; } @@ -921,6 +924,7 @@ static void actually_do_blit (void) blitlineloop = 0; } } + blitter_line_sign(); blitter_nxline(); if (blitlinepixel) { blitter_line_write(); @@ -1606,7 +1610,6 @@ static bool decide_blitter_maybe_write2(int until_hpos, uaecptr addr, uae_u32 va written = decide_blitter_idle(hpos, until_hpos, addr, value); if (dat & BLITTER_PIPELINE_FIRST) { blitter_line_proc_status(); - blitter_line_sign(); blitter_line_proc_apt(); } @@ -1645,13 +1648,13 @@ static bool decide_blitter_maybe_write2(int until_hpos, uaecptr addr, uae_u32 va blitter_line_ovf(); if (blt_info.hblitsize == 1) { blitter_line_proc_status(); - blitter_line_sign(); } else { if (blitlineloop) { blitter_line_proc_cpt_y(); blitlineloop = 0; } } + blitter_line_sign(); blitter_nxline(); /* onedot mode and no pixel = bus write access is skipped */ @@ -1673,12 +1676,7 @@ static bool decide_blitter_maybe_write2(int until_hpos, uaecptr addr, uae_u32 va bltdpt = bltcpt; blitter_line_minterm(dat); -#if 0 - if (blt_info.hblitsize == 1) { - blitter_line_proc_cpt_x(); - blitter_line_proc_cpt_y(); - } -#endif + } else { // normal mode channels @@ -2233,6 +2231,10 @@ void blitter_reset (void) bltcon0 = 0; bltcon1 = 0; blitter_start_init(); + blt_info.blit_main = 0; + blt_info.blit_pending = 0; + blt_info.blit_finald = 0; + blt_info.blit_queued = 0; } #ifdef SAVESTATE