home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD1.iso / Emulatoren / UAE061.LZH / uae-0.6.1 / genblitter.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-08-28  |  14.1 KB  |  402 lines

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