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