--- uae/src/genblitter.c 2018/04/24 16:38:39 1.1 +++ uae/src/genblitter.c 2018/04/24 16:39:04 1.1.1.2 @@ -10,11 +10,8 @@ #include "sysconfig.h" #include "sysdeps.h" -#include "config.h" -#include "options.h" -/*#include "custom.h"*/ +#include "genblitter.h" -UWORD dmacon; /* Here is the minterm table used in blitter function generation */ static unsigned char blttbl[]= { @@ -22,84 +19,13 @@ static unsigned char blttbl[]= { 0xaa, 0xb1, 0xca, 0xcc, 0xd8, 0xe2, 0xea, 0xf0, 0xfa, 0xfc }; -static int bitset(int mt, int bit) -{ - return mt & (1<hblitsize>1"); + printf("ULONG totald = 0;\n"); + printf("if (blits_32bit_enabled && b->hblitsize > 1"); if (a_is_on) printf(" && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff"); if (b_is_on) printf(" && !b->blitbshift"); printf(") {\n"); @@ -140,18 +66,16 @@ static void generate_func(void) if (a_is_on) printf("\t\tif (pta) {srca=*((ULONG *)pta); pta += 4;}\n"); if (b_is_on) printf("\t\tif (ptb) {srcb=*((ULONG *)ptb); ptb += 4;}\n"); if (c_is_on) printf("\t\tif (ptc) {srcc=*((ULONG *)ptc); ptc += 4;}\n"); - printf("\t\tdest="); - generate_expr(blttbl[i],1); - printf("\t\tif (dest) b->blitzero=0;\n"); + printf("\t\tdest = %s;\n", blitops[blttbl[i]].s); + printf("\t\ttotald |= dest;\n"); printf("\t\tif (ptd) {*(ULONG *)ptd=dest; ptd += 4;}\n"); printf("\t}\n"); printf("\tif (oddword) {\n"); if (a_is_on) printf("\t\tif (pta) { srca=(ULONG)*(UWORD *)pta; pta += 2; }\n"); if (b_is_on) printf("\t\tif (ptb) { srcb=(ULONG)*(UWORD *)ptb; ptb += 2; }\n"); if (c_is_on) printf("\t\tif (ptc) { srcc=(ULONG)*(UWORD *)ptc; ptc += 2; }\n"); - printf("\t\tdest="); - generate_expr(blttbl[i],1); - printf("\t\tif (dest) b->blitzero=0;\n"); + printf("\t\tdest = %s;\n", blitops[blttbl[i]].s); + printf("\t\ttotald |= dest;\n"); printf("\t\tif (ptd) { *(UWORD *)ptd= dest; ptd += 2; }\n"); printf("\t}\n"); if (a_is_on) printf("\tif (pta) pta += b->bltamod;\n"); @@ -164,100 +88,64 @@ static void generate_func(void) 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"); - printf("} else\n"); -#endif - printf("{\n"); - - printf("UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;\n"); - if (a_is_on) printf("if (b->hblitsize==1) bltamask&=b->bltalwm;\n"); - printf("for (j=0;jvblitsize;j++) {\n"); - if (a_is_on) { - printf("\tif (pta) { b->bltadat=(*pta << 8) | (*(pta+1)); pta+=2; }\n"); - if (b_is_on) printf("\tif (ptb) { b->bltbdat=(*ptb << 8) | (*(ptb+1)); ptb+=2; }\n"); - if (c_is_on) printf("\tif (ptc) { b->bltcdat=(*ptc << 8) | (*(ptc+1)); ptc+=2; };\n"); - printf("\tbltaold=b->bltadat & bltamask;\n"); - printf("\tsrca=(((ULONG)b->blitpreva << 16) | bltaold) >> b->blitashift;\n"); - if (b_is_on) printf("\tsrcb=(((ULONG)b->blitprevb << 16) | b->bltbdat) >> b->blitbshift;\n"); - if (c_is_on) printf("\tsrcc=b->bltcdat;\n"); - printf("\tb->bltddat="); - generate_expr(blttbl[i],1); - printf("\tb->blitpreva=bltaold;\n"); - if (b_is_on) printf("\tb->blitprevb=b->bltbdat;\n"); - printf("\tif (b->bltddat) b->blitzero=0;\n"); - printf("\tif (ptd) { *ptd = b->bltddat >> 8; *(ptd+1) = b->bltddat; ptd+= 2; }\n"); - } - if (a_is_on) printf("\tfor (i=2;ihblitsize;i++) {\n"); - else printf("\tfor (i=0;ihblitsize;i++) {\n"); - if (a_is_on) printf("\t\tif (pta) { b->bltadat=(*pta << 8) | (*(pta+1)); pta+=2; }\n"); - if (b_is_on) printf("\t\tif (ptb) { b->bltbdat=(*ptb << 8) | (*(ptb+1)); ptb+=2; }\n"); - if (c_is_on) printf("\t\tif (ptc) { b->bltcdat=(*ptc << 8) | (*(ptc+1)); ptc+=2; }\n"); - if (a_is_on) printf("\t\tsrca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;\n"); - if (b_is_on) printf("\t\tsrcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;\n"); - if (c_is_on) printf("\t\tsrcc=b->bltcdat;\n"); - printf("\t\tb->bltddat="); - generate_expr(blttbl[i],1); - if (a_is_on) printf("\t\tb->blitpreva=b->bltadat;\n"); - if (b_is_on) printf("\t\tb->blitprevb=b->bltbdat;\n"); - printf("\t\tif (b->bltddat) b->blitzero=0;\n"); - printf("\t\tif (ptd) { *ptd = b->bltddat >> 8; *(ptd+1) = b->bltddat; ptd+= 2; }\n"); + printf("} else {\n"); + if (a_is_on) printf("ULONG preva = 0;\n"); + if (b_is_on) printf("ULONG prevb = 0, srcb = b->bltbhold;\n"); + if (c_is_on) printf("ULONG srcc = b->bltcdat;\n"); + printf("for (j = 0; j < b->vblitsize; j++) {\n"); + printf("\tfor (i = 0; i < b->hblitsize; i++) {\t\tULONG dstd, bltadat, srca;\n\n"); + if (c_is_on) printf("\t\tif (ptc) { srcc = do_get_mem_word((UWORD *)ptc); ptc += 2; }\n"); + if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tULONG bltbdat = do_get_mem_word((UWORD *)ptb); ptb += 2;\n"); + if (b_is_on) printf("\t\t\tsrcb = (((ULONG)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 = do_get_mem_word((UWORD *)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 = (((ULONG)preva << 16) | bltadat) >> b->blitashift;\n"); + if (a_is_on) printf("\t\tpreva = bltadat;\n"); + printf("\t\tdstd = (%s) & 0xFFFF;\n", blitops[blttbl[i]].s); + printf("\t\ttotald |= dstd;\n"); + printf("\t\tif (ptd) { do_put_mem_word((UWORD *)ptd, dstd); ptd += 2; }\n"); printf("\t}\n"); - if (a_is_on) { - printf("\tif (b->hblitsize>1) {\n"); - printf("\t\tif (pta) { b->bltadat=(*pta << 8) | (*(pta+1)); pta+=2; }\n"); - if (b_is_on) printf("\t\tif (ptb) { b->bltbdat=(*ptb << 8) | (*(ptb+1)); ptb+=2; }\n"); - if (c_is_on) printf("\t\tif (ptc) { b->bltcdat=(*ptc << 8) | (*(ptc+1)); ptc+=2; }\n"); - printf("\t\tbltaold=b->bltadat & b->bltalwm;\n"); - printf("\t\tsrca=(((ULONG)b->blitpreva << 16) | bltaold) >> b->blitashift;\n"); - if (b_is_on) printf("\t\tsrcb=(((ULONG)b->blitprevb << 16) | b->bltbdat) >> b->blitbshift;\n"); - if (c_is_on) printf("\t\tsrcc=b->bltcdat;\n"); - printf("\t\tb->bltddat="); - generate_expr(blttbl[i],1); - printf("\t\tb->blitpreva=bltaold;\n"); - if (b_is_on) printf("\t\tb->blitprevb=b->bltbdat;\n"); - printf("\t\tif (b->bltddat) b->blitzero=0;\n"); - printf("\t\tif (ptd) { *ptd = b->bltddat >> 8; *(ptd+1) = b->bltddat; 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"); + 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("}\n"); - + printf("if (totald == 0) b->blitzero = 1;\n"); + printf("}\n"); printf("void blitdofast_desc_%x(UBYTE *pta, UBYTE *ptb, UBYTE *ptc, UBYTE *ptd, struct bltinfo *b)\n",blttbl[i]); printf("{\n"); + printf("ULONG totald = 0;\n"); printf("int i,j;\n"); -#if FAST_BLITTER == 3 || FAST_BLITTER == 5 - printf("if (b->hblitsize>1"); + printf("if (blits_32bit_enabled && b->hblitsize > 1"); if (a_is_on) printf(" && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff"); if (b_is_on) printf(" && !b->blitbshift"); printf(") {\n"); - if (a_is_on) printf("ULONG srca=((ULONG)b->bltadat << 16) | b->bltadat;\n"); - if (b_is_on) printf("ULONG srcb=((ULONG)b->bltbdat << 16) | b->bltbdat;\n"); - if (c_is_on) printf("ULONG srcc=((ULONG)b->bltcdat << 16) | b->bltcdat;\n"); + if (a_is_on) printf("ULONG srca = ((ULONG)b->bltadat << 16) | b->bltadat;\n"); + if (b_is_on) printf("ULONG srcb = ((ULONG)b->bltbdat << 16) | b->bltbdat;\n"); + if (c_is_on) printf("ULONG srcc = ((ULONG)b->bltcdat << 16) | b->bltcdat;\n"); printf("ULONG dest;\n"); printf("int count=b->hblitsize/2, oddword=b->hblitsize&1;\n"); printf("for (j=0;jvblitsize;j++) {\n"); printf("\tfor(i=0;iblitzero=0;\n"); + if (a_is_on) printf("\t\tif (pta) { srca=*((ULONG *)(pta-2)); pta -= 4;}\n"); + if (b_is_on) printf("\t\tif (ptb) { srcb=*((ULONG *)(ptb-2)); ptb -= 4;}\n"); + if (c_is_on) printf("\t\tif (ptc) { srcc=*((ULONG *)(ptc-2)); ptc -= 4;}\n"); + printf("\t\tdest = %s;\n", blitops[blttbl[i]].s); + printf("\t\ttotald |= dest;\n"); printf("\t\tif (ptd) {*(ULONG *)(ptd-2)=dest; ptd -= 4;}\n"); printf("\t}\n"); printf("\tif (oddword) {\n"); if (a_is_on) printf("\t\tif (pta) { srca=(ULONG)*(UWORD *)pta; pta -= 2; }\n"); if (b_is_on) printf("\t\tif (ptb) { srcb=(ULONG)*(UWORD *)ptb; ptb -= 2; }\n"); if (c_is_on) printf("\t\tif (ptc) { srcc=(ULONG)*(UWORD *)ptc; ptc -= 2; }\n"); - printf("\t\tdest="); - generate_expr(blttbl[i],1); - printf("\t\tif (dest) b->blitzero=0;\n"); + printf("\t\tdest = %s;\n", blitops[blttbl[i]].s); + printf("\t\ttotald |= dest;\n"); printf("\t\tif (ptd) { *(UWORD *)ptd= dest; ptd -= 2; }\n"); printf("\t}\n"); if (a_is_on) printf("\tif (pta) pta -= b->bltamod;\n"); @@ -270,66 +158,34 @@ static void generate_func(void) 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"); - printf("} else\n"); -#endif - printf("{\n"); - - printf("UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;\n"); - if (a_is_on) printf("if (b->hblitsize==1) bltamask&=b->bltalwm;\n"); - printf("for (j=0;jvblitsize;j++) {\n"); - if (a_is_on) { - printf("\tif (pta) { b->bltadat = (*pta << 8) | *(pta+1); pta -= 2; }\n"); - if (b_is_on) printf("\tif (ptb) { b->bltbdat = (*ptb << 8) | *(ptb+1); ptb -= 2; }\n"); - if (c_is_on) printf("\tif (ptc) { b->bltcdat = (*ptc << 8) | *(ptc+1); ptc -= 2; }\n"); - printf("\tbltaold=b->bltadat & bltamask;\n"); - printf("\tsrca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);\n"); - if (b_is_on) printf("\tsrcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);\n"); - if (c_is_on) printf("\tsrcc=b->bltcdat;\n"); - printf("\tb->bltddat="); - generate_expr(blttbl[i],1); - printf("\tb->blitpreva=bltaold;\n"); - if (b_is_on) printf("\tb->blitprevb=b->bltbdat;\n"); - printf("\tif (b->bltddat) b->blitzero=0;\n"); - printf("\tif (ptd) { *ptd = b->bltddat >> 8; *(ptd+1) = b->bltddat; ptd-= 2; }\n"); - } - if (a_is_on) printf("\tfor (i=2;ihblitsize;i++) {\n"); - else printf("\tfor (i=0;ihblitsize;i++) {\n"); - if (a_is_on) printf("\t\tif (pta) { b->bltadat = (*pta << 8) | *(pta+1); pta -= 2; }\n"); - if (b_is_on) printf("\t\tif (ptb) { b->bltbdat = (*ptb << 8) | *(ptb+1); ptb -= 2; }\n"); - if (c_is_on) printf("\t\tif (ptc) { b->bltcdat = (*ptc << 8) | *(ptc+1); ptc -= 2; }\n"); - if (a_is_on) printf("\t\tsrca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);\n"); - if (b_is_on) printf("\t\tsrcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);\n"); - if (c_is_on) printf("\t\tsrcc=b->bltcdat;\n"); - printf("\t\tb->bltddat="); - generate_expr(blttbl[i],1); - if (a_is_on) printf("\t\tb->blitpreva=b->bltadat;\n"); - if (b_is_on) printf("\t\tb->blitprevb=b->bltbdat;\n"); - printf("\t\tif (b->bltddat) b->blitzero=0;\n"); - printf("\t\tif (ptd) { *ptd = b->bltddat >> 8; *(ptd+1) = b->bltddat; ptd-= 2; }\n"); + printf("} else {\n"); + if (a_is_on) printf("ULONG preva = 0;\n"); + if (b_is_on) printf("ULONG prevb = 0, srcb = b->bltbhold;\n"); + if (c_is_on) printf("ULONG srcc = b->bltcdat;\n"); + printf ("ULONG dstd;\n"); + printf("for (j = 0; j < b->vblitsize; j++) {\n"); + printf("\tfor (i = 0; i < b->hblitsize; i++) {\n\t\tULONG dstd, bltadat, srca;\n"); + if (c_is_on) printf("\t\tif (ptc) { srcc = do_get_mem_word((UWORD *)ptc); ptc -= 2; }\n"); + if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tULONG bltbdat = do_get_mem_word((UWORD *)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 = do_get_mem_word((UWORD *)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 = (((ULONG)bltadat << 16) | preva) >> b->blitdownashift;\n"); + if (a_is_on) printf("\t\tpreva = bltadat;\n"); + printf("\t\tdstd = (%s) & 0xFFFF;\n", blitops[blttbl[i]].s); + printf("\t\ttotald |= dstd;\n"); + printf("\t\tif (ptd) { do_put_mem_word((UWORD *)ptd, dstd); ptd -= 2; }\n"); printf("\t}\n"); - if (a_is_on) { - printf("\tif (b->hblitsize>1) {\n"); - printf("\t\tif (pta) { b->bltadat = (*pta << 8) | *(pta+1); pta -= 2; }\n"); - if (b_is_on) printf("\t\tif (ptb) { b->bltbdat = (*ptb << 8) | *(ptb+1); ptb -= 2; }\n"); - if (c_is_on) printf("\t\tif (ptc) { b->bltcdat = (*ptc << 8) | *(ptc+1); ptc -= 2; }\n"); - printf("\t\tbltaold=b->bltadat & b->bltalwm;\n"); - printf("\t\tsrca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);\n"); - if (b_is_on) printf("\t\tsrcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);\n"); - if (c_is_on) printf("\t\tsrcc=b->bltcdat;\n"); - printf("\t\tb->bltddat="); - generate_expr(blttbl[i],1); - printf("\t\tb->blitpreva=bltaold;\n"); - if (b_is_on) printf("\t\tb->blitprevb=b->bltbdat;\n"); - printf("\t\tif (b->bltddat) b->blitzero=0;\n"); - printf("\t\tif (ptd) { *ptd = b->bltddat >> 8; *(ptd+1) = b->bltddat; 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 (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("}\n"); + printf("if (totald == 0) b->blitzero = 1;\n"); printf("}\n"); } } @@ -343,6 +199,7 @@ static void generate_table(void) printf("#include \"config.h\"\n"); printf("#include \"options.h\"\n"); printf("#include \"custom.h\"\n"); + printf("#include \"memory.h\"\n"); printf("#include \"blitter.h\"\n"); printf("#include \"blitfunc.h\"\n\n"); printf("blitter_func *blitfunc_dofast[256] = {\n"); @@ -383,6 +240,7 @@ static void generate_header(void) int main(int argc, char **argv) { char mode = 'i'; + if (argc == 2) mode = *argv[1]; switch (mode) { case 'i': generate_include();