// license:BSD-3-Clause
// copyright-holders:Zsolt Vasvari
/***************************************************************************
VIC Dual Game board
****************************************************************************/
#include "emu.h"
#include "includes/vicdual.h"
static const pen_t pens_from_color_prom[] =
{
rgb_t::black(),
rgb_t(0x00, 0xff, 0x00),
rgb_t(0x00, 0x00, 0xff),
rgb_t(0x00, 0xff, 0xff),
rgb_t(0xff, 0x00, 0x00),
rgb_t(0xff, 0xff, 0x00),
rgb_t(0xff, 0x00, 0xff),
rgb_t::white()
};
WRITE8_MEMBER(vicdual_state::palette_bank_w)
{
m_screen->update_partial(m_screen->vpos());
m_palette_bank = data & 3;
}
uint32_t vicdual_state::screen_update_bw(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
uint8_t x = 0;
uint8_t y = cliprect.min_y;
uint8_t video_data = 0;
while (1)
{
pen_t pen;
if ((x & 0x07) == 0)
{
offs_t offs;
uint8_t char_code;
/* read the character code */
offs = (y >> 3 << 5) | (x >> 3);
char_code = m_videoram[offs];
/* read the appropriate line of the character ram */
offs = (char_code << 3) | (y & 0x07);
video_data = m_characterram[offs];
}
/* plot the current pixel */
pen = (video_data & 0x80) ? rgb_t::white() : rgb_t::black();
bitmap.pix32(y, x) = pen;
/* next pixel */
video_data = video_data << 1;
x = x + 1;
/* end of line? */
if (x == 0)
{
/* end of region to update? */
if (y == cliprect.max_y)
{
break;
}
/* next row */
y = y + 1;
}
}
return 0;
}
uint32_t vicdual_state::screen_update_color(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
uint8_t *color_prom = (uint8_t *)m_proms->base();
uint8_t x = 0;
uint8_t y = cliprect.min_y;
uint8_t video_data = 0;
pen_t back_pen = 0;
pen_t fore_pen = 0;
while (1)
{
pen_t pen;
if ((x & 0x07) == 0)
{
offs_t offs;
uint8_t char_code;
/* read the character code */
offs = (y >> 3 << 5) | (x >> 3);
char_code = m_videoram[offs];
/* read the appropriate line of the character ram */
offs = (char_code << 3) | (y & 0x07);
video_data = m_characterram[offs];
/* get the foreground and background colors from the PROM */
offs = (char_code >> 5) | (m_palette_bank << 3);
back_pen = pens_from_color_prom[(color_prom[offs] >> 1) & 0x07];
fore_pen = pens_from_color_prom[(color_prom[offs] >> 5) & 0x07];
}
// this does nothing by default, but is used to enable overrides
back_pen = choose_pen(x, y, back_pen);
/* plot the current pixel */
pen = (video_data & 0x80) ? fore_pen : back_pen;
bitmap.pix32(y, x) = pen;
/* next pixel */
video_data = video_data << 1;
x = x + 1;
/* end of line? */
if (x == 0)
{
/* end of region to update? */
if (y == cliprect.max_y)
{
break;
}
/* next row */
y = y + 1;
}
}
return 0;
}
uint32_t vicdual_state::screen_update_bw_or_color(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
if (is_cabinet_color())
screen_update_color(screen, bitmap, cliprect);
else
screen_update_bw(screen, bitmap, cliprect);
return 0;
}
pen_t vicdual_state::choose_pen(uint8_t x, uint8_t y, pen_t back_pen)
{
return back_pen;
}
pen_t nsub_state::choose_pen(uint8_t x, uint8_t y, pen_t back_pen)
{
return m_s97269pb->choose_pen(x, y, back_pen);
}