// license:BSD-3-Clause
// copyright-holders:Nathan Woods,R. Belmont
/*********************************************************************
video/apple2gs.c
Apple IIgs video code
*********************************************************************/
#include "emu.h"
#include "includes/apple2.h"
#include "includes/apple2gs.h"
VIDEO_START_MEMBER(apple2gs_state,apple2gs)
{
m_bordercolor = 0;
apple2_video_start(m_slowmem, m_slowmem+0x10000, 0, 8);
m_legacy_gfx = auto_bitmap_ind16_alloc(machine(), 560, 192);
save_item(m_bordercolor, "BORDERCLR");
save_item(NAME(m_fgcolor));
save_item(NAME(m_bgcolor));
}
UINT32 apple2gs_state::screen_update_apple2gs(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
const UINT8 *vram;
UINT32 *scanline;
UINT8 scb, b;
int col, palette;
UINT32 last_pixel = 0, pixel;
int beamy;
UINT16 *a2pixel;
beamy = cliprect.min_y;
if (m_newvideo & 0x80)
{
// in top or bottom border?
if ((beamy < BORDER_TOP) || (beamy >= 200+BORDER_TOP))
{
// don't draw past the bottom border
if (beamy >= 231+BORDER_TOP)
{
return 0;
}
scanline = &bitmap.pix32(beamy);
for (col = 0; col < BORDER_LEFT+BORDER_RIGHT+640; col++)
{
scanline[col] = m_a2_palette[m_bordercolor];
}
}
else // regular screen area
{
int shrline = beamy - BORDER_TOP;
scb = m_slowmem[0x19D00 + shrline];
palette = ((scb & 0x0f) << 4);
vram = &m_slowmem[0x12000 + (shrline * 160)];
scanline = &bitmap.pix32(beamy);
// draw left and right borders
for (col = 0; col < BORDER_LEFT; col++)
{
scanline[col] = m_a2_palette[m_bordercolor];
scanline[col+BORDER_LEFT+640] = m_a2_palette[m_bordercolor];
}
if (scb & 0x80) // 640 mode
{
for (col = 0; col < 160; col++)
{
b = vram[col];
scanline[col * 4 + 0 + BORDER_LEFT] = m_shr_palette[palette + 0 + ((b >> 6) & 0x03)];
scanline[col * 4 + 1 + BORDER_LEFT] = m_shr_palette[palette + 4 + ((b >> 4) & 0x03)];
scanline[col * 4 + 2 + BORDER_LEFT] = m_shr_palette[palette + 8 + ((b >> 2) & 0x03)];
scanline[col * 4 + 3 + BORDER_LEFT] = m_shr_palette[palette + 12 + ((b >> 0) & 0x03)];
}
}
else // 320 mode
{
for (col = 0; col < 160; col++)
{
b = vram[col];
pixel = (b >> 4) & 0x0f;
if ((scb & 0x20) && !pixel)
pixel = last_pixel;
else
last_pixel = pixel;
pixel += palette;
scanline[col * 4 + 0 + BORDER_LEFT] = m_shr_palette[pixel];
scanline[col * 4 + 1 + BORDER_LEFT] = m_shr_palette[pixel];
b = vram[col];
pixel = (b >> 0) & 0x0f;
if ((scb & 0x20) && !pixel)
pixel = last_pixel;
else
last_pixel = pixel;
pixel += palette;
scanline[col * 4 + 2 + BORDER_LEFT] = m_shr_palette[pixel];
scanline[col * 4 + 3 + BORDER_LEFT] = m_shr_palette[pixel];
}
}
}
}
else
{
/* call legacy Apple II video rendering at scanline 0 to draw into the off-screen buffer */
if (beamy == 0)
{
// check if DHR should be monochrome 560x192
if (m_newvideo & 0x20)
{
m_monochrome_dhr = true;
}
else
{
m_monochrome_dhr = false;
}
rectangle new_cliprect(0, 559, 0, 191);
screen_update_apple2(screen, *m_legacy_gfx, new_cliprect);
}
if ((beamy < (BORDER_TOP+4)) || (beamy >= (192+4+BORDER_TOP)))
{
if (beamy >= (231+BORDER_TOP))
{
return 0;
}
scanline = &bitmap.pix32(beamy);
for (col = 0; col < BORDER_LEFT+BORDER_RIGHT+640; col++)
{
scanline[col] = m_a2_palette[m_bordercolor];
}
}
else
{
scanline = &bitmap.pix32(beamy);
// draw left and right borders
for (col = 0; col < BORDER_LEFT + 40; col++)
{
scanline[col] = m_a2_palette[m_bordercolor];
scanline[col+BORDER_LEFT+600] = m_a2_palette[m_bordercolor];
}
a2pixel = &m_legacy_gfx->pix16(beamy-(BORDER_TOP+4));
for (int x = 0; x < 560; x++)
{
scanline[40 + BORDER_LEFT + x] = m_a2_palette[*a2pixel++];
}
}
}
return 0;
}