|
|
1.1.1.3 ! root 1: /* 1.1 root 2: * UAE - The Un*x Amiga Emulator 1.1.1.3 ! root 3: * 1.1 root 4: * Optimized blitter minterm function generator 1.1.1.3 ! root 5: * 1.1 root 6: * Copyright 1995,1996 Bernd Schmidt 7: * Copyright 1996 Alessandro Bissacco 8: */ 9: 10: #include "sysconfig.h" 11: #include "sysdeps.h" 12: 1.1.1.2 root 13: #include "genblitter.h" 1.1 root 14: 15: /* Here is the minterm table used in blitter function generation */ 1.1.1.3 ! root 16: 1.1 root 17: static unsigned char blttbl[]= { 18: 0x00, 0x0a, 0x2a, 0x30, 0x3a, 0x3c, 0x4a, 0x6a, 0x8a, 0x8c, 0x9a, 0xa8, 19: 0xaa, 0xb1, 0xca, 0xcc, 0xd8, 0xe2, 0xea, 0xf0, 0xfa, 0xfc 20: }; 21: 22: static void generate_include(void) 23: { 24: int minterm; 1.1.1.3 ! root 25: printf("static __inline__ uae_u32 blit_func(uae_u32 srca, uae_u32 srcb, uae_u32 srcc, uae_u8 mt)\n{\nswitch(mt){\n"); 1.1 root 26: for (minterm = 0; minterm < 256; minterm++) { 27: printf("case 0x%x:\n", minterm); 1.1.1.2 root 28: printf("\treturn %s;\n", blitops[minterm].s); 1.1 root 29: } 30: printf("}\n"); 31: printf("return 0;\n"); /* No, sir, it doesn't! */ 32: printf("}\n"); 33: } 34: 35: static void generate_func(void) 36: { 37: unsigned int i; 38: printf("#include \"sysconfig.h\"\n"); 39: printf("#include \"sysdeps.h\"\n"); 40: printf("#include \"config.h\"\n"); 41: printf("#include \"options.h\"\n"); 42: printf("#include \"custom.h\"\n"); 1.1.1.2 root 43: printf("#include \"memory.h\"\n"); 1.1 root 44: printf("#include \"blitter.h\"\n"); 45: printf("#include \"blitfunc.h\"\n\n"); 46: 1.1.1.3 ! root 47: for (i = 0; i < sizeof(blttbl); i++) { 1.1.1.2 root 48: int active = blitops[blttbl[i]].used; 1.1.1.3 ! root 49: int a_is_on = active & 1, b_is_on = active & 2, c_is_on = active & 4; ! 50: ! 51: printf("void blitdofast_%x(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)\n",blttbl[i]); 1.1 root 52: printf("{\n"); 1.1.1.3 ! root 53: printf("int i,j;\n"); ! 54: printf("uae_u32 totald = 0;\n"); ! 55: printf("if (currprefs.blits_32bit_enabled && b->hblitsize > 1"); ! 56: if (a_is_on) printf(" && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff"); ! 57: if (b_is_on) printf(" && !b->blitbshift"); ! 58: printf(") {\n"); ! 59: if (a_is_on) printf("uae_u32 srca=((uae_u32)b->bltadat << 16) | b->bltadat;\n"); ! 60: if (b_is_on) printf("uae_u32 srcb=((uae_u32)b->bltbdat << 16) | b->bltbdat;\n"); ! 61: if (c_is_on) printf("uae_u32 srcc=((uae_u32)b->bltcdat << 16) | b->bltcdat;\n"); ! 62: printf("uae_u32 dest;\n"); 1.1 root 63: printf("int count=b->hblitsize/2, oddword=b->hblitsize&1;\n"); 1.1.1.3 ! root 64: printf("for (j=0;j<b->vblitsize;j++) {\n"); ! 65: printf("\tfor(i=0;i<count;i++) {\n"); ! 66: if (a_is_on) printf("\t\tif (pta) {srca=*((uae_u32 *)pta); pta += 4;}\n"); ! 67: if (b_is_on) printf("\t\tif (ptb) {srcb=*((uae_u32 *)ptb); ptb += 4;}\n"); ! 68: if (c_is_on) printf("\t\tif (ptc) {srcc=*((uae_u32 *)ptc); ptc += 4;}\n"); 1.1.1.2 root 69: printf("\t\tdest = %s;\n", blitops[blttbl[i]].s); 70: printf("\t\ttotald |= dest;\n"); 1.1.1.3 ! root 71: printf("\t\tif (ptd) {*(uae_u32 *)ptd=dest; ptd += 4;}\n"); 1.1 root 72: printf("\t}\n"); 73: printf("\tif (oddword) {\n"); 1.1.1.3 ! root 74: if (a_is_on) printf("\t\tif (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta += 2; }\n"); ! 75: if (b_is_on) printf("\t\tif (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb += 2; }\n"); ! 76: if (c_is_on) printf("\t\tif (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc += 2; }\n"); 1.1.1.2 root 77: printf("\t\tdest = %s;\n", blitops[blttbl[i]].s); 78: printf("\t\ttotald |= dest;\n"); 1.1.1.3 ! root 79: printf("\t\tif (ptd) { *(uae_u16 *)ptd= dest; ptd += 2; }\n"); 1.1 root 80: printf("\t}\n"); 1.1.1.3 ! root 81: if (a_is_on) printf("\tif (pta) pta += b->bltamod;\n"); ! 82: if (b_is_on) printf("\tif (ptb) ptb += b->bltbmod;\n"); 1.1 root 83: if (c_is_on) printf("\tif (ptc) ptc += b->bltcmod;\n"); 1.1.1.3 ! root 84: printf("\tif (ptd) ptd += b->bltdmod;\n"); 1.1 root 85: printf("}\n"); 1.1.1.3 ! root 86: 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 */ 1.1 root 87: if (b_is_on) printf("if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);\n"); 88: if (c_is_on) printf("if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);\n"); 89: printf("if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);\n"); 1.1.1.3 ! root 90: 1.1.1.2 root 91: printf("} else {\n"); 1.1.1.3 ! root 92: if (a_is_on) printf("uae_u32 preva = 0;\n"); ! 93: if (b_is_on) printf("uae_u32 prevb = 0, srcb = b->bltbhold;\n"); ! 94: if (c_is_on) printf("uae_u32 srcc = b->bltcdat;\n"); ! 95: printf("uae_u32 dstd=0;\n"); ! 96: printf("uae_u16 foo, *dstp = &foo;\n"); 1.1.1.2 root 97: printf("for (j = 0; j < b->vblitsize; j++) {\n"); 1.1.1.3 ! root 98: printf("\tfor (i = 0; i < b->hblitsize; i++) {\t\tuae_u32 bltadat, srca;\n\n"); ! 99: if (c_is_on) printf("\t\tif (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc += 2; }\n"); ! 100: if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tuae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb += 2;\n"); ! 101: if (b_is_on) printf("\t\t\tsrcb = (((uae_u32)prevb << 16) | bltbdat) >> b->blitbshift;\n"); 1.1.1.2 root 102: if (b_is_on) printf("\t\t\tprevb = bltbdat;\n\t\t}\n"); 1.1.1.3 ! root 103: if (a_is_on) printf("\t\tif (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta += 2; } else { bltadat = blt_info.bltadat; }\n"); 1.1.1.2 root 104: if (a_is_on) printf("\t\tbltadat &= blit_masktable[i];\n"); 1.1.1.3 ! root 105: if (a_is_on) printf("\t\tsrca = (((uae_u32)preva << 16) | bltadat) >> b->blitashift;\n"); 1.1.1.2 root 106: if (a_is_on) printf("\t\tpreva = bltadat;\n"); 1.1.1.3 ! root 107: printf("\t\tdo_put_mem_word (dstp, dstd);\n"); 1.1.1.2 root 108: printf("\t\tdstd = (%s) & 0xFFFF;\n", blitops[blttbl[i]].s); 109: printf("\t\ttotald |= dstd;\n"); 1.1.1.3 ! root 110: printf("\t\tif (ptd) { dstp = (uae_u16 *)ptd; ptd += 2; }\n"); 1.1 root 111: printf("\t}\n"); 112: if (a_is_on) printf("\tif (pta) pta += b->bltamod;\n"); 113: if (b_is_on) printf("\tif (ptb) ptb += b->bltbmod;\n"); 114: if (c_is_on) printf("\tif (ptc) ptc += b->bltcmod;\n"); 1.1.1.2 root 115: printf("\tif (ptd) ptd += b->bltdmod;\n"); 1.1 root 116: printf("}\n"); 1.1.1.2 root 117: if (b_is_on) printf("b->bltbhold = srcb;\n"); 118: if (c_is_on) printf("b->bltcdat = srcc;\n"); 1.1.1.3 ! root 119: printf("\t\tdo_put_mem_word (dstp, dstd);\n"); ! 120: printf("}\n"); ! 121: printf("if (totald != 0) b->blitzero = 0;\n"); 1.1 root 122: printf("}\n"); 1.1.1.3 ! root 123: ! 124: printf("void blitdofast_desc_%x(uae_u8 *pta, uae_u8 *ptb, uae_u8 *ptc, uae_u8 *ptd, struct bltinfo *b)\n",blttbl[i]); 1.1 root 125: printf("{\n"); 1.1.1.3 ! root 126: printf("uae_u32 totald = 0;\n"); 1.1 root 127: printf("int i,j;\n"); 1.1.1.3 ! root 128: ! 129: printf("if (currprefs.blits_32bit_enabled && b->hblitsize > 1"); ! 130: if (a_is_on) printf(" && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff"); ! 131: if (b_is_on) printf(" && !b->blitbshift"); ! 132: printf(") {\n"); ! 133: if (a_is_on) printf("uae_u32 srca = ((uae_u32)b->bltadat << 16) | b->bltadat;\n"); ! 134: if (b_is_on) printf("uae_u32 srcb = ((uae_u32)b->bltbdat << 16) | b->bltbdat;\n"); ! 135: if (c_is_on) printf("uae_u32 srcc = ((uae_u32)b->bltcdat << 16) | b->bltcdat;\n"); ! 136: printf("uae_u32 dest;\n"); 1.1 root 137: printf("int count=b->hblitsize/2, oddword=b->hblitsize&1;\n"); 1.1.1.3 ! root 138: printf("for (j=0;j<b->vblitsize;j++) {\n"); ! 139: printf("\tfor(i=0;i<count;i++) {\n"); ! 140: if (a_is_on) printf("\t\tif (pta) { srca=*((uae_u32 *)(pta-2)); pta -= 4;}\n"); ! 141: if (b_is_on) printf("\t\tif (ptb) { srcb=*((uae_u32 *)(ptb-2)); ptb -= 4;}\n"); ! 142: if (c_is_on) printf("\t\tif (ptc) { srcc=*((uae_u32 *)(ptc-2)); ptc -= 4;}\n"); 1.1.1.2 root 143: printf("\t\tdest = %s;\n", blitops[blttbl[i]].s); 144: printf("\t\ttotald |= dest;\n"); 1.1.1.3 ! root 145: printf("\t\tif (ptd) {*(uae_u32 *)(ptd-2)=dest; ptd -= 4;}\n"); ! 146: printf("\t}\n"); 1.1 root 147: printf("\tif (oddword) {\n"); 1.1.1.3 ! root 148: if (a_is_on) printf("\t\tif (pta) { srca=(uae_u32)*(uae_u16 *)pta; pta -= 2; }\n"); ! 149: if (b_is_on) printf("\t\tif (ptb) { srcb=(uae_u32)*(uae_u16 *)ptb; ptb -= 2; }\n"); ! 150: if (c_is_on) printf("\t\tif (ptc) { srcc=(uae_u32)*(uae_u16 *)ptc; ptc -= 2; }\n"); 1.1.1.2 root 151: printf("\t\tdest = %s;\n", blitops[blttbl[i]].s); 152: printf("\t\ttotald |= dest;\n"); 1.1.1.3 ! root 153: printf("\t\tif (ptd) { *(uae_u16 *)ptd= dest; ptd -= 2; }\n"); 1.1 root 154: printf("\t}\n"); 1.1.1.3 ! root 155: if (a_is_on) printf("\tif (pta) pta -= b->bltamod;\n"); ! 156: if (b_is_on) printf("\tif (ptb) ptb -= b->bltbmod;\n"); 1.1 root 157: if (c_is_on) printf("\tif (ptc) ptc -= b->bltcmod;\n"); 1.1.1.3 ! root 158: printf("\tif (ptd) ptd-=b->bltdmod;\n"); 1.1 root 159: printf("}\n"); 160: 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 */ 161: if (b_is_on) printf("if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);\n"); 162: if (c_is_on) printf("if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);\n"); 163: printf("if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);\n"); 1.1.1.3 ! root 164: 1.1.1.2 root 165: printf("} else {\n"); 1.1.1.3 ! root 166: if (a_is_on) printf("uae_u32 preva = 0;\n"); ! 167: if (b_is_on) printf("uae_u32 prevb = 0, srcb = b->bltbhold;\n"); ! 168: if (c_is_on) printf("uae_u32 srcc = b->bltcdat;\n"); ! 169: printf("uae_u32 dstd=0;\n"); ! 170: printf("uae_u16 foo, *dstp = &foo;\n"); 1.1.1.2 root 171: printf("for (j = 0; j < b->vblitsize; j++) {\n"); 1.1.1.3 ! root 172: printf("\tfor (i = 0; i < b->hblitsize; i++) {\n\t\tuae_u32 bltadat, srca;\n"); ! 173: if (c_is_on) printf("\t\tif (ptc) { srcc = do_get_mem_word((uae_u16 *)ptc); ptc -= 2; }\n"); ! 174: if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tuae_u32 bltbdat = do_get_mem_word((uae_u16 *)ptb); ptb -= 2;\n"); 1.1.1.2 root 175: if (b_is_on) printf("\t\t\tsrcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;\n"); 176: if (b_is_on) printf("\t\t\tprevb = bltbdat;\n\t\t}\n"); 1.1.1.3 ! root 177: if (a_is_on) printf("\t\tif (pta) { bltadat = do_get_mem_word((uae_u16 *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; }\n"); 1.1.1.2 root 178: if (a_is_on) printf("\t\tbltadat &= blit_masktable[i];\n"); 1.1.1.3 ! root 179: if (a_is_on) printf("\t\tsrca = (((uae_u32)bltadat << 16) | preva) >> b->blitdownashift;\n"); 1.1.1.2 root 180: if (a_is_on) printf("\t\tpreva = bltadat;\n"); 1.1.1.3 ! root 181: printf("\t\tdo_put_mem_word (dstp, dstd);\n"); 1.1.1.2 root 182: printf("\t\tdstd = (%s) & 0xFFFF;\n", blitops[blttbl[i]].s); 183: printf("\t\ttotald |= dstd;\n"); 1.1.1.3 ! root 184: printf("\t\tif (ptd) { dstp = (uae_u16 *)ptd; ptd -= 2; }\n"); 1.1 root 185: printf("\t}\n"); 1.1.1.2 root 186: if (a_is_on) printf("\tif (pta) pta -= b->bltamod;\n"); 187: if (b_is_on) printf("\tif (ptb) ptb -= b->bltbmod;\n"); 188: if (c_is_on) printf("\tif (ptc) ptc -= b->bltcmod;\n"); 189: printf("\tif (ptd) ptd -= b->bltdmod;\n"); 1.1 root 190: printf("}\n"); 1.1.1.2 root 191: if (b_is_on) printf("b->bltbhold = srcb;\n"); 192: if (c_is_on) printf("b->bltcdat = srcc;\n"); 1.1.1.3 ! root 193: printf("\t\tdo_put_mem_word (dstp, dstd);\n"); 1.1 root 194: printf("}\n"); 1.1.1.3 ! root 195: printf("if (totald != 0) b->blitzero = 0;\n"); 1.1 root 196: printf("}\n"); 197: } 198: } 1.1.1.3 ! root 199: 1.1 root 200: static void generate_table(void) 201: { 202: unsigned int index = 0; 203: unsigned int i; 204: printf("#include \"sysconfig.h\"\n"); 205: printf("#include \"sysdeps.h\"\n"); 206: printf("#include \"config.h\"\n"); 207: printf("#include \"options.h\"\n"); 208: printf("#include \"custom.h\"\n"); 1.1.1.2 root 209: printf("#include \"memory.h\"\n"); 1.1 root 210: printf("#include \"blitter.h\"\n"); 211: printf("#include \"blitfunc.h\"\n\n"); 212: printf("blitter_func *blitfunc_dofast[256] = {\n"); 213: for (i = 0; i < 256; i++) { 214: if (index < sizeof(blttbl) && i == blttbl[index]) { 215: printf("blitdofast_%x",i); 216: index++; 217: } 218: else printf("0"); 219: if (i < 255) printf(", "); 220: if ((i & 7) == 7) printf("\n"); 221: } 222: printf("};\n\n"); 1.1.1.3 ! root 223: 1.1 root 224: index = 0; 225: printf("blitter_func *blitfunc_dofast_desc[256] = {\n"); 226: for (i = 0; i < 256; i++) { 227: if (index < sizeof(blttbl) && i == blttbl[index]) { 228: printf("blitdofast_desc_%x",i); 229: index++; 230: } 231: else printf("0"); 232: if (i < 255) printf(", "); 233: if ((i & 7) == 7) printf("\n"); 234: } 235: printf("};\n"); 236: } 237: 238: static void generate_header(void) 239: { 240: unsigned int i; 241: for (i = 0; i < sizeof(blttbl); i++) { 242: printf("extern blitter_func blitdofast_%x;\n",blttbl[i]); 243: printf("extern blitter_func blitdofast_desc_%x;\n",blttbl[i]); 244: } 245: } 246: 247: int main(int argc, char **argv) 248: { 249: char mode = 'i'; 1.1.1.2 root 250: 1.1 root 251: if (argc == 2) mode = *argv[1]; 252: switch (mode) { 253: case 'i': generate_include(); 254: break; 255: case 'f': generate_func(); 256: break; 257: case 't': generate_table(); 258: break; 259: case 'h': generate_header(); 260: break; 261: default: abort(); 262: } 263: return 0; 264: } 265:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.