mirror of
https://github.com/holub/mame
synced 2025-05-31 10:01:51 +03:00
167 lines
3.9 KiB
C
167 lines
3.9 KiB
C
/*********************************************************************
|
|
|
|
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;
|
|
}
|