int log_blitter = 0;
#endif
+#define BLTCHA 0x800
+#define BLTCHB 0x400
+#define BLTCHC 0x200
+#define BLTCHD 0x100
+
#define BLTDOFF 0x80
-#define BLTSIGN 0x40
-#define BLTOVG 0x20
-#define BLTSING 0x02
+#define BLTEFE 0x10
+#define BLTIFE 0x08
+#define BLTFILL (BLTEFE | BLTIFE)
+#define BLTFC 0x04
#define BLTDESC 0x02
#define BLTLINE 0x01
+#define BLTSIGN 0x40
+#define BLTOVF 0x20
+#define BLTSUD 0x10
+#define BLTSUL 0x08
+#define BLTAUL 0x04
+#define BLTSING 0x02
+
+#define BLITTER_PIPELINE_BLIT 0x0008
+#define BLITTER_PIPELINE_ADDMOD 0x0010
+#define BLITTER_PIPELINE_LINE 0x0020
+#define BLITTER_PIPELINE_PROCESS 0x0200
+#define BLITTER_PIPELINE_FINISHED 0x0400
+#define BLITTER_PIPELINE_LASTD 0x1000
+#define BLITTER_PIPELINE_FIRST 0x2000
+#define BLITTER_PIPELINE_LAST 0x4000
+
/* we must not change ce-mode while blitter is running.. */
static int blitter_cycle_exact, immediate_blits;
static int blt_statefile_type;
uae_u32 bltptx;
int bltptxpos, bltptxc;
-static uae_u16 blinea, blineb;
+static uae_u16 blineb;
static int blitline, blitfc, blitfill, blitife, blitdesc, blit_ovf;
static bool blitfill_idle;
-static int blitline_started;
+static int blitline_started, blitlineloop;
static int blitonedot, blitlinepixel;
static int blit_add;
static int blit_modadda, blit_modaddb, blit_modaddc, blit_modaddd;
blt_info.bltamod & 0xffff, blt_info.bltbmod & 0xffff, blt_info.bltcmod & 0xffff, blt_info.bltdmod & 0xffff);
console_out_f(_T("PC=%08X DMA=%d\n"), m68k_getpc(), dmaen (DMA_BLITTER));
- if (((bltcon0 & 0x800) && bltapt >= chipsize) || ((bltcon0 & 0x400) && bltbpt >= chipsize) ||
- ((bltcon0 & 0x200) && bltcpt >= chipsize) || ((bltcon0 & 0x100) && bltdpt >= chipsize))
+ if (((bltcon0 & BLTCHA) && bltapt >= chipsize) || ((bltcon0 & BLTCHB) && bltbpt >= chipsize) ||
+ ((bltcon0 & BLTCHC) && bltcpt >= chipsize) || ((bltcon0 & BLTCHD) && bltdpt >= chipsize))
console_out_f(_T("PT outside of chipram\n"));
}
}
-STATIC_INLINE void chipmem_agnus_wput2 (uaecptr addr, uae_u32 w)
+static void blit_chipmem_agnus_wput(uaecptr addr, uae_u32 w, uae_u32 typemask)
{
if (!(log_blitter & 4)) {
if (!blit_dof) {
- debug_putpeekdma_chipram(addr, w, MW_MASK_BLITTER_D_N, 0x000, 0x054);
+ debug_putpeekdma_chipram(addr, w, typemask, 0x000, 0x054);
chipmem_wput_indirect(addr, w);
}
regs.chipset_latch_rw = w;
blit_masktable[0] = blt_info.bltafwm;
blit_masktable[blt_info.hblitsize - 1] &= blt_info.bltalwm;
- if (bltcon0 & 0x800) {
+ if (bltcon0 & BLTCHA) {
bltadatptr = bltapt;
bltapt += (blt_info.hblitsize * 2 + blt_info.bltamod) * blt_info.vblitsize;
}
- if (bltcon0 & 0x400) {
+ if (bltcon0 & BLTCHB) {
bltbdatptr = bltbpt;
bltbpt += (blt_info.hblitsize * 2 + blt_info.bltbmod) * blt_info.vblitsize;
}
- if (bltcon0 & 0x200) {
+ if (bltcon0 & BLTCHC) {
bltcdatptr = bltcpt;
bltcpt += (blt_info.hblitsize * 2 + blt_info.bltcmod) * blt_info.vblitsize;
}
- if (bltcon0 & 0x100) {
+ if (bltcon0 & BLTCHD) {
bltddatptr = bltdpt;
bltdpt += (blt_info.hblitsize * 2 + blt_info.bltdmod) * blt_info.vblitsize;
}
int dodst = 0;
for (j = 0; j < blt_info.vblitsize; j++) {
- blitfc = !!(bltcon1 & 0x4);
+ blitfc = !!(bltcon1 & BLTFC);
for (i = 0; i < blt_info.hblitsize; i++) {
uae_u32 bltadat, blitahold;
if (bltadatptr) {
bltcdatptr += 2;
}
if (dodst)
- chipmem_agnus_wput2 (dstp, blt_info.bltddat);
+ blit_chipmem_agnus_wput(dstp, blt_info.bltddat, MW_MASK_BLITTER_D_N);
blt_info.bltddat = blit_func (blitahold, blitbhold, blt_info.bltcdat, mt) & 0xFFFF;
if (blitfill) {
uae_u16 d = blt_info.bltddat;
bltddatptr += blt_info.bltdmod;
}
if (dodst)
- chipmem_agnus_wput2 (dstp, blt_info.bltddat);
+ blit_chipmem_agnus_wput(dstp, blt_info.bltddat, MW_MASK_BLITTER_D_N);
blt_info.bltbhold = blitbhold;
}
blit_masktable[0] = 0xFFFF;
blit_masktable[0] = blt_info.bltafwm;
blit_masktable[blt_info.hblitsize - 1] &= blt_info.bltalwm;
- if (bltcon0 & 0x800) {
+ if (bltcon0 & BLTCHA) {
bltadatptr = bltapt;
bltapt -= (blt_info.hblitsize * 2 + blt_info.bltamod) * blt_info.vblitsize;
}
- if (bltcon0 & 0x400) {
+ if (bltcon0 & BLTCHB) {
bltbdatptr = bltbpt;
bltbpt -= (blt_info.hblitsize * 2 + blt_info.bltbmod) * blt_info.vblitsize;
}
- if (bltcon0 & 0x200) {
+ if (bltcon0 & BLTCHC) {
bltcdatptr = bltcpt;
bltcpt -= (blt_info.hblitsize * 2 + blt_info.bltcmod) * blt_info.vblitsize;
}
- if (bltcon0 & 0x100) {
+ if (bltcon0 & BLTCHD) {
bltddatptr = bltdpt;
bltdpt -= (blt_info.hblitsize * 2 + blt_info.bltdmod) * blt_info.vblitsize;
}
int dodst = 0;
for (j = 0; j < blt_info.vblitsize; j++) {
- blitfc = !!(bltcon1 & 0x4);
+ blitfc = !!(bltcon1 & BLTFC);
for (i = 0; i < blt_info.hblitsize; i++) {
uae_u32 bltadat, blitahold;
if (bltadatptr) {
bltcdatptr -= 2;
}
if (dodst)
- chipmem_agnus_wput2 (dstp, blt_info.bltddat);
+ blit_chipmem_agnus_wput(dstp, blt_info.bltddat, MW_MASK_BLITTER_D_N);
blt_info.bltddat = blit_func (blitahold, blitbhold, blt_info.bltcdat, mt) & 0xFFFF;
if (blitfill) {
uae_u16 d = blt_info.bltddat;
bltddatptr -= blt_info.bltdmod;
}
if (dodst)
- chipmem_agnus_wput2 (dstp, blt_info.bltddat);
+ blit_chipmem_agnus_wput(dstp, blt_info.bltddat, MW_MASK_BLITTER_D_N);
blt_info.bltbhold = blitbhold;
}
blit_masktable[0] = 0xFFFF;
blt_info.blit_main = 0;
}
-static void blitter_line_read(void)
+static void blitter_line_read_b(void)
{
- if (bltcon0 & 0x400) {
+ if (bltcon0 & BLTCHB) {
// B (normally not enabled)
record_dma_blit(0x72, 0, bltbpt, last_blitter_hpos);
blt_info.bltbdat = chipmem_wget_indirect(bltbpt);
record_dma_blit_val(blt_info.bltbdat);
bltbpt += blt_info.bltbmod;
}
- if (bltcon0 & 0x200) {
+}
+static void blitter_line_read_c(void)
+{
+ if (bltcon0 & BLTCHC) {
// C
record_dma_blit(0x70, 0, bltcpt, last_blitter_hpos);
blt_info.bltcdat = chipmem_wget_indirect(bltcpt);
static void blitter_line_write(void)
{
/* D-channel state has no effect on linedraw, but C must be enabled or nothing is drawn! */
- if (bltcon0 & 0x200) {
- chipmem_wput_indirect(bltdpt, blt_info.bltddat);
- regs.chipset_latch_rw = blt_info.bltddat;
+ if (bltcon0 & BLTCHC) {
+ blit_chipmem_agnus_wput(bltdpt, blt_info.bltddat, MW_MASK_BLITTER_D_L);
+ }
+}
+
+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;
+ }
+
+ uae_u16 blitahold = (blt_info.bltadat & mask) >> ashift;
+
+ if (bltcon0 & BLTCHB) {
+ // B special case if enabled
+ blineb = (((uae_u32)blt_info.bltbold << 16) | blt_info.bltbdat) >> bshift;
+ }
+ blt_info.bltbhold = (blineb & 0x0001) ? 0xFFFF : 0;
+ blt_info.bltddat = blit_func(blitahold, blt_info.bltbhold, blt_info.bltcdat, bltcon0 & 0xFF);
+
+ if (blt_info.bltddat) {
+ blt_info.blitzero = 0;
+ }
+}
+
+static void blitter_line_minterm_extra(void)
+{
+ int ashift = bltcon0 >> 12;
+ // never first or last, no masking needed.
+ uae_u16 blitahold = blt_info.bltadat >> ashift;
+
+ blt_info.bltddat = blit_func(blitahold, blt_info.bltbhold, blt_info.bltcdat, bltcon0 & 0xFF);
+}
+
+static void blitter_line_adat(void)
+{
+ int ashift = bltcon0 >> 12;
+
+ blt_info.bltaold = (((uae_u32)blt_info.bltaold << 16) | (blt_info.bltadat & blt_info.bltafwm)) >> ashift;
+}
+
+static void blitter_line_proc_apt(void)
+{
+ if (bltcon0 & BLTCHA) {
+ if (bltcon1 & BLTSIGN)
+ bltapt += (uae_s16)blt_info.bltbmod;
+ else
+ bltapt += (uae_s16)blt_info.bltamod;
}
}
static void blitter_line_incx(void)
{
uae_u16 ashift = bltcon0 >> 12;
- if (++ashift == 16) {
- ashift = 0;
+ if (ashift == 15) {
bltcpt += 2;
}
- bltcon0 &= 0x0fff;
- bltcon0 |= ashift << 12;
+ blit_ovf = 1;
}
static void blitter_line_decx(void)
{
uae_u16 ashift = bltcon0 >> 12;
- if (ashift-- == 0) {
- ashift = 15;
+ if (ashift == 0) {
bltcpt -= 2;
}
+ 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 & 0x0200) {
+ if (bltcon0 & BLTCHC) {
bltcpt -= blt_info.bltcmod;
+ blitonedot = 0;
}
- blitonedot = 0;
}
static void blitter_line_incy(void)
{
- if (bltcon0 & 0x0200) {
+ if (bltcon0 & BLTCHC) {
bltcpt += blt_info.bltcmod;
+ blitonedot = 0;
}
- blitonedot = 0;
}
-static void blitter_line(void)
+static void blitter_line_proc_cpt_y(void)
{
- int ashift = bltcon0 >> 12;
- int bshift = bltcon1 >> 12;
- uae_u16 blitahold = (blinea & blt_info.bltafwm) >> ashift;
- uae_u16 blitchold = blt_info.bltcdat;
-
- if (bltcon0 & 0x400) {
- // B special case if enabled
- blineb = (((uae_u32)blt_info.bltbold << 16) | blt_info.bltbdat) >> bshift;
+ if (!(bltcon1 & BLTSIGN)) {
+ if (bltcon1 & BLTSUD) {
+ if (bltcon1 & BLTSUL)
+ blitter_line_decy();
+ else
+ blitter_line_incy();
+ }
+ }
+ if (!(bltcon1 & BLTSUD)) {
+ if (bltcon1 & BLTAUL)
+ blitter_line_decy();
+ else
+ blitter_line_incy();
}
- blt_info.bltbhold = (blineb & 0x0001) ? 0xFFFF : 0;
- blitlinepixel = !(bltcon1 & BLTSING) || ((bltcon1 & BLTSING) && !blitonedot);
- blt_info.bltddat = blit_func(blitahold, blt_info.bltbhold, blitchold, bltcon0 & 0xFF);
- blitonedot++;
-
- blt_info.bltaold = (((uae_u32)blt_info.bltaold << 16) | (blinea & blt_info.bltafwm)) >> ashift;
}
-static void blitter_line_proc (void)
+static void blitter_line_proc_cpt_x(void)
{
if (!(bltcon1 & BLTSIGN)) {
- if (bltcon1 & 0x10) {
- if (bltcon1 & 0x8)
- blitter_line_decy();
- else
- blitter_line_incy();
- } else {
- if (bltcon1 & 0x8)
+ if (!(bltcon1 & BLTSUD)) {
+ if (bltcon1 & BLTSUL)
blitter_line_decx();
else
blitter_line_incx();
}
}
- if (bltcon1 & 0x10) {
- if (bltcon1 & 0x4)
+ if (bltcon1 & BLTSUD) {
+ if (bltcon1 & BLTAUL)
blitter_line_decx();
else
blitter_line_incx();
- } else {
- if (bltcon1 & 0x4)
- blitter_line_decy();
- else
- blitter_line_incy();
}
+}
- if (bltcon0 & 0x800) {
- if (bltcon1 & BLTSIGN)
- bltapt += (uae_s16)blt_info.bltbmod;
- else
- bltapt += (uae_s16)blt_info.bltamod;
- }
+static void blitter_line_proc_status(void)
+{
+ blitlinepixel = !(bltcon1 & BLTSING) || ((bltcon1 & BLTSING) && !blitonedot);
+ blitonedot = 1;
+}
- bool blitsign = 0 > (uae_s16)bltapt;
+static void blitter_line_sign(void)
+{
+ bool blitsign = (uae_s16)bltapt < 0;
if (blitsign) {
bltcon1 |= BLTSIGN;
} else {
bltcon1 &= ~BLTSIGN;
}
-
- if (blt_info.bltddat)
- blt_info.blitzero = 0;
}
-static void blitter_nxline (void)
+static void blitter_nxline(void)
{
int bshift = bltcon1 >> 12;
{
if (blitline) {
do {
- blitter_line_read();
- blitter_line();
- blitter_line_proc();
+ blitter_line_proc_status();
+ blitter_line_sign();
+ blitter_line_proc_apt();
+ if (blt_info.hblitsize > 1) {
+ blitter_line_read_b();
+ blitter_line_read_c();
+ blitter_line_minterm(BLITTER_PIPELINE_FIRST);
+ blitter_line_proc_cpt_x();
+ }
+ if (blt_info.hblitsize > 2) {
+ if (!(bltcon1 & BLTSUD) && blitlineloop) {
+ blitter_line_proc_cpt_y();
+ blitlineloop = 0;
+ }
+ blitter_line_read_c();
+ blitter_line_minterm_extra();
+ }
+ blitter_line_adat();
+ blitter_line_ovf();
+ if (blt_info.hblitsize >= 2) {
+ if (blitlineloop) {
+ blitter_line_proc_cpt_y();
+ blitlineloop = 0;
+ }
+ }
blitter_nxline();
- blt_info.vblitsize--;
if (blitlinepixel) {
blitter_line_write();
blitlinepixel = 0;
}
bltdpt = bltcpt;
+ blitter_line_minterm(BLITTER_PIPELINE_FIRST | BLITTER_PIPELINE_LAST);
+ blitlineloop = 1;
+ blt_info.vblitsize--;
} while (blt_info.vblitsize != 0);
} else {
if (blitdesc)
static void blitter_doit (int hpos)
{
- if (blt_info.vblitsize == 0 || (blitline && blt_info.hblitsize != 2)) {
+ if (blt_info.vblitsize == 0) {
blitter_done_all(hpos);
return;
}
uae_u16 con0_old = bltcon0_old;
if (con & 2) {
- blitdesc = bltcon1 & 2;
+ blitdesc = bltcon1 & BLTDESC;
if (!savestate_state && blit_warned > 0) {
- if ((bltcon1 & 1) && !blitline_started) {
+ if ((bltcon1 & BLTLINE) && !blitline_started) {
write_log(_T("BLITTER: linedraw enabled when blitter is active! %08x\n"), M68K_GETPC);
blit_warned--;
//activate_debugger();
- } else if (!(bltcon1 & 1) && blitline_started) {
+ } else if (!(bltcon1 & BLTLINE) && blitline_started) {
write_log(_T("BLITTER: linedraw disabled when blitter is active! %08x\n"), M68K_GETPC);
blit_warned--;
//activate_debugger();
}
- if ((bltcon1 & 0x18) && !(bltcon1_old & 0x18)) {
+ if ((bltcon1 & BLTFILL) && !(bltcon1_old & BLTFILL)) {
write_log(_T("BLITTER: fill enabled when blitter is active! %08x\n"), M68K_GETPC);
blit_warned--;
//activate_debugger();
- } else if (!(bltcon1 & 0x18) && (bltcon1_old & 0x18)) {
+ } else if (!(bltcon1 & BLTFILL) && (bltcon1_old & BLTFILL)) {
write_log(_T("BLITTER: fill disabled when blitter is active! %08x\n"), M68K_GETPC);
blit_warned--;
//activate_debugger();
}
blit_ch = (bltcon0 & 0x0f00) >> 8;
- blitline = bltcon1 & 1;
- blit_ovf = (bltcon1 & 0x20) != 0;
+ blitline = bltcon1 & BLTLINE;
+ blit_ovf = (bltcon1 & BLTOVF) != 0;
blitfill_idle = false;
- shifter_skip_b = (bltcon0 & 0x400) == 0;
+ shifter_skip_b = (bltcon0 & BLTCHB) == 0;
if (blitline) {
shifter_skip_y = true;
blitfill = 0;
shifter_out = shifter_skip_y ? shifter[2] : shifter[3];
} else {
int oldfill = blitfill;
- blitfill = (bltcon1 & 0x18) != 0;
- blitfc = !!(bltcon1 & 0x4);
- blitife = !!(bltcon1 & 0x8);
- if ((bltcon1 & 0x18) == 0x18) {
+ blitfill = (bltcon1 & BLTFILL) != 0;
+ blitfc = !!(bltcon1 & BLTFC);
+ blitife = !!(bltcon1 & BLTIFE);
+ if ((bltcon1 & BLTFILL) == BLTFILL) {
debugtest(DEBUGTEST_BLITTER, _T("weird fill mode\n"));
blitife = 0;
}
}
}
- shifter_skip_y = (bltcon0 & (0x100 | 0x200)) != 0x300;
+ shifter_skip_y = (bltcon0 & (BLTCHD | BLTCHC)) != 0x300;
// fill mode idle cycle needed? (D enabled but C not enabled)
- if (blitfill && (bltcon0 & (0x100 | 0x200)) == 0x100) {
+ if (blitfill && (bltcon0 & (BLTCHD | BLTCHC)) == 0x100) {
shifter_skip_y = false;
blitfill_idle = true;
}
}
blit_cyclecount = 4 - (shifter_skip_b + shifter_skip_y);
- blit_dmacount = ((bltcon0 & 0x800) ? 1 : 0) + ((bltcon0 & 0x400) ? 1 : 0) +
- ((bltcon0 & 0x200) ? 1 : 0) + (((bltcon0 & 0x100) && !blitline) ? 1 : 0);
+ blit_dmacount = ((bltcon0 & BLTCHA) ? 1 : 0) + ((bltcon0 & BLTCHB) ? 1 : 0) +
+ ((bltcon0 & BLTCHC) ? 1 : 0) + (((bltcon0 & BLTCHD) && !blitline) ? 1 : 0);
if (blt_info.blit_main || blt_info.blit_pending) {
blitfill_c = blitfill;
}
blit_dof = 0;
- if ((bltcon1 & 0x80) && ecs_agnus) {
+ if ((bltcon1 & BLTDOFF) && ecs_agnus) {
blit_dof = 1;
debugtest(DEBUGTEST_BLITTER, _T("ECS BLTCON1 DOFF-bit set\n"));
if (log_blitter & 16)
}
-#define BLITTER_PIPELINE_BLIT 0x0008
-#define BLITTER_PIPELINE_ADDMOD 0x0010
-#define BLITTER_PIPELINE_LINE 0x0020
-#define BLITTER_PIPELINE_PROCESS 0x0200
-#define BLITTER_PIPELINE_FINISHED 0x0400
-#define BLITTER_PIPELINE_LASTD 0x1000
-#define BLITTER_PIPELINE_FIRST 0x2000
-#define BLITTER_PIPELINE_LAST 0x4000
-
static int get_current_channel(void)
{
if (blit_cyclecounter < 0) {
// A or idle
if (blitter_hcounter + 1 == blt_info.hblitsize)
return 5;
- if (bltcon0 & 0x800)
+ if (bltcon0 & BLTCHA)
return 1;
return 0;
}
// B
- if (shifter[1] && (bltcon0 & 0x400)) {
+ if (shifter[1] && (bltcon0 & BLTCHB)) {
return 2;
}
// C or D
if (shifter[2]) {
// enabled C
- if (bltcon0 & 0x200) {
+ if (bltcon0 & BLTCHC) {
if (blitter_hcounter + 1 == blt_info.hblitsize)
return 4;
return 3;
} else {
// order is important when multiple bits in shift register
// C
- if (shifter[2] && (bltcon0 & 0x200)) {
+ if (shifter[2] && (bltcon0 & BLTCHC)) {
return 3;
}
// Shift stage 4 active, C enabled and other stage(s) also active:
// normally would be D but becomes C.
- if (shifter[3] && (bltcon0 & 0x200) && (shifter[0] || shifter[1])) {
+ if (shifter[3] && (bltcon0 & BLTCHC) && (shifter[0] || shifter[1])) {
return 3;
}
// A
- if (shifter[0] && (bltcon0 & 0x800)) {
+ if (shifter[0] && (bltcon0 & BLTCHA)) {
return 1;
}
// B
- if (shifter[1] && (bltcon0 & 0x400)) {
+ if (shifter[1] && (bltcon0 & BLTCHB)) {
return 2;
}
// D is disabled if position A is non-zero, even if A is disabled.
return 0;
}
// if stage 3: D
- if (shifter[2] && (bltcon0 & 0x100)) {
+ if (shifter[2] && (bltcon0 & BLTCHD)) {
return 4;
}
} else {
// if stage 3 and C disabled and D enabled: D
- if (shifter[2] && !(bltcon0 & 0x200) && (bltcon0 & 0x100)) {
+ if (shifter[2] && !(bltcon0 & BLTCHC) && (bltcon0 & BLTCHD)) {
return 4;
}
// if stage 4 and C enabled and D enabled: D
- if (shifter[3] && (bltcon0 & 0x200) && (bltcon0 & 0x100)) {
+ if (shifter[3] && (bltcon0 & BLTCHC) && (bltcon0 & BLTCHD)) {
return 4;
}
}
if (shifter_out) {
dodat = true;
if (!blitline) {
- if (bltcon0 & 0x100) {
+ if (bltcon0 & BLTCHD) {
ddat1use = true;
}
}
blit_cyclecounter = CYCLECOUNT_FINISHED;
if (!blitline) {
// do we need final D write?
- if (ddat1use && (bltcon0 & 0x0100)) {
+ if (ddat1use && (bltcon0 & BLTCHD)) {
if (blt_info.blit_finald) {
write_log(_T("blit finald already set!?\n"));
}
if (shifter_first > 0) {
shifter_first = -1;
shifter[0] = true;
- blitfc = !!(bltcon1 & 0x4);
+ blitfc = !!(bltcon1 & BLTFC);
} else {
if (shifter_skip_b) {
shifter[2] = tmp[0];
check_channel_mods(hpos, 4, &bltdpt);
record_dma_blit(0x00, ddat1, bltdpt, hpos);
- chipmem_agnus_wput2(bltdpt, ddat1);
+ blit_chipmem_agnus_wput(bltdpt, ddat1, MW_MASK_BLITTER_D_N);
alloc_cycle_blitter(hpos, &bltdpt, 4);
if (!blitline) {
} else if (c == 1 && line) { // line 1/4 (A, free)
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();
+ }
} else if (c == 3 && line) { // line 2/4 (C)
+ if (!(dat & BLITTER_PIPELINE_FIRST) && blitlineloop && !(bltcon1 & BLTSUD)) {
+ blitter_line_proc_cpt_y();
+ blitlineloop = 0;
+ }
+
record_dma_blit(0x70, 0, bltcpt, hpos);
check_channel_mods(hpos, 3, &bltcpt);
blt_info.bltcdat = chipmem_wget_indirect(bltcpt);
record_dma_blit_val(blt_info.bltcdat);
alloc_cycle_blitter(hpos, &bltcpt, 3);
- } else if (c == 5 && line) { // line 3/4 (free)
+ if (dat & BLITTER_PIPELINE_FIRST) {
+ blitter_line_minterm(dat);
+ blitter_line_proc_cpt_x();
+ } else {
+ // W>2 special case
+ blitter_line_minterm_extra();
+ }
- blitter_line();
+ } else if (c == 5 && line) { // line 3/4 (free)
written = decide_blitter_idle(hpos, until_hpos, addr, value);
- } else if ((c == 4 || c == 6) && line) { // line 4/4 (D)
+ } else if ((c == 4 || c == 6) && line) { // line 4/4 (C/D)
- blitter_line_proc();
+ blitter_line_adat();
+ 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_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;
+ blit_chipmem_agnus_wput(bltdpt, blt_info.bltddat, MW_MASK_BLITTER_D_L);
alloc_cycle_blitter(hpos, &bltdpt, 4);
} else {
markidlecycle(hpos);
}
blitlinepixel = 0;
+ blitlineloop = 1;
bltdpt = bltcpt;
+ blitter_line_minterm(dat);
+
} else {
// normal mode channels
if ((dat & BLITTER_PIPELINE_BLIT) && !blitline) {
ddat1 = blitter_doblit(dat);
+ blt_info.bltddat = ddat1;
}
if (dat & BLITTER_PIPELINE_PROCESS) {
- blitfc = !!(bltcon1 & 0x4);
+ blitfc = !!(bltcon1 & BLTFC);
}
break;
}
if (blt_info.blit_finald == 1) {
// final D write. Only if BLTCON D and line mode is off.
- if ((bltcon0 & 0x0100) && !(bltcon1 & 1)) {
+ if ((bltcon0 & BLTCHD) && !(bltcon1 & BLTLINE)) {
int offset = get_rga_pipeline(hpos, RGA_PIPELINE_OFFSET_BLITTER);
cycle_line_pipe[offset] = CYCLE_PIPE_BLITTER;
blitter_pipe[offset] = CYCLE_PIPE_BLITTER | 4 | BLITTER_PIPELINE_ADDMOD | BLITTER_PIPELINE_LASTD;
blt_info.blit_queued = 0;
blit_faulty = 0;
blt_info.blitzero = 1;
- blitline_started = bltcon1 & 1;
+ blitline_started = bltcon1 & BLTLINE;
+ blitlineloop = 1;
blit_bltset (1 | 2);
shifter_skip_b_old = shifter_skip_b;
blt_info.bltbold = 0;
int bshift = bltcon1 >> 12;
- blinea = blt_info.bltadat;
blineb = (blt_info.bltbdat >> bshift) | (blt_info.bltbdat << (16 - bshift));
blitonedot = 0;
blitlinepixel = 0;
return;
}
- if (blt_info.vblitsize == 0 || (blitline && blt_info.hblitsize != 2)) {
+ if (blt_info.vblitsize == 0) {
if (dmaen(DMA_BLITTER)) {
blitter_done_all(-1);
}
blitline = restore_u8();
blitfill = restore_u8();
- blinea = restore_u16();
+ restore_u16(); //blinea = restore_u16();
blineb = restore_u16();
restore_u8();
blitonedot = restore_u8();
save_u8(blitline);
save_u8(blitfill);
- save_u16(blinea);
+ save_u16(blt_info.bltadat);
save_u16(blineb);
save_u8(bltcon0 >> 12);
save_u8(blitonedot);