// license:BSD-3-Clause
// copyright-holders:Uki
/******************************************************************************
Ikki (c) 1985 Sun Electronics
Video hardware driver by Uki
20/Jun/2001 -
******************************************************************************/
#include "emu.h"
#include "includes/ikki.h"
PALETTE_INIT_MEMBER(ikki_state, ikki)
{
const uint8_t *color_prom = memregion("proms")->base();
int i;
/* create a lookup table for the palette */
for (i = 0; i < 0x100; i++)
{
int r = pal4bit(color_prom[i + 0x000]);
int g = pal4bit(color_prom[i + 0x100]);
int b = pal4bit(color_prom[i + 0x200]);
palette.set_indirect_color(i, rgb_t(r, g, b));
}
/* color_prom now points to the beginning of the lookup table */
color_prom += 0x300;
/* sprites lookup table */
for (i = 0; i < 0x200; i++)
{
uint16_t ctabentry = color_prom[i] ^ 0xff;
if (((i & 0x07) == 0x07) && (ctabentry == 0))
{
/* punch through */
m_punch_through_pen = i;
ctabentry = 0x100;
}
palette.set_pen_indirect(i, ctabentry);
}
/* bg lookup table */
for (i = 0x200; i < 0x400; i++)
{
uint8_t ctabentry = color_prom[i];
palette.set_pen_indirect(i, ctabentry);
}
}
WRITE8_MEMBER(ikki_state::ikki_scrn_ctrl_w)
{
m_flipscreen = (data >> 2) & 1;
}
void ikki_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
{
uint8_t *spriteram = m_spriteram;
int y;
offs_t offs;
m_sprite_bitmap.fill(m_punch_through_pen, cliprect);
for (offs = 0; offs < m_spriteram.bytes(); offs += 4)
{
int code = (spriteram[offs + 2] & 0x80) | (spriteram[offs + 1] >> 1);
int color = spriteram[offs + 2] & 0x3f;
int x = spriteram[offs + 3];
y = spriteram[offs + 0];
if (m_flipscreen)
x = 240 - x;
else
y = 224 - y;
x = x & 0xff;
y = y & 0xff;
if (x > 248)
x = x - 256;
if (y > 240)
y = y - 256;
m_gfxdecode->gfx(1)->transmask(m_sprite_bitmap,cliprect,
code, color,
m_flipscreen,m_flipscreen,
x,y,
m_palette->transpen_mask(*m_gfxdecode->gfx(1), color, 0));
}
/* copy the sprite bitmap into the main bitmap, skipping the transparent pixels */
for (y = cliprect.min_y; y <= cliprect.max_y; y++)
{
int x;
for (x = cliprect.min_x; x <= cliprect.max_x; x++)
{
uint16_t pen = m_sprite_bitmap.pix16(y, x);
if (m_palette->pen_indirect(pen) != 0x100)
bitmap.pix16(y, x) = pen;
}
}
}
void ikki_state::video_start()
{
m_screen->register_screen_bitmap(m_sprite_bitmap);
save_item(NAME(m_sprite_bitmap));
}
uint32_t ikki_state::screen_update_ikki(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
offs_t offs;
uint8_t *VIDEOATTR = memregion("user1")->base();
/* draw bg layer */
for (offs = 0; offs < (m_videoram.bytes() / 2); offs++)
{
int color, bank;
int sx = offs / 32;
int sy = offs % 32;
int y = sy*8;
int x = sx*8;
int d = VIDEOATTR[sx];
switch (d)
{
case 0x02: /* scroll area */
x = sx * 8 - m_scroll[1];
if (x < 0)
x += 8 * 22;
y = (sy * 8 + ~m_scroll[0]) & 0xff;
break;
case 0x03: /* non-scroll area */
break;
case 0x00: /* sprite disable? */
break;
case 0x0d: /* sprite disable? */
break;
case 0x0b: /* non-scroll area (?) */
break;
case 0x0e: /* unknown */
break;
}
if (m_flipscreen)
{
x = 248 - x;
y = 248 - y;
}
color = m_videoram[offs * 2];
bank = (color & 0xe0) << 3;
color = ((color & 0x1f)<<0) | ((color & 0x80) >> 2);
m_gfxdecode->gfx(0)->opaque(bitmap,cliprect,
m_videoram[offs * 2 + 1] + bank,
color,
m_flipscreen,m_flipscreen,
x,y);
}
draw_sprites(bitmap, cliprect);
/* mask sprites */
for (offs = 0; offs < (m_videoram.bytes() / 2); offs++)
{
int sx = offs / 32;
int sy = offs % 32;
int d = VIDEOATTR[sx];
if ((d == 0) || (d == 0x0d))
{
int color, bank;
int y = sy * 8;
int x = sx * 8;
if (m_flipscreen)
{
x = 248 - x;
y = 248 - y;
}
color = m_videoram[offs * 2];
bank = (color & 0xe0) << 3;
color = ((color & 0x1f)<<0) | ((color & 0x80) >> 2);
m_gfxdecode->gfx(0)->opaque(bitmap,cliprect,
m_videoram[offs * 2 + 1] + bank,
color,
m_flipscreen,m_flipscreen,
x,y);
}
}
return 0;
}