summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/video/esd16.cpp
blob: 519c66af28fd0cdd991123ca801bc3f8e671d587 (plain) (tree)
1
2
                       
                                             


































                                                                            
                
                           
                   
 













                                                                            

                                                
 
                                                   
                               
                             
                                               


                           

                                                      
 
                                                   
                               
                             
                                               



                           
                                            
 


                                             
 


                                        

 
                                                    

               

                               
 


                                        











                                                                            
                               
 

                                                                                                                                                                             
 
                                                                  
                                                                                                                                                                                          
 
                                                                  
                                                                                                                                                                                          
 



                                                           
 

                                                      


 







                                                                            
                                                                                                      


                             
                                            

                 
                                              

                    


                                                                 

                                         

      

                            
                                                 
                 


                                                                                 


                    


                                                                           



                 
                                         

         


                            
                                                 
                 


                                                                                 


                    


                                                                           



                 
                                                                                          
 


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

                          -= ESD 16 Bit Games =-

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


Note:   if MAME_DEBUG is defined, pressing Z with:

        Q / W           Shows Layer 0 / 1
        A               Shows Sprites

        Keys can be used together!


    [ 2 Scrolling Layers ]

        Tile Size:              8 x 8 x 8
        Color Codes:            1 per Layer (banked for Layer 0)
        Layer Size (tiles) :    128 x 64
        Layer Size (pixels):    1024 x 512

    [ 256 Sprites ]

        Sprites are made of 16 x 16 x 5 tiles. Size can vary from 1 to
        8 tiles vertically, while their width is always 1 tile.

    [ Priorities ]

        The game only uses this scheme:

        Back -> Front:  Layer 0, Layer 1, Sprites

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

#include "emu.h"
#include "includes/esd16.h"
#include "screen.h"


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

                                    Tilemaps

    Offset:     Bits:                   Value:

        0.w                             Code

    Color code:  layer 0 (backmost) can bank at every 256 colors,
                 layer 1 uses the first 256.

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

template<unsigned Layer>
TILE_GET_INFO_MEMBER(esd16_state::get_tile_info)
{
	const u16 code = m_vram[Layer][tile_index];
	SET_TILE_INFO_MEMBER(1,
			code,
			m_tilemap_color[Layer],
			0);
}

template<unsigned Layer>
TILE_GET_INFO_MEMBER(esd16_state::get_tile_info_16x16)
{
	const u16 code = m_vram[Layer][tile_index];
	SET_TILE_INFO_MEMBER(2,
			code,
			m_tilemap_color[Layer],
			0);
}


void esd16_state::tilemap0_color_w(u16 data)
{
	m_tilemap_color[0] = data & 0x03;
	m_tilemap[0]->mark_all_dirty();
	m_tilemap_16x16[0]->mark_all_dirty();

	bool flip = BIT(data, 7);
	flip_screen_set(flip);
	m_sprgen->set_flip_screen(flip);
}

void esd16_state::tilemap0_color_jumppop_w(u16 data)
{
	// todo
	m_tilemap_color[0] = 2;
	m_tilemap_color[1] = 1;

	bool flip = BIT(data, 7);
	flip_screen_set(flip);
	m_sprgen->set_flip_screen(flip);
}


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


                            Video Hardware Init


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


void esd16_state::video_start()
{
	m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(esd16_state::get_tile_info<0>)), TILEMAP_SCAN_ROWS, 8, 8, 0x80, 0x40);
	m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(esd16_state::get_tile_info<1>)), TILEMAP_SCAN_ROWS, 8, 8, 0x80, 0x40);

	/* swatpolc changes tilemap 0 to 16x16 at various times */
	m_tilemap_16x16[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(esd16_state::get_tile_info_16x16<0>)), TILEMAP_SCAN_ROWS, 16,16, 0x40, 0x40);

	/* hedpanic changes tilemap 1 to 16x16 at various times */
	m_tilemap_16x16[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(esd16_state::get_tile_info_16x16<1>)), TILEMAP_SCAN_ROWS, 16,16, 0x40, 0x40);

	m_tilemap[0]->set_scrolldx(-0x60 + 2, -0x60);
	m_tilemap[1]->set_scrolldx(-0x60, -0x60 + 2);
	m_tilemap_16x16[0]->set_scrolldx(-0x60 + 2, -0x60);
	m_tilemap_16x16[1]->set_scrolldx(-0x60, -0x60 + 2);

	m_tilemap[1]->set_transparent_pen(0x00);
	m_tilemap_16x16[1]->set_transparent_pen(0x00);
}


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


                                Screen Drawing


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

u32 esd16_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
	int layers_ctrl = -1;

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

#ifdef MAME_DEBUG
if (machine().input().code_pressed(KEYCODE_Z))
{
	int msk = 0;
	if (machine().input().code_pressed(KEYCODE_Q))  msk |= 1;
	if (machine().input().code_pressed(KEYCODE_W))  msk |= 2;
	if (machine().input().code_pressed(KEYCODE_A))  msk |= 4;
	if (msk != 0) layers_ctrl &= msk;
}
#endif

	if (layers_ctrl & 1)
	{
		if (m_head_layersize[0] & 0x0001)
		{
			m_tilemap_16x16[0]->set_scrollx(0, m_scroll[0][0]);
			m_tilemap_16x16[0]->set_scrolly(0, m_scroll[0][1]);
			m_tilemap_16x16[0]->draw(screen, bitmap, cliprect, 0, 0);
		}
		else
		{
			m_tilemap[0]->set_scrollx(0, m_scroll[0][0]);
			m_tilemap[0]->set_scrolly(0, m_scroll[0][1]);
			m_tilemap[0]->draw(screen, bitmap, cliprect, 0, 0);
		}
	}
	else
	{
		bitmap.fill(0, cliprect);
	}


	if (layers_ctrl & 2)
	{
		if (m_head_layersize[0] & 0x0002)
		{
			m_tilemap_16x16[1]->set_scrollx(0, m_scroll[1][0]);
			m_tilemap_16x16[1]->set_scrolly(0, m_scroll[1][1]);
			m_tilemap_16x16[1]->draw(screen, bitmap, cliprect, 0, 1);
		}
		else
		{
			m_tilemap[1]->set_scrollx(0, m_scroll[1][0]);
			m_tilemap[1]->set_scrolly(0, m_scroll[1][1]);
			m_tilemap[1]->draw(screen, bitmap, cliprect, 0, 1);
		}

	}

	if (layers_ctrl & 4) m_sprgen->draw_sprites(bitmap, cliprect, m_spriteram, 0x400);

//  popmessage("%04x %04x %04x %04x %04x",head_unknown1[0],head_layersize[0],head_unknown3[0],head_unknown4[0],head_unknown5[0]);
	return 0;
}