|
|
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:
13: #include "config.h"
14: #include "options.h"
15: /*#include "custom.h"*/
16:
17: UWORD dmacon;
18: /* Here is the minterm table used in blitter function generation */
19:
20: static unsigned char blttbl[]= {
21: 0x00, 0x0a, 0x2a, 0x30, 0x3a, 0x3c, 0x4a, 0x6a, 0x8a, 0x8c, 0x9a, 0xa8,
22: 0xaa, 0xb1, 0xca, 0xcc, 0xd8, 0xe2, 0xea, 0xf0, 0xfa, 0xfc
23: };
24:
25: static int bitset(int mt, int bit)
26: {
27: return mt & (1<<bit);
28: }
29:
30: static int generate_expr(int minterm, int print)
31: {
32: int result = 0;
33: int firstor = 1;
34: int bits = 0;
35: int i;
36: for(i=0; i<8; i++) {
37: if (bitset(minterm, i) && !bitset(bits,i)) {
38: int j;
39: int dontcare = 0;
40: int firstand = 1;
41: int bitbucket[8], bitcount;
42:
43: bits |= 1<<i;
44: bitcount = 1; bitbucket[0] = i;
45: for(j=1; j<8; j *= 2) {
46: int success = 1;
47: int k;
48: for(k=0; k < bitcount; k++) {
49: if (!bitset(minterm, bitbucket[k] ^ j)) {
50: success = 0;
51: }
52: }
53: if (success) {
54: int l;
55: dontcare |= j;
56: for(l=bitcount; l < bitcount*2; l++) {
57: bitbucket[l] = bitbucket[l-bitcount] ^ j;
58: bits |= 1 << bitbucket[l];
59: }
60: bitcount *= 2;
61: }
62: }
63: if (firstor) {
64: firstor = 0;
65: } else {
66: if (print) printf(" | ");
67: }
68: for (j=1; j<8; j *= 2) {
69: if (!(dontcare & j)) {
70: if (firstand) {
71: firstand = 0;
72: if (print) printf("(");
73: } else {
74: if (print) printf(" & ");
75: }
76: if (!(i & j))
77: if (print) printf("~");
78: if (print) printf("src%c", (j == 1 ? 'c' : j == 2 ? 'b' : 'a'));
79: result |= (j == 1 ? 4 : j == 2 ? 2 : 1);
80: }
81: }
82: if (!firstand) {
83: if (print) printf(")");
84: } else {
85: if (print) printf("0xFFFF");
86: }
87: }
88: }
89: if (firstor)
90: if (print) printf("0");
91: if (print) printf(";\n");
92: return result;
93: }
94:
95: static void generate_include(void)
96: {
97: int minterm;
98: printf("static __inline__ ULONG blit_func(ULONG srca, ULONG srcb, ULONG srcc, UBYTE mt)\n{\nswitch(mt){\n");
99: for (minterm = 0; minterm < 256; minterm++) {
100: printf("case 0x%x:\n", minterm);
101: printf("\treturn ");
102: generate_expr(minterm, 1);
103: }
104: printf("}\n");
105: printf("return 0;\n"); /* No, sir, it doesn't! */
106: printf("}\n");
107: }
108:
109: static void generate_func(void)
110: {
111: unsigned int i;
112: printf("#include \"sysconfig.h\"\n");
113: printf("#include \"sysdeps.h\"\n");
114: printf("#include \"config.h\"\n");
115: printf("#include \"options.h\"\n");
116: printf("#include \"custom.h\"\n");
117: printf("#include \"blitter.h\"\n");
118: printf("#include \"blitfunc.h\"\n\n");
119:
120: for (i = 0; i < sizeof(blttbl); i++) {
121: int active = generate_expr(blttbl[i],0);
122: int a_is_on = active & 1, b_is_on = active & 2, c_is_on = active & 4;
123:
124: printf("void blitdofast_%x(UBYTE *pta, UBYTE *ptb, UBYTE *ptc, UBYTE *ptd, struct bltinfo *b)\n",blttbl[i]);
125: printf("{\n");
126: printf("int i,j;\n");
127:
128: #if FAST_BLITTER == 3 || FAST_BLITTER == 5
129: printf("if (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("ULONG srca=((ULONG)b->bltadat << 16) | b->bltadat;\n");
134: if (b_is_on) printf("ULONG srcb=((ULONG)b->bltbdat << 16) | b->bltbdat;\n");
135: if (c_is_on) printf("ULONG srcc=((ULONG)b->bltcdat << 16) | b->bltcdat;\n");
136: printf("ULONG dest;\n");
137: printf("int count=b->hblitsize/2, oddword=b->hblitsize&1;\n");
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=*((ULONG *)pta); pta += 4;}\n");
141: if (b_is_on) printf("\t\tif (ptb) {srcb=*((ULONG *)ptb); ptb += 4;}\n");
142: if (c_is_on) printf("\t\tif (ptc) {srcc=*((ULONG *)ptc); ptc += 4;}\n");
143: printf("\t\tdest=");
144: generate_expr(blttbl[i],1);
145: printf("\t\tif (dest) b->blitzero=0;\n");
146: printf("\t\tif (ptd) {*(ULONG *)ptd=dest; ptd += 4;}\n");
147: printf("\t}\n");
148: printf("\tif (oddword) {\n");
149: if (a_is_on) printf("\t\tif (pta) { srca=(ULONG)*(UWORD *)pta; pta += 2; }\n");
150: if (b_is_on) printf("\t\tif (ptb) { srcb=(ULONG)*(UWORD *)ptb; ptb += 2; }\n");
151: if (c_is_on) printf("\t\tif (ptc) { srcc=(ULONG)*(UWORD *)ptc; ptc += 2; }\n");
152: printf("\t\tdest=");
153: generate_expr(blttbl[i],1);
154: printf("\t\tif (dest) b->blitzero=0;\n");
155: printf("\t\tif (ptd) { *(UWORD *)ptd= dest; ptd += 2; }\n");
156: printf("\t}\n");
157: if (a_is_on) printf("\tif (pta) pta += b->bltamod;\n");
158: if (b_is_on) printf("\tif (ptb) ptb += b->bltbmod;\n");
159: if (c_is_on) printf("\tif (ptc) ptc += b->bltcmod;\n");
160: printf("\tif (ptd) ptd += b->bltdmod;\n");
161: printf("}\n");
162: 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 */
163: if (b_is_on) printf("if (ptb) b->bltbdat = (*(ptb-b->bltbmod-2) << 8) | *(ptb - b->bltbmod - 1);\n");
164: if (c_is_on) printf("if (ptc) b->bltcdat = (*(ptc-b->bltcmod-2) << 8) | *(ptc - b->bltcmod - 1);\n");
165: printf("if (ptd) b->bltddat = (*(ptd-b->bltdmod-2) << 8) | *(ptd - b->bltdmod - 1);\n");
166:
167: printf("} else\n");
168: #endif
169: printf("{\n");
170:
171: printf("UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;\n");
172: if (a_is_on) printf("if (b->hblitsize==1) bltamask&=b->bltalwm;\n");
173: printf("for (j=0;j<b->vblitsize;j++) {\n");
174: if (a_is_on) {
175: printf("\tif (pta) { b->bltadat=(*pta << 8) | (*(pta+1)); pta+=2; }\n");
176: if (b_is_on) printf("\tif (ptb) { b->bltbdat=(*ptb << 8) | (*(ptb+1)); ptb+=2; }\n");
177: if (c_is_on) printf("\tif (ptc) { b->bltcdat=(*ptc << 8) | (*(ptc+1)); ptc+=2; };\n");
178: printf("\tbltaold=b->bltadat & bltamask;\n");
179: printf("\tsrca=(((ULONG)b->blitpreva << 16) | bltaold) >> b->blitashift;\n");
180: if (b_is_on) printf("\tsrcb=(((ULONG)b->blitprevb << 16) | b->bltbdat) >> b->blitbshift;\n");
181: if (c_is_on) printf("\tsrcc=b->bltcdat;\n");
182: printf("\tb->bltddat=");
183: generate_expr(blttbl[i],1);
184: printf("\tb->blitpreva=bltaold;\n");
185: if (b_is_on) printf("\tb->blitprevb=b->bltbdat;\n");
186: printf("\tif (b->bltddat) b->blitzero=0;\n");
187: printf("\tif (ptd) { *ptd = b->bltddat >> 8; *(ptd+1) = b->bltddat; ptd+= 2; }\n");
188: }
189: if (a_is_on) printf("\tfor (i=2;i<b->hblitsize;i++) {\n");
190: else printf("\tfor (i=0;i<b->hblitsize;i++) {\n");
191: if (a_is_on) printf("\t\tif (pta) { b->bltadat=(*pta << 8) | (*(pta+1)); pta+=2; }\n");
192: if (b_is_on) printf("\t\tif (ptb) { b->bltbdat=(*ptb << 8) | (*(ptb+1)); ptb+=2; }\n");
193: if (c_is_on) printf("\t\tif (ptc) { b->bltcdat=(*ptc << 8) | (*(ptc+1)); ptc+=2; }\n");
194: if (a_is_on) printf("\t\tsrca=(((ULONG)b->blitpreva<<16)|b->bltadat)>>b->blitashift;\n");
195: if (b_is_on) printf("\t\tsrcb=(((ULONG)b->blitprevb<<16)|b->bltbdat)>>b->blitbshift;\n");
196: if (c_is_on) printf("\t\tsrcc=b->bltcdat;\n");
197: printf("\t\tb->bltddat=");
198: generate_expr(blttbl[i],1);
199: if (a_is_on) printf("\t\tb->blitpreva=b->bltadat;\n");
200: if (b_is_on) printf("\t\tb->blitprevb=b->bltbdat;\n");
201: printf("\t\tif (b->bltddat) b->blitzero=0;\n");
202: printf("\t\tif (ptd) { *ptd = b->bltddat >> 8; *(ptd+1) = b->bltddat; ptd+= 2; }\n");
203: printf("\t}\n");
204: if (a_is_on) {
205: printf("\tif (b->hblitsize>1) {\n");
206: printf("\t\tif (pta) { b->bltadat=(*pta << 8) | (*(pta+1)); pta+=2; }\n");
207: if (b_is_on) printf("\t\tif (ptb) { b->bltbdat=(*ptb << 8) | (*(ptb+1)); ptb+=2; }\n");
208: if (c_is_on) printf("\t\tif (ptc) { b->bltcdat=(*ptc << 8) | (*(ptc+1)); ptc+=2; }\n");
209: printf("\t\tbltaold=b->bltadat & b->bltalwm;\n");
210: printf("\t\tsrca=(((ULONG)b->blitpreva << 16) | bltaold) >> b->blitashift;\n");
211: if (b_is_on) printf("\t\tsrcb=(((ULONG)b->blitprevb << 16) | b->bltbdat) >> b->blitbshift;\n");
212: if (c_is_on) printf("\t\tsrcc=b->bltcdat;\n");
213: printf("\t\tb->bltddat=");
214: generate_expr(blttbl[i],1);
215: printf("\t\tb->blitpreva=bltaold;\n");
216: if (b_is_on) printf("\t\tb->blitprevb=b->bltbdat;\n");
217: printf("\t\tif (b->bltddat) b->blitzero=0;\n");
218: printf("\t\tif (ptd) { *ptd = b->bltddat >> 8; *(ptd+1) = b->bltddat; ptd+= 2; }\n");
219: printf("\t}\n");
220: }
221: if (a_is_on) printf("\tif (pta) pta += b->bltamod;\n");
222: if (b_is_on) printf("\tif (ptb) ptb += b->bltbmod;\n");
223: if (c_is_on) printf("\tif (ptc) ptc += b->bltcmod;\n");
224: printf("\tif (ptd) ptd+=b->bltdmod;\n");
225: printf("}\n");
226: printf("}\n");
227: printf("}\n");
228:
229:
230: printf("void blitdofast_desc_%x(UBYTE *pta, UBYTE *ptb, UBYTE *ptc, UBYTE *ptd, struct bltinfo *b)\n",blttbl[i]);
231: printf("{\n");
232: printf("int i,j;\n");
233:
234: #if FAST_BLITTER == 3 || FAST_BLITTER == 5
235: printf("if (b->hblitsize>1");
236: if (a_is_on) printf(" && !b->blitashift && b->bltafwm==0xffff && b->bltalwm==0xffff");
237: if (b_is_on) printf(" && !b->blitbshift");
238: printf(") {\n");
239: if (a_is_on) printf("ULONG srca=((ULONG)b->bltadat << 16) | b->bltadat;\n");
240: if (b_is_on) printf("ULONG srcb=((ULONG)b->bltbdat << 16) | b->bltbdat;\n");
241: if (c_is_on) printf("ULONG srcc=((ULONG)b->bltcdat << 16) | b->bltcdat;\n");
242: printf("ULONG dest;\n");
243: printf("int count=b->hblitsize/2, oddword=b->hblitsize&1;\n");
244: printf("for (j=0;j<b->vblitsize;j++) {\n");
245: printf("\tfor(i=0;i<count;i++) {\n");
246: if (a_is_on) printf("\t\tif (pta) {srca=*((ULONG *)(pta-2)); pta -= 4;}\n");
247: if (b_is_on) printf("\t\tif (ptb) {srcb=*((ULONG *)(ptb-2)); ptb -= 4;}\n");
248: if (c_is_on) printf("\t\tif (ptc) {srcc=*((ULONG *)(ptc-2)); ptc -= 4;}\n");
249: printf("\t\tdest=");
250: generate_expr(blttbl[i],1);
251: printf("\t\tif (dest) b->blitzero=0;\n");
252: printf("\t\tif (ptd) {*(ULONG *)(ptd-2)=dest; ptd -= 4;}\n");
253: printf("\t}\n");
254: printf("\tif (oddword) {\n");
255: if (a_is_on) printf("\t\tif (pta) { srca=(ULONG)*(UWORD *)pta; pta -= 2; }\n");
256: if (b_is_on) printf("\t\tif (ptb) { srcb=(ULONG)*(UWORD *)ptb; ptb -= 2; }\n");
257: if (c_is_on) printf("\t\tif (ptc) { srcc=(ULONG)*(UWORD *)ptc; ptc -= 2; }\n");
258: printf("\t\tdest=");
259: generate_expr(blttbl[i],1);
260: printf("\t\tif (dest) b->blitzero=0;\n");
261: printf("\t\tif (ptd) { *(UWORD *)ptd= dest; ptd -= 2; }\n");
262: printf("\t}\n");
263: if (a_is_on) printf("\tif (pta) pta -= b->bltamod;\n");
264: if (b_is_on) printf("\tif (ptb) ptb -= b->bltbmod;\n");
265: if (c_is_on) printf("\tif (ptc) ptc -= b->bltcmod;\n");
266: printf("\tif (ptd) ptd-=b->bltdmod;\n");
267: printf("}\n");
268: 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 */
269: if (b_is_on) printf("if (ptb) b->bltbdat = (*(ptb + b->bltbmod + 2) << 8) | *(ptb + b->bltbmod + 1);\n");
270: if (c_is_on) printf("if (ptc) b->bltcdat = (*(ptc + b->bltcmod + 2) << 8) | *(ptc + b->bltcmod + 1);\n");
271: printf("if (ptd) b->bltddat = (*(ptd + b->bltdmod + 2) << 8) | *(ptd + b->bltdmod + 1);\n");
272:
273: printf("} else\n");
274: #endif
275: printf("{\n");
276:
277: printf("UWORD srca,srcb,srcc,bltaold,bltamask=b->bltafwm;\n");
278: if (a_is_on) printf("if (b->hblitsize==1) bltamask&=b->bltalwm;\n");
279: printf("for (j=0;j<b->vblitsize;j++) {\n");
280: if (a_is_on) {
281: printf("\tif (pta) { b->bltadat = (*pta << 8) | *(pta+1); pta -= 2; }\n");
282: if (b_is_on) printf("\tif (ptb) { b->bltbdat = (*ptb << 8) | *(ptb+1); ptb -= 2; }\n");
283: if (c_is_on) printf("\tif (ptc) { b->bltcdat = (*ptc << 8) | *(ptc+1); ptc -= 2; }\n");
284: printf("\tbltaold=b->bltadat & bltamask;\n");
285: printf("\tsrca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);\n");
286: if (b_is_on) printf("\tsrcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);\n");
287: if (c_is_on) printf("\tsrcc=b->bltcdat;\n");
288: printf("\tb->bltddat=");
289: generate_expr(blttbl[i],1);
290: printf("\tb->blitpreva=bltaold;\n");
291: if (b_is_on) printf("\tb->blitprevb=b->bltbdat;\n");
292: printf("\tif (b->bltddat) b->blitzero=0;\n");
293: printf("\tif (ptd) { *ptd = b->bltddat >> 8; *(ptd+1) = b->bltddat; ptd-= 2; }\n");
294: }
295: if (a_is_on) printf("\tfor (i=2;i<b->hblitsize;i++) {\n");
296: else printf("\tfor (i=0;i<b->hblitsize;i++) {\n");
297: if (a_is_on) printf("\t\tif (pta) { b->bltadat = (*pta << 8) | *(pta+1); pta -= 2; }\n");
298: if (b_is_on) printf("\t\tif (ptb) { b->bltbdat = (*ptb << 8) | *(ptb+1); ptb -= 2; }\n");
299: if (c_is_on) printf("\t\tif (ptc) { b->bltcdat = (*ptc << 8) | *(ptc+1); ptc -= 2; }\n");
300: if (a_is_on) printf("\t\tsrca=(((ULONG)b->bltadat<<16)|b->blitpreva)>>(16-b->blitashift);\n");
301: if (b_is_on) printf("\t\tsrcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);\n");
302: if (c_is_on) printf("\t\tsrcc=b->bltcdat;\n");
303: printf("\t\tb->bltddat=");
304: generate_expr(blttbl[i],1);
305: if (a_is_on) printf("\t\tb->blitpreva=b->bltadat;\n");
306: if (b_is_on) printf("\t\tb->blitprevb=b->bltbdat;\n");
307: printf("\t\tif (b->bltddat) b->blitzero=0;\n");
308: printf("\t\tif (ptd) { *ptd = b->bltddat >> 8; *(ptd+1) = b->bltddat; ptd-= 2; }\n");
309: printf("\t}\n");
310: if (a_is_on) {
311: printf("\tif (b->hblitsize>1) {\n");
312: printf("\t\tif (pta) { b->bltadat = (*pta << 8) | *(pta+1); pta -= 2; }\n");
313: if (b_is_on) printf("\t\tif (ptb) { b->bltbdat = (*ptb << 8) | *(ptb+1); ptb -= 2; }\n");
314: if (c_is_on) printf("\t\tif (ptc) { b->bltcdat = (*ptc << 8) | *(ptc+1); ptc -= 2; }\n");
315: printf("\t\tbltaold=b->bltadat & b->bltalwm;\n");
316: printf("\t\tsrca=(((ULONG)bltaold<<16)|b->blitpreva)>>(16-b->blitashift);\n");
317: if (b_is_on) printf("\t\tsrcb=(((ULONG)b->bltbdat<<16)|b->blitprevb)>>(16-b->blitbshift);\n");
318: if (c_is_on) printf("\t\tsrcc=b->bltcdat;\n");
319: printf("\t\tb->bltddat=");
320: generate_expr(blttbl[i],1);
321: printf("\t\tb->blitpreva=bltaold;\n");
322: if (b_is_on) printf("\t\tb->blitprevb=b->bltbdat;\n");
323: printf("\t\tif (b->bltddat) b->blitzero=0;\n");
324: printf("\t\tif (ptd) { *ptd = b->bltddat >> 8; *(ptd+1) = b->bltddat; ptd-= 2; }\n");
325: printf("\t}\n");
326: }
327: if (a_is_on) printf("\tif (pta) pta-=b->bltamod;\n");
328: if (b_is_on) printf("\tif (ptb) ptb-=b->bltbmod;\n");
329: if (c_is_on) printf("\tif (ptc) ptc-=b->bltcmod;\n");
330: printf("\tif (ptd) ptd-=b->bltdmod;\n");
331: printf("}\n");
332: printf("}\n");
333: printf("}\n");
334: }
335: }
336:
337: static void generate_table(void)
338: {
339: unsigned int index = 0;
340: unsigned int i;
341: printf("#include \"sysconfig.h\"\n");
342: printf("#include \"sysdeps.h\"\n");
343: printf("#include \"config.h\"\n");
344: printf("#include \"options.h\"\n");
345: printf("#include \"custom.h\"\n");
346: printf("#include \"blitter.h\"\n");
347: printf("#include \"blitfunc.h\"\n\n");
348: printf("blitter_func *blitfunc_dofast[256] = {\n");
349: for (i = 0; i < 256; i++) {
350: if (index < sizeof(blttbl) && i == blttbl[index]) {
351: printf("blitdofast_%x",i);
352: index++;
353: }
354: else printf("0");
355: if (i < 255) printf(", ");
356: if ((i & 7) == 7) printf("\n");
357: }
358: printf("};\n\n");
359:
360: index = 0;
361: printf("blitter_func *blitfunc_dofast_desc[256] = {\n");
362: for (i = 0; i < 256; i++) {
363: if (index < sizeof(blttbl) && i == blttbl[index]) {
364: printf("blitdofast_desc_%x",i);
365: index++;
366: }
367: else printf("0");
368: if (i < 255) printf(", ");
369: if ((i & 7) == 7) printf("\n");
370: }
371: printf("};\n");
372: }
373:
374: static void generate_header(void)
375: {
376: unsigned int i;
377: for (i = 0; i < sizeof(blttbl); i++) {
378: printf("extern blitter_func blitdofast_%x;\n",blttbl[i]);
379: printf("extern blitter_func blitdofast_desc_%x;\n",blttbl[i]);
380: }
381: }
382:
383: int main(int argc, char **argv)
384: {
385: char mode = 'i';
386: if (argc == 2) mode = *argv[1];
387: switch (mode) {
388: case 'i': generate_include();
389: break;
390: case 'f': generate_func();
391: break;
392: case 't': generate_table();
393: break;
394: case 'h': generate_header();
395: break;
396: default: abort();
397: }
398: return 0;
399: }
400:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.