]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Blitter cycle accuracy fix, line mode special case fix.
authorToni Wilen <twilen@winuae.net>
Sun, 24 Jul 2022 17:47:44 +0000 (20:47 +0300)
committerToni Wilen <twilen@winuae.net>
Sun, 24 Jul 2022 17:47:44 +0000 (20:47 +0300)
blitter.cpp
include/blitter.h

index 665036f4156809e14295b270a38d5af2f388e78e..0d06c699d1c934cb19c76132b80069ce71f3a11d 100644 (file)
@@ -112,7 +112,7 @@ static uae_u16 debug_bltadat, debug_bltbdat, debug_bltcdat;
 #define BLITTER_MAX_PIPELINED_CYCLES 4
 
 #define CYCLECOUNT_FINISHED -1000
-#define CYCLECOUNT_START 4
+#define CYCLECOUNT_START 3
 
 /*
 Blitter Idle Cycle:
@@ -412,7 +412,7 @@ static void blitter_interrupt(void)
                return;
        }
        blt_info.blit_interrupt = 1;
-       send_interrupt(6, (4 + 1) * CYCLE_UNIT);
+       send_interrupt(6, 3 * CYCLE_UNIT);
        if (debug_dma) {
                record_dma_event(DMA_EVENT_BLITIRQ, current_hpos(), vpos);
        }
@@ -818,21 +818,16 @@ static void actually_do_blit (void)
        if (blitline) {
                do {
                        blitter_line_read();
-                       if (ddat1use) {
-                               bltdpt = bltcpt;
-                       }
-                       ddat1use = 1;
                        blitter_line();
                        blitter_line_proc();
                        blitter_nxline();
                        blt_info.vblitsize--;
                        if (blitlinepixel) {
-                               record_dma_blit(0x00, blt_info.bltddat, bltdpt, last_blitter_hpos);
                                blitter_line_write();
                                blitlinepixel = 0;
                        }
+                       bltdpt = bltcpt;
                } while (blt_info.vblitsize != 0);
-               bltdpt = bltcpt;
        } else {
                if (blitdesc)
                        blitter_dofast_desc();
@@ -1468,6 +1463,7 @@ static bool decide_blitter_maybe_write2(int until_hpos, uaecptr addr, uae_u32 va
                        } else if (c == 3 && line) { // line 2/4 (C)
 
                                record_dma_blit(0x70, 0, bltcpt, hpos);
+                               check_channel_mods(hpos, 3, &bltcpt);
                                blt_info.bltcdat = chipmem_wget_indirect(bltcpt);
                                regs.chipset_latch_rw = blt_info.bltcdat;
                                record_dma_blit_val(blt_info.bltcdat);
@@ -1481,17 +1477,13 @@ static bool decide_blitter_maybe_write2(int until_hpos, uaecptr addr, uae_u32 va
 
                        } else if ((c == 4 || c == 6) && line) { // line 4/4 (D)
 
-                               if (ddat2use) {
-                                       bltdpt = bltcpt;
-                               }
-                               ddat2use = 1;
-
                                blitter_line_proc();
                                blitter_nxline();
 
                                /* onedot mode and no pixel = bus write access is skipped */
                                if (blitlinepixel && c == 4) {
                                        record_dma_blit(0x00, blt_info.bltddat, bltdpt, hpos);
+                                       check_channel_mods(hpos, 4, &bltdpt);
                                        chipmem_wput_indirect(bltdpt, blt_info.bltddat);
                                        regs.chipset_latch_rw = blt_info.bltddat;
                                        alloc_cycle_blitter(hpos, &bltdpt, 4);
@@ -1531,13 +1523,6 @@ static bool decide_blitter_maybe_write2(int until_hpos, uaecptr addr, uae_u32 va
 
                        // cycle allocations
                        for (;;) {
-                               // copper bltsize write needs one cycle (any cycle) delay
-                               // does not need free bus
-                               if (blit_waitcyclecounter > 0) {
-                                       blit_waitcyclecounter--;
-                                       markidlecycle(hpos);
-                                       break;
-                               }
 
                                // final D idle cycle
                                // does not need free bus
@@ -1545,6 +1530,12 @@ static bool decide_blitter_maybe_write2(int until_hpos, uaecptr addr, uae_u32 va
                                        blt_info.blit_finald--;
                                }
 
+                               // Skip BLTSIZE write cycle
+                               if (blit_waitcyclecounter) {
+                                       blit_waitcyclecounter = 0;
+                                       break;
+                               }
+
                                bool cant = blitter_cant_access(hpos);
                                if (cant) {
                                        blit_misscyclecounter++;
@@ -1880,9 +1871,7 @@ void do_blitter(int hpos, int copper, uaecptr pc)
                        blitter_hcounter = 0;
                        blitter_vcounter = 0;
                        blit_cyclecounter = -CYCLECOUNT_START;
-                       if (!copper) {
-                               blit_cyclecounter++;
-                       }
+                       blit_waitcyclecounter = 1;
                        blit_maxcyclecounter = blt_info.hblitsize * blt_info.vblitsize + 2;
                        blt_info.blit_pending = 0;
                        blt_info.blit_main = 1;
index eea3aefd088d2e8eb1a80cab5c5f57a9e57ad1dd..c34a011358b4cfe74354fd19c0436cf2f4ed1908 100644 (file)
@@ -50,7 +50,6 @@ extern void blitter_slowdown(int, int, int, int);
 extern void blitter_check_start(void);
 extern void blitter_reset(void);
 extern void blitter_debugdump(void);
-extern bool blit_steal_cycle(int hpos);
 extern void restore_blitter_start(void);
 
 extern uae_u16 blitter_pipe[256];