summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author mooglyguy <therealmogminer@gmail.com>2019-05-12 20:38:10 +0200
committer MooglyGuy <therealmogminer@gmail.com>2019-05-12 20:38:34 +0200
commitebb591c233431bf9bb0914db11fd0163125e1209 (patch)
tree76a8a2b4fad7d8a1926194aa70f0a6b2869134dc
parente9a84bc89ebe8b5b79de4726ff84ea9b1ea92935 (diff)
-newport: Fixed fast-clear mode. [Ryan Holtz]
-rw-r--r--src/devices/bus/gio/newport.cpp39
1 files changed, 34 insertions, 5 deletions
diff --git a/src/devices/bus/gio/newport.cpp b/src/devices/bus/gio/newport.cpp
index e6875bc883d..b1b2cf9458f 100644
--- a/src/devices/bus/gio/newport.cpp
+++ b/src/devices/bus/gio/newport.cpp
@@ -1594,7 +1594,8 @@ bool newport_base_device::pixel_clip_pass(int16_t x, int16_t y)
void newport_base_device::store_pixel(uint32_t *dest_buf, uint32_t src)
{
- const uint32_t write_mask = m_rex3.m_write_mask & m_global_mask;
+ const uint32_t fast_mask = BIT(m_rex3.m_draw_mode1, 17) ? m_rex3.m_write_mask : 0xffffffff;
+ const uint32_t write_mask = fast_mask & m_global_mask;
const uint32_t dst = *dest_buf;
*dest_buf &= ~write_mask;
@@ -2425,18 +2426,41 @@ void newport_base_device::do_rex3_command()
const uint32_t pattern = BIT(mode0, 12) ? m_rex3.m_z_pattern : (BIT(mode0, 13) ? m_rex3.m_ls_pattern : 0xffffffff);
const bool shade = BIT(mode0, 18);
const bool rgbmode = BIT(mode1, 15);
+ const bool fastclear = BIT(mode1, 17);
LOGMASKED(LOG_COMMANDS, "%04x, %04x to %04x, %04x = %08x\n", start_x, start_y, end_x, end_y, pattern);
+ uint32_t color = m_rex3.m_color_i;
+ if (fastclear)
+ {
+ switch (m_rex3.m_plane_depth)
+ {
+ case 0: // 4bpp
+ color = m_rex3.m_color_vram & 0xf;
+ color |= color << 4;
+ break;
+ case 1: // 8bpp
+ color = m_rex3.m_color_vram & 0xff;
+ break;
+ case 2: // 12bpp
+ color = ((m_rex3.m_color_vram & 0xf00000) >> 12) | ((m_rex3.m_color_vram & 0xf000) >> 8) | ((m_rex3.m_color_vram & 0xf0) >> 4);
+ color |= color << 12;
+ break;
+ case 3: // 24bpp
+ color = m_rex3.m_color_vram & 0xffffff;
+ break;
+ }
+ }
+
uint32_t bit = 31;
for (; start_x != end_x; start_x += dx)
{
if (BIT(pattern, bit))
{
- if (shade || rgbmode)
+ if ((shade || rgbmode) && !fastclear)
write_pixel(start_x, start_y, get_rgb_color(start_x, start_y));
else
- write_pixel(start_x, start_y, m_rex3.m_color_i);
+ write_pixel(start_x, start_y, color);
}
else if (opaque)
{
@@ -2556,24 +2580,27 @@ void newport_base_device::do_rex3_command()
const bool shade = BIT(mode0, 18);
const bool rgbmode = BIT(mode1, 15);
const bool opaque = BIT(mode0, 16) || BIT(mode0, 17);
+ const bool fastclear = BIT(mode1, 17);
const uint32_t pattern = BIT(mode0, 12) ? m_rex3.m_z_pattern : (BIT(mode0, 13) ? m_rex3.m_ls_pattern : 0xffffffff);
if (BIT(mode0, 15) && (end_x - start_x) >= 32)
end_x = start_x + 32 * dx;
uint32_t color = m_rex3.m_color_i;
- if (BIT(mode1, 17))
+ if (fastclear)
{
switch (m_rex3.m_plane_depth)
{
case 0: // 4bpp
color = m_rex3.m_color_vram & 0xf;
+ color |= color << 4;
break;
case 1: // 8bpp
color = m_rex3.m_color_vram & 0xff;
break;
case 2: // 12bpp
color = ((m_rex3.m_color_vram & 0xf00000) >> 12) | ((m_rex3.m_color_vram & 0xf000) >> 8) | ((m_rex3.m_color_vram & 0xf0) >> 4);
+ color |= color << 12;
break;
case 3: // 24bpp
color = m_rex3.m_color_vram & 0xffffff;
@@ -2588,7 +2615,7 @@ void newport_base_device::do_rex3_command()
{
if (BIT(pattern, bit))
{
- if (shade || rgbmode)
+ if ((shade || rgbmode) && !fastclear)
write_pixel(start_x, start_y, get_rgb_color(start_x, start_y));
else
write_pixel(start_x, start_y, color);
@@ -2668,6 +2695,8 @@ void newport_base_device::do_rex3_command()
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);
start_x += dx;