-newport: Added a few more command configs, nw

This commit is contained in:
MooglyGuy 2019-02-24 10:56:21 +01:00 committed by Vas Crabb
parent 0ed2d2684e
commit 7dd43bc27e
2 changed files with 38 additions and 32 deletions

View File

@ -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);

View File

@ -131,14 +131,14 @@ private:
int16_t m_x_end_i;
int16_t m_y_end_i;
uint32_t m_x_start_end_i;
uint32_t m_color_red;
uint32_t m_color_alpha;
uint32_t m_color_green;
uint32_t m_color_blue;
uint32_t m_slope_red;
uint32_t m_slope_alpha;
uint32_t m_slope_green;
uint32_t m_slope_blue;
int32_t m_color_red;
int32_t m_color_alpha;
int32_t m_color_green;
int32_t m_color_blue;
int32_t m_slope_red;
int32_t m_slope_alpha;
int32_t m_slope_green;
int32_t m_slope_blue;
uint32_t m_write_mask;
uint32_t m_color_i;
uint32_t m_zero_overflow;