summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author MooglyGuy <therealmogminer@gmail.com>2019-02-21 23:56:12 +0100
committer MooglyGuy <therealmogminer@gmail.com>2019-02-21 23:59:04 +0100
commit7936b0fc044dfa549d28054da05a5454f03c9cd9 (patch)
tree929bd17aed4665fd9a5d52e42ff6cbb442f973e0
parent763479a5974ad83e98dc6d0046abaade8d31f9e0 (diff)
-newport: Basic support for shade DDAs and some other command configs. Fixes 'jot' on IRIX. [Ryan Holtz]
-rw-r--r--src/mame/video/newport.cpp82
-rw-r--r--src/mame/video/newport.h8
2 files changed, 67 insertions, 23 deletions
diff --git a/src/mame/video/newport.cpp b/src/mame/video/newport.cpp
index 46102e49e17..21595b09245 100644
--- a/src/mame/video/newport.cpp
+++ b/src/mame/video/newport.cpp
@@ -1244,9 +1244,12 @@ READ64_MEMBER(newport_video_device::rex3_r)
return ret;
}
-void newport_video_device::write_pixel(uint8_t color)
+void newport_video_device::write_pixel(uint8_t color, bool shade)
{
- write_pixel(m_rex3.m_x_start_i, m_rex3.m_y_start_i, color);
+ if (shade)
+ write_pixel(m_rex3.m_x_start_i, m_rex3.m_y_start_i, (uint8_t)(m_rex3.m_color_red >> 11));
+ else
+ write_pixel(m_rex3.m_x_start_i, m_rex3.m_y_start_i, color);
}
bool newport_video_device::pixel_clip_pass(int16_t x, int16_t y)
@@ -1388,7 +1391,7 @@ void newport_video_device::write_pixel(int16_t x, int16_t y, uint8_t color)
}
}
-void newport_video_device::do_v_iline(uint8_t color, bool skip_last)
+void newport_video_device::do_v_iline(uint8_t color, bool skip_last, bool shade)
{
int16_t x1 = m_rex3.m_x_start_i;
int16_t y1 = m_rex3.m_y_start_i;
@@ -1398,19 +1401,30 @@ void newport_video_device::do_v_iline(uint8_t color, bool skip_last)
do
{
- write_pixel(x1, y1, color);
+ if (shade)
+ write_pixel(x1, y1, (uint8_t)(m_rex3.m_color_red >> 11));
+ else
+ write_pixel(x1, y1, color);
+
y1 += incy;
+
+ if (shade)
+ m_rex3.m_color_red += m_rex3.m_slope_red;
} while (y1 != y2);
- if (!skip_last) {
- write_pixel(x1, y1, color);
+ if (!skip_last)
+ {
+ if (shade)
+ write_pixel(x1, y1, (uint8_t)(m_rex3.m_color_red >> 11));
+ else
+ write_pixel(x1, y1, color);
}
write_x_start(x1 << 11);
write_y_start(y1 << 11);
}
-void newport_video_device::do_h_iline(uint8_t color, bool skip_last)
+void newport_video_device::do_h_iline(uint8_t color, bool skip_last, bool shade)
{
int16_t x1 = m_rex3.m_x_start_i;
int16_t y1 = m_rex3.m_y_start_i;
@@ -1420,19 +1434,29 @@ void newport_video_device::do_h_iline(uint8_t color, bool skip_last)
do
{
- write_pixel(x1, y1, color);
+ if (shade)
+ write_pixel(x1, y1, (uint8_t)(m_rex3.m_color_red >> 11));
+ else
+ write_pixel(x1, y1, color);
+
x1 += incx;
+
+ if (shade)
+ m_rex3.m_color_red += m_rex3.m_slope_red;
} while (x1 != x2);
if (!skip_last) {
- write_pixel(x1, y1, color);
+ if (shade)
+ write_pixel(x1, y1, (uint8_t)(m_rex3.m_color_red >> 11));
+ else
+ write_pixel(x1, y1, color);
}
write_x_start(x1 << 11);
write_y_start(y1 << 11);
}
-void newport_video_device::do_iline(uint8_t color, bool skip_last)
+void newport_video_device::do_iline(uint8_t color, bool skip_last, bool shade)
{
int16_t x1 = m_rex3.m_x_start_i;
int16_t y1 = m_rex3.m_y_start_i;
@@ -1486,7 +1510,10 @@ void newport_video_device::do_iline(uint8_t color, bool skip_last)
{
do
{
- write_pixel(x1, y1, color);
+ if (shade)
+ write_pixel(x1, y1, (uint8_t)(m_rex3.m_color_red >> 11));
+ else
+ write_pixel(x1, y1, color);
if (e > 0)
{
@@ -1499,13 +1526,18 @@ void newport_video_device::do_iline(uint8_t color, bool skip_last)
}
x1++;
+ if (shade)
+ m_rex3.m_color_red += m_rex3.m_slope_red;
} while (x1 != x2);
}
else
{
do
{
- write_pixel(x1, y1, color);
+ if (shade)
+ write_pixel(x1, y1, (uint8_t)(m_rex3.m_color_red >> 11));
+ else
+ write_pixel(x1, y1, color);
if (e > 0)
{
@@ -1518,11 +1550,17 @@ void newport_video_device::do_iline(uint8_t color, bool skip_last)
}
x1++;
+ if (shade)
+ m_rex3.m_color_red += m_rex3.m_slope_red;
} while (x1 != x2);
}
- if (!skip_last) {
- write_pixel(x1, y1, color);
+ if (!skip_last)
+ {
+ if (shade)
+ write_pixel(x1, y1, (uint8_t)(m_rex3.m_color_red >> 11));
+ else
+ write_pixel(x1, y1, color);
}
write_x_start(x1 << 11);
@@ -1595,7 +1633,7 @@ void newport_video_device::do_rex3_command()
{
LOGMASKED(LOG_COMMANDS, "%04x, %04x = %02x\n", start_x, start_y, m_rex3.m_color_i & 0xff);
m_rex3.m_bres_octant_inc1 = 0;
- write_pixel(m_rex3.m_color_i & 0xff);
+ write_pixel(m_rex3.m_color_i & 0xff, false);
start_x++;
if (start_x > end_x)
{
@@ -1651,6 +1689,7 @@ void newport_video_device::do_rex3_command()
case 0x00000122: // StopOnX, DoSetup, Span, Draw
case 0x00022102: // LSOpaque, EnLSPattern, StopOnX, Span, Draw
case 0x00080122: // LROnly, StopOnX, DoSetup, Span, Draw
+ case 0x000c0122: // Shade, LROnly, StopOnX, DoSetup, Span, Draw
{
if (BIT(mode0, 19) && dx < 0) // LROnly
break;
@@ -1715,27 +1754,32 @@ void newport_video_device::do_rex3_command()
case 0x0000032a: // StopOnX, StopOnY, DoSetup, I_Line, Draw
case 0x00000b2a: // SkipLast, StopOnX, StopOnY, DoSetup, I_Line, Draw
case 0x0000232e: // EnLSPattern, StopOnX, StopOnY, DoSetup, F_Line, Draw
+ case 0x0004232e: // Shade, EnLSPattern, StopOnX, StopOnY, DoSetup, F_Line, Draw
{
+ const bool skip_last = BIT(mode0, 11);
+ const bool shade = BIT(mode0, 18);
+
LOGMASKED(LOG_COMMANDS, "%cLine: %04x, %04x to %04x, %04x = %08x\n", (mode0 & 0x1c) == 3 ? 'F' : 'I',
start_x, start_y, end_x, end_y, m_cmap0.m_palette[m_rex3.m_color_i]);
if (start_x == end_x && start_y == end_y)
{
- write_pixel(m_rex3.m_color_i);
+ write_pixel(m_rex3.m_color_i, shade);
}
else if (start_x == end_x)
{
- do_v_iline(m_rex3.m_color_i, BIT(mode0, 11));
+ do_v_iline(m_rex3.m_color_i, skip_last, shade);
}
else if (start_y == end_y)
{
- do_h_iline(m_rex3.m_color_i, BIT(mode0, 11));
+ do_h_iline(m_rex3.m_color_i, skip_last, shade);
}
else
{
- do_iline(m_rex3.m_color_i, BIT(mode0, 11));
+ do_iline(m_rex3.m_color_i, skip_last, shade);
}
break;
}
+ case 0x00001106: // EnZPattern, StopOnX, Block, Draw
case 0x00002106: // EnLSPattern, StopOnX, Block, Draw
case 0x00009106: // Length32, EnZPattern, StopOnX, Block, Draw
case 0x00022106: // LSOpaque, EnLSPattern, StopOnX, Block, Draw
diff --git a/src/mame/video/newport.h b/src/mame/video/newport.h
index 3de9362e7a0..b8038c69372 100644
--- a/src/mame/video/newport.h
+++ b/src/mame/video/newport.h
@@ -187,13 +187,13 @@ private:
void write_y_end(int32_t val);
bool pixel_clip_pass(int16_t x, int16_t y);
- void write_pixel(uint8_t color);
+ void write_pixel(uint8_t color, bool shade);
void write_pixel(int16_t x, int16_t y, uint8_t color);
void store_pixel(uint8_t *dest_buf, const uint8_t src);
- void do_v_iline(uint8_t color, bool skip_last);
- void do_h_iline(uint8_t color, bool skip_last);
- void do_iline(uint8_t color, bool skip_last);
+ void do_v_iline(uint8_t color, bool skip_last, bool shade);
+ void do_h_iline(uint8_t color, bool skip_last, bool shade);
+ void do_iline(uint8_t color, bool skip_last, bool shade);
uint8_t do_pixel_read();
uint64_t do_pixel_word_read();
void do_rex3_command();