static int blit_cyclecounter, blit_waitcyclecounter;
static int blit_maxcyclecounter, blit_slowdown, blit_totalcyclecounter;
static int blit_misscyclecounter;
-static int blit_copperstarted;
#ifdef CPUEMU_13
static int blitter_cyclecounter;
#define BLITTER_MAX_PIPELINED_CYCLES 4
#define CYCLECOUNT_FINISHED -1000
-#define CYCLECOUNT_START 3
+#define CYCLECOUNT_START 4
/*
Blitter Idle Cycle:
if (dmaen(DMA_BLITTER)) {
blitter_doit(last_blitter_hpos);
}
- goto end;
+ goto end2;
}
if (log_blitter && blitter_delayed_debug) {
}
if (!blitter_cycle_exact) {
- goto end;
+ goto end2;
}
while (last_blitter_hpos < until_hpos) {
last_blitter_hpos++;
bltptxpos = -1;
}
-
-end:
+end2:
bltptxpos = -1;
+end:
if (hsync) {
last_blitter_hpos = 0;
}
blit_maxcyclecounter = 0x7fffffff;
blit_waitcyclecounter = 0;
+ last_blitter_hpos = hpos;
if (blitter_cycle_exact) {
if (immediate_blits) {
blitter_hcounter = 0;
blitter_vcounter = 0;
blit_cyclecounter = -CYCLECOUNT_START;
- blit_copperstarted = copper;
- if (copper) {
- blit_waitcyclecounter = 0;
- } else {
- blit_waitcyclecounter = 0;
+ if (!copper) {
+ blit_cyclecounter++;
}
blit_maxcyclecounter = blt_info.hblitsize * blt_info.vblitsize + 2;
blt_info.blit_pending = 0;
blt_info.bltalwm = v;
reset_blit(0);
}
+static void setblitx(int hpos, int n)
+{
+ bltptxpos = (hpos + 1) % maxhpos;
+ bltptxc = copper_access ? n : -n;
+}
static void BLTAPTH(int hpos, uae_u16 v)
{
maybe_blit(hpos, 0);
bltptx = bltapt;
- bltptxpos = hpos;
- bltptxc = copper_access ? 1 : -1;
+ setblitx(hpos, 1);
bltapt = (bltapt & 0xffff) | ((uae_u32)v << 16);
}
static void BLTAPTL(int hpos, uae_u16 v)
{
maybe_blit(hpos, 0);
bltptx = bltapt;
- bltptxpos = hpos;
- bltptxc = copper_access ? 1 : -1;
+ setblitx(hpos, 1);
bltapt = (bltapt & ~0xffff) | (v & 0xFFFE);
}
static void BLTBPTH(int hpos, uae_u16 v)
{
maybe_blit(hpos, 0);
bltptx = bltbpt;
- bltptxpos = hpos;
- bltptxc = copper_access ? 2 : -2;
+ setblitx(hpos, 2);
bltbpt = (bltbpt & ~0xffff) | (v & 0xFFFE);
}
static void BLTCPTH(int hpos, uae_u16 v)
{
maybe_blit(hpos, 0);
bltptx = bltcpt;
- bltptxpos = hpos;
- bltptxc = copper_access ? 3 : -3;
+ setblitx(hpos, 3);
bltcpt = (bltcpt & 0xffff) | ((uae_u32)v << 16);
}
static void BLTCPTL(int hpos, uae_u16 v)
{
maybe_blit(hpos, 0);
bltptx = bltcpt;
- bltptxpos = hpos;
- bltptxc = copper_access ? 3 : -3;
+ setblitx(hpos, 3);
bltcpt = (bltcpt & ~0xffff) | (v & 0xFFFE);
}
static void BLTDPTH (int hpos, uae_u16 v)
write_log("Possible Copper Blitter wait bug detected COP=%08x\n", cop_state.ip);
}
}
-
bltptx = bltdpt;
- bltptxpos = hpos;
- bltptxc = copper_access ? 4 : -4;
+ setblitx(hpos, 4);
bltdpt = (bltdpt & 0xffff) | ((uae_u32)v << 16);
}
static void BLTDPTL(int hpos, uae_u16 v)
}
bltptx = bltdpt;
- bltptxpos = hpos;
- bltptxc = copper_access ? 4 : -4;
+ setblitx(hpos, 4);
bltdpt = (bltdpt & ~0xffff) | (v & 0xFFFE);
}
decide_fetch_ce(hpos_next);
int bpldma = bitplane_dma_access(hpos_old, 0);
if (blt_info.blit_queued) {
-#if 0
+#if 1
decide_blitter(hpos_next);
#else
// CPU write must be done at the same time with blitter idle cycles