From 1447891c79277a7f9a931c76881172618f4ba474 Mon Sep 17 00:00:00 2001 From: Keir Date: Wed, 22 Jan 2014 14:17:48 +0000 Subject: [PATCH] Fix blitter handling when an active channel's address is zero. --- src/blitter.c | 56 ++++++++++----------- src/genblitter.c | 112 +++++++++++++++++++++--------------------- src/include/blitter.h | 2 +- 3 files changed, 85 insertions(+), 85 deletions(-) diff --git a/src/blitter.c b/src/blitter.c index 4bf0334..e68a22b 100644 --- a/src/blitter.c +++ b/src/blitter.c @@ -274,31 +274,31 @@ static void blitter_dofast (void) { int i,j; uaecptr bltadatptr = 0, bltbdatptr = 0, bltcdatptr = 0, bltddatptr = 0; - uae_u8 mt = bltcon0 & 0xFF; + uae_u8 mt = bltcon0 & 0xFF, chen = bltcon0 >> 8; blit_masktable[0] = blt_info.bltafwm; blit_masktable[blt_info.hblitsize - 1] &= blt_info.bltalwm; - if (bltcon0 & 0x800) { + if (chen & 8) { bltadatptr = bltapt; bltapt += (blt_info.hblitsize*2 + blt_info.bltamod)*blt_info.vblitsize; } - if (bltcon0 & 0x400) { + if (chen & 4) { bltbdatptr = bltbpt; bltbpt += (blt_info.hblitsize*2 + blt_info.bltbmod)*blt_info.vblitsize; } - if (bltcon0 & 0x200) { + if (chen & 2) { bltcdatptr = bltcpt; bltcpt += (blt_info.hblitsize*2 + blt_info.bltcmod)*blt_info.vblitsize; } - if (bltcon0 & 0x100) { + if (chen & 1) { bltddatptr = bltdpt; bltdpt += (blt_info.hblitsize*2 + blt_info.bltdmod)*blt_info.vblitsize; } #ifdef SPEEDUP if (blitfunc_dofast[mt] && !blitfill) { - (*blitfunc_dofast[mt])(bltadatptr, bltbdatptr, bltcdatptr, bltddatptr, &blt_info); + (*blitfunc_dofast[mt])(chen, bltadatptr, bltbdatptr, bltcdatptr, bltddatptr, &blt_info); } else #endif { @@ -313,7 +313,7 @@ static void blitter_dofast (void) for (i = 0; i < blt_info.hblitsize; i++) { uae_u32 bltadat, blitahold; uae_u16 bltbdat; - if (bltadatptr) { + if (chen & 8) { blt_info.bltadat = bltadat = chipmem_wget (bltadatptr); bltadatptr += 2; } else @@ -322,14 +322,14 @@ static void blitter_dofast (void) blitahold = (((uae_u32)preva << 16) | bltadat) >> blt_info.blitashift; preva = bltadat; - if (bltbdatptr) { + if (chen & 4) { blt_info.bltbdat = bltbdat = chipmem_wget (bltbdatptr); bltbdatptr += 2; blitbhold = (((uae_u32)prevb << 16) | bltbdat) >> blt_info.blitbshift; prevb = bltbdat; } - if (bltcdatptr) { + if (chen & 2) { blt_info.bltcdat = chipmem_wget (bltcdatptr); bltcdatptr += 2; } @@ -345,16 +345,16 @@ static void blitter_dofast (void) } if (blt_info.bltddat) blt_info.blitzero = 0; - if (bltddatptr) { + if (chen & 1) { dodst = 1; dstp = bltddatptr; bltddatptr += 2; } } - if (bltadatptr) bltadatptr += blt_info.bltamod; - if (bltbdatptr) bltbdatptr += blt_info.bltbmod; - if (bltcdatptr) bltcdatptr += blt_info.bltcmod; - if (bltddatptr) bltddatptr += blt_info.bltdmod; + if (chen & 8) bltadatptr += blt_info.bltamod; + if (chen & 4) bltbdatptr += blt_info.bltbmod; + if (chen & 2) bltcdatptr += blt_info.bltcmod; + if (chen & 1) bltddatptr += blt_info.bltdmod; } if (dodst) chipmem_wput (dstp, blt_info.bltddat); blt_info.bltbhold = blitbhold; @@ -369,30 +369,30 @@ static void blitter_dofast_desc (void) { int i,j; uaecptr bltadatptr = 0, bltbdatptr = 0, bltcdatptr = 0, bltddatptr = 0; - uae_u8 mt = bltcon0 & 0xFF; + uae_u8 mt = bltcon0 & 0xFF, chen = bltcon0 >> 8; blit_masktable[0] = blt_info.bltafwm; blit_masktable[blt_info.hblitsize - 1] &= blt_info.bltalwm; - if (bltcon0 & 0x800) { + if (chen & 8) { bltadatptr = bltapt; bltapt -= (blt_info.hblitsize*2 + blt_info.bltamod)*blt_info.vblitsize; } - if (bltcon0 & 0x400) { + if (chen & 4) { bltbdatptr = bltbpt; bltbpt -= (blt_info.hblitsize*2 + blt_info.bltbmod)*blt_info.vblitsize; } - if (bltcon0 & 0x200) { + if (chen & 2) { bltcdatptr = bltcpt; bltcpt -= (blt_info.hblitsize*2 + blt_info.bltcmod)*blt_info.vblitsize; } - if (bltcon0 & 0x100) { + if (chen & 1) { bltddatptr = bltdpt; bltdpt -= (blt_info.hblitsize*2 + blt_info.bltdmod)*blt_info.vblitsize; } #ifdef SPEEDUP if (blitfunc_dofast_desc[mt] && !blitfill) { - (*blitfunc_dofast_desc[mt])(bltadatptr, bltbdatptr, bltcdatptr, bltddatptr, &blt_info); + (*blitfunc_dofast_desc[mt])(chen, bltadatptr, bltbdatptr, bltcdatptr, bltddatptr, &blt_info); } else #endif { @@ -406,7 +406,7 @@ static void blitter_dofast_desc (void) for (i = 0; i < blt_info.hblitsize; i++) { uae_u32 bltadat, blitahold; uae_u16 bltbdat; - if (bltadatptr) { + if (chen & 8) { bltadat = blt_info.bltadat = chipmem_wget (bltadatptr); bltadatptr -= 2; } else @@ -415,14 +415,14 @@ static void blitter_dofast_desc (void) blitahold = (((uae_u32)bltadat << 16) | preva) >> blt_info.blitdownashift; preva = bltadat; - if (bltbdatptr) { + if (chen & 4) { blt_info.bltbdat = bltbdat = chipmem_wget (bltbdatptr); bltbdatptr -= 2; blitbhold = (((uae_u32)bltbdat << 16) | prevb) >> blt_info.blitdownbshift; prevb = bltbdat; } - if (bltcdatptr) { + if (chen & 2) { blt_info.bltcdat = blt_info.bltbdat = chipmem_wget (bltcdatptr); bltcdatptr -= 2; } @@ -438,16 +438,16 @@ static void blitter_dofast_desc (void) } if (blt_info.bltddat) blt_info.blitzero = 0; - if (bltddatptr) { + if (chen & 1) { dstp = bltddatptr; dodst = 1; bltddatptr -= 2; } } - if (bltadatptr) bltadatptr -= blt_info.bltamod; - if (bltbdatptr) bltbdatptr -= blt_info.bltbmod; - if (bltcdatptr) bltcdatptr -= blt_info.bltcmod; - if (bltddatptr) bltddatptr -= blt_info.bltdmod; + if (chen & 8) bltadatptr -= blt_info.bltamod; + if (chen & 4) bltbdatptr -= blt_info.bltbmod; + if (chen & 2) bltcdatptr -= blt_info.bltcmod; + if (chen & 1) bltddatptr -= blt_info.bltdmod; } if (dodst) chipmem_wput (dstp, blt_info.bltddat); blt_info.bltbhold = blitbhold; diff --git a/src/genblitter.c b/src/genblitter.c index ba37b37..28b664b 100644 --- a/src/genblitter.c +++ b/src/genblitter.c @@ -48,9 +48,9 @@ static void generate_func(void) 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("void blitdofast_%x (uae_u8 chen, uaecptr pta, uaecptr ptb, uaecptr ptc, uaecptr ptd, struct bltinfo *b)\n",blttbl[i]); printf("{\n"); - printf("int i,j;\n"); + printf("int i,j,dodst=0;\n"); printf("uae_u32 totald = 0;\n"); #if 0 printf("if (currprefs.blits_32bit_enabled && b->hblitsize > 1"); @@ -64,30 +64,30 @@ static void generate_func(void) printf("int count=b->hblitsize/2, oddword=b->hblitsize&1;\n"); printf("for (j=0;jvblitsize;j++) {\n"); printf("\tfor(i=0;ibltamod;\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"); + if (a_is_on) printf("\tif (chen&8) pta += b->bltamod;\n"); + if (b_is_on) printf("\tif (chen&4) ptb += b->bltbmod;\n"); + if (c_is_on) printf("\tif (chen&2) ptc += b->bltcmod;\n"); + printf("\tif (chen&1) ptd += b->bltdmod;\n"); printf("}\n"); - if (a_is_on) printf("if (pta) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);\n"); /* Maybe not necessary, but I don't want problems */ - if (b_is_on) printf("if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);\n"); - if (c_is_on) printf("if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);\n"); - printf("if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);\n"); + if (a_is_on) printf("if (chen&8) b->bltadat = (*(pta-b->bltamod-2) << 8) | *(pta - b->bltamod - 1);\n"); /* Maybe not necessary, but I don't want problems */ + if (b_is_on) printf("if (chen&4) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);\n"); + if (c_is_on) printf("if (chen&2) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);\n"); + printf("if (chen&1) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);\n"); printf("} else {\n"); #endif @@ -98,37 +98,37 @@ static void generate_func(void) printf("uaecptr dstp = 0;\n"); printf("for (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 (ptc); ptc += 2; }\n"); - if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tuae_u32 bltbdat = blt_info.bltbdat = chipmem_wget (ptb); ptb += 2;\n"); + if (c_is_on) printf("\t\tif (chen&2) { srcc = chipmem_wget (ptc); ptc += 2; }\n"); + if (b_is_on) printf("\t\tif (chen&4) {\n\t\t\tuae_u32 bltbdat = blt_info.bltbdat = chipmem_wget (ptb); ptb += 2;\n"); if (b_is_on) printf("\t\t\tsrcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;\n"); if (b_is_on) printf("\t\t\tprevb = bltbdat;\n\t\t}\n"); - if (a_is_on) printf("\t\tif (pta) { bltadat = blt_info.bltadat = chipmem_wget (pta); pta += 2; } else { bltadat = blt_info.bltadat; }\n"); + if (a_is_on) printf("\t\tif (chen&8) { bltadat = blt_info.bltadat = chipmem_wget (pta); pta += 2; } else { bltadat = blt_info.bltadat; }\n"); if (a_is_on) printf("\t\tbltadat &= blit_masktable[i];\n"); if (a_is_on) printf("\t\tsrca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;\n"); if (a_is_on) printf("\t\tpreva = bltadat;\n"); - printf("\t\tif (dstp) chipmem_wput (dstp, dstd);\n"); + printf("\t\tif (dodst) chipmem_wput (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\tif (chen&1) { dodst = 1; 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"); + if (a_is_on) printf("\tif (chen&8) pta += b->bltamod;\n"); + if (b_is_on) printf("\tif (chen&4) ptb += b->bltbmod;\n"); + if (c_is_on) printf("\tif (chen&2) ptc += b->bltcmod;\n"); + printf("\tif (chen&1) ptd += b->bltdmod;\n"); printf("}\n"); if (b_is_on) printf("b->bltbhold = srcb;\n"); printf("b->bltcdat = srcc;\n"); - printf("\t\tif (dstp) chipmem_wput (dstp, dstd);\n"); + printf("\t\tif (dodst) chipmem_wput (dstp, dstd);\n"); #if 0 printf("}\n"); #endif 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("void blitdofast_desc_%x (uae_u8 chen, 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"); + printf("int i,j,dodst=0;\n"); #if 0 printf("if (currprefs.blits_32bit_enabled && b->hblitsize > 1"); if (a_is_on) printf(" && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff"); @@ -141,30 +141,30 @@ static void generate_func(void) printf("int count=b->hblitsize/2, oddword=b->hblitsize&1;\n"); printf("for (j=0;jvblitsize;j++) {\n"); printf("\tfor(i=0;ibltamod;\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"); + if (a_is_on) printf("\tif (chen&8) pta -= b->bltamod;\n"); + if (b_is_on) printf("\tif (chen&4) ptb -= b->bltbmod;\n"); + if (c_is_on) printf("\tif (chen&2) ptc -= b->bltcmod;\n"); + printf("\tif (chen&1) ptd-=b->bltdmod;\n"); printf("}\n"); - if (a_is_on) printf("if (pta) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);\n"); /* Maybe not necessary, but I don't want problems */ - if (b_is_on) printf("if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);\n"); - if (c_is_on) printf("if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);\n"); - printf("if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);\n"); + if (a_is_on) printf("if (chen&8) b->bltadat = (*(pta + b->bltamod + 2) << 8) | *(pta + b->bltamod + 1);\n"); /* Maybe not necessary, but I don't want problems */ + if (b_is_on) printf("if (chen&4) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);\n"); + if (c_is_on) printf("if (chen&2) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);\n"); + printf("if (chen&1) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);\n"); printf("} else {\n"); #endif @@ -175,27 +175,27 @@ static void generate_func(void) printf("uaecptr dstp = 0;\n"); printf("for (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 (ptc); ptc -= 2; }\n"); - if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tuae_u32 bltbdat = blt_info.bltbdat = chipmem_wget (ptb); ptb -= 2;\n"); + if (c_is_on) printf("\t\tif (chen&2) { srcc = chipmem_wget (ptc); ptc -= 2; }\n"); + if (b_is_on) printf("\t\tif (chen&4) {\n\t\t\tuae_u32 bltbdat = blt_info.bltbdat = chipmem_wget (ptb); ptb -= 2;\n"); if (b_is_on) printf("\t\t\tsrcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;\n"); if (b_is_on) printf("\t\t\tprevb = bltbdat;\n\t\t}\n"); - if (a_is_on) printf("\t\tif (pta) { bltadat = blt_info.bltadat = chipmem_wget (pta); pta -= 2; } else { bltadat = blt_info.bltadat; }\n"); + if (a_is_on) printf("\t\tif (chen&8) { bltadat = blt_info.bltadat = chipmem_wget (pta); pta -= 2; } else { bltadat = blt_info.bltadat; }\n"); if (a_is_on) printf("\t\tbltadat &= blit_masktable[i];\n"); if (a_is_on) printf("\t\tsrca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;\n"); if (a_is_on) printf("\t\tpreva = bltadat;\n"); - printf("\t\tif (dstp) chipmem_wput (dstp, dstd);\n"); + printf("\t\tif (dodst) chipmem_wput (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\tif (chen&1) { dodst = 1; 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"); + if (a_is_on) printf("\tif (chen&8) pta -= b->bltamod;\n"); + if (b_is_on) printf("\tif (chen&4) ptb -= b->bltbmod;\n"); + if (c_is_on) printf("\tif (chen&2) ptc -= b->bltcmod;\n"); + printf("\tif (chen&1) ptd -= b->bltdmod;\n"); printf("}\n"); if (b_is_on) printf("b->bltbhold = srcb;\n"); printf("b->bltcdat = srcc;\n"); - printf("\t\tif (dstp) chipmem_wput (dstp, dstd);\n"); + printf("\t\tif (dodst) chipmem_wput (dstp, dstd);\n"); #if 0 printf("}\n"); #endif diff --git a/src/include/blitter.h b/src/include/blitter.h index 97e8f89..53d5d11 100644 --- a/src/include/blitter.h +++ b/src/include/blitter.h @@ -36,7 +36,7 @@ extern void decide_blitter (unsigned int hpos); extern void blitter_done_notify (void); extern void blitter_slowdown (int, int, unsigned int, unsigned int); -typedef void blitter_func(uaecptr, uaecptr, uaecptr, uaecptr, struct bltinfo *); +typedef void blitter_func(uae_u8, uaecptr, uaecptr, uaecptr, uaecptr, struct bltinfo *); #define BLITTER_MAX_WORDS 2048