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

                                                             
                
                              
 
                                                                                   
 




                                                                                                                                         




                                
 




                                        
 
          
 

                                                 
                                               
 
                               




                                                                             
                                                 







                                                       
 
                                              
                                       
                                         


                                        
                                           





                                  
                                                             
 


                                  



                      
 
                               
 


                                                       
 
                                                                 

 
                                                    
 

                                                

 
                                                             
 


                                  



                      
 
                               
 


                                                       
 
                                                                      

 
                                                    
 

                                                

 
                                              
 
                               




                                                                                                                          
                                                           

                      
                                                           

                      
                                                           

                      
                                                           



                      
                                  
 
                                                                                                                                                                                 
                                           
 
                                                                                                                                                                                 

 
                                                                                                                       
 

                                                         
                                       

                 
// license:BSD-3-Clause
// copyright-holders:David Haywood
/* video/mugsmash.c - see drivers/mugsmash.c for more info */

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

void mugsmash_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect )
{
	/* Each Sprite takes 16 bytes, 5 used? */

	/* ---- ----  xxxx xxxx  ---- ----  aaaa aaaa  ---- ----  NNNN NNNN  ---- ----  nnnn nnnn  ---- ----  yyyy yyyy (rest unused?) */

	/* x = xpos LSB
	   y = ypos LSB
	   N = tile number MSB
	   n = tile number LSB
	   a = attribute / extra
	        f?XY cccc

	    f = x-flip
	    ? = unknown, probably y-flip
	    X = xpos MSB
	    y = ypos MSB
	    c = colour

	*/

	const uint16_t *source = m_spriteram;
	const uint16_t *finish = source + 0x2000;
	gfx_element *gfx = m_gfxdecode->gfx(0);

	while (source < finish)
	{
		int xpos = source[0] & 0x00ff;
		int ypos = source[4] & 0x00ff;
		int num = (source[3] & 0x00ff) | ((source[2] & 0x00ff) << 8);
		int attr = source[1];
		int flipx = (attr & 0x0080) >> 7;
		int colour = (attr & 0x000f);

		xpos += ((attr & 0x0020) >> 5) * 0x100;
		ypos += ((attr & 0x0010) >> 4) * 0x100;

		xpos -= 28;
		ypos -= 16;


				gfx->transpen(
				bitmap,
				cliprect,
				num,
				colour,
				flipx,0,
				xpos,ypos,0
				);

		source += 0x8;
	}
}

TILE_GET_INFO_MEMBER(mugsmash_state::get_mugsmash_tile_info1)
{
	/* fF-- cccc  nnnn nnnn */

	/* c = colour?
	   n = number?
	   F = flip-X
	   f = flip-Y
	*/

	int tileno, colour, fx;

	tileno = m_videoram1[tile_index * 2 + 1];
	colour = m_videoram1[tile_index * 2] & 0x000f;
	fx = (m_videoram1[tile_index * 2] & 0xc0) >> 6;

	SET_TILE_INFO_MEMBER(1, tileno, colour, TILE_FLIPYX(fx));
}

WRITE16_MEMBER(mugsmash_state::mugsmash_videoram1_w)
{
	m_videoram1[offset] = data;
	m_tilemap1->mark_tile_dirty(offset / 2);
}

TILE_GET_INFO_MEMBER(mugsmash_state::get_mugsmash_tile_info2)
{
	/* fF-- cccc  nnnn nnnn */

	/* c = colour?
	   n = number?
	   F = flip-X
	   f = flip-Y
	*/

	int tileno, colour, fx;

	tileno = m_videoram2[tile_index * 2 + 1];
	colour = m_videoram2[tile_index * 2] & 0x000f;
	fx = (m_videoram2[tile_index * 2] & 0xc0) >> 6;

	SET_TILE_INFO_MEMBER(1, tileno, 16 + colour, TILE_FLIPYX(fx));
}

WRITE16_MEMBER(mugsmash_state::mugsmash_videoram2_w)
{
	m_videoram2[offset] = data;
	m_tilemap2->mark_tile_dirty(offset / 2);
}

WRITE16_MEMBER(mugsmash_state::mugsmash_reg_w)
{
	m_regs1[offset] = data;
//  popmessage ("Regs %04x, %04x, %04x, %04x", mugsmash_regs1[0], mugsmash_regs1[1],mugsmash_regs1[2], mugsmash_regs1[3]);

	switch (offset)
	{
	case 0:
		m_tilemap2->set_scrollx(0, m_regs1[2] + 7);
		break;
	case 1:
		m_tilemap2->set_scrolly(0, m_regs1[3] + 4);
		break;
	case 2:
		m_tilemap1->set_scrollx(0, m_regs1[0] + 3);
		break;
	case 3:
		m_tilemap1->set_scrolly(0, m_regs1[1] + 4);
		break;
	}
}

void mugsmash_state::video_start()
{
	m_tilemap1 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(mugsmash_state::get_mugsmash_tile_info1),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
	m_tilemap1->set_transparent_pen(0);

	m_tilemap2 = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(mugsmash_state::get_mugsmash_tile_info2),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
}

uint32_t mugsmash_state::screen_update_mugsmash(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
	m_tilemap2->draw(screen, bitmap, cliprect, 0, 0);
	m_tilemap1->draw(screen, bitmap, cliprect, 0, 0);
	draw_sprites(bitmap, cliprect);
	return 0;
}