]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Reset blitter fully, linemode sign-bit fix.
authorToni Wilen <twilen@winuae.net>
Fri, 19 May 2023 18:54:50 +0000 (21:54 +0300)
committerToni Wilen <twilen@winuae.net>
Fri, 19 May 2023 18:54:50 +0000 (21:54 +0300)
blitter.cpp

index d4ea3fd9fbf51dfe824ce8febe360971e8e90fdd..fca77c1e10f8c691fac035c5b086b445d3169684 100644 (file)
@@ -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