Previous 15994 Revisions Next

r9121 Monday 13th September, 2010 at 19:19:45 UTC by Angelo Salese
[SUPER A'CAN]: Added direct sprite tiles, used by feet of fighters in Sango Fighter [David Haywood]
[src/mess/drivers]supracan.c

src/mess/drivers/supracan.c
r9120r9121
470470//      zzzz ---- ---- ---- X scale
471471//      ---- ---x xxxx xxxx X position
472472//      [3]
473//      oooo oooo oooo oooo Sprite address
473//      d--- ---- ---- ---- Direct Sprite (use details from here, not looked up in vram)
474//      -ooo oooo oooo oooo Sprite address
474475
475476   UINT32 skip_count = 0;
476477    UINT32 start_word = (state->sprite_base_addr >> 1) + skip_count * 4;
r9120r9121
480481//   printf("frame\n");
481482   #define VRAM_MASK (0xffff)
482483
484
483485   for(int i = start_word; i < end_word; i += 4)
484486   {
485487      int x = supracan_vram[i+2] & 0x01ff;
r9120r9121
487489
488490      int sprite_offset = (supracan_vram[i+3])<< 1;
489491
490      sprite_offset &= VRAM_MASK; // there are only 0xffff words of vram? sango is specifying tiles outside of this, why, I'm sure it didn't used to, timing? DMA?
492      //sprite_offset &= VRAM_MASK; // there are only 0xffff words of vram? sango is specifying tiles outside of this, why, I'm sure it didn't used to, timing? DMA?
491493
492494
493495      int bank = (supracan_vram[i+1] & 0xf000) >> 12;
494496        //int mask = (supracan_vram[i+1] & 0x0300) >> 8;
495      bool hflip = (supracan_vram[i+1] & 0x0800) ? true : false;
496      bool vflip = (supracan_vram[i+1] & 0x0400) ? true : false;
497      bool sprite_xflip = (supracan_vram[i+1] & 0x0800) ? true : false;
498      bool sprite_yflip = (supracan_vram[i+1] & 0x0400) ? true : false;
497499        //int xscale = (supracan_vram[i+2] & 0xf000) >> 12;
498500      const gfx_element *gfx = machine->gfx[region];
499501
r9120r9121
513515*/
514516
515517
516
517
518518      // wraparound
519519      if (y>=0x180) y-=0x200;
520520      if (x>=0x180) x-=0x200;
521521
522522      if(supracan_vram[i+3] != 0)
523523      {
524            int xsize = 1 << (supracan_vram[i+1] & 7);
525            int ysize = ((supracan_vram[i+0] & 0x1e00) >> 9) + 1;
524         if (supracan_vram[i+3] &0x8000)
525         {
526            UINT16 data = supracan_vram[i+3];
527            int tile = (bank * 0x200) + (data & 0x03ff);
528           
529            int palette = (data & 0xf000) >> 12; // this might not be correct, due to the &0x8000 condition above this would force all single tile sprites to be using palette >=0x8 only
530           
531            //printf("sprite data %04x %04x %04x %04x\n", supracan_vram[i+0] , supracan_vram[i+1] , supracan_vram[i+2] ,supracan_vram[i+3]  );
526532
527         if(vflip)
533            drawgfx_transpen(bitmap,cliprect,gfx,tile,palette,sprite_xflip,sprite_yflip,
534               x,
535               y,
536               0);
537         
538         }
539         else
528540         {
529            for(int ytile = (ysize - 1); ytile >= 0; ytile--)
541            int xsize = 1 << (supracan_vram[i+1] & 7);
542            int ysize = ((supracan_vram[i+0] & 0x1e00) >> 9) + 1;
543
544            if(sprite_yflip)
530545            {
531               if(hflip)
546               for(int ytile = (ysize - 1); ytile >= 0; ytile--)
532547               {
533                  for(int xtile = (xsize - 1); xtile >= 0; xtile--)
548                  if(sprite_xflip)
534549                  {
535                            UINT16 data = supracan_vram[(sprite_offset+ytile*xsize+xtile)&VRAM_MASK];
536                     int tile = (bank * 0x200) + (data & 0x03ff);
537                            bool xflip = (data & 0x0800) ? false : true;
538                            bool yflip = (data & 0x0400) ? false : true;
539                            int palette = (data & 0xf000) >> 12;
540                     int xpos = x + ((xsize - 1) - xtile)*8;
541                     int ypos = y + ((ysize - 1) - ytile)*8;
550                     for(int xtile = (xsize - 1); xtile >= 0; xtile--)
551                     {
552                        UINT16 data = supracan_vram[(sprite_offset+ytile*xsize+xtile)&VRAM_MASK];
553                        int tile = (bank * 0x200) + (data & 0x03ff);
554                        int tile_xflip = (data & 0x0800) ? false : true;
555                        int tile_yflip = (data & 0x0400) ? false : true;
556                        int palette = (data & 0xf000) >> 12;
557                        int xpos = x + ((xsize - 1) - xtile)*8;
558                        int ypos = y + ((ysize - 1) - ytile)*8;
542559
543                     drawgfx_transpen(bitmap,cliprect,gfx,tile,palette,xflip,yflip,
544                     xpos,
545                     ypos,
546                     0);
560                        drawgfx_transpen(bitmap,cliprect,gfx,tile,palette,tile_xflip,tile_yflip,
561                        xpos,
562                        ypos,
563                        0);
547564
565                     }
548566                  }
549               }
550               else
551               {
552                  for(int xtile = 0; xtile < xsize; xtile++)
567                  else
553568                  {
554                            UINT16 data = supracan_vram[(sprite_offset+ytile*xsize+xtile)&VRAM_MASK];
555                     int tile = (bank * 0x200) + (data & 0x03ff);
556                            bool xflip = (data & 0x0800) ? true : false;
557                            bool yflip = (data & 0x0400) ? false : true;
558                            int palette = (data & 0xf000) >> 12;
569                     for(int xtile = 0; xtile < xsize; xtile++)
570                     {
571                        UINT16 data = supracan_vram[(sprite_offset+ytile*xsize+xtile)&VRAM_MASK];
572                        int tile = (bank * 0x200) + (data & 0x03ff);
573                        int tile_xflip = (data & 0x0800) ? true : false;
574                        int tile_yflip = (data & 0x0400) ? false : true;
575                        int palette = (data & 0xf000) >> 12;
559576
560                     int xpos = x + xtile*8;
561                     int ypos = y + ((ysize - 1) - ytile)*8;
577                        int xpos = x + xtile*8;
578                        int ypos = y + ((ysize - 1) - ytile)*8;
562579
563                     drawgfx_transpen(bitmap,cliprect,gfx,tile,palette,xflip,yflip,
564                     xpos,
565                     ypos,
566                     0);
580                        drawgfx_transpen(bitmap,cliprect,gfx,tile,palette,tile_xflip,tile_yflip,
581                        xpos,
582                        ypos,
583                        0);
584                     }
567585                  }
568586               }
569587            }
570         }
571         else
572         {
573            for(int ytile = 0; ytile < ysize; ytile++)
588            else
574589            {
575               if(hflip)
590               for(int ytile = 0; ytile < ysize; ytile++)
576591               {
577                  for(int xtile = (xsize - 1); xtile >= 0; xtile--)
592                  if(sprite_xflip)
578593                  {
579                            UINT16 data = supracan_vram[(sprite_offset+ytile*xsize+xtile)&VRAM_MASK];
580                     int tile = (bank * 0x200) + (data & 0x03ff);
581                            bool xflip = (data & 0x0800) ? false : true;
582                            bool yflip = (data & 0x0400) ? true : false;
583                            int palette = (data & 0xf000) >> 12;
594                     for(int xtile = (xsize - 1); xtile >= 0; xtile--)
595                     {
596                        UINT16 data = supracan_vram[(sprite_offset+ytile*xsize+xtile)&VRAM_MASK];
597                        int tile = (bank * 0x200) + (data & 0x03ff);
598                        int tile_xflip = (data & 0x0800) ? false : true;
599                        int tile_yflip = (data & 0x0400) ? true : false;
600                        int palette = (data & 0xf000) >> 12;
584601
585                     int xpos = x + ((xsize - 1) - xtile)*8;
586                     int ypos = y + ytile*8;
602                        int xpos = x + ((xsize - 1) - xtile)*8;
603                        int ypos = y + ytile*8;
587604
588                     drawgfx_transpen(bitmap,cliprect,gfx,tile,palette,xflip,yflip,
589                     xpos,
590                     ypos,
591                     0);
605                        drawgfx_transpen(bitmap,cliprect,gfx,tile,palette,tile_xflip,tile_yflip,
606                        xpos,
607                        ypos,
608                        0);
609                     }
592610                  }
593               }
594               else
595               {
596                  for(int xtile = 0; xtile < xsize; xtile++)
611                  else
597612                  {
598                            UINT16 data = supracan_vram[(sprite_offset+ytile*xsize+xtile)&VRAM_MASK];
599                     int tile = (bank * 0x200) + (data & 0x03ff);
600                            bool xflip = (data & 0x0800) ? true : false;
601                            bool yflip = (data & 0x0400) ? true : false;
602                            int palette = (data & 0xf000) >> 12;
613                     for(int xtile = 0; xtile < xsize; xtile++)
614                     {
615                        UINT16 data = supracan_vram[(sprite_offset+ytile*xsize+xtile)&VRAM_MASK];
616                        int tile = (bank * 0x200) + (data & 0x03ff);
617                        int tile_xflip = (data & 0x0800) ? true : false;
618                        int tile_yflip = (data & 0x0400) ? true : false;
619                        int palette = (data & 0xf000) >> 12;
603620
604                     int xpos = x + xtile*8;
605                     int ypos = y + ytile*8;
621                        int xpos = x + xtile*8;
622                        int ypos = y + ytile*8;
606623
607                     drawgfx_transpen(bitmap,cliprect,gfx,tile,palette,xflip,yflip,
608                     xpos,
609                     ypos,
610                     0);
624                        drawgfx_transpen(bitmap,cliprect,gfx,tile,palette,tile_xflip,tile_yflip,
625                        xpos,
626                        ypos,
627                        0);
611628
629                     }
612630                  }
613631               }
614632            }
615633         }
616
617634#if 0
618635            if(xscale == 0) continue;
619636            UINT32 delta = (1 << 17) / xscale;

Previous 15994 Revisions Next


© 1998-2018 The MESS Team