summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/video/yunsun16.cpp
blob: 29f9045ec3342759da26d396cccef5dab014b364 (plain) (tree)
1
2
                       
                              





















                                                                            
                
                              









                                                                            




                                  
 
                                                         
 
                                                                                                   





                                                                                        
                                                     
 

                                                     
                                      




                                                        
                                                     
 

                                                     
                                      




                                                        
                                        
 

                                                 

 
                                        
 

                                                 










                                                                            
                                  
 





                                                                                                                                                                                   
 

                                            
 

                                            
 

                                               






















                                                                            
                                                                                                           

                 
                                                            
 

                                      
 
                                     

                     
                    
         





                                                                  
                       
                        

                                     

         
                                                                             
         



                                                 

                                        
 

                                        
 
                                                 
                 

                                                               

                 
                                                                   



                                                     
                                                          
                                                     












                                                                            
                                                                                                                       
 

                                                      
 

                                                      
 
                                             
 
                                            
 
                                         

                                                                                         


                                                                                    
         
                                              

                                                                                         


                                                                                    

         
                                               

                 
// license:BSD-3-Clause
// copyright-holders:Luca Elia
/***************************************************************************

                          -= Yun Sung 16 Bit Games =-

                    driver by   Luca Elia (l.elia@tin.it)


    [ 2 Scrolling Layers ]

    Tiles are 16 x 16 x 8. The layout of the tilemap is a bit weird:
    16 consecutive tile codes define a vertical column.
    16 columns form a page (256 x 256).
    The tilemap is made of 4 x 4 pages (1024 x 1024)

    [ 512? Sprites ]

    Sprites are 16 x 16 x 4 in size. There's RAM for 512, but
    the game just copies 384 entries.


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

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


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


                                    Tilemaps


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

#define TMAP_GFX            (0)
#define TILES_PER_PAGE_X    (0x10)
#define TILES_PER_PAGE_Y    (0x10)
#define PAGES_PER_TMAP_X    (0x4)
#define PAGES_PER_TMAP_Y    (0x4)

TILEMAP_MAPPER_MEMBER(yunsun16_state::tilemap_scan_pages)
{
	return  (row / TILES_PER_PAGE_Y) * TILES_PER_PAGE_X * TILES_PER_PAGE_Y * PAGES_PER_TMAP_X +
			(row % TILES_PER_PAGE_Y) +

			(col / TILES_PER_PAGE_X) * TILES_PER_PAGE_X * TILES_PER_PAGE_Y +
			(col % TILES_PER_PAGE_X) * TILES_PER_PAGE_Y;
}

TILE_GET_INFO_MEMBER(yunsun16_state::get_tile_info_0)
{
	uint16_t code = m_vram_0[2 * tile_index + 0];
	uint16_t attr = m_vram_0[2 * tile_index + 1];
	SET_TILE_INFO_MEMBER(TMAP_GFX,
			code,
			attr & 0xf,
			(attr & 0x20) ? TILE_FLIPX : 0);
}

TILE_GET_INFO_MEMBER(yunsun16_state::get_tile_info_1)
{
	uint16_t code = m_vram_1[2 * tile_index + 0];
	uint16_t attr = m_vram_1[2 * tile_index + 1];
	SET_TILE_INFO_MEMBER(TMAP_GFX,
			code,
			attr & 0xf,
			(attr & 0x20) ? TILE_FLIPX : 0);
}

WRITE16_MEMBER(yunsun16_state::vram_0_w)
{
	COMBINE_DATA(&m_vram_0[offset]);
	m_tilemap_0->mark_tile_dirty(offset / 2);
}

WRITE16_MEMBER(yunsun16_state::vram_1_w)
{
	COMBINE_DATA(&m_vram_1[offset]);
	m_tilemap_1->mark_tile_dirty(offset / 2);
}


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


                            Video Hardware Init


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

void yunsun16_state::video_start()
{
	m_tilemap_0 = &machine().tilemap().create(
			*m_gfxdecode, tilemap_get_info_delegate(FUNC(yunsun16_state::get_tile_info_0),this),tilemap_mapper_delegate(FUNC(yunsun16_state::tilemap_scan_pages),this),
			16,16, TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y);
	m_tilemap_1 = &machine().tilemap().create(
			*m_gfxdecode, tilemap_get_info_delegate(FUNC(yunsun16_state::get_tile_info_1),this),tilemap_mapper_delegate(FUNC(yunsun16_state::tilemap_scan_pages),this),
			16,16, TILES_PER_PAGE_X*PAGES_PER_TMAP_X,TILES_PER_PAGE_Y*PAGES_PER_TMAP_Y);

	m_tilemap_0->set_scrolldx(-0x34, 0);
	m_tilemap_1->set_scrolldx(-0x38, 0);

	m_tilemap_0->set_scrolldy(-0x10, 0);
	m_tilemap_1->set_scrolldy(-0x10, 0);

	m_tilemap_0->set_transparent_pen(0xff);
	m_tilemap_1->set_transparent_pen(0xff);
}


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


                                Sprites Drawing


        0.w                             X

        2.w                             Y

        4.w                             Code

        6.w     fedc ba98 7--- ----
                ---- ---- -6-- ----     Flip Y
                ---- ---- --5- ----     Flip X
                ---- ---- ---4 3210     Color


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

void yunsun16_state::draw_sprites( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect )
{
	int offs;
	const rectangle &visarea = m_screen->visible_area();

	int max_x = visarea.max_x + 1;
	int max_y = visarea.max_y + 1;

	int pri = *m_priorityram & 3;
	int pri_mask;

	switch (pri)
	{
		case 1:
			pri_mask = (1 << 1) | (1 << 2) | (1 << 3);
			break;
		case 2:
			pri_mask = (1 << 2) | (1 << 3);
			break;
		case 3:
		default:
			pri_mask = 0;
			break;
	}

	for (offs = (m_spriteram.bytes() - 8) / 2 ; offs >= 0; offs -= 8 / 2)
	{
		int x = m_spriteram[offs + 0];
		int y = m_spriteram[offs + 1];
		int code = m_spriteram[offs + 2];
		int attr = m_spriteram[offs + 3];
		int flipx = attr & 0x20;
		int flipy = attr & 0x40;

		x += m_sprites_scrolldx;
		y += m_sprites_scrolldy;

		if (flip_screen())   // not used?
		{
			flipx = !flipx;     x = max_x - x - 16;
			flipy = !flipy;     y = max_y - y - 16;
		}

		m_gfxdecode->gfx(1)->prio_transpen(bitmap,cliprect,
					code,
					attr & 0x1f,
					flipx, flipy,
					x,y,
					screen.priority(),
					pri_mask,15);
	}
}


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


                                Screen Drawing


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


uint32_t yunsun16_state::screen_update_yunsun16(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
	m_tilemap_0->set_scrollx(0, m_scrollram_0[0]);
	m_tilemap_0->set_scrolly(0, m_scrollram_0[1]);

	m_tilemap_1->set_scrollx(0, m_scrollram_1[0]);
	m_tilemap_1->set_scrolly(0, m_scrollram_1[1]);

	//popmessage("%04X", *m_priorityram);

	screen.priority().fill(0, cliprect);

	if ((*m_priorityram & 0x0c) == 4)
	{
		/* The color of the this layer's transparent pen goes below everything */
		m_tilemap_0->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0);
		m_tilemap_0->draw(screen, bitmap, cliprect, 0, 1);
		m_tilemap_1->draw(screen, bitmap, cliprect, 0, 2);
	}
	else if ((*m_priorityram & 0x0c) == 8)
	{
		/* The color of the this layer's transparent pen goes below everything */
		m_tilemap_1->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0);
		m_tilemap_1->draw(screen, bitmap, cliprect, 0, 1);
		m_tilemap_0->draw(screen, bitmap, cliprect, 0, 2);
	}

	draw_sprites(screen, bitmap, cliprect);
	return 0;
}