--- uae/src/genblitter.c 2018/04/24 16:39:04 1.1.1.2 +++ uae/src/genblitter.c 2018/04/24 16:39:59 1.1.1.3 @@ -1,8 +1,8 @@ - /* + /* * UAE - The Un*x Amiga Emulator - * + * * Optimized blitter minterm function generator - * + * * Copyright 1995,1996 Bernd Schmidt * Copyright 1996 Alessandro Bissacco */ @@ -13,7 +13,7 @@ #include "genblitter.h" /* Here is the minterm table used in blitter function generation */ - + static unsigned char blttbl[]= { 0x00, 0x0a, 0x2a, 0x30, 0x3a, 0x3c, 0x4a, 0x6a, 0x8a, 0x8c, 0x9a, 0xa8, 0xaa, 0xb1, 0xca, 0xcc, 0xd8, 0xe2, 0xea, 0xf0, 0xfa, 0xfc @@ -22,7 +22,7 @@ static unsigned char blttbl[]= { static void generate_include(void) { int minterm; - printf("static __inline__ ULONG blit_func(ULONG srca, ULONG srcb, ULONG srcc, UBYTE mt)\n{\nswitch(mt){\n"); + printf("static __inline__ uae_u32 blit_func(uae_u32 srca, uae_u32 srcb, uae_u32 srcc, uae_u8 mt)\n{\nswitch(mt){\n"); for (minterm = 0; minterm < 256; minterm++) { printf("case 0x%x:\n", minterm); printf("\treturn %s;\n", blitops[minterm].s); @@ -44,67 +44,70 @@ static void generate_func(void) printf("#include \"blitter.h\"\n"); printf("#include \"blitfunc.h\"\n\n"); - for (i = 0; i < sizeof(blttbl); i++) { + 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(UBYTE *pta, UBYTE *ptb, UBYTE *ptc, UBYTE *ptd, struct bltinfo *b)\n",blttbl[i]); + int a_is_on = active & 1, b_is_on = active & 2, c_is_on = active & 4; + + printf("void blitdofast_%x(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)\n",blttbl[i]); printf("{\n"); - printf("int i,j;\n"); - 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"); - 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 i,j;\n"); + printf("uae_u32 totald = 0;\n"); + printf("if (currprefs.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("uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;\n"); + if (b_is_on) printf("uae_u32 srcb=((uae_u32)b->bltbdat << 16) | b->bltbdat;\n"); + if (c_is_on) printf("uae_u32 srcc=((uae_u32)b->bltcdat << 16) | b->bltcdat;\n"); + printf("uae_u32 dest;\n"); printf("int count=b->hblitsize/2, oddword=b->hblitsize&1;\n"); - printf("for (j=0;jvblitsize;j++) {\n"); - printf("\tfor(i=0;ivblitsize;j++) {\n"); + printf("\tfor(i=0;ibltamod;\n"); - if (b_is_on) printf("\tif (ptb) ptb += b->bltbmod;\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("\tif (ptd) 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 (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"); - + 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"); + if (a_is_on) printf("uae_u32 preva = 0;\n"); + if (b_is_on) printf("uae_u32 prevb = 0, srcb = b->bltbhold;\n"); + if (c_is_on) printf("uae_u32 srcc = b->bltcdat;\n"); + printf("uae_u32 dstd=0;\n"); + printf("uae_u16 foo, *dstp = &foo;\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"); + printf("\tfor (i = 0; i < b->hblitsize; i++) {\t\tuae_u32 bltadat, srca;\n\n"); + if (c_is_on) printf("\t\tif (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc += 2; }\n"); + if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tuae_u32 bltbdat = do_get_mem_word((uae_u16 *)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 = do_get_mem_word((UWORD *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } \n"); + if (a_is_on) printf("\t\tif (pta) { bltadat = do_get_mem_word((uae_u16 *)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\tsrca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;\n"); if (a_is_on) printf("\t\tpreva = bltadat;\n"); + printf("\t\tdo_put_mem_word (dstp, dstd);\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\tif (ptd) { dstp = (uae_u16 *)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"); @@ -113,69 +116,72 @@ static void generate_func(void) printf("}\n"); if (b_is_on) printf("b->bltbhold = srcb;\n"); if (c_is_on) printf("b->bltcdat = srcc;\n"); + printf("\t\tdo_put_mem_word (dstp, dstd);\n"); + printf("}\n"); + printf("if (totald != 0) b->blitzero = 0;\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("void blitdofast_desc_%x(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)\n",blttbl[i]); printf("{\n"); - printf("ULONG totald = 0;\n"); + printf("uae_u32 totald = 0;\n"); printf("int i,j;\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"); - 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("if (currprefs.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("uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;\n"); + if (b_is_on) printf("uae_u32 srcb = ((uae_u32)b->bltbdat << 16) | b->bltbdat;\n"); + if (c_is_on) printf("uae_u32 srcc = ((uae_u32)b->bltcdat << 16) | b->bltcdat;\n"); + printf("uae_u32 dest;\n"); printf("int count=b->hblitsize/2, oddword=b->hblitsize&1;\n"); - printf("for (j=0;jvblitsize;j++) {\n"); - printf("\tfor(i=0;ivblitsize;j++) {\n"); + printf("\tfor(i=0;ibltamod;\n"); - if (b_is_on) printf("\tif (ptb) ptb -= b->bltbmod;\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("\tif (ptd) 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"); - + 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"); + if (a_is_on) printf("uae_u32 preva = 0;\n"); + if (b_is_on) printf("uae_u32 prevb = 0, srcb = b->bltbhold;\n"); + if (c_is_on) printf("uae_u32 srcc = b->bltcdat;\n"); + printf("uae_u32 dstd=0;\n"); + printf("uae_u16 foo, *dstp = &foo;\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"); + printf("\tfor (i = 0; i < b->hblitsize; i++) {\n\t\tuae_u32 bltadat, srca;\n"); + if (c_is_on) printf("\t\tif (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc -= 2; }\n"); + if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tuae_u32 bltbdat = do_get_mem_word((uae_u16 *)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\tif (pta) { bltadat = do_get_mem_word((uae_u16 *)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\tsrca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;\n"); if (a_is_on) printf("\t\tpreva = bltadat;\n"); + printf("\t\tdo_put_mem_word (dstp, dstd);\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\tif (ptd) { dstp = (uae_u16 *)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"); @@ -184,12 +190,13 @@ static void generate_func(void) printf("}\n"); if (b_is_on) printf("b->bltbhold = srcb;\n"); if (c_is_on) printf("b->bltcdat = srcc;\n"); + printf("\t\tdo_put_mem_word (dstp, dstd);\n"); printf("}\n"); - printf("if (totald == 0) b->blitzero = 1;\n"); + printf("if (totald != 0) b->blitzero = 0;\n"); printf("}\n"); } } - + static void generate_table(void) { unsigned int index = 0; @@ -213,7 +220,7 @@ static void generate_table(void) if ((i & 7) == 7) printf("\n"); } printf("};\n\n"); - + index = 0; printf("blitter_func *blitfunc_dofast_desc[256] = {\n"); for (i = 0; i < 256; i++) {