summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/video/momoko.cpp
blob: 06292f1236778630be50c3349e48e1163e09d9ef (plain) (tree)
1
2
3
4
5
6
7
                       
                        

                                                                                
                               
 
                                




                                                                                
                
                            
 
 
                                                
 
                            
 
 
                                                
 
                            
 
 
                                               
 

                                  
 
 
                                                  
 
                              
 
 
                                               
 
                           
 
 
                                                
 
                                    
 
 
                                                
 
                                    
 
 
                                               
 

                                  
 
 
                                                 
 
                                    
 
 
                                                
 
                                   
 
 

                                                                              
                                                                                                                            
 
                                    


                                                    

                                  
         

                                           
                 



                                                            

                                                                                                              





                                                                           
                                                                                    
 








                                                                              
                                                                                                                   

                                                                                       
                                         
 



                                                         

 
                                                              
 
                           



                                                            
 
                           
         
                                        
                 
                                                
                         

                                                                                        

                                                                                                       
 
                                              
                                 

                                                            


                                    

                                                                    

                                 
                                                                            


                                                  
                                               



                         
                                   

 

                                              
         
                                                                                
                                                          






                                                                          

                               
                                     


                    

                                     

                 
                                                              


                               
                                 


         
                           
                          
         
                                        
                 
                                                
                         

                                                                                         
                                                                                                

                                                        
                                              
                                 

                                                            
                                         

                                    

                                                                    



                                                         
                                                                      
                                                                                                      





                                 
                                   
                                                                 
         
                                                                                
                                                          






                                                                          

                               
                                     


                    

                                     
                 
                                                              


                               
                                 


         

                                  
         
                                        

                               
                                             
                                                                           

                            
                                                         
                                                             
                                                                    
                         

                                      
                         
                                           



                                       

                                                 
                         
                                                                      
                                                                        

                                       
                                         



                 
                           
                           
         



                                            
 
                                        
                 
                                                
                         
                                                                                                                     

                                                    
                                 

                                                            


                                    

                                                                    
                                 
                                                                              


                                                             
                                                 




                         
// license:BSD-3-Clause
// copyright-holders:Uki
/*******************************************************************************

    Momoko 120% (c) 1986 Jaleco

    Video hardware driver by Uki

    02/Mar/2001 -

*******************************************************************************/

#include "emu.h"
#include "includes/momoko.h"


WRITE8_MEMBER(momoko_state::momoko_fg_scrollx_w)
{
	m_fg_scrollx = data;
}

WRITE8_MEMBER(momoko_state::momoko_fg_scrolly_w)
{
	m_fg_scrolly = data;
}

WRITE8_MEMBER(momoko_state::momoko_fg_select_w)
{
	m_fg_select = data & 0x0f;
	m_fg_mask = data & 0x10;
}

WRITE8_MEMBER(momoko_state::momoko_text_scrolly_w)
{
	m_text_scrolly = data;
}

WRITE8_MEMBER(momoko_state::momoko_text_mode_w)
{
	m_text_mode = data;
}

WRITE8_MEMBER(momoko_state::momoko_bg_scrollx_w)
{
	m_bg_scrollx[offset] = data;
}

WRITE8_MEMBER(momoko_state::momoko_bg_scrolly_w)
{
	m_bg_scrolly[offset] = data;
}

WRITE8_MEMBER(momoko_state::momoko_bg_select_w)
{
	m_bg_select = data & 0x0f;
	m_bg_mask = data & 0x10;
}

WRITE8_MEMBER(momoko_state::momoko_bg_priority_w)
{
	m_bg_priority = data & 0x01;
}

WRITE8_MEMBER(momoko_state::momoko_flipscreen_w)
{
	m_flipscreen = data & 0x01;
}

/****************************************************************************/

void momoko_state::momoko_draw_bg_pri( bitmap_ind16 &bitmap, int chr, int col, int flipx, int flipy, int x, int y, int pri )
{
	int xx, sx, sy, px, py, dot;
	uint32_t gfxadr;
	uint8_t d0, d1;
	uint8_t *BG_GFX = memregion("gfx2")->base();

	for (sy = 0; sy < 8; sy++)
	{
		gfxadr = chr * 16 + sy * 2;
		for (xx = 0; xx < 2; xx++)
		{
			d0 = BG_GFX[gfxadr + xx * 4096];
			d1 = BG_GFX[gfxadr + xx * 4096 + 1];

			for (sx = 0; sx < 4; sx++)
			{
				dot = (d0 & 0x08) | ((d0 & 0x80) >>5) | ((d1 & 0x08) >>2) | ((d1 & 0x80) >>7);
				if (flipx == 0) px = sx + xx * 4 + x;
					else      px = 7 - sx - xx * 4 + x;
				if (flipy == 0) py = sy + y;
					else      py = 7 - sy + y;

				if (dot >= pri)
					bitmap.pix16(py, px) = col * 16 + dot + 256;

				d0 = d0 << 1;
				d1 = d1 << 1;
			}
		}
	}
}

/****************************************************************************/

