// license:BSD-3-Clause
// copyright-holders:David Haywood
/* Kick Goal - video */
#include "emu.h"
#include "includes/kickgoal.h"
WRITE16_MEMBER(kickgoal_state::fgram_w)
{
COMBINE_DATA(&m_fgram[offset]);
m_fgtm->mark_tile_dirty(offset / 2);
}
WRITE16_MEMBER(kickgoal_state::bgram_w)
{
COMBINE_DATA(&m_bgram[offset]);
m_bgtm->mark_tile_dirty(offset / 2);
}
WRITE16_MEMBER(kickgoal_state::bg2ram_w)
{
COMBINE_DATA(&m_bg2ram[offset]);
m_bg2tm->mark_tile_dirty(offset / 2);
}
/* FG */
TILE_GET_INFO_MEMBER(kickgoal_state::get_kickgoal_fg_tile_info)
{
u16 const tileno = m_fgram[tile_index * 2] & 0x0fff;
u16 const color = m_fgram[tile_index * 2 + 1] & 0x000f;
SET_TILE_INFO_MEMBER(BIT(tile_index, 5) ? 3 : 0, tileno + m_fg_base, color + 0x00, 0); // similar 8x8 gfx behavior as CPS1
}
TILE_GET_INFO_MEMBER(kickgoal_state::get_actionhw_fg_tile_info)
{
u16 const tileno = m_fgram[tile_index * 2] & 0x0fff;
u16 const color = m_fgram[tile_index * 2 + 1] & 0x000f;
SET_TILE_INFO_MEMBER(0, tileno + m_fg_base, color + 0x00, 0);
}
/* BG */
TILE_GET_INFO_MEMBER(kickgoal_state::get_bg_tile_info)
{
u16 const tileno = m_bgram[tile_index * 2] & m_bg_mask;
u16 const color = m_bgram[tile_index * 2 + 1] & 0x000f;
bool const flipx = m_bgram[tile_index * 2 + 1] & 0x0020;
bool const flipy = m_bgram[tile_index * 2 + 1] & 0x0040;
SET_TILE_INFO_MEMBER(1, tileno + m_bg_base, color + 0x10, (flipx ? TILE_FLIPX : 0) | (flipy ? TILE_FLIPY : 0));
}
/* BG 2 */
TILE_GET_INFO_MEMBER(kickgoal_state::get_bg2_tile_info)
{
u16 const tileno = m_bg2ram[tile_index * 2] & m_bg2_mask;
u16 const color = m_bg2ram[tile_index * 2 + 1] & 0x000f;
bool const flipx = m_bg2ram[tile_index * 2 + 1] & 0x0020;
bool const flipy = m_bg2ram[tile_index * 2 + 1] & 0x0040;
SET_TILE_INFO_MEMBER(m_bg2_region, tileno + m_bg2_base, color + 0x20, (flipx ? TILE_FLIPX : 0) | (flipy ? TILE_FLIPY : 0));
}
TILEMAP_MAPPER_MEMBER(kickgoal_state::tilemap_scan_8x8)
{
/* logical (col,row) -> memory offset */
return (row & 0x1f) | ((col & 0x3f) << 5) | ((row & 0x20) << 6);
}
TILEMAP_MAPPER_MEMBER(kickgoal_state::tilemap_scan_16x16)
{
/* logical (col,row) -> memory offset */
return (row & 0xf) | ((col & 0x3f) << 4) | ((row & 0x30) << 6);
}
TILEMAP_MAPPER_MEMBER(kickgoal_state::tilemap_scan_32x32)
{
/* logical (col,row) -> memory offset */
return (row & 0x7) | ((col & 0x3f) << 3) | ((row & 0x38) << 6);
}
void kickgoal_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect)
{
for (int offs = 0; offs < m_spriteram.bytes() / 2; offs += 4)
{
int xpos = m_spriteram[offs + 3];
int ypos = m_spriteram[offs + 0] & 0x00ff;
u16 const tileno = m_spriteram[offs + 2] & 0x3fff;
bool const flipx = m_spriteram[offs + 1] & 0x0020;
u16 const color = m_spriteram[offs + 1] & 0x000f;
if (m_spriteram[offs + 0] & 0x0100) break;
ypos = 0x110 - ypos;
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
tileno + m_sprbase,
0x30 + color,
flipx,0,
xpos-16+4,ypos-32,15);
}
}
VIDEO_START_MEMBER(kickgoal_state,kickgoal)
{
m_sprbase = 0x0000;
m_fg_base = 0x7000;
m_bg_base = 0x1000;
m_bg_mask = 0x0fff;
m_bg2_region = 2; // 32x32 tile source
m_bg2_base = 0x2000 / 4;
m_bg2_mask = (0x2000/4) - 1;
m_fgtm = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(kickgoal_state::get_kickgoal_fg_tile_info)), tilemap_mapper_delegate(*this, FUNC(kickgoal_state::tilemap_scan_8x8)), 8, 8, 64, 64);
m_bgtm = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(kickgoal_state::get_bg_tile_info)), tilemap_mapper_delegate(*this, FUNC(kickgoal_state::tilemap_scan_16x16)), 16, 16, 64, 64);
m_bg2tm = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(kickgoal_state::get_bg2_tile_info)), tilemap_mapper_delegate(*this, FUNC(kickgoal_state::tilemap_scan_32x32)), 32, 32, 64, 64);
m_fgtm->set_transparent_pen(15);
m_bgtm->set_transparent_pen(15);
}
VIDEO_START_MEMBER(kickgoal_state,actionhw)
{
m_sprbase = 0x4000;
m_fg_base = 0x7000 * 2;
m_bg_base = 0x0000;
m_bg_mask = 0x1fff;
m_bg2_region = 1; // 16x16 tile source
m_bg2_base = 0x2000;
m_bg2_mask = 0x2000 - 1;
m_fgtm = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(kickgoal_state::get_actionhw_fg_tile_info)), tilemap_mapper_delegate(*this, FUNC(kickgoal_state::tilemap_scan_8x8)), 8, 8, 64, 64);
m_bgtm = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(kickgoal_state::get_bg_tile_info)), tilemap_mapper_delegate(*this, FUNC(kickgoal_state::tilemap_scan_16x16)), 16, 16, 64, 64);
m_bg2tm = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(kickgoal_state::get_bg2_tile_info)), tilemap_mapper_delegate(*this, FUNC(kickgoal_state::tilemap_scan_16x16)), 16, 16, 64, 64);
m_fgtm->set_transparent_pen(15);
m_bgtm->set_transparent_pen(15);
}
u32 kickgoal_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
/* set scroll */
m_fgtm->set_scrollx(0, m_scrram[0]);
m_fgtm->set_scrolly(0, m_scrram[1]);
m_bgtm->set_scrollx(0, m_scrram[2]);
m_bgtm->set_scrolly(0, m_scrram[3]);
m_bg2tm->set_scrollx(0, m_scrram[4]);
m_bg2tm->set_scrolly(0, m_scrram[5]);
/* draw */
m_bg2tm->draw(screen, bitmap, cliprect, 0, 0);
m_bgtm->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
m_fgtm->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}