// license:BSD-3-Clause
// copyright-holders:K.Wilkins
/***************************************************************************
Toaplan Slap Fight hardware
Functions to emulate the video hardware of the machine
***************************************************************************/
#include "emu.h"
#include "includes/slapfght.h"
/***************************************************************************
Callbacks for the TileMap code
***************************************************************************/
TILE_GET_INFO_MEMBER(slapfght_state::get_pf_tile_info)
{
/* For Performan only */
int tile = m_videoram[tile_index] | ((m_colorram[tile_index] & 0x03) << 8);
int color = (m_colorram[tile_index] >> 3) & 0x0f;
SET_TILE_INFO_MEMBER(0, tile, color, 0);
}
TILE_GET_INFO_MEMBER(slapfght_state::get_pf1_tile_info)
{
int tile = m_videoram[tile_index] | ((m_colorram[tile_index] & 0x0f) << 8);
int color = (m_colorram[tile_index] & 0xf0) >> 4;
SET_TILE_INFO_MEMBER(1, tile, color, 0);
}
TILE_GET_INFO_MEMBER(slapfght_state::get_fix_tile_info)
{
int tile = m_fixvideoram[tile_index] | ((m_fixcolorram[tile_index] & 0x03) << 8);
int color = (m_fixcolorram[tile_index] & 0xfc) >> 2;
SET_TILE_INFO_MEMBER(0, tile, color, 0);
}
/***************************************************************************
Start the video hardware emulation.
***************************************************************************/
VIDEO_START_MEMBER(slapfght_state, perfrman)
{
m_pf1_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(slapfght_state::get_pf_tile_info), this), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_pf1_tilemap->set_transparent_pen(0);
}
VIDEO_START_MEMBER(slapfght_state, slapfight)
{
m_pf1_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(slapfght_state::get_pf1_tile_info), this), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_fix_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(slapfght_state::get_fix_tile_info), this), TILEMAP_SCAN_ROWS, 8, 8, 64, 32);
m_fix_tilemap->set_scrolldy(0, 15);
m_pf1_tilemap->set_scrolldy(0, 14);
m_fix_tilemap->set_transparent_pen(0);
}
/***************************************************************************
Memory handlers
***************************************************************************/
WRITE8_MEMBER(slapfght_state::videoram_w)
{
m_videoram[offset] = data;
m_pf1_tilemap->mark_tile_dirty(offset);
}
WRITE8_MEMBER(slapfght_state::colorram_w)
{
m_colorram[offset] = data;
m_pf1_tilemap->mark_tile_dirty(offset);
}
WRITE8_MEMBER(slapfght_state::fixram_w)
{
m_fixvideoram[offset] = data;
m_fix_tilemap->mark_tile_dirty(offset);
}
WRITE8_MEMBER(slapfght_state::fixcol_w)
{
m_fixcolorram[offset] = data;
m_fix_tilemap->mark_tile_dirty(offset);
}
WRITE8_MEMBER(slapfght_state::scrollx_lo_w)
{
m_scrollx_lo = data;
}
WRITE8_MEMBER(slapfght_state::scrollx_hi_w)
{
m_scrollx_hi = data;
}
WRITE8_MEMBER(slapfght_state::scrolly_w)
{
m_scrolly = data;
}
WRITE_LINE_MEMBER(slapfght_state::flipscreen_w)
{
flip_screen_set(state ? 0 : 1);
}
WRITE_LINE_MEMBER(slapfght_state::palette_bank_w)
{
m_palette_bank = state;
}
/***************************************************************************
Render the Screen
***************************************************************************/
void slapfght_state::draw_perfrman_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int layer)
{
uint8_t *src = m_spriteram->buffer();
for (int offs = 0; offs < m_spriteram->bytes(); offs += 4)
{
/*
0: xxxxxxxx - code
1: xxxxxxxx - x
2: x....... - priority over backdrop
.x...... - sprite-sprite priority (see point-pop sprites)
..x..... - ?
...xx... - no function?
.....xxx - color
3: xxxxxxxx - y
*/
int code = src[offs + 0];
int sy = src[offs + 3] - 1;
int sx = src[offs + 1] - 13;
int pri = src[offs + 2] >> 6 & 3;
int color = (src[offs + 2] >> 1 & 3) | (src[offs + 2] << 2 & 4) | (m_palette_bank << 3);
int fx = 0, fy = 0;
if (flip_screen())
{
sy = 256 - sy;
sx = 240 - sx;
fx = fy = 1;
}
if (layer == pri)
m_gfxdecode->gfx(1)->transpen(bitmap, cliprect, code, color, fx, fy, sx, sy, 0);
}
}
uint32_t slapfght_state::screen_update_perfrman(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_pf1_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE);
draw_perfrman_sprites(bitmap, cliprect, 0);
draw_perfrman_sprites(bitmap, cliprect, 1);
m_pf1_tilemap->draw(screen, bitmap, cliprect, 0);
draw_perfrman_sprites(bitmap, cliprect, 2);
draw_perfrman_sprites(bitmap, cliprect, 3);
return 0;
}
void slapfght_state::draw_slapfight_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint8_t *src = m_spriteram->buffer();
for (int offs = 0; offs < m_spriteram->bytes(); offs += 4)
{
/*
0: xxxxxxxx - code low
1: xxxxxxxx - x low
2: xx...... - code high
..x..... - no function?
...xxxx. - color
.......x - x high
3: xxxxxxxx - y
*/
int code = src[offs + 0] | ((src[offs + 2] & 0xc0) << 2);
int sy = src[offs + 3];
int sx = (src[offs + 1] | (src[offs + 2] << 8 & 0x100)) - 13;
int color = src[offs + 2] >> 1 & 0xf;
int fx = 0, fy = 0;
if (flip_screen())
{
sy = (238 - sy) & 0xff;
sx = 284 - sx;
fx = fy = 1;
}
m_gfxdecode->gfx(2)->transpen(bitmap, cliprect, code, color, fx, fy, sx, sy, 0);
}
}
uint32_t slapfght_state::screen_update_slapfight(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_pf1_tilemap->set_scrollx(m_scrollx_hi << 8 | m_scrollx_lo);
m_pf1_tilemap->set_scrolly(m_scrolly);
m_pf1_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_slapfight_sprites(bitmap, cliprect);
m_fix_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}