|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * Optimized blitter minterm function generator
5: *
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 */
16:
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;
25: printf("static __inline__ ULONG blit_func(ULONG srca, ULONG srcb, ULONG srcc, UBYTE mt)\n{\nswitch(mt){\n");
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:
47: for (i = 0; i < sizeof(blttbl); i++) {
1.1.1.2 ! root 48: int active = blitops[blttbl[i]].used;
1.1 root 49: int a_is_on = active & 1, b_is_on = active & 2, c_is_on = active & 4;
50:
51: printf("void blitdofast_%x(UBYTE *pta, UBYTE *ptb, UBYTE *ptc, UBYTE *ptd, struct bltinfo *b)\n",blttbl[i]);
52: printf("{\n");
53: printf("int i,j;\n");
1.1.1.2 ! root 54: printf("ULONG totald = 0;\n");
! 55: printf("if (blits_32bit_enabled && b->hblitsize > 1");
1.1 root 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("ULONG srca=((ULONG)b->bltadat << 16) | b->bltadat;\n");
60: if (b_is_on) printf("ULONG srcb=((ULONG)b->bltbdat << 16) | b->bltbdat;\n");
61: if (c_is_on) printf("ULONG srcc=((ULONG)b->bltcdat << 16) | b->bltcdat;\n");
62: printf("ULONG dest;\n");
63: printf("int count=b->hblitsize/2, oddword=b->hblitsize&1;\n");
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=*((ULONG *)pta); pta += 4;}\n");
67: if (b_is_on) printf("\t\tif (ptb) {srcb=*((ULONG *)ptb); ptb += 4;}\n");
68: if (c_is_on) printf("\t\tif (ptc) {srcc=*((ULONG *)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 root 71: printf("\t\tif (ptd) {*(ULONG *)ptd=dest; ptd += 4;}\n");
72: printf("\t}\n");
73: printf("\tif (oddword) {\n");
74: if (a_is_on) printf("\t\tif (pta) { srca=(ULONG)*(UWORD *)pta; pta += 2; }\n");
75: if (b_is_on) printf("\t\tif (ptb) { srcb=(ULONG)*(UWORD *)ptb; ptb += 2; }\n");
76: if (c_is_on) printf("\t\tif (ptc) { srcc=(ULONG)*(UWORD *)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 root 79: printf("\t\tif (ptd) { *(UWORD *)ptd= dest; ptd += 2; }\n");
80: printf("\t}\n");
81: if (a_is_on) printf("\tif (pta) pta += b->bltamod;\n");
82: if (b_is_on) printf("\tif (ptb) ptb += b->bltbmod;\n");
83: if (c_is_on) printf("\tif (ptc) ptc += b->bltcmod;\n");
84: printf("\tif (ptd) ptd += b->bltdmod;\n");
85: printf("}\n");
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 */
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");
90:
1.1.1.2 ! root 91: printf("} else {\n");
! 92: if (a_is_on) printf("ULONG preva = 0;\n");
! 93: if (b_is_on) printf("ULONG prevb = 0, srcb = b->bltbhold;\n");
! 94: if (c_is_on) printf("ULONG srcc = b->bltcdat;\n");
! 95: printf("for (j = 0; j < b->vblitsize; j++) {\n");
! 96: printf("\tfor (i = 0; i < b->hblitsize; i++) {\t\tULONG dstd, bltadat, srca;\n\n");
! 97: if (c_is_on) printf("\t\tif (ptc) { srcc = do_get_mem_word((UWORD *)ptc); ptc += 2; }\n");
! 98: if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tULONG bltbdat = do_get_mem_word((UWORD *)ptb); ptb += 2;\n");
! 99: if (b_is_on) printf("\t\t\tsrcb = (((ULONG)prevb << 16) | bltbdat) >> b->blitbshift;\n");
! 100: if (b_is_on) printf("\t\t\tprevb = bltbdat;\n\t\t}\n");
! 101: if (a_is_on) printf("\t\tif (pta) { bltadat = do_get_mem_word((UWORD *)pta); pta += 2; } else { bltadat = blt_info.bltadat; } \n");
! 102: if (a_is_on) printf("\t\tbltadat &= blit_masktable[i];\n");
! 103: if (a_is_on) printf("\t\tsrca = (((ULONG)preva << 16) | bltadat) >> b->blitashift;\n");
! 104: if (a_is_on) printf("\t\tpreva = bltadat;\n");
! 105: printf("\t\tdstd = (%s) & 0xFFFF;\n", blitops[blttbl[i]].s);
! 106: printf("\t\ttotald |= dstd;\n");
! 107: printf("\t\tif (ptd) { do_put_mem_word((UWORD *)ptd, dstd); ptd += 2; }\n");
1.1 root 108: printf("\t}\n");
109: if (a_is_on) printf("\tif (pta) pta += b->bltamod;\n");
110: if (b_is_on) printf("\tif (ptb) ptb += b->bltbmod;\n");
111: if (c_is_on) printf("\tif (ptc) ptc += b->bltcmod;\n");
1.1.1.2 ! root 112: printf("\tif (ptd) ptd += b->bltdmod;\n");
1.1 root 113: printf("}\n");
1.1.1.2 ! root 114: if (b_is_on) printf("b->bltbhold = srcb;\n");
! 115: if (c_is_on) printf("b->bltcdat = srcc;\n");
1.1 root 116: printf("}\n");
1.1.1.2 ! root 117: printf("if (totald == 0) b->blitzero = 1;\n");
! 118: printf("}\n");
1.1 root 119:
120: printf("void blitdofast_desc_%x(UBYTE *pta, UBYTE *ptb, UBYTE *ptc, UBYTE *ptd, struct bltinfo *b)\n",blttbl[i]);
121: printf("{\n");
1.1.1.2 ! root 122: printf("ULONG totald = 0;\n");
1.1 root 123: printf("int i,j;\n");
124:
1.1.1.2 ! root 125: printf("if (blits_32bit_enabled && b->hblitsize > 1");
1.1 root 126: if (a_is_on) printf(" && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff");
127: if (b_is_on) printf(" && !b->blitbshift");
128: printf(") {\n");
1.1.1.2 ! root 129: if (a_is_on) printf("ULONG srca = ((ULONG)b->bltadat << 16) | b->bltadat;\n");
! 130: if (b_is_on) printf("ULONG srcb = ((ULONG)b->bltbdat << 16) | b->bltbdat;\n");
! 131: if (c_is_on) printf("ULONG srcc = ((ULONG)b->bltcdat << 16) | b->bltcdat;\n");
1.1 root 132: printf("ULONG dest;\n");
133: printf("int count=b->hblitsize/2, oddword=b->hblitsize&1;\n");
134: printf("for (j=0;j<b->vblitsize;j++) {\n");
135: printf("\tfor(i=0;i<count;i++) {\n");
1.1.1.2 ! root 136: if (a_is_on) printf("\t\tif (pta) { srca=*((ULONG *)(pta-2)); pta -= 4;}\n");
! 137: if (b_is_on) printf("\t\tif (ptb) { srcb=*((ULONG *)(ptb-2)); ptb -= 4;}\n");
! 138: if (c_is_on) printf("\t\tif (ptc) { srcc=*((ULONG *)(ptc-2)); ptc -= 4;}\n");
! 139: printf("\t\tdest = %s;\n", blitops[blttbl[i]].s);
! 140: printf("\t\ttotald |= dest;\n");
1.1 root 141: printf("\t\tif (ptd) {*(ULONG *)(ptd-2)=dest; ptd -= 4;}\n");
142: printf("\t}\n");
143: printf("\tif (oddword) {\n");
144: if (a_is_on) printf("\t\tif (pta) { srca=(ULONG)*(UWORD *)pta; pta -= 2; }\n");
145: if (b_is_on) printf("\t\tif (ptb) { srcb=(ULONG)*(UWORD *)ptb; ptb -= 2; }\n");
146: if (c_is_on) printf("\t\tif (ptc) { srcc=(ULONG)*(UWORD *)ptc; ptc -= 2; }\n");
1.1.1.2 ! root 147: printf("\t\tdest = %s;\n", blitops[blttbl[i]].s);
! 148: printf("\t\ttotald |= dest;\n");
1.1 root 149: printf("\t\tif (ptd) { *(UWORD *)ptd= dest; ptd -= 2; }\n");
150: printf("\t}\n");
151: if (a_is_on) printf("\tif (pta) pta -= b->bltamod;\n");
152: if (b_is_on) printf("\tif (ptb) ptb -= b->bltbmod;\n");
153: if (c_is_on) printf("\tif (ptc) ptc -= b->bltcmod;\n");
154: printf("\tif (ptd) ptd-=b->bltdmod;\n");
155: printf("}\n");
156: 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 */
157: if (b_is_on) printf("if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);\n");
158: if (c_is_on) printf("if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);\n");
159: printf("if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);\n");
160:
1.1.1.2 ! root 161: printf("} else {\n");
! 162: if (a_is_on) printf("ULONG preva = 0;\n");
! 163: if (b_is_on) printf("ULONG prevb = 0, srcb = b->bltbhold;\n");
! 164: if (c_is_on) printf("ULONG srcc = b->bltcdat;\n");
! 165: printf ("ULONG dstd;\n");
! 166: printf("for (j = 0; j < b->vblitsize; j++) {\n");
! 167: printf("\tfor (i = 0; i < b->hblitsize; i++) {\n\t\tULONG dstd, bltadat, srca;\n");
! 168: if (c_is_on) printf("\t\tif (ptc) { srcc = do_get_mem_word((UWORD *)ptc); ptc -= 2; }\n");
! 169: if (b_is_on) printf("\t\tif (ptb) {\n\t\t\tULONG bltbdat = do_get_mem_word((UWORD *)ptb); ptb -= 2;\n");
! 170: if (b_is_on) printf("\t\t\tsrcb = ((bltbdat << 16) | prevb) >> b->blitdownbshift;\n");
! 171: if (b_is_on) printf("\t\t\tprevb = bltbdat;\n\t\t}\n");
! 172: if (a_is_on) printf("\t\tif (pta) { bltadat = do_get_mem_word((UWORD *)pta); pta -= 2; } else { bltadat = blt_info.bltadat; } \n");
! 173: if (a_is_on) printf("\t\tbltadat &= blit_masktable[i];\n");
! 174: if (a_is_on) printf("\t\tsrca = (((ULONG)bltadat << 16) | preva) >> b->blitdownashift;\n");
! 175: if (a_is_on) printf("\t\tpreva = bltadat;\n");
! 176: printf("\t\tdstd = (%s) & 0xFFFF;\n", blitops[blttbl[i]].s);
! 177: printf("\t\ttotald |= dstd;\n");
! 178: printf("\t\tif (ptd) { do_put_mem_word((UWORD *)ptd, dstd); ptd -= 2; }\n");
1.1 root 179: printf("\t}\n");
1.1.1.2 ! root 180: if (a_is_on) printf("\tif (pta) pta -= b->bltamod;\n");
! 181: if (b_is_on) printf("\tif (ptb) ptb -= b->bltbmod;\n");
! 182: if (c_is_on) printf("\tif (ptc) ptc -= b->bltcmod;\n");
! 183: printf("\tif (ptd) ptd -= b->bltdmod;\n");
1.1 root 184: printf("}\n");
1.1.1.2 ! root 185: if (b_is_on) printf("b->bltbhold = srcb;\n");
! 186: if (c_is_on) printf("b->bltcdat = srcc;\n");
1.1 root 187: printf("}\n");
1.1.1.2 ! root 188: printf("if (totald == 0) b->blitzero = 1;\n");
1.1 root 189: printf("}\n");
190: }
191: }
192:
193: static void generate_table(void)
194: {
195: unsigned int index = 0;
196: unsigned int i;
197: printf("#include \"sysconfig.h\"\n");
198: printf("#include \"sysdeps.h\"\n");
199: printf("#include \"config.h\"\n");
200: printf("#include \"options.h\"\n");
201: printf("#include \"custom.h\"\n");
1.1.1.2 ! root 202: printf("#include \"memory.h\"\n");
1.1 root 203: printf("#include \"blitter.h\"\n");
204: printf("#include \"blitfunc.h\"\n\n");
205: printf("blitter_func *blitfunc_dofast[256] = {\n");
206: for (i = 0; i < 256; i++) {
207: if (index < sizeof(blttbl) && i == blttbl[index]) {
208: printf("blitdofast_%x",i);
209: index++;
210: }
211: else printf("0");
212: if (i < 255) printf(", ");
213: if ((i & 7) == 7) printf("\n");
214: }
215: printf("};\n\n");
216:
217: index = 0;
218: printf("blitter_func *blitfunc_dofast_desc[256] = {\n");
219: for (i = 0; i < 256; i++) {
220: if (index < sizeof(blttbl) && i == blttbl[index]) {
221: printf("blitdofast_desc_%x",i);
222: index++;
223: }
224: else printf("0");
225: if (i < 255) printf(", ");
226: if ((i & 7) == 7) printf("\n");
227: }
228: printf("};\n");
229: }
230:
231: static void generate_header(void)
232: {
233: unsigned int i;
234: for (i = 0; i < sizeof(blttbl); i++) {
235: printf("extern blitter_func blitdofast_%x;\n",blttbl[i]);
236: printf("extern blitter_func blitdofast_desc_%x;\n",blttbl[i]);
237: }
238: }
239:
240: int main(int argc, char **argv)
241: {
242: char mode = 'i';
1.1.1.2 ! root 243:
1.1 root 244: if (argc == 2) mode = *argv[1];
245: switch (mode) {
246: case 'i': generate_include();
247: break;
248: case 'f': generate_func();
249: break;
250: case 't': generate_table();
251: break;
252: case 'h': generate_header();
253: break;
254: default: abort();
255: }
256: return 0;
257: }
258:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.