summaryrefslogblamecommitdiffstatshomepage
path: root/src/devices/video/epic12in.hxx
blob: c43e24cf480a41bfbdc308c946e8180f64d77c66 (plain) (tree)
1
2
3
4
5
6
7

                                  
                      
 
                                         
 
               























                       



                      
                

      
                
      
                 




                          

                                                   

                       
                                                 









                                                                                                                                                                  
                                                           
         
                                                                                      


                       
                                                           
         
                                                                                      




                       
                                                 









                                                    
                                                                
 
                                                          




                

                                                    


               
                                                    

               
                                                    





               
                                                    



      
                                           

                                                                        

                                                                            

                              
                                                 
                     
                                                 


                      
                                                       



                                                                                                                                                   
                                             






                                         







                                                  



                                    
                                 
                 
                                                  







                      
// license:BSD-3-Clause
// copyright-holders:David Haywood
/* blitter function */

void epic12_device::FUNCNAME(BLIT_PARAMS)
{
	int yf;

#if REALLY_SIMPLE == 0
	colour_t s_clr;
#endif

#if BLENDED == 1
	colour_t d_clr;

#if _SMODE == 2
#if _DMODE != 0
	colour_t clr0;
#endif
#elif _SMODE == 0
#if _DMODE != 0
#if _DMODE != 5
#if _DMODE != 1
	colour_t clr0;
#endif
#endif
#endif
#else
	colour_t clr0;
#endif

#endif

#if REALLY_SIMPLE == 1
#if TRANSPARENT == 1
	u32 pen;
#endif
#else
	u32 pen;
#endif
	u32 *bmp;

#if FLIPX == 1
	src_x += (dimx-1);
#endif

	if (flipy)  { yf = -1; src_y += (dimy-1); }
	else        { yf = +1;                    }

	int starty = 0;
	const int dst_y_end = dst_y_start + dimy;

	if (dst_y_start < clip->min_y)
		starty = clip->min_y - dst_y_start;

	if (dst_y_end > clip->max_y)
		dimy -= (dst_y_end-1) - clip->max_y;

	// check things are safe to draw (note, if the source would wrap round an edge of the 0x2000*0x1000 vram we don't draw.. not sure what the hw does anyway)
	// ddpdfk triggers this on boss explosions so it needs fixing
#if FLIPX == 1
	if ((src_x & 0x1fff) < ((src_x-(dimx-1)) & 0x1fff))
	{
	//  popmessage("sprite gets clipped off src_x %04x dimx %04x\n", src_x, dimx);
		return;
	}
#else
	if ((src_x & 0x1fff) > ((src_x+(dimx-1)) & 0x1fff))
	{
	//  popmessage("sprite gets clipped off src_x %04x dimx %04x\n", src_x, dimx);
		return;
	}
#endif

	int startx = 0;
	const int dst_x_end = dst_x_start + dimx;

	if (dst_x_start < clip->min_x)
		startx = clip->min_x - dst_x_start;

	if (dst_x_end > clip->max_x)
		dimx -= (dst_x_end-1) - clip->max_x;

// wrong/unsafe slowdown sim
	if (dimy > starty && dimx > startx)
	{
		blit_delay += (dimy - starty) * (dimx - startx);

		//printf("delay is now %d\n", blit_delay);
	}

#if BLENDED == 1
#if _SMODE == 0
#if _DMODE == 0
	const u8* salpha_table = colrtable[s_alpha];
	const u8* dalpha_table = colrtable[d_alpha];
#endif

#if _DMODE == 5
	const u8* salpha_table = colrtable[s_alpha];
#endif
#if _DMODE == 1
	const u8* salpha_table = colrtable[s_alpha];
#endif

#endif

#if _SMODE == 2
#if _DMODE == 0
	const u8* dalpha_table = colrtable[d_alpha];
#endif
#endif
#endif

	for (int y = starty; y < dimy; y++)
	{
		bmp = &bitmap->pix(dst_y_start + y, dst_x_start+startx);
		const int ysrc_index = ((src_y + yf * y) & 0x0fff) * 0x2000;
		u32* gfx2 = gfx + ysrc_index;

		#if FLIPX == 1
			gfx2 += (src_x - startx);
		#else
			gfx2 += (src_x + startx);
		#endif

#if 1
		const u32* end = bmp + (dimx - startx);
#else
		// maybe we can do some SSE type optimizations on larger blocks? right now this just results in more code and slower compiling tho.

		const int width = dimx-startx;
		const u32* end = bmp+(width);

		if (width<0) return;

		int bigblocks = width>>3;

		while (bigblocks)
		{
			#include "epic12pixel.hxx"
			#include "epic12pixel.hxx"
			#include "epic12pixel.hxx"
			#include "epic12pixel.hxx"
			#include "epic12pixel.hxx"
			#include "epic12pixel.hxx"
			#include "epic12pixel.hxx"
			#include "epic12pixel.hxx"

			bigblocks--;
		}
#endif
		while (bmp < end)
		{
			#include "epic12pixel.hxx"
		}

	}

//  g_profiler.stop();
}

#undef LOOP_INCREMENTS