summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/video/zeus2.cpp
diff options
context:
space:
mode:
author Ted Green <tedgreen99@protonmail.com>2016-10-07 10:05:54 -0600
committer Ted Green <tedgreen99@protonmail.com>2016-10-07 10:05:54 -0600
commita722fc2912b2a977b13b58aa63fe7a8e948e4ca9 (patch)
tree7bfd911d5fbe7958e75547576c6268e21448c1d1 /src/devices/video/zeus2.cpp
parent2117cc5a64dcbb4f84649a2f81b1817426d52c5f (diff)
atlantis: Removed unused define parameter. (nw)
zeus2: Updated waveram organization. Updated quad rendering command size. Updated register naming. (nw) midzeus: Removed midzeus2.h as not needed. (nw) arcade.lua: Removed midzeus2.h and midzeus2.cpp as they aren't used anymore. (nw)
Diffstat (limited to 'src/devices/video/zeus2.cpp')
-rw-r--r--src/devices/video/zeus2.cpp381
1 files changed, 267 insertions, 114 deletions
diff --git a/src/devices/video/zeus2.cpp b/src/devices/video/zeus2.cpp
index aada2414711..3f7ef93e921 100644
--- a/src/devices/video/zeus2.cpp
+++ b/src/devices/video/zeus2.cpp
@@ -67,8 +67,7 @@ TIMER_CALLBACK_MEMBER(zeus2_device::int_timer_callback)
void zeus2_device::device_start()
{
/* allocate memory for "wave" RAM */
- waveram[0] = auto_alloc_array(machine(), UINT32, WAVERAM0_WIDTH * WAVERAM0_HEIGHT * 8/4);
- //waveram[1] = auto_alloc_array(machine(), UINT32, WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 12/4);
+ waveram = auto_alloc_array(machine(), UINT32, WAVERAM0_WIDTH * WAVERAM0_HEIGHT * 8/4);
m_frameColor = std::make_unique<UINT32[]>(WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 2);
m_frameDepth = std::make_unique<UINT16[]>(WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 2);
@@ -86,13 +85,16 @@ void zeus2_device::device_start()
int_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(zeus2_device::int_timer_callback), this));
vblank_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(zeus2_device::display_irq), this));
+ //printf("%s\n", machine().system().name);
+ m_thegrid = strcmp(machine().system().name, "thegrid")==0;
+
/* save states */
- save_pointer(NAME(waveram[0]), WAVERAM0_WIDTH * WAVERAM0_HEIGHT * 8 / sizeof(waveram[0][0]));
- //save_pointer(NAME(waveram[1]), WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 12 / sizeof(waveram[1][0]));
+ save_pointer(NAME(waveram), WAVERAM0_WIDTH * WAVERAM0_HEIGHT * 2);
save_pointer(NAME(m_frameColor.get()), WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 2);
- save_pointer(NAME(m_frameDepth.get()), WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 2);
- save_item(NAME(m_zeusbase));
- save_item(NAME(m_renderRegs));
+ save_pointer(NAME(m_frameDepth.get()), WAVERAM1_WIDTH * WAVERAM1_HEIGHT);
+ save_pointer(NAME(m_zeusbase), 0x80);
+ save_pointer(NAME(m_renderRegs), 0x50);
+ save_pointer(NAME(m_pal_table), 0x100);
save_item(NAME(zeus_fifo));
save_item(NAME(zeus_fifo_words));
save_item(NAME(zeus_cliprect.min_x));
@@ -103,18 +105,17 @@ void zeus2_device::device_start()
save_item(NAME(zeus_point));
save_item(NAME(zeus_point2));
save_item(NAME(zeus_texbase));
- save_item(NAME(m_renderMode));
save_item(NAME(zeus_quad_size));
save_item(NAME(m_fill_color));
save_item(NAME(m_fill_depth));
- save_item(NAME(m_renderPtr));
+ save_item(NAME(m_renderAddr));
save_item(NAME(m_yScale));
}
void zeus2_device::device_reset()
{
memset(m_zeusbase, 0, sizeof(m_zeusbase[0]) * 0x80);
- memset(m_renderRegs, 0, sizeof(m_renderRegs[0]) * 0x40);
+ memset(m_renderRegs, 0, sizeof(m_renderRegs[0]) * 0x50);
zbase = 32.0f;
m_yScale = 0;
@@ -124,24 +125,30 @@ void zeus2_device::device_reset()
zeus_fifo_words = 0;
m_fill_color = 0;
m_fill_depth = 0;
- m_renderPtr = 0;
-}
+ m_renderAddr = 0;
+ m_directCmd = nullptr;
+ // Setup a linear pal conversion table for thegrid
+ for (int i = 0; i < 0x100; ++i) {
+ m_pal_table[i] = (i << 16) | (i << 8) | (i << 0);
+ }
+}
+#if DUMP_WAVE_RAM
+#include <iostream>
+#include <fstream>
+#endif
void zeus2_device::device_stop()
{
#if DUMP_WAVE_RAM
- FILE *f = fopen("waveram.dmp", "w");
- int i;
-
- for (i = 0; i < WAVERAM0_WIDTH * WAVERAM0_HEIGHT; i++)
- {
- if (i % 4 == 0) fprintf(f, "%03X%03X: ", i / WAVERAM0_WIDTH, i % WAVERAM0_WIDTH);
- fprintf(f, " %08X %08X ",
- WAVERAM_READ32(waveram[0], i*2+0),
- WAVERAM_READ32(waveram[0], i*2+1));
- if (i % 4 == 3) fprintf(f, "\n");
- }
- fclose(f);
+ std::string fileName = "waveram_";
+ fileName += machine().system().name;
+ fileName += ".bin";
+ std::ofstream myfile;
+ myfile.open(fileName.c_str(), std::ios::out | std::ios::trunc | std::ios::binary);
+
+ if (myfile.is_open())
+ myfile.write((char *)waveram, WAVERAM0_WIDTH * WAVERAM0_HEIGHT * 2 * sizeof(UINT32));
+ myfile.close();
#endif
#if TRACK_REG_USAGE
@@ -195,7 +202,7 @@ UINT32 zeus2_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
int x, y;
- poly->wait();
+ poly->wait("SCREEN_UPDATE");
if (machine().input().code_pressed(KEYCODE_DOWN)) { zbase += machine().input().code_pressed(KEYCODE_LSHIFT) ? 0x10 : 1; popmessage("Zbase = %f", (double)zbase); }
if (machine().input().code_pressed(KEYCODE_UP)) { zbase -= machine().input().code_pressed(KEYCODE_LSHIFT) ? 0x10 : 1; popmessage("Zbase = %f", (double)zbase); }
@@ -210,7 +217,6 @@ UINT32 zeus2_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
UINT32 *dest = &bitmap.pix32(y);
for (x = cliprect.min_x; x <= cliprect.max_x; x++) {
UINT32 bufX = x - xoffs;
- //dest[x] = WAVERAM_READPIX(base, y, x - xoffs);
dest[x] = colorptr[bufX];
}
}
@@ -444,7 +450,7 @@ void zeus2_device::zeus2_register_update(offs_t offset, UINT32 oldval, int logit
m_zeusbase[0x38] = oldval;
m_screen->update_partial(m_screen->vpos());
log_fifo = machine().input().code_pressed(KEYCODE_L);
- log_fifo = 1;
+ //log_fifo = 1;
m_zeusbase[0x38] = temp;
}
break;
@@ -464,6 +470,72 @@ void zeus2_device::zeus2_register_update(offs_t offset, UINT32 oldval, int logit
m_zeusbase[0x41] &= ~0xfc00;
}
}
+ // mwskinsa 0xE085001F -- pal 555?
+ // thegrid 0x0055002C ???
+ // crusnexo 0x005500FF ???
+ // crusnexo 0x00A20000 ???
+ // Zeus render info
+ if ((m_zeusbase[0x40] >> 16) == 0xc085) {
+ if (logit)
+ logerror("\t-- pal table argb32 load: control: %08X addr: %08X", m_zeusbase[0x40], m_zeusbase[0x41]);
+ // Load pal table from ARGB32
+ poly->wait("PAL_TABLE_WRITE");
+ void *dataPtr = waveram0_ptr_from_expanded_addr(m_zeusbase[0x41]);
+ load_pal_table(dataPtr, m_zeusbase[0x40], logit);
+ } else if ((m_zeusbase[0x40] >> 16) == 0x0084) {
+ // Load pal table from RGB555
+ poly->wait("PAL_TABLE_WRITE");
+ void *dataPtr = waveram0_ptr_from_expanded_addr(m_zeusbase[0x41]);
+ load_pal_table(dataPtr, m_zeusbase[0x40], logit);
+ if (logit)
+ logerror("\t-- pal table rgb555 load: control: %08X addr: %08X", m_zeusbase[0x40], m_zeusbase[0x41]);
+ }
+ else if ((((m_zeusbase[0x40] >> 24) & 0xff) == 0x38) ||
+ (((m_zeusbase[0x40] >> 24) & 0xff) == 0x2d)) {
+ // Direct command buffer
+ m_directCmd = (UINT32*)waveram0_ptr_from_expanded_addr(m_zeusbase[0x41]);
+ if (logit)
+ logerror("\t-- direct cmd: %08X addr: %08X", m_zeusbase[0x40], m_zeusbase[0x41]);
+ {
+ // Zeus Quad Size
+ switch (m_zeusbase[0x40]) {
+ case 0x38550083: case 0x3885007B: case 0x2D550083:
+ zeus_quad_size = 14;
+ break;
+ case 0x3855006F: case 0x38550088: case 0x388500A9:
+ zeus_quad_size = 12;
+ break;
+ case 0x38550075:
+ if (m_zeusbase[0x41] == 0x00000324)
+ zeus_quad_size = 12;
+ else
+ zeus_quad_size = 10;
+ break;
+ case 0x38850077:
+ zeus_quad_size = 10;
+ break;
+ default:
+ logerror("default quad size 10\n");
+ zeus_quad_size = 10;
+ break;
+ }
+ }
+ if (1 && logit) {
+ UINT32 *wavePtr = (UINT32*)WAVERAM_BLOCK0(m_zeusbase[0x41]);
+ UINT32 waveData;
+ int size = m_zeusbase[0x40] & 0xff;
+ logerror("\n Setup size=%d [40]=%08X [41]=%08X [4e]=%08X\n", zeus_quad_size, m_zeusbase[0x40], m_zeusbase[0x41], m_zeusbase[0x4e]);
+ for (int i = 0; i <= size; ++i) {
+ waveData = *wavePtr++;
+ logerror(" %08X", waveData);
+ waveData = *wavePtr++;
+ //logerror(" %08X", waveData);
+ if (0 && (i + 1) % 16 == 0)
+ logerror("\n");
+ }
+ logerror("\n");
+ }
+ }
break;
case 0x41:
/* this is the address, except in read mode, where it latches values */
@@ -503,6 +575,8 @@ void zeus2_device::zeus2_register_update(offs_t offset, UINT32 oldval, int logit
void *dest = waveram0_ptr_from_expanded_addr(m_zeusbase[0x41]);
WAVERAM_WRITE32(dest, 0, m_zeusbase[0x48]);
WAVERAM_WRITE32(dest, 1, m_zeusbase[0x49]);
+ if (logit)
+ logerror("\t[41]=%08X [4E]=%08X", m_zeusbase[0x41], m_zeusbase[0x4e]);
if (m_zeusbase[0x4e] & 0x40)
{
@@ -575,12 +649,13 @@ void zeus2_device::zeus2_register_update(offs_t offset, UINT32 oldval, int logit
frame_read();
}
/* make sure we log anything else */
- else if (1 || logit)
+ else if (logit || m_zeusbase[0x50] != 0x0)
logerror("\tw[50]=%08X [5E]=%08X\n", m_zeusbase[0x50], m_zeusbase[0x5e]);
}
break;
case 0x51:
-
+ // Set direct rendering location
+ m_renderAddr = frame_addr_from_phys_addr(m_zeusbase[0x51]);
/* in this mode, crusnexo expects the reads to immediately latch */
//if ((m_zeusbase[0x50] == 0x00a20000) || (m_zeusbase[0x50] == 0x00720000))
if (m_zeusbase[0x50] == 0x00a20000)
@@ -647,7 +722,32 @@ void zeus2_device::zeus2_register_update(offs_t offset, UINT32 oldval, int logit
logerror("\n");
}
-
+/*************************************
+* Load pal table from waveram
+*************************************/
+void zeus2_device::load_pal_table(void *wavePtr, UINT32 ctrl, int logit)
+{
+ UINT32 *tablePtr = m_pal_table;
+ int count = ctrl & 0xff;
+ UINT32 cmd = ctrl >> 24;
+ if (cmd == 0x0) {
+ // Convert from RGB555
+ UINT16 *src = (UINT16*)wavePtr;
+ for (int i = 0; i <= count; ++i) {
+ *tablePtr++ = conv_rgb555_to_rgb32(*src++);
+ *tablePtr++ = conv_rgb555_to_rgb32(*src++);
+ *tablePtr++ = conv_rgb555_to_rgb32(*src++);
+ *tablePtr++ = conv_rgb555_to_rgb32(*src++);
+ }
+ } else if (cmd==0xc0) {
+ // The data seems to be in ARGB32 format
+ UINT32 *src = (UINT32*)wavePtr;
+ for (int i = 0; i <= count; ++i) {
+ *tablePtr++ = *src++;
+ *tablePtr++ = *src++;
+ }
+ }
+}
/*************************************
*
@@ -675,19 +775,14 @@ if (subregdata_count[which] < 256)
}
}
#endif
- if (which<0x40)
+ if (which<0x50)
m_renderRegs[which] = value;
switch (which)
{
case 0x40:
- m_renderMode = value;
- // 0x020202 crusnexo quad ??
- //zeus_quad_size = ((m_renderMode & 0xff) == 0x04) ? 14 : 10;
- //zeus_quad_size = (m_renderMode & 0x020000) ? 14 : 10;
if (logit)
- logerror("\tRender Mode = %06X", m_renderMode);
- //printf("\tRender Mode = %06X\n", m_renderMode);
+ logerror("\t(R%02X) = %06x Render Unknown", which, value);
break;
case 0xff:
@@ -739,19 +834,22 @@ int zeus2_device::zeus2_fifo_process(const UINT32 *data, int numwords)
switch (data[0] >> 24)
{
// 0x00: write 32-bit value to low registers
- case 0x00:
- // Ignore the all zeros commmand
- if (((data[0] >> 16) & 0x7f) == 0x0)
- return TRUE;
- // Drop through to 0x05 command
- /* 0x05: write 32-bit value to low registers */
- case 0x05:
- if (numwords < 2)
- return FALSE;
- if (log_fifo)
- log_fifo_command(data, numwords, " -- reg32");
- if (((data[0] >> 16) & 0x7f) != 0x08)
- zeus2_register32_w((data[0] >> 16) & 0x7f, data[1], log_fifo);
+ case 0x00:
+ // Ignore the all zeros commmand
+ if (((data[0] >> 16) & 0x7f) == 0x0) {
+ if (log_fifo && (data[0] & 0xfff) != 0x2c0)
+ log_fifo_command(data, numwords, " -- ignored\n");
+ return TRUE;
+ }
+ // Drop through to 0x05 command
+ /* 0x05: write 32-bit value to low registers */
+ case 0x05:
+ if (numwords < 2)
+ return FALSE;
+ if (log_fifo)
+ log_fifo_command(data, numwords, " -- reg32");
+ if (((data[0] >> 16) & 0x7f) != 0x08)
+ zeus2_register32_w((data[0] >> 16) & 0x7f, data[1], log_fifo);
break;
/* 0x08: set matrix and point (thegrid) */
@@ -818,10 +916,20 @@ int zeus2_device::zeus2_fifo_process(const UINT32 *data, int numwords)
}
break;
- /* 0x1c: */
- // 0x1b: the grid
- case 0x1b:
+ // 0x1c: thegrid (3 words)
case 0x1c:
+ if (m_thegrid) {
+ if (numwords < 3)
+ return FALSE;
+ if (log_fifo)
+ log_fifo_command(data, numwords, " -- unknown control\n");
+ break;
+ }
+ // 0x1b: thegrid
+ // 0x1c: crusnexo (4 words)
+ // 0x10: atlantis???
+ case 0x10:
+ case 0x1b:
if (numwords < 4)
return FALSE;
if (log_fifo)
@@ -843,7 +951,6 @@ int zeus2_device::zeus2_fifo_process(const UINT32 *data, int numwords)
case 0x1d:
if (numwords < 2)
return FALSE;
- //zeus_point[2] = convert_float(data[1]);
if (log_fifo)
{
log_fifo_command(data, numwords, " -- unknown\n");
@@ -862,8 +969,7 @@ int zeus2_device::zeus2_fifo_process(const UINT32 *data, int numwords)
return FALSE;
if (log_fifo)
log_fifo_command(data, numwords, "");
- //zeus2_draw_model(data[1], data[0] & 0xffff, log_fifo);
- zeus2_draw_model(data[1], data[0] & 0x3fff, log_fifo);
+ zeus2_draw_model(data[1], data[0] & 0xffff, log_fifo);
break;
// 0x2d; set direct render pixels location (atlantis)
@@ -872,7 +978,7 @@ int zeus2_device::zeus2_fifo_process(const UINT32 *data, int numwords)
return FALSE;
if (log_fifo)
log_fifo_command(data, numwords, "\n");
- m_renderPtr = frame_addr_from_phys_addr(data[1]);
+ m_renderAddr = frame_addr_from_phys_addr(data[1]);
//zeus2_draw_model(data[1], data[0] & 0xff, log_fifo);
break;
@@ -884,20 +990,19 @@ int zeus2_device::zeus2_fifo_process(const UINT32 *data, int numwords)
case 0x32:
if (log_fifo)
log_fifo_command(data, numwords, " sync? \n");
- //zeus_quad_size = 10;
break;
/* 0x38: direct render quad (crusnexo) */
- // 0x38: ?? (atlantis)
+ // 0x38: direct write to frame buffer (atlantis)
case 0x38:
if (data[0] == 0x38000000) {
if (numwords < 3)
return FALSE;
// Direct write to frame buffer
- m_frameColor[m_renderPtr++] = conv_rgb555_to_rgb32((UINT16)data[1]);
- m_frameColor[m_renderPtr++] = conv_rgb555_to_rgb32((UINT16)(data[1] >> 16));
- m_frameColor[m_renderPtr++] = conv_rgb555_to_rgb32((UINT16)data[2]);
- m_frameColor[m_renderPtr++] = conv_rgb555_to_rgb32((UINT16)(data[2] >> 16));
+ m_frameColor[m_renderAddr++] = conv_rgb555_to_rgb32((UINT16)data[1]);
+ m_frameColor[m_renderAddr++] = conv_rgb555_to_rgb32((UINT16)(data[1] >> 16));
+ m_frameColor[m_renderAddr++] = conv_rgb555_to_rgb32((UINT16)data[2]);
+ m_frameColor[m_renderAddr++] = conv_rgb555_to_rgb32((UINT16)(data[2] >> 16));
} else if (numwords < 12)
return FALSE;
//print_fifo_command(data, numwords, "\n");
@@ -905,14 +1010,8 @@ int zeus2_device::zeus2_fifo_process(const UINT32 *data, int numwords)
log_fifo_command(data, numwords, "\n");
break;
- /* 0x40: ???? */
- case 0x40:
- if (log_fifo)
- log_fifo_command(data, numwords, "\n");
- break;
-
default:
- if (data[0] != 0x2c0)
+ if (1 || data[0] != 0x2c0)
{
printf("Unknown command %08X\n", data[0]);
if (log_fifo)
@@ -934,13 +1033,10 @@ void zeus2_device::zeus2_draw_model(UINT32 baseaddr, UINT16 count, int logit)
int model_done = FALSE;
UINT32 texdata = 0;
- // need to only set the quad size at the start of model ??
- zeus_quad_size = (m_renderMode & 0x020000) ? 14 : 10;
-
if (logit)
logerror(" -- model @ %08X, len %04X\n", baseaddr, count);
- if (count > 0x1000)
+ if (count > 0xc800)
fatalerror("Extreme count\n");
while (baseaddr != 0 && !model_done)
@@ -956,6 +1052,7 @@ void zeus2_device::zeus2_draw_model(UINT32 baseaddr, UINT16 count, int logit)
{
int countneeded = 2;
UINT8 cmd;
+ UINT8 subCmd;
/* accumulate 2 words of data */
databuffer[databufcount++] = WAVERAM_READ32(base, curoffs * 2 + 0);
@@ -963,25 +1060,32 @@ void zeus2_device::zeus2_draw_model(UINT32 baseaddr, UINT16 count, int logit)
/* if this is enough, process the command */
cmd = databuffer[0] >> 24;
- if ((cmd == 0x38) || (cmd == 0x2d))
+ subCmd = (databuffer[1] >> 24) & 0xfc;
+
+ if ((cmd == 0x38 && subCmd != 0x38) || (cmd == 0x2d)) {
countneeded = zeus_quad_size;
+ }
if (databufcount == countneeded)
{
/* handle logging of the command */
if (logit)
{
//if ((cmd == 0x38) || (cmd == 0x2d))
- // log_render_info();
- int offs;
- logerror("\t");
- for (offs = 0; offs < databufcount; offs++)
- logerror("%08X ", databuffer[offs]);
- logerror("-- ");
+ // log_render_info(texdata);
+ if (cmd != 0x00 || (cmd == 0x00 && curoffs == count)) {
+ logerror("\t");
+ for (int offs = 0; offs < databufcount; offs++)
+ logerror("%08X ", databuffer[offs]);
+ logerror("-- ");
+ }
}
/* handle the command */
switch (cmd)
{
+ case 0x00: // crusnexo
+ if (logit && curoffs == count)
+ logerror(" end cmd 00\n");
case 0x21: /* thegrid */
case 0x22: /* crusnexo */
if (((databuffer[0] >> 16) & 0xff) == 0x9b)
@@ -1012,15 +1116,52 @@ void zeus2_device::zeus2_draw_model(UINT32 baseaddr, UINT16 count, int logit)
break;
case 0x38: /* crusnexo/thegrid */
- poly->zeus2_draw_quad(databuffer, texdata, logit);
+ if (subCmd == 0x38) {
+ // Direct commands from waveram buffer
+ //UINT32 cmdData[2];
+ //for (int subIndex = 0; subIndex < 2; ++subIndex) {
+ // UINT32 offset = (databuffer[subIndex] & 0xff) * 6;
+ // //printf("directRead curoffs: 0x%X\n", curoffs);
+ // for (int cmdIndex = 0; cmdIndex < 3; ++cmdIndex) {
+ // cmdData[0] = m_directCmd[offset + cmdIndex * 2 + 0];
+ // cmdData[1] = m_directCmd[offset + cmdIndex * 2 + 1];
+ // if (curoffs < 0x40)
+ // printf("directRead curoffs: 0x%X cmdData %08X %08X\n", curoffs, cmdData[0], cmdData[1]);
+ // if (cmdData[0] != 0 && cmdData[1] != 0) {
+ // // Error check
+ // if (cmdData[0] != 0x58 && cmdData[0] != 0x5A) {
+ // if (curoffs < 0x20)
+ // printf("case38 error curoffs: 0x%X cmdData %08X %08X\n", curoffs, cmdData[0], cmdData[1]);
+ // }
+ // else {
+ // zeus2_register32_w(cmdData[0] & 0x7f, cmdData[1], logit);
+ // }
+ // }
+ // }
+ //}
+ //void *palbase = waveram0_ptr_from_expanded_addr(m_zeusbase[0x41]);
+ //UINT8 texel = databuffer[0];
+ //UINT32 color = WAVERAM_READ16(palbase, texel);
+ //m_frameDepth[m_renderAddr] = 0;
+ //m_frameColor[m_renderAddr++] = conv_rgb555_to_rgb32(color);
+ //texel = databuffer[1];
+ //color = WAVERAM_READ16(palbase, texel);
+ //m_frameDepth[m_renderAddr] = 0;
+ //m_frameColor[m_renderAddr++] = conv_rgb555_to_rgb32(color);
+ //m_frameDepth[m_renderAddr] = 0;
+ //m_frameColor[m_renderAddr++] = databuffer[0] & 0x00ffffff;
+ //m_frameDepth[m_renderAddr] = 0;
+ //m_frameColor[m_renderAddr++] = databuffer[1] & 0x00ffffff;
+ //if (logit)
+ // if ((curoffs + 1) % 16 == 0)
+ // logerror("\n");
+ }
+ else {
+ poly->zeus2_draw_quad(databuffer, texdata, logit);
+ }
break;
default:
- //if (quadsize == 10)
- //{
- // logerror("Correcting quad size\n");
- // quadsize = 14;
- //}
if (logit)
logerror("unknown model data\n");
break;
@@ -1030,6 +1171,16 @@ void zeus2_device::zeus2_draw_model(UINT32 baseaddr, UINT16 count, int logit)
databufcount = 0;
}
}
+ // Log unused data
+ if (databufcount != 0) {
+ if (logit)
+ {
+ logerror("\t");
+ for (int offs = 0; offs < databufcount; offs++)
+ logerror("%08X ", databuffer[offs]);
+ logerror("-- Unused data\n");
+ }
+ }
}
}
@@ -1136,7 +1287,7 @@ void zeus2_renderer::zeus2_draw_quad(const UINT32 *databuffer, UINT32 texdata, i
vert[3].p[2] = (databuffer[9] >> 24) & 0xff;
}
else {
- //printf("renderMode: %06X\n", m_state->m_renderMode);
+ //printf("R40: %06X\n", m_state->m_renderRegs[0x40]);
vert[0].x = (INT16)databuffer[2];
vert[0].y = (INT16)databuffer[3];
vert[0].p[0] = (INT16)databuffer[6];
@@ -1234,15 +1385,10 @@ void zeus2_renderer::zeus2_draw_quad(const UINT32 *databuffer, UINT32 texdata, i
vert[i].p[0] += m_state->zbase;
else {
int shift;
- // Not sure why but atlantis coordinates are scaled differently
- if (0 && m_state->m_atlantis)
- shift = 2048 >> m_state->m_zeusbase[0x6c];
- else
- shift = 1024 >> m_state->m_zeusbase[0x6c];
- //int shift = 8 << ((m_state->m_renderRegs[0x14] >> 4) & 0xf);
+ shift = 1024 >> m_state->m_zeusbase[0x6c];
vert[i].p[0] += shift;
}
- //vert[i].p[0] *= 2.0f;
+
vert[i].p[2] += texdata >> 16;
vert[i].p[1] *= 256.0f;
vert[i].p[2] *= 256.0f;
@@ -1280,8 +1426,8 @@ void zeus2_renderer::zeus2_draw_quad(const UINT32 *databuffer, UINT32 texdata, i
unknown[0], unknown[1], unknown[2], unknown[3], unknown[4], unknown[5], unknown[6], unknown[7],
unknownFloat[0], unknownFloat[1], unknownFloat[2], unknownFloat[3]);
}
- bool enable_perspective = true;// !(m_state->m_renderRegs[0x14] & 0x80);
- float clipVal = enable_perspective ? 1.0f / 512.0f / 4.0f : -1.0f;
+ bool enable_perspective = true; // !(m_state->m_renderRegs[0x14] & 0x1);
+ float clipVal = enable_perspective ? 1.0f / 512.0f / 4.0f : 0.0f;
numverts = this->zclip_if_less(4, &vert[0], &clipvert[0], 4, clipVal);
if (numverts < 3)
return;
@@ -1289,7 +1435,7 @@ void zeus2_renderer::zeus2_draw_quad(const UINT32 *databuffer, UINT32 texdata, i
float xOrigin = reinterpret_cast<float&>(m_state->m_zeusbase[0x6a]);
float yOrigin = reinterpret_cast<float&>(m_state->m_zeusbase[0x6b]);
- float oozBase = (m_state->m_atlantis) ? 1024.0f : 512.0f;
+ float oozBase = (m_state->m_atlantis) ? 1024.0f : (m_state->m_thegrid) ? 512.0f : 512.0f;
maxx = maxy = -1000.0f;
for (i = 0; i < numverts; i++)
@@ -1387,15 +1533,15 @@ void zeus2_renderer::zeus2_draw_quad(const UINT32 *databuffer, UINT32 texdata, i
//}
extra.solidcolor = 0;//m_zeusbase[0x00] & 0x7fff;
- extra.zoffset = m_state->m_renderRegs[0x15];
+ extra.zoffset = m_state->m_renderRegs[0x15] & 0xffff;
extra.alpha = 0;//m_zeusbase[0x4e];
extra.transcolor = 0x100; // !(texmode & 100) ? 0 : 0x100;
extra.texbase = WAVERAM_BLOCK0_EXT(m_state->zeus_texbase);
extra.palbase = m_state->waveram0_ptr_from_expanded_addr(m_state->m_zeusbase[0x41]);
- //extra.depth_test_enable = !(m_state->m_renderMode & 0x020000);
+ //extra.depth_test_enable = !(m_state->m_renderRegs[0x40] & 0x020000);
// crusnexo text is R14=0x4062
extra.depth_test_enable = !(m_state->m_renderRegs[0x14] & 0x000020);
- //extra.depth_test_enable = !(m_state->m_renderMode & 0x000002);
+ //extra.depth_test_enable = !(m_state->m_renderRegs[0x40] & 0x000002);
//extra.depth_test_enable = true; // (texmode & 0x0010);
extra.depth_write_enable = true;
@@ -1428,7 +1574,7 @@ void zeus2_renderer::render_poly_8bit(INT32 scanline, const extent_t& extent, co
INT32 dvdx = extent.param[2].dpdx;
// INT32 didx = extent.param[3].dpdx;
const void *texbase = object.texbase;
- const void *palbase = object.palbase;
+ //const void *palbase = object.palbase;
UINT16 transcolor = object.transcolor;
int texwidth = object.texwidth;
int x;
@@ -1462,14 +1608,18 @@ void zeus2_renderer::render_poly_8bit(INT32 scanline, const extent_t& extent, co
UINT8 texel3 = m_state->get_texel_8bit(texbase, v1, u1, texwidth);
if (texel0 != transcolor)
{
- UINT32 color0 = WAVERAM_READ16(palbase, texel0);
- UINT32 color1 = WAVERAM_READ16(palbase, texel1);
- UINT32 color2 = WAVERAM_READ16(palbase, texel2);
- UINT32 color3 = WAVERAM_READ16(palbase, texel3);
- color0 = ((color0 & 0x7c00) << 9) | ((color0 & 0x3e0) << 6) | ((color0 & 0x1f) << 3);
- color1 = ((color1 & 0x7c00) << 9) | ((color1 & 0x3e0) << 6) | ((color1 & 0x1f) << 3);
- color2 = ((color2 & 0x7c00) << 9) | ((color2 & 0x3e0) << 6) | ((color2 & 0x1f) << 3);
- color3 = ((color3 & 0x7c00) << 9) | ((color3 & 0x3e0) << 6) | ((color3 & 0x1f) << 3);
+ UINT32 color0 = m_state->m_pal_table[texel0];
+ UINT32 color1 = m_state->m_pal_table[texel1];
+ UINT32 color2 = m_state->m_pal_table[texel2];
+ UINT32 color3 = m_state->m_pal_table[texel3];
+ //UINT32 color0 = WAVERAM_READ16(palbase, texel0);
+ //UINT32 color1 = WAVERAM_READ16(palbase, texel1);
+ //UINT32 color2 = WAVERAM_READ16(palbase, texel2);
+ //UINT32 color3 = WAVERAM_READ16(palbase, texel3);
+ //color0 = ((color0 & 0x7c00) << 9) | ((color0 & 0x3e0) << 6) | ((color0 & 0x1f) << 3);
+ //color1 = ((color1 & 0x7c00) << 9) | ((color1 & 0x3e0) << 6) | ((color1 & 0x1f) << 3);
+ //color2 = ((color2 & 0x7c00) << 9) | ((color2 & 0x3e0) << 6) | ((color2 & 0x1f) << 3);
+ //color3 = ((color3 & 0x7c00) << 9) | ((color3 & 0x3e0) << 6) | ((color3 & 0x1f) << 3);
rgb_t filtered = rgbaint_t::bilinear_filter(color0, color1, color2, color3, curu, curv);
//WAVERAM_WRITEPIX(m_state->zeus_renderbase, scanline, x, filtered);
//*depthptr = depth;
@@ -1505,12 +1655,15 @@ void zeus2_device::print_fifo_command(const UINT32 *data, int numwords, const ch
printf("%s", suffix);
}
-void zeus2_device::log_render_info()
+void zeus2_device::log_render_info(UINT32 texdata)
{
- logerror("-- RMode = %08X", m_renderMode);
- for (int i = 1; i <= 0x15; ++i)
+ logerror("-- RMode0 R40 = %08X texdata = %08X", m_renderRegs[0x40], texdata);
+ logerror("\n-- RMode1 ");
+ for (int i = 1; i <= 0x9; ++i)
+ logerror(" R%02X=%06X", i, m_renderRegs[i]);
+ for (int i = 0xa; i <= 0x15; ++i)
logerror(" R%02X=%06X", i, m_renderRegs[i]);
- logerror("\n-- RMode ");
+ logerror("\n-- RMode2 ");
for (int i = 0x63; i <= 0x6f; ++i)
logerror(" %02X=%08X", i, m_zeusbase[i]);
logerror("\n");