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

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: 

unix.superglobalmegacorp.com

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