summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/video/renegade.c
blob: ac87c6ce7f03e71a1b5513a56c68438f621600e1 (plain) (tree)
1
2
3
4
5
6
7
8
9





                                                                            
                
                              
 


                                     
                                                                               
                                            
                                
                                    
                                                             



                                      
                                                                               
                                          
                                    
                                                             



                                       
                                                        



                                    
                                                                               
                                                              



                                    
                                                                               
                                                                   



                                           
                                                                      
                                            
                                                    









                                                        
                                                                      
                                                              







                                                   

                       
                                                                      

                                                                                                                   
 

                                                            
 
                                                              

 
                                                                                               
 
                                                                      
                                           

















                                                                  
                                                     








                                                               
                                                                                            

                                                          
                                                                        
                                                                                           


                            
                                                                            
                         
                                                                                    

                                              
                                                                
                                           




                            
                         
 
                                                                                

                                                                      
                                                          
                                                                   

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

    Renegade Video Hardware

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

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


WRITE8_HANDLER( renegade_videoram_w )
{
	renegade_state *state = space->machine().driver_data<renegade_state>();
	UINT8 *videoram = state->m_videoram;
	videoram[offset] = data;
	offset = offset % (64 * 16);
	tilemap_mark_tile_dirty(state->m_bg_tilemap, offset);
}

WRITE8_HANDLER( renegade_videoram2_w )
{
	renegade_state *state = space->machine().driver_data<renegade_state>();
	state->m_videoram2[offset] = data;
	offset = offset % (32 * 32);
	tilemap_mark_tile_dirty(state->m_fg_tilemap, offset);
}

WRITE8_HANDLER( renegade_flipscreen_w )
{
	flip_screen_set(space->machine(), ~data & 0x01);
}

WRITE8_HANDLER( renegade_scroll0_w )
{
	renegade_state *state = space->machine().driver_data<renegade_state>();
	state->m_scrollx = (state->m_scrollx & 0xff00) | data;
}

WRITE8_HANDLER( renegade_scroll1_w )
{
	renegade_state *state = space->machine().driver_data<renegade_state>();
	state->m_scrollx = (state->m_scrollx & 0xff) | (data << 8);
}

static TILE_GET_INFO( get_bg_tilemap_info )
{
	renegade_state *state = machine.driver_data<renegade_state>();
	UINT8 *videoram = state->m_videoram;
	const UINT8 *source = &videoram[tile_index];
	UINT8 attributes = source[0x400]; /* CCC??BBB */
	SET_TILE_INFO(
		1 + (attributes & 0x7),
		source[0],
		attributes >> 5,
		0);
}

static TILE_GET_INFO( get_fg_tilemap_info )
{
	renegade_state *state = machine.driver_data<renegade_state>();
	const UINT8 *source = &state->m_videoram2[tile_index];
	UINT8 attributes = source[0x400];
	SET_TILE_INFO(
		0,
		(attributes & 3) * 256 + source[0],
		attributes >> 6,
		0);
}

VIDEO_START( renegade )
{
	renegade_state *state = machine.driver_data<renegade_state>();
	state->m_bg_tilemap = tilemap_create(machine, get_bg_tilemap_info, tilemap_scan_rows,      16, 16, 64, 16);
	state->m_fg_tilemap = tilemap_create(machine, get_fg_tilemap_info, tilemap_scan_rows,   8, 8, 32, 32);

	tilemap_set_transparent_pen(state->m_fg_tilemap, 0);
	tilemap_set_scrolldx(state->m_bg_tilemap, 256, 0);

	state_save_register_global(machine, state->m_scrollx);
}

static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect)
{
	renegade_state *state = machine.driver_data<renegade_state>();
	UINT8 *source = state->m_spriteram;
	UINT8 *finish = source + 96 * 4;

	while (source < finish)
	{
		int sy = 240 - source[0];

		if (sy >= 16)
		{
			int attributes = source[1]; /* SFCCBBBB */
			int sx = source[3];
			int sprite_number = source[2];
			int sprite_bank = 9 + (attributes & 0xf);
			int color = (attributes >> 4) & 0x3;
			int xflip = attributes & 0x40;

			if (sx > 248)
				sx -= 256;

			if (flip_screen_get(machine))
			{
				sx = 240 - sx;
				sy = 240 - sy;
				xflip = !xflip;
			}

			if (attributes & 0x80) /* big sprite */
			{
				sprite_number &= ~1;
				drawgfx_transpen(bitmap, cliprect, machine.gfx[sprite_bank],
					sprite_number + 1,
					color,
					xflip, flip_screen_get(machine),
					sx, sy + (flip_screen_get(machine) ? -16 : 16), 0);
			}
			else
			{
				sy += (flip_screen_get(machine) ? -16 : 16);
			}
			drawgfx_transpen(bitmap, cliprect, machine.gfx[sprite_bank],
				sprite_number,
				color,
				xflip, flip_screen_get(machine),
				sx, sy, 0);
		}
		source += 4;
	}
}

SCREEN_UPDATE( renegade )
{
	renegade_state *state = screen->machine().driver_data<renegade_state>();
	tilemap_set_scrollx(state->m_bg_tilemap, 0, state->m_scrollx);
	tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0 , 0);
	draw_sprites(screen->machine(), bitmap, cliprect);
	tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0 , 0);
	return 0;
}