mirror of
https://github.com/holub/mame
synced 2025-06-06 12:53:46 +03:00
-newport: Split framebuffer accesses out to an RB2 device. Fixed recent regressions. [Ryan Holtz]
This commit is contained in:
parent
385aedf785
commit
39dc220851
@ -53,6 +53,7 @@
|
|||||||
DEFINE_DEVICE_TYPE(XMAP9, xmap9_device, "xmap9", "SGI XMAP9")
|
DEFINE_DEVICE_TYPE(XMAP9, xmap9_device, "xmap9", "SGI XMAP9")
|
||||||
DEFINE_DEVICE_TYPE(CMAP, cmap_device, "cmap", "SGI CMAP")
|
DEFINE_DEVICE_TYPE(CMAP, cmap_device, "cmap", "SGI CMAP")
|
||||||
DEFINE_DEVICE_TYPE(VC2, vc2_device, "vc2", "SGI VC2")
|
DEFINE_DEVICE_TYPE(VC2, vc2_device, "vc2", "SGI VC2")
|
||||||
|
DEFINE_DEVICE_TYPE(RB2, rb2_device, "rb2", "SGI RB2")
|
||||||
DEFINE_DEVICE_TYPE(GIO64_XL8, gio64_xl8_device, "gio64_xl8", "SGI 8-bit XL board")
|
DEFINE_DEVICE_TYPE(GIO64_XL8, gio64_xl8_device, "gio64_xl8", "SGI 8-bit XL board")
|
||||||
DEFINE_DEVICE_TYPE(GIO64_XL24, gio64_xl24_device, "gio64_xl24", "SGI 24-bit XL board")
|
DEFINE_DEVICE_TYPE(GIO64_XL24, gio64_xl24_device, "gio64_xl24", "SGI 24-bit XL board")
|
||||||
|
|
||||||
@ -268,6 +269,7 @@ vc2_device::vc2_device(const machine_config &mconfig, const char *tag, device_t
|
|||||||
void vc2_device::device_start()
|
void vc2_device::device_start()
|
||||||
{
|
{
|
||||||
m_vert_int.resolve_safe();
|
m_vert_int.resolve_safe();
|
||||||
|
m_screen_timing_changed.resolve_safe();
|
||||||
|
|
||||||
m_ram = std::make_unique<uint16_t[]>(RAM_SIZE);
|
m_ram = std::make_unique<uint16_t[]>(RAM_SIZE);
|
||||||
m_vt_table = make_unique_clear<uint32_t[]>(2048 * 2048);
|
m_vt_table = make_unique_clear<uint32_t[]>(2048 * 2048);
|
||||||
@ -673,6 +675,8 @@ void vc2_device::update_screen_size()
|
|||||||
src++;
|
src++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_screen_timing_changed(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool vc2_device::is_cursor_active(int x, int y)
|
bool vc2_device::is_cursor_active(int x, int y)
|
||||||
@ -726,6 +730,180 @@ WRITE_LINE_MEMBER(vc2_device::vblank_w)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************
|
||||||
|
*
|
||||||
|
* RB2 Device
|
||||||
|
*
|
||||||
|
*************************************/
|
||||||
|
|
||||||
|
/*static*/ const size_t rb2_device::BUFFER_SIZE = (1280 + 64) * (1024 + 64);
|
||||||
|
|
||||||
|
rb2_device::rb2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||||
|
: device_t(mconfig, RB2, tag, owner, clock)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void rb2_device::device_start()
|
||||||
|
{
|
||||||
|
m_rgbci = std::make_unique<uint32_t[]>(BUFFER_SIZE);
|
||||||
|
m_cidaux = std::make_unique<uint32_t[]>(BUFFER_SIZE);
|
||||||
|
|
||||||
|
save_item(NAME(m_global_mask));
|
||||||
|
save_item(NAME(m_write_mask));
|
||||||
|
save_item(NAME(m_blend));
|
||||||
|
save_item(NAME(m_fast_clear));
|
||||||
|
save_item(NAME(m_rgbmode));
|
||||||
|
save_item(NAME(m_dblsrc));
|
||||||
|
save_item(NAME(m_plane_enable));
|
||||||
|
save_item(NAME(m_draw_depth));
|
||||||
|
save_item(NAME(m_logicop));
|
||||||
|
save_item(NAME(m_store_shift));
|
||||||
|
|
||||||
|
save_pointer(NAME(&m_rgbci[0]), BUFFER_SIZE);
|
||||||
|
save_pointer(NAME(&m_cidaux[0]), BUFFER_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void rb2_device::device_reset()
|
||||||
|
{
|
||||||
|
m_write_mask = 0;
|
||||||
|
m_blend = false;
|
||||||
|
m_fast_clear = false;
|
||||||
|
m_rgbmode = false;
|
||||||
|
m_dblsrc = false;
|
||||||
|
m_plane_enable = 0;
|
||||||
|
m_draw_depth = 0;
|
||||||
|
m_logicop = 0;
|
||||||
|
m_store_shift = 0;
|
||||||
|
|
||||||
|
m_dest_buf = &m_rgbci[0];
|
||||||
|
m_buf_ptr = &m_rgbci[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
void rb2_device::set_write_mask(uint32_t data)
|
||||||
|
{
|
||||||
|
m_write_mask = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rb2_device::set_flags(uint16_t data)
|
||||||
|
{
|
||||||
|
m_blend = BIT(data, 12);
|
||||||
|
m_fast_clear = BIT(data, 11);
|
||||||
|
m_rgbmode = BIT(data, 10);
|
||||||
|
m_dblsrc = BIT(data, 9);
|
||||||
|
m_plane_enable = (data & 0x1c0) >> 6;
|
||||||
|
m_draw_depth = (data & 0x30) >> 4;
|
||||||
|
m_logicop = data & 0xf;
|
||||||
|
|
||||||
|
static const uint32_t s_store_shift[8][4][2] = {
|
||||||
|
{ { 0, 0 }, // None, 4bpp, Buffer 0/1
|
||||||
|
{ 0, 0 }, // None, 8bpp, Buffer 0/1
|
||||||
|
{ 0, 0 }, // None, 12bpp, Buffer 0/1
|
||||||
|
{ 0, 0 }, // None, 24bpp, Buffer 0/1 (not valid)
|
||||||
|
},
|
||||||
|
{ { 0, 0 }, // RGB/CI, 4bpp, Buffer 0/1
|
||||||
|
{ 0, 8 }, // RGB/CI, 8bpp, Buffer 0/1
|
||||||
|
{ 0, 12 }, // RGB/CI, 12bpp, Buffer 0/1
|
||||||
|
{ 0, 0 }, // RGB/CI, 24bpp, Buffer 0/1 (not valid)
|
||||||
|
},
|
||||||
|
{ { 0, 0 }, // RGBA, 4bpp, Buffer 0/1
|
||||||
|
{ 0, 8 }, // RGBA, 8bpp, Buffer 0/1
|
||||||
|
{ 0, 12 }, // RGBA, 12bpp, Buffer 0/1
|
||||||
|
{ 0, 0 }, // RGBA, 24bpp, Buffer 0/1 (not valid)
|
||||||
|
},
|
||||||
|
{ { 0, 0 }, // Invalid, 4bpp, Buffer 0/1
|
||||||
|
{ 0, 0 }, // Invalid, 8bpp, Buffer 0/1
|
||||||
|
{ 0, 0 }, // Invalid, 12bpp, Buffer 0/1
|
||||||
|
{ 0, 0 }, // Invalid, 24bpp, Buffer 0/1 (not valid)
|
||||||
|
},
|
||||||
|
{ { 8, 16 }, // Overlay, 4bpp, Buffer 0/1
|
||||||
|
{ 8, 16 }, // Overlay, 8bpp, Buffer 0/1
|
||||||
|
{ 8, 16 }, // Overlay, 12bpp, Buffer 0/1
|
||||||
|
{ 8, 16 }, // Overlay, 24bpp, Buffer 0/1 (not valid)
|
||||||
|
},
|
||||||
|
{ { 2, 6 }, // Popup, 4bpp, Buffer 0/1
|
||||||
|
{ 2, 6 }, // Popup, 8bpp, Buffer 0/1
|
||||||
|
{ 2, 6 }, // Popup, 12bpp, Buffer 0/1
|
||||||
|
{ 2, 6 }, // Popup, 24bpp, Buffer 0/1 (not valid)
|
||||||
|
},
|
||||||
|
{ { 0, 4 }, // CID, 4bpp, Buffer 0/1
|
||||||
|
{ 0, 4 }, // CID, 8bpp, Buffer 0/1
|
||||||
|
{ 0, 4 }, // CID, 12bpp, Buffer 0/1
|
||||||
|
{ 0, 4 }, // CID, 24bpp, Buffer 0/1 (not valid)
|
||||||
|
},
|
||||||
|
{ { 0, 0 }, // Invalid, 4bpp, Buffer 0/1
|
||||||
|
{ 0, 0 }, // Invalid, 8bpp, Buffer 0/1
|
||||||
|
{ 0, 0 }, // Invalid, 12bpp, Buffer 0/1
|
||||||
|
{ 0, 0 }, // Invalid, 24bpp, Buffer 0/1 (not valid)
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
m_store_shift = s_store_shift[m_plane_enable][m_draw_depth][m_dblsrc];
|
||||||
|
|
||||||
|
switch (m_plane_enable)
|
||||||
|
{
|
||||||
|
case 1: // RGB/CI planes
|
||||||
|
case 2: // RGBA planes
|
||||||
|
m_dest_buf = &m_rgbci[0];
|
||||||
|
break;
|
||||||
|
case 4: // Overlay planes
|
||||||
|
case 5: // Popup planes
|
||||||
|
case 6: // CID planes
|
||||||
|
m_dest_buf = &m_cidaux[0];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void rb2_device::set_address(uint32_t address)
|
||||||
|
{
|
||||||
|
m_buf_ptr = &m_dest_buf[address];
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t rb2_device::read_pixel()
|
||||||
|
{
|
||||||
|
return *m_buf_ptr >> m_store_shift;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rb2_device::write_pixel(uint32_t data)
|
||||||
|
{
|
||||||
|
if (m_blend)
|
||||||
|
store_pixel(data);
|
||||||
|
else
|
||||||
|
logic_pixel(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void rb2_device::logic_pixel(uint32_t src)
|
||||||
|
{
|
||||||
|
const uint32_t dst = read_pixel();
|
||||||
|
|
||||||
|
switch (m_logicop)
|
||||||
|
{
|
||||||
|
case 0: store_pixel(0x000000); break;
|
||||||
|
case 1: store_pixel(src & dst); break;
|
||||||
|
case 2: store_pixel(src & ~dst); break;
|
||||||
|
case 3: store_pixel(src); break;
|
||||||
|
case 4: store_pixel(~src & dst); break;
|
||||||
|
case 5: store_pixel(dst); break;
|
||||||
|
case 6: store_pixel(src ^ dst); break;
|
||||||
|
case 7: store_pixel(src | dst); break;
|
||||||
|
case 8: store_pixel(~(src | dst)); break;
|
||||||
|
case 9: store_pixel(~(src ^ dst)); break;
|
||||||
|
case 10: store_pixel(~dst); break;
|
||||||
|
case 11: store_pixel(src | ~dst); break;
|
||||||
|
case 12: store_pixel(~src); break;
|
||||||
|
case 13: store_pixel(~src | dst); break;
|
||||||
|
case 14: store_pixel(~(src & dst)); break;
|
||||||
|
case 15: store_pixel(0xffffff); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void rb2_device::store_pixel(uint32_t value)
|
||||||
|
{
|
||||||
|
const uint32_t write_mask = m_write_mask & m_global_mask;
|
||||||
|
*m_buf_ptr &= ~write_mask;
|
||||||
|
*m_buf_ptr |= (value << m_store_shift) & write_mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************
|
/*************************************
|
||||||
*
|
*
|
||||||
* Newport Device
|
* Newport Device
|
||||||
@ -734,24 +912,29 @@ WRITE_LINE_MEMBER(vc2_device::vblank_w)
|
|||||||
|
|
||||||
/*static*/ const uint32_t newport_base_device::s_host_shifts[4] = { 8, 8, 16, 32 };
|
/*static*/ const uint32_t newport_base_device::s_host_shifts[4] = { 8, 8, 16, 32 };
|
||||||
|
|
||||||
newport_base_device::newport_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t global_mask)
|
newport_base_device::newport_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
|
||||||
: device_t(mconfig, type, tag, owner, clock)
|
: device_t(mconfig, type, tag, owner, clock)
|
||||||
, device_gio64_card_interface(mconfig, *this)
|
, device_gio64_card_interface(mconfig, *this)
|
||||||
, m_screen(*this, "screen")
|
, m_screen(*this, "screen")
|
||||||
, m_xmap(*this, "xmap%u", 0U)
|
, m_xmap(*this, "xmap%u", 0U)
|
||||||
, m_cmap(*this, "cmap%u", 0U)
|
, m_cmap(*this, "cmap%u", 0U)
|
||||||
, m_vc2(*this, "vc2")
|
, m_vc2(*this, "vc2")
|
||||||
, m_global_mask(global_mask)
|
, m_rb2(*this, "rb2")
|
||||||
|
, m_write_mask_w(*this)
|
||||||
|
, m_draw_flags_w(*this)
|
||||||
|
, m_set_address(*this)
|
||||||
|
, m_write_pixel(*this)
|
||||||
|
, m_read_pixel(*this)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
gio64_xl8_device::gio64_xl8_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
gio64_xl8_device::gio64_xl8_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||||
: newport_base_device(mconfig, GIO64_XL8, tag, owner, clock, 0x000000ff)
|
: newport_base_device(mconfig, GIO64_XL8, tag, owner, clock)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
gio64_xl24_device::gio64_xl24_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
gio64_xl24_device::gio64_xl24_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||||
: newport_base_device(mconfig, GIO64_XL24, tag, owner, clock, 0xffffffff)
|
: newport_base_device(mconfig, GIO64_XL24, tag, owner, clock)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -761,14 +944,8 @@ gio64_xl24_device::gio64_xl24_device(const machine_config &mconfig, const char *
|
|||||||
|
|
||||||
void newport_base_device::device_start()
|
void newport_base_device::device_start()
|
||||||
{
|
{
|
||||||
m_rgbci = make_unique_clear<uint32_t[]>((1280+64) * (1024+64));
|
|
||||||
m_cidaux = make_unique_clear<uint32_t[]>((1280+64) * (1024+64));
|
|
||||||
|
|
||||||
m_dcb_timeout_timer = timer_alloc(DCB_TIMEOUT);
|
m_dcb_timeout_timer = timer_alloc(DCB_TIMEOUT);
|
||||||
|
|
||||||
save_pointer(NAME(m_rgbci), (1280+64) * (1024+64));
|
|
||||||
save_pointer(NAME(m_cidaux), (1280+64) * (1024+64));
|
|
||||||
|
|
||||||
save_item(NAME(m_rex3.m_draw_mode0));
|
save_item(NAME(m_rex3.m_draw_mode0));
|
||||||
save_item(NAME(m_rex3.m_color_host));
|
save_item(NAME(m_rex3.m_color_host));
|
||||||
save_item(NAME(m_rex3.m_draw_mode1));
|
save_item(NAME(m_rex3.m_draw_mode1));
|
||||||
@ -779,7 +956,6 @@ void newport_base_device::device_start()
|
|||||||
save_item(NAME(m_rex3.m_rwdouble));
|
save_item(NAME(m_rex3.m_rwdouble));
|
||||||
save_item(NAME(m_rex3.m_sfactor));
|
save_item(NAME(m_rex3.m_sfactor));
|
||||||
save_item(NAME(m_rex3.m_dfactor));
|
save_item(NAME(m_rex3.m_dfactor));
|
||||||
save_item(NAME(m_rex3.m_logicop));
|
|
||||||
save_item(NAME(m_rex3.m_store_shift));
|
save_item(NAME(m_rex3.m_store_shift));
|
||||||
save_item(NAME(m_rex3.m_write_width));
|
save_item(NAME(m_rex3.m_write_width));
|
||||||
save_item(NAME(m_rex3.m_ls_mode));
|
save_item(NAME(m_rex3.m_ls_mode));
|
||||||
@ -859,6 +1035,12 @@ void newport_base_device::device_start()
|
|||||||
save_item(NAME(m_ramdac_lut_g));
|
save_item(NAME(m_ramdac_lut_g));
|
||||||
save_item(NAME(m_ramdac_lut_b));
|
save_item(NAME(m_ramdac_lut_b));
|
||||||
save_item(NAME(m_ramdac_lut_index));
|
save_item(NAME(m_ramdac_lut_index));
|
||||||
|
|
||||||
|
m_write_mask_w.resolve_safe();
|
||||||
|
m_draw_flags_w.resolve_safe();
|
||||||
|
m_set_address.resolve_safe();
|
||||||
|
m_write_pixel.resolve_safe();
|
||||||
|
m_read_pixel.resolve_safe(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
@ -912,8 +1094,8 @@ void newport_base_device::start_logging()
|
|||||||
fwrite(&m_rex3, sizeof(rex3_t), 1, m_newview_log);
|
fwrite(&m_rex3, sizeof(rex3_t), 1, m_newview_log);
|
||||||
// TODO
|
// TODO
|
||||||
//fwrite(&m_cmap0, sizeof(cmap_t), 1, m_newview_log);
|
//fwrite(&m_cmap0, sizeof(cmap_t), 1, m_newview_log);
|
||||||
fwrite(&m_rgbci[0], sizeof(uint32_t), (1280+64)*(1024+64), m_newview_log);
|
//fwrite(&m_rgbci[0], sizeof(uint32_t), (1280+64)*(1024+64), m_newview_log);
|
||||||
fwrite(&m_cidaux[0], sizeof(uint32_t), (1280+64)*(1024+64), m_newview_log);
|
//fwrite(&m_cidaux[0], sizeof(uint32_t), (1280+64)*(1024+64), m_newview_log);
|
||||||
}
|
}
|
||||||
|
|
||||||
void newport_base_device::stop_logging()
|
void newport_base_device::stop_logging()
|
||||||
@ -945,8 +1127,8 @@ uint32_t newport_base_device::screen_update(screen_device &device, bitmap_rgb32
|
|||||||
for (int y = cliprect.min_y, sy = y_start; y <= cliprect.max_y && sy < y_end; y++, sy++)
|
for (int y = cliprect.min_y, sy = y_start; y <= cliprect.max_y && sy < y_end; y++, sy++)
|
||||||
{
|
{
|
||||||
uint32_t *dest = &bitmap.pix32(y, cliprect.min_x);
|
uint32_t *dest = &bitmap.pix32(y, cliprect.min_x);
|
||||||
uint32_t *src_rgbci = &m_rgbci[1344 * y];
|
const uint32_t *src_rgbci = m_rb2->rgbci(y);
|
||||||
uint32_t *src_cidaux = &m_cidaux[1344 * y];
|
const uint32_t *src_cidaux = m_rb2->cidaux(y);
|
||||||
|
|
||||||
// Fetch the initial DID entry
|
// Fetch the initial DID entry
|
||||||
uint16_t curr_did_entry = m_vc2->begin_did_line(y);
|
uint16_t curr_did_entry = m_vc2->begin_did_line(y);
|
||||||
@ -1888,16 +2070,16 @@ uint32_t newport_base_device::get_host_color()
|
|||||||
return color;
|
return color;
|
||||||
}
|
}
|
||||||
|
|
||||||
void newport_base_device::write_pixel(uint32_t color)
|
void newport_base_device::output_pixel(uint32_t color)
|
||||||
{
|
{
|
||||||
const bool shade = BIT(m_rex3.m_draw_mode0, 18);
|
const bool shade = BIT(m_rex3.m_draw_mode0, 18);
|
||||||
const bool rgbmode = BIT(m_rex3.m_draw_mode1, 15);
|
const bool rgbmode = BIT(m_rex3.m_draw_mode1, 15);
|
||||||
if (m_rex3.m_color_host)
|
if (m_rex3.m_color_host)
|
||||||
write_pixel(m_rex3.m_x_start_i, m_rex3.m_y_start_i, get_host_color());
|
output_pixel(m_rex3.m_x_start_i, m_rex3.m_y_start_i, get_host_color());
|
||||||
else if (shade || rgbmode)
|
else if (shade || rgbmode)
|
||||||
write_pixel(m_rex3.m_x_start_i, m_rex3.m_y_start_i, get_rgb_color(m_rex3.m_x_start_i, m_rex3.m_y_start_i));
|
output_pixel(m_rex3.m_x_start_i, m_rex3.m_y_start_i, get_rgb_color(m_rex3.m_x_start_i, m_rex3.m_y_start_i));
|
||||||
else
|
else
|
||||||
write_pixel(m_rex3.m_x_start_i, m_rex3.m_y_start_i, color);
|
output_pixel(m_rex3.m_x_start_i, m_rex3.m_y_start_i, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool newport_base_device::pixel_clip_pass(int16_t x, int16_t y)
|
bool newport_base_device::pixel_clip_pass(int16_t x, int16_t y)
|
||||||
@ -1983,9 +2165,26 @@ bool newport_base_device::pixel_clip_pass(int16_t x, int16_t y)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void newport_base_device::blend_pixel(uint32_t *dest_buf, uint32_t src)
|
void newport_base_device::output_pixel(int16_t x, int16_t y, uint32_t color)
|
||||||
{
|
{
|
||||||
const uint32_t dst = *dest_buf >> m_rex3.m_store_shift;
|
if (!pixel_clip_pass(x, y))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
x += m_rex3.m_x_window;
|
||||||
|
y += m_rex3.m_y_window;
|
||||||
|
x -= 0x1000;
|
||||||
|
y -= 0x1000;
|
||||||
|
|
||||||
|
const uint32_t address = (uint32_t)(y * (1280 + 64) + x);
|
||||||
|
m_set_address(address);
|
||||||
|
m_write_pixel(color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void newport_base_device::blend_pixel(uint32_t src)
|
||||||
|
{
|
||||||
|
const uint32_t dst = m_read_pixel();
|
||||||
|
|
||||||
float sa = ((src >> 24) & 0xff) / 255.0f;
|
float sa = ((src >> 24) & 0xff) / 255.0f;
|
||||||
float sb = 0.0f;
|
float sb = 0.0f;
|
||||||
@ -2013,7 +2212,7 @@ void newport_base_device::blend_pixel(uint32_t *dest_buf, uint32_t src)
|
|||||||
sg = (0x92 * BIT(src, 5)) | (0x49 * BIT(src, 4)) | (0x24 * BIT(src, 3));
|
sg = (0x92 * BIT(src, 5)) | (0x49 * BIT(src, 4)) | (0x24 * BIT(src, 3));
|
||||||
sr = (0x92 * BIT(src, 2)) | (0x49 * BIT(src, 1)) | (0x24 * BIT(src, 0));
|
sr = (0x92 * BIT(src, 2)) | (0x49 * BIT(src, 1)) | (0x24 * BIT(src, 0));
|
||||||
|
|
||||||
if (BIT(m_rex3.m_draw_mode1, 25))
|
if (m_rex3.m_blend_back)
|
||||||
{
|
{
|
||||||
db = (uint8_t)(m_rex3.m_color_back >> 16) / 255.0f;
|
db = (uint8_t)(m_rex3.m_color_back >> 16) / 255.0f;
|
||||||
dg = (uint8_t)(m_rex3.m_color_back >> 8) / 255.0f;
|
dg = (uint8_t)(m_rex3.m_color_back >> 8) / 255.0f;
|
||||||
@ -2032,7 +2231,7 @@ void newport_base_device::blend_pixel(uint32_t *dest_buf, uint32_t src)
|
|||||||
sg = (((src >> 4) & 15) * 0x11) / 255.0f;
|
sg = (((src >> 4) & 15) * 0x11) / 255.0f;
|
||||||
sr = (((src >> 0) & 15) * 0x11) / 255.0f;
|
sr = (((src >> 0) & 15) * 0x11) / 255.0f;
|
||||||
|
|
||||||
if (BIT(m_rex3.m_draw_mode1, 25))
|
if (m_rex3.m_blend_back)
|
||||||
{
|
{
|
||||||
db = (uint8_t)(m_rex3.m_color_back >> 16) / 255.0f;
|
db = (uint8_t)(m_rex3.m_color_back >> 16) / 255.0f;
|
||||||
dg = (uint8_t)(m_rex3.m_color_back >> 8) / 255.0f;
|
dg = (uint8_t)(m_rex3.m_color_back >> 8) / 255.0f;
|
||||||
@ -2052,7 +2251,7 @@ void newport_base_device::blend_pixel(uint32_t *dest_buf, uint32_t src)
|
|||||||
sg = (uint8_t)(src >> 8) / 255.0f;
|
sg = (uint8_t)(src >> 8) / 255.0f;
|
||||||
sr = (uint8_t)(src >> 0) / 255.0f;
|
sr = (uint8_t)(src >> 0) / 255.0f;
|
||||||
|
|
||||||
if (BIT(m_rex3.m_draw_mode1, 25))
|
if (m_rex3.m_blend_back)
|
||||||
{
|
{
|
||||||
db = (uint8_t)(m_rex3.m_color_back >> 16) / 255.0f;
|
db = (uint8_t)(m_rex3.m_color_back >> 16) / 255.0f;
|
||||||
dg = (uint8_t)(m_rex3.m_color_back >> 8) / 255.0f;
|
dg = (uint8_t)(m_rex3.m_color_back >> 8) / 255.0f;
|
||||||
@ -2158,80 +2357,14 @@ void newport_base_device::blend_pixel(uint32_t *dest_buf, uint32_t src)
|
|||||||
case 1: // 8bpp (not supported)
|
case 1: // 8bpp (not supported)
|
||||||
break;
|
break;
|
||||||
case 2: // 12bpp
|
case 2: // 12bpp
|
||||||
store_pixel(dest_buf, ((b_blend_i & 0xf0) << 4) | (g_blend_i & 0xf0) | ((r_blend_i & 0xf0) >> 4));
|
m_write_pixel(((b_blend_i & 0xf0) << 4) | (g_blend_i & 0xf0) | ((r_blend_i & 0xf0) >> 4));
|
||||||
break;
|
break;
|
||||||
case 3: // 24bpp
|
case 3: // 24bpp
|
||||||
store_pixel(dest_buf, (b_blend_i << 16) | (g_blend_i << 8) | r_blend_i);
|
m_write_pixel((b_blend_i << 16) | (g_blend_i << 8) | r_blend_i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void newport_base_device::logic_pixel(uint32_t *dest_buf, uint32_t src)
|
|
||||||
{
|
|
||||||
const uint32_t dst = *dest_buf >> m_rex3.m_store_shift;
|
|
||||||
|
|
||||||
switch (m_rex3.m_logicop)
|
|
||||||
{
|
|
||||||
case 0: store_pixel(dest_buf, 0x000000); break;
|
|
||||||
case 1: store_pixel(dest_buf, src & dst); break;
|
|
||||||
case 2: store_pixel(dest_buf, src & ~dst); break;
|
|
||||||
case 3: store_pixel(dest_buf, src); break;
|
|
||||||
case 4: store_pixel(dest_buf, ~src & dst); break;
|
|
||||||
case 5: store_pixel(dest_buf, dst); break;
|
|
||||||
case 6: store_pixel(dest_buf, src ^ dst); break;
|
|
||||||
case 7: store_pixel(dest_buf, src | dst); break;
|
|
||||||
case 8: store_pixel(dest_buf, ~(src | dst)); break;
|
|
||||||
case 9: store_pixel(dest_buf, ~(src ^ dst)); break;
|
|
||||||
case 10: store_pixel(dest_buf, ~dst); break;
|
|
||||||
case 11: store_pixel(dest_buf, src | ~dst); break;
|
|
||||||
case 12: store_pixel(dest_buf, ~src); break;
|
|
||||||
case 13: store_pixel(dest_buf, ~src | dst); break;
|
|
||||||
case 14: store_pixel(dest_buf, ~(src & dst)); break;
|
|
||||||
case 15: store_pixel(dest_buf, 0xffffff); break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void newport_base_device::store_pixel(uint32_t *dest_buf, uint32_t value)
|
|
||||||
{
|
|
||||||
const uint32_t write_mask = m_rex3.m_write_mask & m_global_mask;
|
|
||||||
*dest_buf &= ~write_mask;
|
|
||||||
*dest_buf |= (value << m_rex3.m_store_shift) & write_mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
void newport_base_device::write_pixel(int16_t x, int16_t y, uint32_t color)
|
|
||||||
{
|
|
||||||
if (!pixel_clip_pass(x, y))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
x += m_rex3.m_x_window;
|
|
||||||
y += m_rex3.m_y_window;
|
|
||||||
x -= 0x1000;
|
|
||||||
y -= 0x1000;
|
|
||||||
|
|
||||||
uint32_t *dest_buf = nullptr;
|
|
||||||
switch (m_rex3.m_plane_enable)
|
|
||||||
{
|
|
||||||
case 1: // RGB/CI planes
|
|
||||||
dest_buf = &m_rgbci[y * (1280 + 64) + x];
|
|
||||||
break;
|
|
||||||
case 2: // RGBA planes
|
|
||||||
// Not yet handled
|
|
||||||
break;
|
|
||||||
case 4: // Overlay planes
|
|
||||||
case 5: // Popup planes
|
|
||||||
case 6: // CID planes
|
|
||||||
dest_buf = &m_cidaux[y * (1280 + 64) + x];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (BIT(m_rex3.m_draw_mode1, 18))
|
|
||||||
blend_pixel(dest_buf, color);
|
|
||||||
else
|
|
||||||
logic_pixel(dest_buf, color);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t newport_base_device::get_rgb_color(int16_t x, int16_t y)
|
uint32_t newport_base_device::get_rgb_color(int16_t x, int16_t y)
|
||||||
{
|
{
|
||||||
static const uint8_t s_bayer[4][4] = { { 0, 12, 3, 15 },{ 8, 4, 11, 7 },{ 2, 14, 1, 13 },{ 10, 6, 9, 5 } };
|
static const uint8_t s_bayer[4][4] = { { 0, 12, 3, 15 },{ 8, 4, 11, 7 },{ 2, 14, 1, 13 },{ 10, 6, 9, 5 } };
|
||||||
@ -2533,9 +2666,9 @@ void newport_base_device::do_fline(uint32_t color)
|
|||||||
const int16_t x16 = (int16_t)(x >> 4);
|
const int16_t x16 = (int16_t)(x >> 4);
|
||||||
const int16_t y16 = (int16_t)(y >> 4);
|
const int16_t y16 = (int16_t)(y >> 4);
|
||||||
if (shade || rgbmode)
|
if (shade || rgbmode)
|
||||||
write_pixel(x16, y16, get_rgb_color(x16, y16));
|
output_pixel(x16, y16, get_rgb_color(x16, y16));
|
||||||
else
|
else
|
||||||
write_pixel(x16, y16, color);
|
output_pixel(x16, y16, color);
|
||||||
|
|
||||||
if (shade)
|
if (shade)
|
||||||
iterate_shade();
|
iterate_shade();
|
||||||
@ -2566,9 +2699,9 @@ void newport_base_device::do_fline(uint32_t color)
|
|||||||
const int16_t x16 = (int16_t)(x >> 4);
|
const int16_t x16 = (int16_t)(x >> 4);
|
||||||
const int16_t y16 = (int16_t)(y >> 4);
|
const int16_t y16 = (int16_t)(y >> 4);
|
||||||
if (shade || rgbmode)
|
if (shade || rgbmode)
|
||||||
write_pixel(x16, y16, get_rgb_color(x16, y16));
|
output_pixel(x16, y16, get_rgb_color(x16, y16));
|
||||||
else
|
else
|
||||||
write_pixel(x16, y16, color);
|
output_pixel(x16, y16, color);
|
||||||
|
|
||||||
if (shade)
|
if (shade)
|
||||||
iterate_shade();
|
iterate_shade();
|
||||||
@ -2592,9 +2725,9 @@ void newport_base_device::do_fline(uint32_t color)
|
|||||||
const int16_t x16 = (int16_t)(x2 >> 4);
|
const int16_t x16 = (int16_t)(x2 >> 4);
|
||||||
const int16_t y16 = (int16_t)(y2 >> 4);
|
const int16_t y16 = (int16_t)(y2 >> 4);
|
||||||
if (shade || rgbmode)
|
if (shade || rgbmode)
|
||||||
write_pixel(x16, y16, get_rgb_color(x16, y16));
|
output_pixel(x16, y16, get_rgb_color(x16, y16));
|
||||||
else
|
else
|
||||||
write_pixel(x16, y16, color);
|
output_pixel(x16, y16, color);
|
||||||
|
|
||||||
if (shade)
|
if (shade)
|
||||||
iterate_shade();
|
iterate_shade();
|
||||||
@ -2658,9 +2791,9 @@ void newport_base_device::do_iline(uint32_t color)
|
|||||||
const int16_t y16 = (int16_t)y;
|
const int16_t y16 = (int16_t)y;
|
||||||
|
|
||||||
if (shade || rgbmode)
|
if (shade || rgbmode)
|
||||||
write_pixel(x16, y16, get_rgb_color(x16, y16));
|
output_pixel(x16, y16, get_rgb_color(x16, y16));
|
||||||
else
|
else
|
||||||
write_pixel(x16, y16, color);
|
output_pixel(x16, y16, color);
|
||||||
|
|
||||||
if (shade)
|
if (shade)
|
||||||
iterate_shade();
|
iterate_shade();
|
||||||
@ -2692,9 +2825,9 @@ void newport_base_device::do_iline(uint32_t color)
|
|||||||
const int16_t y16 = (int16_t)y;
|
const int16_t y16 = (int16_t)y;
|
||||||
|
|
||||||
if (shade || rgbmode)
|
if (shade || rgbmode)
|
||||||
write_pixel(x16, y16, get_rgb_color(x16, y16));
|
output_pixel(x16, y16, get_rgb_color(x16, y16));
|
||||||
else
|
else
|
||||||
write_pixel(x16, y16, color);
|
output_pixel(x16, y16, color);
|
||||||
|
|
||||||
if (shade)
|
if (shade)
|
||||||
iterate_shade();
|
iterate_shade();
|
||||||
@ -2719,9 +2852,9 @@ void newport_base_device::do_iline(uint32_t color)
|
|||||||
const int16_t y16 = (int16_t)y2;
|
const int16_t y16 = (int16_t)y2;
|
||||||
|
|
||||||
if (shade || rgbmode)
|
if (shade || rgbmode)
|
||||||
write_pixel(x16, y16, get_rgb_color(x16, y16));
|
output_pixel(x16, y16, get_rgb_color(x16, y16));
|
||||||
else
|
else
|
||||||
write_pixel(x16, y16, color);
|
output_pixel(x16, y16, color);
|
||||||
|
|
||||||
if (shade)
|
if (shade)
|
||||||
iterate_shade();
|
iterate_shade();
|
||||||
@ -2741,14 +2874,11 @@ uint32_t newport_base_device::do_pixel_read()
|
|||||||
m_rex3.m_bres_octant_inc1 = 0;
|
m_rex3.m_bres_octant_inc1 = 0;
|
||||||
const int16_t src_x = m_rex3.m_x_start_i + m_rex3.m_x_window - 0x1000;
|
const int16_t src_x = m_rex3.m_x_start_i + m_rex3.m_x_window - 0x1000;
|
||||||
const int16_t src_y = m_rex3.m_y_start_i + m_rex3.m_y_window - 0x1000;
|
const int16_t src_y = m_rex3.m_y_start_i + m_rex3.m_y_window - 0x1000;
|
||||||
const uint32_t src_addr = src_y * (1280 + 64) + src_x;
|
|
||||||
uint32_t ret = 0;
|
uint32_t ret = 0;
|
||||||
switch (m_rex3.m_plane_enable)
|
m_set_address(src_y * (1280 + 64) + src_x);
|
||||||
|
ret = m_read_pixel();
|
||||||
|
if (m_rex3.m_plane_enable == 1 || m_rex3.m_plane_enable == 2) // RGB/CI or RGBA planes
|
||||||
{
|
{
|
||||||
case 1: // RGB/CI planes
|
|
||||||
case 2: // RGBA planes
|
|
||||||
{
|
|
||||||
ret = m_rgbci[src_addr];
|
|
||||||
uint8_t convert_index = (m_rex3.m_plane_depth << 2) | m_rex3.m_hostdepth;
|
uint8_t convert_index = (m_rex3.m_plane_depth << 2) | m_rex3.m_hostdepth;
|
||||||
switch (convert_index & 15)
|
switch (convert_index & 15)
|
||||||
{
|
{
|
||||||
@ -2792,15 +2922,8 @@ uint32_t newport_base_device::do_pixel_read()
|
|||||||
ret = convert_24bpp_bgr_to_12bpp(ret);
|
ret = convert_24bpp_bgr_to_12bpp(ret);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case 4: // Overlay planes
|
LOGMASKED(LOG_COMMANDS, "Read %08x from %04x, %04x\n", ret, src_x, src_y);
|
||||||
case 5: // Popup planes
|
|
||||||
case 6: // CID planes
|
|
||||||
ret = m_cidaux[src_addr];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
LOGMASKED(LOG_COMMANDS, "Read %08x (%08x) from %04x, %04x\n", ret, m_rgbci[src_addr], src_x, src_y);
|
|
||||||
m_rex3.m_x_start_i++;
|
m_rex3.m_x_start_i++;
|
||||||
if (m_rex3.m_x_start_i > m_rex3.m_x_end_i)
|
if (m_rex3.m_x_start_i > m_rex3.m_x_end_i)
|
||||||
{
|
{
|
||||||
@ -3054,15 +3177,15 @@ void newport_base_device::do_rex3_command()
|
|||||||
if (BIT(pattern, bit))
|
if (BIT(pattern, bit))
|
||||||
{
|
{
|
||||||
if (m_rex3.m_color_host)
|
if (m_rex3.m_color_host)
|
||||||
write_pixel(start_x, start_y, get_host_color());
|
output_pixel(start_x, start_y, get_host_color());
|
||||||
else if ((shade || rgbmode) && !fastclear)
|
else if ((shade || rgbmode) && !fastclear)
|
||||||
write_pixel(start_x, start_y, get_rgb_color(start_x, start_y));
|
output_pixel(start_x, start_y, get_rgb_color(start_x, start_y));
|
||||||
else
|
else
|
||||||
write_pixel(start_x, start_y, color);
|
output_pixel(start_x, start_y, color);
|
||||||
}
|
}
|
||||||
else if (opaque)
|
else if (opaque)
|
||||||
{
|
{
|
||||||
write_pixel(start_x, start_y, m_rex3.m_color_back);
|
output_pixel(start_x, start_y, m_rex3.m_color_back);
|
||||||
}
|
}
|
||||||
|
|
||||||
bit = (bit - 1) & 0x1f;
|
bit = (bit - 1) & 0x1f;
|
||||||
@ -3154,15 +3277,15 @@ void newport_base_device::do_rex3_command()
|
|||||||
if (BIT(pattern, bit))
|
if (BIT(pattern, bit))
|
||||||
{
|
{
|
||||||
if (m_rex3.m_color_host)
|
if (m_rex3.m_color_host)
|
||||||
write_pixel(start_x, start_y, get_host_color());
|
output_pixel(start_x, start_y, get_host_color());
|
||||||
else if ((shade || rgbmode) && !fastclear)
|
else if ((shade || rgbmode) && !fastclear)
|
||||||
write_pixel(start_x, start_y, get_rgb_color(start_x, start_y));
|
output_pixel(start_x, start_y, get_rgb_color(start_x, start_y));
|
||||||
else
|
else
|
||||||
write_pixel(start_x, start_y, color);
|
output_pixel(start_x, start_y, color);
|
||||||
}
|
}
|
||||||
else if (opaque)
|
else if (opaque)
|
||||||
{
|
{
|
||||||
write_pixel(start_x, start_y, m_rex3.m_color_back);
|
output_pixel(start_x, start_y, m_rex3.m_color_back);
|
||||||
}
|
}
|
||||||
|
|
||||||
bit = (bit - 1) & 0x1f;
|
bit = (bit - 1) & 0x1f;
|
||||||
@ -3215,26 +3338,10 @@ void newport_base_device::do_rex3_command()
|
|||||||
{
|
{
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
const uint32_t src_addr = (start_y + m_rex3.m_y_window - 0x1000) * (1280 + 64) + (start_x + m_rex3.m_x_window - 0x1000);
|
m_set_address((start_y + m_rex3.m_y_window - 0x1000) * (1280 + 64) + (start_x + m_rex3.m_x_window - 0x1000));
|
||||||
uint32_t src = 0;
|
uint32_t src = m_read_pixel();
|
||||||
switch (mode1 & 7)
|
|
||||||
{
|
|
||||||
case 1: // RGB/CI planes
|
|
||||||
src = m_rgbci[src_addr];
|
|
||||||
break;
|
|
||||||
case 2: // RGBA planes (not yet implemented)
|
|
||||||
break;
|
|
||||||
case 4: // Overlay planes
|
|
||||||
case 5: // Popup planes
|
|
||||||
case 6: // CID planes
|
|
||||||
src = m_cidaux[src_addr];
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
src >>= m_rex3.m_store_shift;
|
|
||||||
|
|
||||||
write_pixel(start_x + m_rex3.m_x_move, start_y + m_rex3.m_y_move, src);
|
output_pixel(start_x + m_rex3.m_x_move, start_y + m_rex3.m_y_move, src);
|
||||||
|
|
||||||
start_x += dx;
|
start_x += dx;
|
||||||
} while (start_x != end_x && stop_on_x);
|
} while (start_x != end_x && stop_on_x);
|
||||||
@ -3339,7 +3446,7 @@ WRITE64_MEMBER(newport_base_device::rex3_w)
|
|||||||
LOGMASKED(LOG_REX3 | LOG_UNKNOWN, " Unknown Plane Enable Value\n");
|
LOGMASKED(LOG_REX3 | LOG_UNKNOWN, " Unknown Plane Enable Value\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
switch ((data32 & 0x00000018) >> 3)
|
switch ((data32 >> 3) & 3)
|
||||||
{
|
{
|
||||||
case 0x00:
|
case 0x00:
|
||||||
LOGMASKED(LOG_REX3, " Plane Draw Depth: 4 bits\n");
|
LOGMASKED(LOG_REX3, " Plane Draw Depth: 4 bits\n");
|
||||||
@ -3489,49 +3596,6 @@ WRITE64_MEMBER(newport_base_device::rex3_w)
|
|||||||
}
|
}
|
||||||
m_rex3.m_draw_mode1 = data32;
|
m_rex3.m_draw_mode1 = data32;
|
||||||
|
|
||||||
static const uint32_t s_store_shift[8][4][2] = {
|
|
||||||
{ { 0, 0 }, // None, 4bpp, Buffer 0/1
|
|
||||||
{ 0, 0 }, // None, 8bpp, Buffer 0/1
|
|
||||||
{ 0, 0 }, // None, 12bpp, Buffer 0/1
|
|
||||||
{ 0, 0 }, // None, 24bpp, Buffer 0/1 (not valid)
|
|
||||||
},
|
|
||||||
{ { 0, 0 }, // RGB/CI, 4bpp, Buffer 0/1
|
|
||||||
{ 0, 8 }, // RGB/CI, 8bpp, Buffer 0/1
|
|
||||||
{ 0, 12 }, // RGB/CI, 12bpp, Buffer 0/1
|
|
||||||
{ 0, 0 }, // RGB/CI, 24bpp, Buffer 0/1 (not valid)
|
|
||||||
},
|
|
||||||
{ { 0, 0 }, // RGBA, 4bpp, Buffer 0/1
|
|
||||||
{ 0, 8 }, // RGBA, 8bpp, Buffer 0/1
|
|
||||||
{ 0, 12 }, // RGBA, 12bpp, Buffer 0/1
|
|
||||||
{ 0, 0 }, // RGBA, 24bpp, Buffer 0/1 (not valid)
|
|
||||||
},
|
|
||||||
{ { 0, 0 }, // Invalid, 4bpp, Buffer 0/1
|
|
||||||
{ 0, 0 }, // Invalid, 8bpp, Buffer 0/1
|
|
||||||
{ 0, 0 }, // Invalid, 12bpp, Buffer 0/1
|
|
||||||
{ 0, 0 }, // Invalid, 24bpp, Buffer 0/1 (not valid)
|
|
||||||
},
|
|
||||||
{ { 8, 16 }, // Overlay, 4bpp, Buffer 0/1
|
|
||||||
{ 8, 16 }, // Overlay, 8bpp, Buffer 0/1
|
|
||||||
{ 8, 16 }, // Overlay, 12bpp, Buffer 0/1
|
|
||||||
{ 8, 16 }, // Overlay, 24bpp, Buffer 0/1 (not valid)
|
|
||||||
},
|
|
||||||
{ { 2, 6 }, // Popup, 4bpp, Buffer 0/1
|
|
||||||
{ 2, 6 }, // Popup, 8bpp, Buffer 0/1
|
|
||||||
{ 2, 6 }, // Popup, 12bpp, Buffer 0/1
|
|
||||||
{ 2, 6 }, // Popup, 24bpp, Buffer 0/1 (not valid)
|
|
||||||
},
|
|
||||||
{ { 0, 4 }, // CID, 4bpp, Buffer 0/1
|
|
||||||
{ 0, 4 }, // CID, 8bpp, Buffer 0/1
|
|
||||||
{ 0, 4 }, // CID, 12bpp, Buffer 0/1
|
|
||||||
{ 0, 4 }, // CID, 24bpp, Buffer 0/1 (not valid)
|
|
||||||
},
|
|
||||||
{ { 0, 0 }, // Invalid, 4bpp, Buffer 0/1
|
|
||||||
{ 0, 0 }, // Invalid, 8bpp, Buffer 0/1
|
|
||||||
{ 0, 0 }, // Invalid, 12bpp, Buffer 0/1
|
|
||||||
{ 0, 0 }, // Invalid, 24bpp, Buffer 0/1 (not valid)
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
m_rex3.m_plane_enable = m_rex3.m_draw_mode1 & 7;
|
m_rex3.m_plane_enable = m_rex3.m_draw_mode1 & 7;
|
||||||
m_rex3.m_plane_depth = (m_rex3.m_draw_mode1 >> 3) & 3;
|
m_rex3.m_plane_depth = (m_rex3.m_draw_mode1 >> 3) & 3;
|
||||||
m_rex3.m_rwpacked = BIT(m_rex3.m_draw_mode1, 7);
|
m_rex3.m_rwpacked = BIT(m_rex3.m_draw_mode1, 7);
|
||||||
@ -3539,10 +3603,18 @@ WRITE64_MEMBER(newport_base_device::rex3_w)
|
|||||||
m_rex3.m_rwdouble = BIT(m_rex3.m_draw_mode1, 10);
|
m_rex3.m_rwdouble = BIT(m_rex3.m_draw_mode1, 10);
|
||||||
m_rex3.m_sfactor = (m_rex3.m_draw_mode1 >> 19) & 7;
|
m_rex3.m_sfactor = (m_rex3.m_draw_mode1 >> 19) & 7;
|
||||||
m_rex3.m_dfactor = (m_rex3.m_draw_mode1 >> 22) & 7;
|
m_rex3.m_dfactor = (m_rex3.m_draw_mode1 >> 22) & 7;
|
||||||
m_rex3.m_logicop = (m_rex3.m_draw_mode1 >> 28) & 15;
|
m_rex3.m_blend_back = BIT(m_rex3.m_draw_mode1, 25);
|
||||||
|
|
||||||
m_rex3.m_store_shift = s_store_shift[m_rex3.m_plane_enable][m_rex3.m_plane_depth][BIT(m_rex3.m_draw_mode1, 5)];
|
|
||||||
m_rex3.m_host_shift = 64 - s_host_shifts[m_rex3.m_hostdepth];
|
m_rex3.m_host_shift = 64 - s_host_shifts[m_rex3.m_hostdepth];
|
||||||
|
|
||||||
|
uint16_t draw_flags = BIT(data32, 18) << 12;
|
||||||
|
draw_flags |= BIT(data32, 17) << 11;
|
||||||
|
draw_flags |= BIT(data32, 15) << 10;
|
||||||
|
draw_flags |= BIT(data32, 5) << 9;
|
||||||
|
draw_flags |= (data32 & 7) << 6;
|
||||||
|
draw_flags |= (data32 & 0x18) << 1;
|
||||||
|
draw_flags |= (data32 >> 28) & 0xf;
|
||||||
|
m_draw_flags_w(draw_flags);
|
||||||
}
|
}
|
||||||
if (ACCESSING_BITS_0_31)
|
if (ACCESSING_BITS_0_31)
|
||||||
{
|
{
|
||||||
@ -3969,6 +4041,7 @@ WRITE64_MEMBER(newport_base_device::rex3_w)
|
|||||||
const uint32_t data32 = (uint32_t)(data >> 32);
|
const uint32_t data32 = (uint32_t)(data >> 32);
|
||||||
LOGMASKED(LOG_REX3, "REX3 Write Mask Write: %08x\n", data32);
|
LOGMASKED(LOG_REX3, "REX3 Write Mask Write: %08x\n", data32);
|
||||||
m_rex3.m_write_mask = data32 & 0xffffff;
|
m_rex3.m_write_mask = data32 & 0xffffff;
|
||||||
|
m_write_mask_w(m_rex3.m_write_mask);
|
||||||
}
|
}
|
||||||
if (ACCESSING_BITS_0_31)
|
if (ACCESSING_BITS_0_31)
|
||||||
{
|
{
|
||||||
@ -4225,7 +4298,7 @@ void newport_base_device::device_add_mconfig(machine_config &config)
|
|||||||
m_screen->screen_vblank().set(m_vc2, FUNC(vc2_device::vblank_w));
|
m_screen->screen_vblank().set(m_vc2, FUNC(vc2_device::vblank_w));
|
||||||
}
|
}
|
||||||
|
|
||||||
void newport_base_device::device_add_mconfig(machine_config &config, uint32_t xmap_revision, uint32_t cmap_revision)
|
void newport_base_device::device_add_mconfig(machine_config &config, uint32_t xmap_revision, uint32_t cmap_revision, uint32_t global_mask)
|
||||||
{
|
{
|
||||||
newport_base_device::device_add_mconfig(config);
|
newport_base_device::device_add_mconfig(config);
|
||||||
|
|
||||||
@ -4233,14 +4306,20 @@ void newport_base_device::device_add_mconfig(machine_config &config, uint32_t xm
|
|||||||
XMAP9(config, m_xmap[1], 0, xmap_revision);
|
XMAP9(config, m_xmap[1], 0, xmap_revision);
|
||||||
CMAP(config, m_cmap[0], 0, cmap_revision);
|
CMAP(config, m_cmap[0], 0, cmap_revision);
|
||||||
CMAP(config, m_cmap[1], 0, cmap_revision);
|
CMAP(config, m_cmap[1], 0, cmap_revision);
|
||||||
|
RB2(config, m_rb2, 0, global_mask);
|
||||||
|
write_mask().set(m_rb2, FUNC(rb2_device::set_write_mask));
|
||||||
|
draw_flags().set(m_rb2, FUNC(rb2_device::set_flags));
|
||||||
|
pixel_address().set(m_rb2, FUNC(rb2_device::set_address));
|
||||||
|
pixel_write().set(m_rb2, FUNC(rb2_device::write_pixel));
|
||||||
|
pixel_read().set(m_rb2, FUNC(rb2_device::read_pixel));
|
||||||
}
|
}
|
||||||
|
|
||||||
void gio64_xl8_device::device_add_mconfig(machine_config &config)
|
void gio64_xl8_device::device_add_mconfig(machine_config &config)
|
||||||
{
|
{
|
||||||
newport_base_device::device_add_mconfig(config, 1, 0xa1);
|
newport_base_device::device_add_mconfig(config, 1, 0xa1, 0x000000ff);
|
||||||
}
|
}
|
||||||
|
|
||||||
void gio64_xl24_device::device_add_mconfig(machine_config &config)
|
void gio64_xl24_device::device_add_mconfig(machine_config &config)
|
||||||
{
|
{
|
||||||
newport_base_device::device_add_mconfig(config, 3, 0x02);
|
newport_base_device::device_add_mconfig(config, 3, 0x02, 0x00ffffff);
|
||||||
}
|
}
|
||||||
|
@ -200,7 +200,68 @@ private:
|
|||||||
static const size_t RAM_SIZE;
|
static const size_t RAM_SIZE;
|
||||||
};
|
};
|
||||||
|
|
||||||
DECLARE_DEVICE_TYPE(XMAP9, xmap9_device)
|
DECLARE_DEVICE_TYPE(VC2, vc2_device)
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************
|
||||||
|
*
|
||||||
|
* RB2 Device
|
||||||
|
*
|
||||||
|
*************************************/
|
||||||
|
|
||||||
|
class rb2_device : public device_t
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
rb2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, uint32_t global_mask)
|
||||||
|
: rb2_device(mconfig, tag, owner, clock)
|
||||||
|
{
|
||||||
|
set_global_mask(global_mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
rb2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||||
|
|
||||||
|
// Getters
|
||||||
|
const uint32_t *rgbci(int y) const { return &m_rgbci[1344 * y]; }
|
||||||
|
const uint32_t *cidaux(int y) const { return &m_cidaux[1344 * y]; }
|
||||||
|
|
||||||
|
// devcb callbacks
|
||||||
|
void set_write_mask(uint32_t data);
|
||||||
|
void set_flags(uint16_t data);
|
||||||
|
void set_address(uint32_t address);
|
||||||
|
uint32_t read_pixel();
|
||||||
|
void write_pixel(uint32_t data);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// device_t overrides
|
||||||
|
virtual void device_start() override;
|
||||||
|
virtual void device_reset() override;
|
||||||
|
|
||||||
|
void logic_pixel(uint32_t src);
|
||||||
|
void store_pixel(uint32_t value);
|
||||||
|
|
||||||
|
void set_global_mask(uint32_t global_mask) { m_global_mask = global_mask; }
|
||||||
|
|
||||||
|
uint32_t m_global_mask;
|
||||||
|
uint32_t m_write_mask;
|
||||||
|
bool m_blend;
|
||||||
|
bool m_fast_clear;
|
||||||
|
bool m_rgbmode;
|
||||||
|
bool m_dblsrc;
|
||||||
|
uint8_t m_plane_enable;
|
||||||
|
uint8_t m_draw_depth;
|
||||||
|
uint8_t m_logicop;
|
||||||
|
uint8_t m_store_shift;
|
||||||
|
|
||||||
|
uint32_t *m_dest_buf;
|
||||||
|
uint32_t *m_buf_ptr;
|
||||||
|
|
||||||
|
std::unique_ptr<uint32_t[]> m_rgbci;
|
||||||
|
std::unique_ptr<uint32_t[]> m_cidaux;
|
||||||
|
|
||||||
|
static const size_t BUFFER_SIZE;
|
||||||
|
};
|
||||||
|
|
||||||
|
DECLARE_DEVICE_TYPE(RB2, rb2_device)
|
||||||
|
|
||||||
|
|
||||||
/*************************************
|
/*************************************
|
||||||
@ -213,7 +274,7 @@ class newport_base_device : public device_t
|
|||||||
, public device_gio64_card_interface
|
, public device_gio64_card_interface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
newport_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t global_mask);
|
newport_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
|
||||||
|
|
||||||
// device_gio_slot_interface overrides
|
// device_gio_slot_interface overrides
|
||||||
virtual void install_device() override;
|
virtual void install_device() override;
|
||||||
@ -226,6 +287,12 @@ public:
|
|||||||
DECLARE_WRITE_LINE_MEMBER(vrint_w);
|
DECLARE_WRITE_LINE_MEMBER(vrint_w);
|
||||||
DECLARE_WRITE_LINE_MEMBER(update_screen_size);
|
DECLARE_WRITE_LINE_MEMBER(update_screen_size);
|
||||||
|
|
||||||
|
auto write_mask() { return m_write_mask_w.bind(); }
|
||||||
|
auto draw_flags() { return m_draw_flags_w.bind(); }
|
||||||
|
auto pixel_address() { return m_set_address.bind(); }
|
||||||
|
auto pixel_write() { return m_write_pixel.bind(); }
|
||||||
|
auto pixel_read() { return m_read_pixel.bind(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// device_t overrides
|
// device_t overrides
|
||||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
|
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
|
||||||
@ -233,7 +300,7 @@ protected:
|
|||||||
virtual void device_start() override;
|
virtual void device_start() override;
|
||||||
virtual void device_reset() override;
|
virtual void device_reset() override;
|
||||||
|
|
||||||
void device_add_mconfig(machine_config &config, uint32_t xmap_revision, uint32_t cmap_revision);
|
void device_add_mconfig(machine_config &config, uint32_t xmap_revision, uint32_t cmap_revision, uint32_t global_mask);
|
||||||
void mem_map(address_map &map) override;
|
void mem_map(address_map &map) override;
|
||||||
|
|
||||||
static constexpr device_timer_id DCB_TIMEOUT = 0;
|
static constexpr device_timer_id DCB_TIMEOUT = 0;
|
||||||
@ -279,7 +346,6 @@ protected:
|
|||||||
uint8_t m_hostdepth;
|
uint8_t m_hostdepth;
|
||||||
uint8_t m_sfactor;
|
uint8_t m_sfactor;
|
||||||
uint8_t m_dfactor;
|
uint8_t m_dfactor;
|
||||||
uint8_t m_logicop;
|
|
||||||
|
|
||||||
uint32_t m_store_shift;
|
uint32_t m_store_shift;
|
||||||
uint32_t m_host_shift;
|
uint32_t m_host_shift;
|
||||||
@ -356,6 +422,7 @@ protected:
|
|||||||
uint32_t m_config;
|
uint32_t m_config;
|
||||||
uint32_t m_status;
|
uint32_t m_status;
|
||||||
uint32_t m_dcb_mask;
|
uint32_t m_dcb_mask;
|
||||||
|
bool m_blend_back;
|
||||||
};
|
};
|
||||||
|
|
||||||
void ramdac_write(uint32_t data);
|
void ramdac_write(uint32_t data);
|
||||||
@ -366,11 +433,9 @@ protected:
|
|||||||
void write_y_end(int32_t val);
|
void write_y_end(int32_t val);
|
||||||
|
|
||||||
bool pixel_clip_pass(int16_t x, int16_t y);
|
bool pixel_clip_pass(int16_t x, int16_t y);
|
||||||
void write_pixel(uint32_t color);
|
void output_pixel(uint32_t color);
|
||||||
void write_pixel(int16_t x, int16_t y, uint32_t color);
|
void output_pixel(int16_t x, int16_t y, uint32_t color);
|
||||||
void blend_pixel(uint32_t *dest_buf, uint32_t src);
|
void blend_pixel(uint32_t src);
|
||||||
void logic_pixel(uint32_t *dest_buf, uint32_t src);
|
|
||||||
void store_pixel(uint32_t *dest_buf, uint32_t src);
|
|
||||||
|
|
||||||
void iterate_shade();
|
void iterate_shade();
|
||||||
|
|
||||||
@ -419,6 +484,7 @@ protected:
|
|||||||
required_device_array<xmap9_device, 2> m_xmap;
|
required_device_array<xmap9_device, 2> m_xmap;
|
||||||
required_device_array<cmap_device, 2> m_cmap;
|
required_device_array<cmap_device, 2> m_cmap;
|
||||||
required_device<vc2_device> m_vc2;
|
required_device<vc2_device> m_vc2;
|
||||||
|
required_device<rb2_device> m_rb2;
|
||||||
|
|
||||||
uint32_t m_ramdac_lut_r[256];
|
uint32_t m_ramdac_lut_r[256];
|
||||||
uint32_t m_ramdac_lut_g[256];
|
uint32_t m_ramdac_lut_g[256];
|
||||||
@ -426,11 +492,15 @@ protected:
|
|||||||
uint8_t m_ramdac_lut_index;
|
uint8_t m_ramdac_lut_index;
|
||||||
|
|
||||||
rex3_t m_rex3;
|
rex3_t m_rex3;
|
||||||
std::unique_ptr<uint32_t[]> m_rgbci;
|
|
||||||
std::unique_ptr<uint32_t[]> m_cidaux;
|
|
||||||
uint32_t m_global_mask;
|
uint32_t m_global_mask;
|
||||||
emu_timer *m_dcb_timeout_timer;
|
emu_timer *m_dcb_timeout_timer;
|
||||||
|
|
||||||
|
devcb_write32 m_write_mask_w;
|
||||||
|
devcb_write16 m_draw_flags_w;
|
||||||
|
devcb_write32 m_set_address;
|
||||||
|
devcb_write32 m_write_pixel;
|
||||||
|
devcb_read32 m_read_pixel;
|
||||||
|
|
||||||
#if ENABLE_NEWVIEW_LOG
|
#if ENABLE_NEWVIEW_LOG
|
||||||
void start_logging();
|
void start_logging();
|
||||||
void stop_logging();
|
void stop_logging();
|
||||||
|
Loading…
Reference in New Issue
Block a user