Annotation of uae/src/genblitter.c, revision 1.1.1.8

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.