/* video/mugsmash.c - see drivers/mugsmash.c for more info */

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

static void draw_sprites(running_machine &machine, bitmap_t *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

    */

	mugsmash_state *state = machine.driver_data<mugsmash_state>();
	const UINT16 *source = state->m_spriteram;
	const UINT16 *finish = source + 0x2000;
	const gfx_element *gfx = machine.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;

		drawgfx_transpen(
				bitmap,
				cliprect,
				gfx,
				num,
				colour,
				flipx,0,
				xpos,ypos,0
				);

		source += 0x8;
	}
}

static TILE_GET_INFO( get_mugsmash_tile_info1 )
{

	/* fF-- cccc  nnnn nnnn */

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

	mugsmash_state *state = machine.driver_data<mugsmash_state>();
	int tileno, colour, fx;

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

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

WRITE16_HANDLER( mugsmash_videoram1_w )
{
	mugsmash_state *state = space->machine().driver_data<mugsmash_state>();

	state->m_videoram1[offset] = data;
	tilemap_mark_tile_dirty(state->m_tilemap1, offset / 2);
}

static TILE_GET_INFO( get_mugsmash_tile_info2 )
{

	/* fF-- cccc  nnnn nnnn */

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

	mugsmash_state *state = machine.driver_data<mugsmash_state>();
	int tileno, colour, fx;

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

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

WRITE16_HANDLER( mugsmash_videoram2_w )
{
	mugsmash_state *state = space->machine().driver_data<mugsmash_state>();

	state->m_videoram2[offset] = data;
	tilemap_mark_tile_dirty(state->m_tilemap2, offset / 2);
}

WRITE16_HANDLER (mugsmash_reg_w)
{
	mugsmash_state *state = space->machine().driver_data<mugsmash_state>();

	state->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:
		tilemap_set_scrollx(state->m_tilemap2, 0, state->m_regs1[2] + 7);
		break;
	case 1:
		tilemap_set_scrolly(state->m_tilemap2, 0, state->m_regs1[3] + 4);
		break;
	case 2:
		tilemap_set_scrollx(state->m_tilemap1, 0, state->m_regs1[0] + 3);
		break;
	case 3:
		tilemap_set_scrolly(state->m_tilemap1, 0, state->m_regs1[1] + 4);
		break;
	}
}

VIDEO_START( mugsmash )
{
	mugsmash_state *state = machine.driver_data<mugsmash_state>();

	state->m_tilemap1 = tilemap_create(machine, get_mugsmash_tile_info1, tilemap_scan_rows, 16, 16, 32, 32);
	tilemap_set_transparent_pen(state->m_tilemap1, 0);

	state->m_tilemap2 = tilemap_create(machine, get_mugsmash_tile_info2, tilemap_scan_rows, 16, 16, 32, 32);
}

SCREEN_UPDATE( mugsmash )
{
	mugsmash_state *state = screen->machine().driver_data<mugsmash_state>();

	tilemap_draw(bitmap, cliprect, state->m_tilemap2, 0, 0);
	tilemap_draw(bitmap, cliprect, state->m_tilemap1, 0, 0);
	draw_sprites(screen->machine(), bitmap, cliprect);
	return 0;
}
