summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/newport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/newport.cpp')
-rw-r--r--src/mame/video/newport.cpp54
1 files changed, 30 insertions, 24 deletions
diff --git a/src/mame/video/newport.cpp b/src/mame/video/newport.cpp
index f1dd9cb004b..72715b628db 100644
--- a/src/mame/video/newport.cpp
+++ b/src/mame/video/newport.cpp
@@ -40,7 +40,7 @@
#define LOG_REJECTS (1 << 8)
#define LOG_ALL (LOG_UNKNOWN | LOG_VC2 | LOG_CMAP0 | LOG_CMAP1 | LOG_XMAP0 | LOG_XMAP1 | LOG_REX3)
-#define VERBOSE (0)//(LOG_UNKNOWN | LOG_VC2 | LOG_XMAP0 | LOG_CMAP0 | LOG_REX3 | LOG_COMMANDS | LOG_REJECTS)
+#define VERBOSE (0)//(LOG_UNKNOWN | LOG_REX3 | LOG_COMMANDS | LOG_REJECTS)
#include "logmacro.h"
DEFINE_DEVICE_TYPE(NEWPORT_VIDEO, newport_video_device, "newport_video", "SGI Newport graphics board")
@@ -1459,7 +1459,7 @@ void newport_video_device::do_v_iline(uint8_t color, bool skip_last, bool shade)
y1 += incy;
if (shade)
- m_rex3.m_color_red += m_rex3.m_slope_red;
+ m_rex3.m_color_red += (m_rex3.m_slope_red << 8) >> 8;
} while (y1 != y2);
if (!skip_last)
@@ -1492,7 +1492,7 @@ void newport_video_device::do_h_iline(uint8_t color, bool skip_last, bool shade)
x1 += incx;
if (shade)
- m_rex3.m_color_red += m_rex3.m_slope_red;
+ m_rex3.m_color_red += (m_rex3.m_slope_red << 8) >> 8;
} while (x1 != x2);
if (!skip_last) {
@@ -1577,7 +1577,7 @@ void newport_video_device::do_iline(uint8_t color, bool skip_last, bool shade)
x1++;
if (shade)
- m_rex3.m_color_red += m_rex3.m_slope_red;
+ m_rex3.m_color_red += (m_rex3.m_slope_red << 8) >> 8;
} while (x1 != x2);
if (!skip_last)
@@ -1609,7 +1609,7 @@ void newport_video_device::do_iline(uint8_t color, bool skip_last, bool shade)
x1++;
if (shade)
- m_rex3.m_color_red += m_rex3.m_slope_red;
+ m_rex3.m_color_red += (m_rex3.m_slope_red << 8) >> 8;
} while (x1 != x2);
if (!skip_last)
@@ -1743,33 +1743,38 @@ void newport_video_device::do_rex3_command()
m_rex3.m_read_active = true;
break;
}
+ case 0x00000022: // DoSetup, Span, Draw
case 0x00000102: // StopOnX, Span, Draw
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
+ case 0x000c0122: // LROnly, Shade, StopOnX, DoSetup, Span, Draw
+ case 0x000c9102: // LROnly, Shade, Length32, EnZPattern, StopOnX, Span, Draw
{
if (BIT(mode0, 19) && dx < 0) // LROnly
break;
+ if (!BIT(mode0, 8))
+ end_x = start_x;
+
end_x += dx;
end_y += dy;
- //bool shade = BIT(mode0, 18);
+ bool shade = BIT(mode0, 18);
uint32_t color = m_rex3.m_color_i & 0xff;
LOGMASKED(LOG_COMMANDS, "%04x, %04x to %04x, %04x = %08x\n", start_x, start_y, end_x, end_y, color);
for (; start_x != end_x; start_x += dx)
{
- //if (shade)
- //{
- // write_pixel(start_x, start_y, (uint8_t)(m_rex3.m_color_red >> 11));
- // m_rex3.m_color_red += m_rex3.m_slope_red;
- //}
- //else
- //{
+ if (shade)
+ {
+ write_pixel(start_x, start_y, (uint8_t)(m_rex3.m_color_red >> 11));
+ m_rex3.m_color_red += (m_rex3.m_slope_red << 8) >> 8;
+ }
+ else
+ {
write_pixel(start_x, start_y, color);
- //}
+ }
}
start_y++;
@@ -1823,6 +1828,7 @@ void newport_video_device::do_rex3_command()
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
+ case 0x00442332: // EndFilter, Shade, EnLSPattern, StopOnX, StopOnY, DoSetp, A_Line, Draw
{
const bool skip_last = BIT(mode0, 11);
const bool shade = BIT(mode0, 18);
@@ -2427,25 +2433,25 @@ WRITE64_MEMBER(newport_video_device::rex3_w)
if (ACCESSING_BITS_32_63)
{
LOGMASKED(LOG_REX3, "REX3 Red/CI Full State Write: %08x\n", (uint32_t)(data >> 32));
- m_rex3.m_color_red = (uint32_t)((data >> 32) & 0xffffff);
- m_rex3.m_color_i = (m_rex3.m_color_red >> 11) & 0x000000ff;
+ m_rex3.m_color_red = (int32_t)((data >> 32) & 0xffffff);
+ m_rex3.m_color_i = (uint32_t)(m_rex3.m_color_red >> 11) & 0x000000ff;
}
if (ACCESSING_BITS_0_31)
{
LOGMASKED(LOG_REX3, "REX3 Alpha Full State Write: %08x\n", (uint32_t)data);
- m_rex3.m_color_alpha = data & 0xfffff;
+ m_rex3.m_color_alpha = (int32_t)(data & 0xfffff);
}
break;
case 0x0208/8:
if (ACCESSING_BITS_32_63)
{
LOGMASKED(LOG_REX3, "REX3 Green Full State Write: %08x\n", (uint32_t)(data >> 32));
- m_rex3.m_color_green = (uint32_t)((data >> 32) & 0xfffff);
+ m_rex3.m_color_green = (int32_t)((data >> 32) & 0xfffff);
}
if (ACCESSING_BITS_0_31)
{
LOGMASKED(LOG_REX3, "REX3 Blue Full State Write: %08x\n", (uint32_t)data);
- m_rex3.m_color_blue = data & 0xfffff;
+ m_rex3.m_color_blue = (int32_t)(data & 0xfffff);
}
break;
case 0x0210/8:
@@ -2455,7 +2461,7 @@ WRITE64_MEMBER(newport_video_device::rex3_w)
uint32_t data32 = (uint32_t)(data >> 32);
LOGMASKED(LOG_REX3, "REX3 Red/CI Slope Write: %08x\n", data32);
data32 &= 0x807fffff;
- uint32_t temp = 0;
+ int32_t temp = 0;
if (BIT(data32, 31))
{
temp = 0x00800000 - (data32 & 0x7fffff);
@@ -2471,7 +2477,7 @@ WRITE64_MEMBER(newport_video_device::rex3_w)
{
LOGMASKED(LOG_REX3, "REX3 Alpha Slope Write: %08x\n", (uint32_t)data);
data &= 0x8007ffff;
- uint32_t temp = 0;
+ int32_t temp = 0;
if (BIT(data, 31))
{
temp = 0x00080000 - (data & 0x7ffff);
@@ -2492,7 +2498,7 @@ WRITE64_MEMBER(newport_video_device::rex3_w)
uint32_t data32 = (uint32_t)(data >> 32);
LOGMASKED(LOG_REX3, "REX3 Green Slope Write: %08x\n", data32);
data32 &= 0x8007ffff;
- uint32_t temp = 0;
+ int32_t temp = 0;
if (BIT(data32, 31))
{
temp = 0x00080000 - (data32 & 0x7ffff);
@@ -2508,7 +2514,7 @@ WRITE64_MEMBER(newport_video_device::rex3_w)
{
LOGMASKED(LOG_REX3, "REX3 Blue Slope Write: %08x\n", (uint32_t)data);
data &= 0x8007ffff;
- uint32_t temp = 0;
+ int32_t temp = 0;
if (BIT(data, 31))
{
temp = 0x00080000 - (data & 0x7ffff);