uint32_t momoko_state::screen_update_momoko(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
	int x, y, dx, dy, rx, ry, radr, chr, sy, fx, fy, px, py, offs, col, pri, flip ;
	uint8_t *spriteram = m_spriteram;

	uint8_t *BG_MAP     = memregion("user1")->base();
	uint8_t *BG_COL_MAP = memregion("user2")->base();
	uint8_t *FG_MAP     = memregion("user3")->base();
	uint8_t *TEXT_COLOR = memregion("proms")->base();


	flip = m_flipscreen ^ (ioport("FAKE")->read() & 0x01);

	/* draw BG layer */
	dx = (7 - m_bg_scrollx[0]) & 7;
	dy = (7 - m_bg_scrolly[0]) & 7;
	rx = (m_bg_scrollx[0] + m_bg_scrollx[1] * 256) >> 3;
	ry = (m_bg_scrolly[0] + m_bg_scrolly[1] * 256) >> 3;

	if (m_bg_mask == 0)
	{
		for (y = 0; y < 29; y++)
		{
			for (x = 0; x < 32; x++)
			{
				radr = ((ry + y + 2) & 0x3ff) * 128 + ((rx + x) & 0x7f);
				chr = BG_MAP[radr];
				col = BG_COL_MAP[chr + m_bg_select * 512 + m_bg_priority * 256] & 0x0f;
				chr = chr + m_bg_select * 512;

				if (flip == 0)
				{
					px = 8 * x + dx - 6;
					py = 8 * y + dy + 9;
				}
				else
				{
					px = 248 - (8 * x + dx - 8);
					py = 248 - (8 * y + dy + 9);
				}

				m_gfxdecode->gfx(1)->opaque(bitmap,cliprect,
					chr,
					col,
					flip,flip,
					px,py);
			}
		}
	}
	else
	bitmap.fill(256, cliprect);


	/* draw sprites (momoko) */
	for (offs = 0; offs < 9 * 4; offs +=4)
	{
		chr = spriteram[offs + 1] | ((spriteram[offs + 2] & 0x60) << 3);
		chr = ((chr & 0x380) << 1) | (chr & 0x7f);
		col = spriteram[offs + 2] & 0x07;
		fx = ((spriteram[offs + 2] & 0x10) >> 4) ^ flip;
		fy = ((spriteram[offs + 2] & 0x08) >> 3) ^ flip; /* ??? */
		x = spriteram[offs + 3];
		y = spriteram[offs + 0];

		if (flip == 0)
		{
			px = x;
			py = 239 - y;
		}
		else
		{
			px = 248 - x;
			py = y + 1;
		}

		m_gfxdecode->gfx(3)->transpen(bitmap,cliprect,
			chr,
			col,
			!fx,fy,
			px,py,0);
	}


	/* draw BG layer */
	if (m_bg_mask ==0)
	{
		for (y = 0; y < 29; y++)
		{
			for (x = 0; x < 32; x++)
			{
				radr = ((ry + y + 2) & 0x3ff) * 128 + ((rx + x) & 0x7f) ;
				chr = BG_MAP[radr] ;
				col = BG_COL_MAP[chr + m_bg_select * 512 + m_bg_priority * 256];
				pri = (col & 0x10) >> 1;

				if (flip == 0)
				{
					px = 8 * x + dx - 6;
					py = 8 * y + dy + 9;
					}
				else
				{
					px = 248 - (8 * x + dx - 8);
					py = 248 - (8 * y + dy + 9);
				}
				if (pri != 0)
				{
					col = col & 0x0f;
					chr = chr + m_bg_select * 512;
					momoko_draw_bg_pri(bitmap, chr, col, flip, flip, px, py, pri);
				}
			}
		}
	}


	/* draw sprites (others) */
	for (offs = 9 * 4; offs < m_spriteram.bytes(); offs += 4)
	{
		chr = spriteram[offs + 1] | ((spriteram[offs + 2] & 0x60) << 3);
		chr = ((chr & 0x380) << 1) | (chr & 0x7f);
		col = spriteram[offs + 2] & 0x07;
		fx = ((spriteram[offs + 2] & 0x10) >> 4) ^ flip;
		fy = ((spriteram[offs + 2] & 0x08) >> 3) ^ flip; /* ??? */
		x = spriteram[offs + 3];
		y = spriteram[offs + 0];

		if (flip == 0)
		{
			px = x;
			py = 239 - y;
		}
		else
		{
			px = 248 - x;
			py = y + 1;
		}
		m_gfxdecode->gfx(3)->transpen(bitmap,cliprect,
			chr,
			col,
			!fx,fy,
			px,py,0);
	}


	/* draw text layer */
	for (y = 16; y < 240; y++)
	{
		for (x = 0; x < 32; x++)
		{
			sy = y;
			if (m_text_mode == 0)
				col = TEXT_COLOR[(sy >> 3) + 0x100] & 0x0f;
			else
			{
				if (TEXT_COLOR[y] < 0x08)
					sy += m_text_scrolly;
				col = (TEXT_COLOR[y] & 0x07) + 0x10;
			}
			dy = sy & 7;
			if (flip == 0)
			{
				px = x * 8;
				py = y;
			}
			else
			{
				px = 248 - x * 8;
				py = 255 - y;
			}
			m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
				m_videoram[(sy >> 3) * 32 + x] * 8 + dy,
				col,
				flip,0,
				px,py,0);
		}
	}


	/* draw FG layer */
	if (m_fg_mask == 0)
	{
		dx = (7 - m_fg_scrollx) & 7;
		dy = (7 - m_fg_scrolly) & 7;
		rx = m_fg_scrollx >> 3;
		ry = m_fg_scrolly >> 3;

		for (y = 0; y < 29; y++)
		{
			for (x = 0; x < 32; x++)
			{
				radr = ((ry + y + 34) & 0x3f) * 0x20 + ((rx + x) & 0x1f) + (m_fg_select & 3) * 0x800;
				chr = FG_MAP[radr] ;
				if (flip == 0)
				{
					px = 8 * x + dx - 6;
					py = 8 * y + dy + 9;
				}
				else
				{
					px = 248 - (8 * x + dx - 8);
					py = 248 - (8 * y + dy + 9);
				}
				m_gfxdecode->gfx(2)->transpen(bitmap,cliprect,
					chr,
					0, /* color */
					flip,flip, /* flip */
					px,py,0);
			}
		}
	}
	return 0;
}