summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/video/kyugo.cpp
blob: 756c0a6f777baa281c4176b2bbac0617d5161e31 (plain) (tree)
1
2
3
4
5
6
7
8
9

                                  





                                                                            
                
                           







                                                                            
                                                   
 
                                            
                               


                                                                                 


 
                                                   
 

                                             
                               


                                                                         








                                       
                               
 
                                                           
 

                                                                                                                                                                         
 
                                             
 
                                                








                                       
                                        
 

                                              


 
                                        
 

                                              


 
                                         
 

                                              


 
                                        

                                             
                                            


 
                                         
 
                             


 
                                     

                                 
                                    

                                                              
                                              
         
                                               
 
                                               


                                              
                                                
         

                                                 






                                        
                                      
 
                          


 
                                            
 
                               








                                       
                                                                               


                                                                                    


                                                        
 
                                 
 
                                        
         
                                        
 
                                                    
 
                                                                                       
                             
                                  
 
                                                     
                              
                                  
 
                         
                                      
 
                                                         
 
                                            
                 
                                                     
 

                                                               





                                                                                  
                                 





                                               
                                                                      


                                                            
                                                                                     
                 



         
                                                                                                           
 
                          
                                                                                       
            
                                                                                      
 
                                                 
 
                                                           
                                       
                                                           

                 
// license:BSD-3-Clause
// copyright-holders:Ernesto Corvi
/***************************************************************************

    Kyugo hardware games

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

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


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

  Callbacks for the TileMap code

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

TILE_GET_INFO_MEMBER(kyugo_state::get_fg_tile_info)
{
	int code = m_fgvideoram[tile_index];
	SET_TILE_INFO_MEMBER(0,
					code,
					2 * m_color_codes[code >> 3] + m_fgcolor,
					0);
}


TILE_GET_INFO_MEMBER(kyugo_state::get_bg_tile_info)
{
	int code = m_bgvideoram[tile_index];
	int attr = m_bgattribram[tile_index];
	SET_TILE_INFO_MEMBER(1,
					code | ((attr & 0x03) << 8),
					(attr >> 4) | (m_bgpalbank << 4),
					TILE_FLIPYX((attr & 0x0c) >> 2));
}


/*************************************
 *
 *  Video system start
 *
 *************************************/

void kyugo_state::video_start()
{
	m_color_codes = memregion("proms")->base() + 0x300;

	m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(kyugo_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
	m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(kyugo_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);

	m_fg_tilemap->set_transparent_pen(0);

	m_bg_tilemap->set_scrolldx(-32, 288+32);
}


/*************************************
 *
 *  Memory handlers
 *
 *************************************/

WRITE8_MEMBER(kyugo_state::fgvideoram_w)
{
	m_fgvideoram[offset] = data;
	m_fg_tilemap->mark_tile_dirty(offset);
}


WRITE8_MEMBER(kyugo_state::bgvideoram_w)
{
	m_bgvideoram[offset] = data;
	m_bg_tilemap->mark_tile_dirty(offset);
}


WRITE8_MEMBER(kyugo_state::bgattribram_w)
{
	m_bgattribram[offset] = data;
	m_bg_tilemap->mark_tile_dirty(offset);
}


READ8_MEMBER(kyugo_state::spriteram_2_r)
{
	// only the lower nibble is connected
	return m_spriteram_2[offset] | 0xf0;
}


WRITE8_MEMBER(kyugo_state::scroll_x_lo_w)
{
	m_scroll_x_lo = data;
}


WRITE8_MEMBER(kyugo_state::gfxctrl_w)
{
	/* bit 0 is scroll MSB */
	m_scroll_x_hi = data & 0x01;

	/* bit 5 is front layer color (Son of Phoenix only) */
	if (m_fgcolor != ((data & 0x20) >> 5))
	{
		m_fgcolor = (data & 0x20) >> 5;

		m_fg_tilemap->mark_all_dirty();
	}

	/* bit 6 is background palette bank */
	if (m_bgpalbank != ((data & 0x40) >> 6))
	{
		m_bgpalbank = (data & 0x40) >> 6;
		m_bg_tilemap->mark_all_dirty();
	}

	if (data & 0x9e)
		popmessage("%02x",data);
}


WRITE8_MEMBER(kyugo_state::scroll_y_w)
{
	m_scroll_y = data;
}


WRITE_LINE_MEMBER(kyugo_state::flipscreen_w)
{
	flip_screen_set(state);
}


/*************************************
 *
 *  Video update
 *
 *************************************/

void kyugo_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
	/* sprite information is scattered through memory */
	/* and uses a portion of the text layer memory (outside the visible area) */
	uint8_t *spriteram_area1 = &m_spriteram_1[0x28];
	uint8_t *spriteram_area2 = &m_spriteram_2[0x28];
	uint8_t *spriteram_area3 = &m_fgvideoram[0x28];

	int flip = flip_screen();

	for (int n = 0; n < 12 * 2; n++)
	{
		int offs, sy, sx, color;

		offs = 2 * (n % 12) + 64 * (n / 12);

		sx = spriteram_area3[offs + 1] + 256 * (spriteram_area2[offs + 1] & 1);
		if (sx > 320)
			sx -= 512;

		sy = 255 - spriteram_area1[offs] + 2;
		if (sy > 0xf0)
			sy -= 256;

		if (flip)
			sy = 240 - sy;

		color = spriteram_area1[offs + 1] & 0x1f;

		for (int y = 0; y < 16; y++)
		{
			int code, attr, flipx, flipy;

			code = spriteram_area3[offs + 128 * y];
			attr = spriteram_area2[offs + 128 * y];

			code = code | ((attr & 0x01) << 9) | ((attr & 0x02) << 7);

			flipx =  attr & 0x08;
			flipy =  attr & 0x04;

			if (flip)
			{
				flipx = !flipx;
				flipy = !flipy;
			}


			m_gfxdecode->gfx(2)->transpen(bitmap,cliprect,
						code,
						color,
						flipx,flipy,
						sx,flip ? sy - 16*y : sy + 16*y, 0 );
		}
	}
}


uint32_t kyugo_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
	if (flip_screen())
		m_bg_tilemap->set_scrollx(0, -(m_scroll_x_lo + (m_scroll_x_hi * 256)));
	else
		m_bg_tilemap->set_scrollx(0,   m_scroll_x_lo + (m_scroll_x_hi * 256));

	m_bg_tilemap->set_scrolly(0, m_scroll_y);

	m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
	draw_sprites(bitmap, cliprect);
	m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
	return 0;
}