int log_blitter = 0;
#endif
+#define BLTDOFF 0x80
+#define BLTSIGN 0x40
+#define BLTOVG 0x20
+#define BLTSING 0x02
+#define BLTDESC 0x02
+#define BLTLINE 0x01
+
/* 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 int blinea_shift;
static uae_u16 blinea, blineb;
-static int blitline, blitfc, blitfill, blitife, blitsing, blitdesc, blit_ovf;
+static int blitline, blitfc, blitfill, blitife, blitdesc, blit_ovf;
static bool blitfill_idle;
static int blitline_started;
-static int blitonedot, blitsign, blitlinepixel;
+static int blitonedot, blitlinepixel;
static int blit_add;
static int blit_modadda, blit_modaddb, blit_modaddc, blit_modaddd;
static int blit_ch;
int i,j;
uaecptr bltadatptr = 0, bltbdatptr = 0, bltcdatptr = 0, bltddatptr = 0;
uae_u8 mt = bltcon0 & 0xFF;
+ uae_u16 ashift = bltcon0 >> 12;
+ uae_u16 bshift = bltcon1 >> 12;
blit_masktable[0] = blt_info.bltafwm;
blit_masktable[blt_info.hblitsize - 1] &= blt_info.bltalwm;
#endif
{
uae_u32 blitbhold = blt_info.bltbhold;
+ int ashift = bltcon0 >> 12;
+ int bshift = bltcon1 >> 12;
uaecptr dstp = 0;
int dodst = 0;
} else
bltadat = blt_info.bltadat;
bltadat &= blit_masktable[i];
- blitahold = (((uae_u32)blt_info.bltaold << 16) | bltadat) >> blt_info.blitashift;
+ blitahold = (((uae_u32)blt_info.bltaold << 16) | bltadat) >> ashift;
blt_info.bltaold = bltadat;
if (bltbdatptr) {
uae_u16 bltbdat = chipmem_wget_indirect (bltbdatptr);
bltbdatptr += 2;
- blitbhold = (((uae_u32)blt_info.bltbold << 16) | bltbdat) >> blt_info.blitbshift;
+ blitbhold = (((uae_u32)blt_info.bltbold << 16) | bltbdat) >> bshift;
blt_info.bltbold = bltbdat;
blt_info.bltbdat = bltbdat;
}
int i,j;
uaecptr bltadatptr = 0, bltbdatptr = 0, bltcdatptr = 0, bltddatptr = 0;
uae_u8 mt = bltcon0 & 0xFF;
+ uae_u16 ashift = 16 - (bltcon0 >> 12);
+ uae_u16 bshift = 16 - (bltcon1 >> 12);
blit_masktable[0] = blt_info.bltafwm;
blit_masktable[blt_info.hblitsize - 1] &= blt_info.bltalwm;
} else
bltadat = blt_info.bltadat;
bltadat &= blit_masktable[i];
- blitahold = (((uae_u32)bltadat << 16) | blt_info.bltaold) >> blt_info.blitdownashift;
+ blitahold = (((uae_u32)bltadat << 16) | blt_info.bltaold) >> ashift;
blt_info.bltaold = bltadat;
if (bltbdatptr) {
uae_u16 bltbdat = chipmem_wget_indirect (bltbdatptr);
bltbdatptr -= 2;
- blitbhold = (((uae_u32)bltbdat << 16) | blt_info.bltbold) >> blt_info.blitdownbshift;
+ blitbhold = (((uae_u32)bltbdat << 16) | blt_info.bltbold) >> bshift;
blt_info.bltbold = bltbdat;
blt_info.bltbdat = bltbdat;
}
static void blitter_line_write(void)
{
- if (blt_info.bltddat)
- blt_info.blitzero = 0;
/* 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);
static void blitter_line_incx(void)
{
- if (++blinea_shift == 16) {
- blinea_shift = 0;
+ uae_u16 ashift = bltcon0 >> 12;
+ if (++ashift == 16) {
+ ashift = 0;
bltcpt += 2;
}
+ bltcon0 &= 0x0fff;
+ bltcon0 |= ashift << 12;
}
static void blitter_line_decx(void)
{
- if (blinea_shift-- == 0) {
- blinea_shift = 15;
+ uae_u16 ashift = bltcon0 >> 12;
+ if (ashift-- == 0) {
+ ashift = 15;
bltcpt -= 2;
}
+ bltcon0 &= 0x0fff;
+ bltcon0 |= ashift << 12;
}
static void blitter_line_decy(void)
static void blitter_line(void)
{
- uae_u16 blitahold = (blinea & blt_info.bltafwm) >> blinea_shift;
+ 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 = (blt_info.bltbdat >> blt_info.blitbshift) | (blt_info.bltbdat << (16 - blt_info.blitbshift));
+ blineb = (((uae_u32)blt_info.bltbold << 16) | blt_info.bltbdat) >> bshift;
}
- blt_info.bltbhold = (blineb & 1) ? 0xFFFF : 0;
- blitlinepixel = !blitsing || (blitsing && !blitonedot);
+ 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)
{
- if (!blitsign) {
+ if (!(bltcon1 & BLTSIGN)) {
if (bltcon1 & 0x10) {
if (bltcon1 & 0x8)
blitter_line_decy();
}
if (bltcon0 & 0x800) {
- if (blitsign)
+ if (bltcon1 & BLTSIGN)
bltapt += (uae_s16)blt_info.bltbmod;
else
bltapt += (uae_s16)blt_info.bltamod;
}
- blitsign = 0 > (uae_s16)bltapt;
+
+ bool blitsign = 0 > (uae_s16)bltapt;
+ if (blitsign) {
+ bltcon1 |= BLTSIGN;
+ } else {
+ bltcon1 &= ~BLTSIGN;
+ }
+
+ if (blt_info.bltddat)
+ blt_info.blitzero = 0;
}
static void blitter_nxline (void)
{
- blineb = (blineb << 1) | (blineb >> 15);
+ int bshift = bltcon1 >> 12;
+
+ bshift--;
+ bshift &= 15;
+
+ blineb = (blt_info.bltbdat >> bshift) | (blt_info.bltbdat << (16 - bshift));
+
+ bltcon1 &= 0x0fff;
+ bltcon1 |= bshift << 12;
+
}
static void actually_do_blit (void)
if (con & 2) {
blitdesc = bltcon1 & 2;
- blt_info.blitbshift = bltcon1 >> 12;
- blt_info.blitdownbshift = 16 - blt_info.blitbshift;
if (blit_warned > 0) {
if ((bltcon1 & 1) && !blitline_started) {
write_log(_T("BLITTER: linedraw enabled when blitter is active! %08x\n"), M68K_GETPC);
}
}
- if (con & 1) {
- blt_info.blitashift = bltcon0 >> 12;
- blt_info.blitdownashift = 16 - blt_info.blitashift;
- }
-
if (!savestate_state && blt_info.blit_main && (bltcon0_old != bltcon0 || bltcon1_old != bltcon1)) {
blit_changed = true;
if (blit_warned > 0) {
return 2;
}
// C or D
- if (shifter[2] && (bltcon0 & 0x200)) {
- if (blitter_hcounter + 1 == blt_info.hblitsize)
- return 4;
- return 3;
+ if (shifter[2]) {
+ // enabled C
+ if (bltcon0 & 0x200) {
+ if (blitter_hcounter + 1 == blt_info.hblitsize)
+ return 4;
+ return 3;
+ } else {
+ // disabled C
+ if (blitter_hcounter + 1 == blt_info.hblitsize)
+ return 6;
+ }
}
} else {
// order is important when multiple bits in shift register
uae_u32 blitahold;
uae_u16 bltadat, ddat;
uae_u8 mt = bltcon0 & 0xFF;
+ uae_u16 ashift = bltcon0 >> 12;
bltadat = blt_info.bltadat;
if (dat & BLITTER_PIPELINE_FIRST) {
bltadat &= blt_info.bltalwm;
}
if (blitdesc) {
- blitahold = (((uae_u32)bltadat << 16) | blt_info.bltaold) >> blt_info.blitdownashift;
+ blitahold = (((uae_u32)bltadat << 16) | blt_info.bltaold) >> (16 - ashift);
} else {
- blitahold = (((uae_u32)blt_info.bltaold << 16) | bltadat) >> blt_info.blitashift;
+ blitahold = (((uae_u32)blt_info.bltaold << 16) | bltadat) >> ashift;
}
blt_info.bltaold = bltadat;
switch (ch)
{
case 1: // A
+ {
check_channel_mods(hpos, 1, &bltapt);
reg = 0x74;
record_dma_blit(reg, 0, bltapt, hpos);
mod = blit_modadda;
alloc_cycle_blitter(hpos, &bltapt, 1);
break;
+ }
case 2: // B
+ {
+ int bshift = bltcon1 >> 12;
check_channel_mods(hpos, 2, &bltbpt);
reg = 0x72;
record_dma_blit(reg, 0, bltbpt, hpos);
addr = &bltbpt;
mod = blit_modaddb;
if (blitdesc)
- blt_info.bltbhold = (((uae_u32)blt_info.bltbdat << 16) | blt_info.bltbold) >> blt_info.blitdownbshift;
+ blt_info.bltbhold = (((uae_u32)blt_info.bltbdat << 16) | blt_info.bltbold) >> (16 - bshift);
else
- blt_info.bltbhold = (((uae_u32)blt_info.bltbold << 16) | blt_info.bltbdat) >> blt_info.blitbshift;
- blineb = (blt_info.bltbdat >> blt_info.blitbshift) | (blt_info.bltbdat << (16 - blt_info.blitbshift));
+ blt_info.bltbhold = (((uae_u32)blt_info.bltbold << 16) | blt_info.bltbdat) >> bshift;
+ blineb = blt_info.bltbhold;
blt_info.bltbold = blt_info.bltbdat;
alloc_cycle_blitter(hpos, &bltbpt, 2);
break;
+ }
case 3: // C
+ {
reg = 0x70;
check_channel_mods(hpos, 3, &bltcpt);
record_dma_blit(reg, 0, bltcpt, hpos);
mod = blit_modaddc;
alloc_cycle_blitter(hpos, &bltcpt, 3);
break;
+ }
default:
abort();
}
written = decide_blitter_idle(hpos, until_hpos, addr, value);
- } else if (c == 4 && line) { // line 4/4 (D)
+ } else if ((c == 4 || c == 6) && line) { // line 4/4 (D)
if (ddat2use) {
bltdpt = bltcpt;
blitter_nxline();
/* onedot mode and no pixel = bus write access is skipped */
- if (blitlinepixel) {
+ if (blitlinepixel && c == 4) {
record_dma_blit(0x00, blt_info.bltddat, bltdpt, hpos);
- if (blt_info.bltddat) {
- blt_info.blitzero = 0;
- }
chipmem_wput_indirect(bltdpt, blt_info.bltddat);
regs.chipset_latch_rw = blt_info.bltddat;
alloc_cycle_blitter(hpos, &bltdpt, 4);
- blitlinepixel = 0;
} else {
markidlecycle(hpos);
}
+ blitlinepixel = 0;
+
bltdpt = bltcpt;
} else {
void reset_blit (int bltcon)
{
- if (bltcon & 1)
- blinea_shift = bltcon0 >> 12;
- if (bltcon & 2)
- blitsign = bltcon1 & 0x40;
if (!blt_info.blit_main && !blt_info.blit_finald)
return;
if (bltcon)
blt_info.bltaold = 0;
blt_info.bltbold = 0;
- if (blitline) {
- blinea = blt_info.bltadat;
- blineb = (blt_info.bltbdat >> blt_info.blitbshift) | (blt_info.bltbdat << (16 - blt_info.blitbshift));
- blitonedot = 0;
- blitlinepixel = 0;
- blitsing = bltcon1 & 0x2;
- }
+ int bshift = bltcon1 >> 12;
+ blinea = blt_info.bltadat;
+ blineb = (blt_info.bltbdat >> bshift) | (blt_info.bltbdat << (16 - bshift));
+ blitonedot = 0;
+ blitlinepixel = 0;
if (!(dmacon & DMA_BLITPRI) && blt_info.nasty_cnt >= BLIT_NASTY_CPU_STEAL_CYCLE_COUNT) {
blt_info.wait_nasty = 1;
blitfc = restore_u8();
blitife = restore_u8();
- blt_info.blitbshift = restore_u8();
- blt_info.blitdownbshift = restore_u8();
- blt_info.blitashift = restore_u8();
- blt_info.blitdownashift = restore_u8();
+ restore_u8();
+ restore_u8();
+ restore_u8();
+ restore_u8();
ddat1use = restore_u8();
restore_u8();
blitfill = restore_u8();
blinea = restore_u16();
blineb = restore_u16();
- blinea_shift = restore_u8();
+ restore_u8();
blitonedot = restore_u8();
blitlinepixel = restore_u8();
- blitsing = restore_u8();
+ restore_u8();
blitlinepixel = restore_u8();
blt_info.blit_interrupt = restore_u8();
blt_delayed_irq = restore_u8();
save_u8(blitfc);
save_u8(blitife);
- save_u8(blt_info.blitbshift);
- save_u8(blt_info.blitdownbshift);
- save_u8(blt_info.blitashift);
- save_u8(blt_info.blitdownashift);
+ save_u8(bltcon1 >> 12);
+ save_u8((16 - (bltcon1 >> 12)));
+ save_u8(bltcon0 >> 12);
+ save_u8(16 - (bltcon0 >> 12));
save_u8(ddat1use);
save_u8(0); //(ddat2use);
save_u8(blitfill);
save_u16(blinea);
save_u16(blineb);
- save_u8(blinea_shift);
+ save_u8(bltcon0 >> 12);
save_u8(blitonedot);
save_u8(blitlinepixel);
- save_u8(blitsing);
+ save_u8((bltcon1 & BLTSING) != 0);
save_u8(blitlinepixel);
save_u8(blt_info.blit_interrupt);
save_u8(blt_delayed_irq);
printf("#include \"blitfunc.h\"\n\n");
for (i = 0; i < sizeof(blttbl); i++) {
- int active = blitops[blttbl[i]].used;
- int a_is_on = active & 1, b_is_on = active & 2, c_is_on = active & 4;
- printf("void blitdofast_%x (uaecptr pta, uaecptr ptb, uaecptr ptc, uaecptr ptd, struct bltinfo *b)\n",blttbl[i]);
- printf("{\n");
- printf("int i,j;\n");
- printf("uae_u32 totald = 0;\n");
- if (b_is_on) printf("uae_u32 srcb = b->bltbhold;\n");
- if (c_is_on) printf("uae_u32 srcc = b->bltcdat;\n");
- printf("uae_u32 dstd=0;\n");
- printf("uaecptr dstp = 0;\n");
- printf("for (j = 0; j < b->vblitsize; j++) {\n");
- printf("\tfor (i = 0; i < b->hblitsize; i++) {\n\t\tuae_u32 bltadat, srca;\n\n");
- if (c_is_on) printf("\t\tif (ptc) { srcc = chipmem_wget_indirect (ptc); ptc += 2; }\n");
- if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tuae_u32 bltbdat = b->bltbdat = chipmem_wget_indirect (ptb); ptb += 2;\n");
- if (b_is_on) printf("\t\t\tsrcb = (((uae_u32)b->bltbold << 16) | bltbdat) >> b->blitbshift;\n");
- if (b_is_on) printf("\t\t\tb->bltbold = bltbdat;\n\t\t}\n");
- if (a_is_on) printf("\t\tif (pta) { bltadat = b->bltadat = chipmem_wget_indirect (pta); pta += 2; } else { bltadat = b->bltadat; }\n");
- if (a_is_on) printf("\t\tbltadat &= blit_masktable[i];\n");
- if (a_is_on) printf("\t\tsrca = (((uae_u32)b->bltaold << 16) | bltadat) >> b->blitashift;\n");
- if (a_is_on) printf("\t\tb->bltaold = bltadat;\n");
- printf("\t\tif (dstp) chipmem_wput_indirect (dstp, dstd);\n");
- printf("\t\tdstd = (%s) & 0xFFFF;\n", blitops[blttbl[i]].s);
- printf("\t\ttotald |= dstd;\n");
- printf("\t\tif (ptd) { dstp = ptd; ptd += 2; }\n");
- printf("\t}\n");
- if (a_is_on) printf("\tif (pta) pta += b->bltamod;\n");
- if (b_is_on) printf("\tif (ptb) ptb += b->bltbmod;\n");
- if (c_is_on) printf("\tif (ptc) ptc += b->bltcmod;\n");
- printf("\tif (ptd) ptd += b->bltdmod;\n");
- printf("}\n");
- if (b_is_on) printf("b->bltbhold = srcb;\n");
- if (c_is_on) printf("b->bltcdat = srcc;\n");
- printf("\t\tif (dstp) chipmem_wput_indirect (dstp, dstd);\n");
- printf("if (totald != 0) b->blitzero = 0;\n");
- printf("}\n");
+ int active = blitops[blttbl[i]].used;
+ int a_is_on = active & 1, b_is_on = active & 2, c_is_on = active & 4;
+ printf("void blitdofast_%x (uaecptr pta, uaecptr ptb, uaecptr ptc, uaecptr ptd, struct bltinfo *b)\n",blttbl[i]);
+ printf("{\n");
+ printf("int i,j;\n");
+ printf("uae_u32 totald = 0;\n");
+ if (b_is_on) printf("uae_u32 srcb = b->bltbhold;\n");
+ if (c_is_on) printf("uae_u32 srcc = b->bltcdat;\n");
+ printf("uae_u16 ashift = bltcon0 >> 12;\n");
+ printf("uae_u16 bshift = bltcon1 >> 12;\n");
+ printf("uae_u32 dstd=0;\n");
+ printf("uaecptr dstp = 0;\n");
+ printf("for (j = 0; j < b->vblitsize; j++) {\n");
+ printf("\tfor (i = 0; i < b->hblitsize; i++) {\n\t\tuae_u32 bltadat, srca;\n\n");
+ if (c_is_on) printf("\t\tif (ptc) { srcc = chipmem_wget_indirect (ptc); ptc += 2; }\n");
+ if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tuae_u32 bltbdat = b->bltbdat = chipmem_wget_indirect (ptb); ptb += 2;\n");
+ if (b_is_on) printf("\t\t\tsrcb = (((uae_u32)b->bltbold << 16) | bltbdat) >> bshift;\n");
+ if (b_is_on) printf("\t\t\tb->bltbold = bltbdat;\n\t\t}\n");
+ if (a_is_on) printf("\t\tif (pta) { bltadat = b->bltadat = chipmem_wget_indirect (pta); pta += 2; } else { bltadat = b->bltadat; }\n");
+ if (a_is_on) printf("\t\tbltadat &= blit_masktable[i];\n");
+ if (a_is_on) printf("\t\tsrca = (((uae_u32)b->bltaold << 16) | bltadat) >> ashift;\n");
+ if (a_is_on) printf("\t\tb->bltaold = bltadat;\n");
+ printf("\t\tif (dstp) chipmem_wput_indirect (dstp, dstd);\n");
+ printf("\t\tdstd = (%s) & 0xFFFF;\n", blitops[blttbl[i]].s);
+ printf("\t\ttotald |= dstd;\n");
+ printf("\t\tif (ptd) { dstp = ptd; ptd += 2; }\n");
+ printf("\t}\n");
+ if (a_is_on) printf("\tif (pta) pta += b->bltamod;\n");
+ if (b_is_on) printf("\tif (ptb) ptb += b->bltbmod;\n");
+ if (c_is_on) printf("\tif (ptc) ptc += b->bltcmod;\n");
+ printf("\tif (ptd) ptd += b->bltdmod;\n");
+ printf("}\n");
+ if (b_is_on) printf("b->bltbhold = srcb;\n");
+ if (c_is_on) printf("b->bltcdat = srcc;\n");
+ printf("\t\tif (dstp) chipmem_wput_indirect (dstp, dstd);\n");
+ printf("if (totald != 0) b->blitzero = 0;\n");
+ printf("}\n");
- printf("void blitdofast_desc_%x (uaecptr pta, uaecptr ptb, uaecptr ptc, uaecptr ptd, struct bltinfo *b)\n",blttbl[i]);
- printf("{\n");
- printf("uae_u32 totald = 0;\n");
- printf("int i,j;\n");
- if (b_is_on) printf("uae_u32 srcb = b->bltbhold;\n");
- if (c_is_on) printf("uae_u32 srcc = b->bltcdat;\n");
- printf("uae_u32 dstd = 0;\n");
- printf("uaecptr dstp = 0;\n");
- printf("for (j = 0; j < b->vblitsize; j++) {\n");
- printf("\tfor (i = 0; i < b->hblitsize; i++) {\n\t\tuae_u32 bltadat, srca;\n");
- if (c_is_on) printf("\t\tif (ptc) { srcc = chipmem_wget_indirect (ptc); ptc -= 2; }\n");
- if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tuae_u32 bltbdat = b->bltbdat = chipmem_wget_indirect (ptb); ptb -= 2;\n");
- if (b_is_on) printf("\t\t\tsrcb = ((bltbdat << 16) | b->bltbold) >> b->blitdownbshift;\n");
- if (b_is_on) printf("\t\t\tb->bltbold = bltbdat;\n\t\t}\n");
- if (a_is_on) printf("\t\tif (pta) { bltadat = b->bltadat = chipmem_wget_indirect (pta); pta -= 2; } else { bltadat = b->bltadat; }\n");
- if (a_is_on) printf("\t\tbltadat &= blit_masktable[i];\n");
- if (a_is_on) printf("\t\tsrca = (((uae_u32)bltadat << 16) | b->bltaold) >> b->blitdownashift;\n");
- if (a_is_on) printf("\t\tb->bltaold = bltadat;\n");
- printf("\t\tif (dstp) chipmem_wput_indirect (dstp, dstd);\n");
- printf("\t\tdstd = (%s) & 0xFFFF;\n", blitops[blttbl[i]].s);
- printf("\t\ttotald |= dstd;\n");
- printf("\t\tif (ptd) { dstp = ptd; ptd -= 2; }\n");
- printf("\t}\n");
- if (a_is_on) printf("\tif (pta) pta -= b->bltamod;\n");
- if (b_is_on) printf("\tif (ptb) ptb -= b->bltbmod;\n");
- if (c_is_on) printf("\tif (ptc) ptc -= b->bltcmod;\n");
- printf("\tif (ptd) ptd -= b->bltdmod;\n");
- printf("}\n");
- if (b_is_on) printf("b->bltbhold = srcb;\n");
- if (c_is_on) printf("b->bltcdat = srcc;\n");
- printf("\t\tif (dstp) chipmem_wput_indirect (dstp, dstd);\n");
- printf("if (totald != 0) b->blitzero = 0;\n");
- printf("}\n");
+ printf("void blitdofast_desc_%x (uaecptr pta, uaecptr ptb, uaecptr ptc, uaecptr ptd, struct bltinfo *b)\n",blttbl[i]);
+ printf("{\n");
+ printf("uae_u32 totald = 0;\n");
+ printf("int i,j;\n");
+ if (b_is_on) printf("uae_u32 srcb = b->bltbhold;\n");
+ if (c_is_on) printf("uae_u32 srcc = b->bltcdat;\n");
+ printf("uae_u16 ashift = 16 - (bltcon0 >> 12);\n");
+ printf("uae_u16 bshift = 16 - (bltcon1 >> 12);\n");
+ printf("uae_u32 dstd = 0;\n");
+ printf("uaecptr dstp = 0;\n");
+ printf("for (j = 0; j < b->vblitsize; j++) {\n");
+ printf("\tfor (i = 0; i < b->hblitsize; i++) {\n\t\tuae_u32 bltadat, srca;\n");
+ if (c_is_on) printf("\t\tif (ptc) { srcc = chipmem_wget_indirect (ptc); ptc -= 2; }\n");
+ if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tuae_u32 bltbdat = b->bltbdat = chipmem_wget_indirect (ptb); ptb -= 2;\n");
+ if (b_is_on) printf("\t\t\tsrcb = ((bltbdat << 16) | b->bltbold) >> bshift;\n");
+ if (b_is_on) printf("\t\t\tb->bltbold = bltbdat;\n\t\t}\n");
+ if (a_is_on) printf("\t\tif (pta) { bltadat = b->bltadat = chipmem_wget_indirect (pta); pta -= 2; } else { bltadat = b->bltadat; }\n");
+ if (a_is_on) printf("\t\tbltadat &= blit_masktable[i];\n");
+ if (a_is_on) printf("\t\tsrca = (((uae_u32)bltadat << 16) | b->bltaold) >> ashift;\n");
+ if (a_is_on) printf("\t\tb->bltaold = bltadat;\n");
+ printf("\t\tif (dstp) chipmem_wput_indirect (dstp, dstd);\n");
+ printf("\t\tdstd = (%s) & 0xFFFF;\n", blitops[blttbl[i]].s);
+ printf("\t\ttotald |= dstd;\n");
+ printf("\t\tif (ptd) { dstp = ptd; ptd -= 2; }\n");
+ printf("\t}\n");
+ if (a_is_on) printf("\tif (pta) pta -= b->bltamod;\n");
+ if (b_is_on) printf("\tif (ptb) ptb -= b->bltbmod;\n");
+ if (c_is_on) printf("\tif (ptc) ptc -= b->bltcmod;\n");
+ printf("\tif (ptd) ptd -= b->bltdmod;\n");
+ printf("}\n");
+ if (b_is_on) printf("b->bltbhold = srcb;\n");
+ if (c_is_on) printf("b->bltcdat = srcc;\n");
+ printf("\t\tif (dstp) chipmem_wput_indirect (dstp, dstd);\n");
+ printf("if (totald != 0) b->blitzero = 0;\n");
+ printf("}\n");
}
}
printf("#include \"blitfunc.h\"\n\n");
printf("blitter_func * const blitfunc_dofast[256] = {\n");
for (i = 0; i < 256; i++) {
- if (index < sizeof(blttbl) && i == blttbl[index]) {
- printf("blitdofast_%x",i);
- index++;
- }
- else printf("0");
- if (i < 255) printf(", ");
- if ((i & 7) == 7) printf("\n");
+ if (index < sizeof(blttbl) && i == blttbl[index]) {
+ printf("blitdofast_%x",i);
+ index++;
+ }
+ else printf("0");
+ if (i < 255) printf(", ");
+ if ((i & 7) == 7) printf("\n");
}
printf("};\n\n");
index = 0;
printf("blitter_func * const blitfunc_dofast_desc[256] = {\n");
for (i = 0; i < 256; i++) {
- if (index < sizeof(blttbl) && i == blttbl[index]) {
- printf("blitdofast_desc_%x",i);
- index++;
- }
- else printf("0");
- if (i < 255) printf(", ");
- if ((i & 7) == 7) printf("\n");
+ if (index < sizeof(blttbl) && i == blttbl[index]) {
+ printf("blitdofast_desc_%x",i);
+ index++;
+ }
+ else printf("0");
+ if (i < 255) printf(", ");
+ if ((i & 7) == 7) printf("\n");
}
printf("};\n");
}
{
unsigned int i;
for (i = 0; i < sizeof(blttbl); i++) {
- printf("extern blitter_func blitdofast_%x;\n",blttbl[i]);
- printf("extern blitter_func blitdofast_desc_%x;\n",blttbl[i]);
+ printf("extern blitter_func blitdofast_%x;\n",blttbl[i]);
+ printf("extern blitter_func blitdofast_desc_%x;\n",blttbl[i]);
}
}