diff options
Diffstat (limited to 'src/mame/video/midzeus.c')
-rw-r--r-- | src/mame/video/midzeus.c | 364 |
1 files changed, 191 insertions, 173 deletions
diff --git a/src/mame/video/midzeus.c b/src/mame/video/midzeus.c index b9f1e84c93a..794779f2999 100644 --- a/src/mame/video/midzeus.c +++ b/src/mame/video/midzeus.c @@ -18,7 +18,7 @@ *************************************/ #define WAVERAM_WIDTH 512 -#define WAVERAM_HEIGHT 4096 +#define WAVERAM_HEIGHT 2048 @@ -31,8 +31,8 @@ typedef struct _poly_extra_data poly_extra_data; struct _poly_extra_data { - const UINT32 * palbase; - const UINT32 * texbase; + const UINT64 * palbase; + const UINT64 * texbase; UINT16 transcolor; UINT16 texwidth; UINT16 color; @@ -56,13 +56,14 @@ static UINT8 zeuscmd_buffer_words; static UINT8 zeuscmd_buffer_expected_words; static INT16 zeus_matrix[3][3]; static INT32 zeus_point[3]; -static UINT32 *zeus_palbase; +static UINT64 *zeus_renderbase; +static UINT64 *zeus_palbase; static int zeus_enable_logging; static UINT32 zeus_blend; static UINT32 zeus_texdata; static UINT32 zeus_objdata; -static UINT32 *waveram; +static UINT64 *waveram[2]; static UINT8 single_step; static poly_extra_data single_step_extra; @@ -95,15 +96,30 @@ static UINT8 zeuscmd_length(UINT32 word); * *************************************/ -INLINE UINT32 *waveram_ptr_from_addr(UINT32 addr) +INLINE UINT64 *waveram_ptr_from_block_addr(UINT8 bank, UINT32 addr) { - return &waveram[((addr & 0x1ff) | ((addr & 0xfff000) >> 3)) * 2]; + return &waveram[bank][(addr % WAVERAM_WIDTH) + ((addr >> 12) % WAVERAM_HEIGHT) * WAVERAM_WIDTH]; } -INLINE UINT32 *waveram_pixel_ptr(int bank, int y, int x) +INLINE UINT64 *waveram_ptr_from_expanded_addr(UINT8 bank, UINT32 addr) { - return &waveram[bank * (WAVERAM_HEIGHT * WAVERAM_WIDTH) + y * WAVERAM_WIDTH + (x & ~1)]; + return &waveram[bank][(addr % WAVERAM_WIDTH) + ((addr >> 16) % WAVERAM_HEIGHT) * WAVERAM_WIDTH]; +} + + +INLINE UINT64 *waveram_ptr_from_texture_addr(UINT8 bank, UINT32 addr, int width) +{ + return &waveram[bank][(addr * width) / 8]; +} + + +INLINE UINT16 *waveram_pixel_ptr(UINT64 *base, int y, int x, UINT16 **depthptr) +{ + UINT16 *baseptr = (UINT16 *)base + y * 512*2 + (x & ~1) * 2; + if (depthptr != NULL) + *depthptr = baseptr + BYTE4_XOR_LE((x & 1) + 2); + return baseptr + BYTE4_XOR_LE(x & 1); } @@ -111,11 +127,8 @@ INLINE void waveram_plot(int y, int x, UINT16 color) { if (x >= 0 && x < 400 && y >= 0 && y < 256) { - UINT32 *ptr = waveram_pixel_ptr(1, y, x); - if (x & 1) - *ptr = (*ptr & 0x0000ffff) | (color << 16); - else - *ptr = (*ptr & 0xffff0000) | color; + UINT16 *ptr = waveram_pixel_ptr(zeus_renderbase, y, x, NULL); + *ptr = color; } } @@ -124,17 +137,10 @@ INLINE void waveram_plot_depth(int y, int x, UINT16 color, UINT16 depth) { if (x >= 0 && x < 400 && y >= 0 && y < 256) { - UINT32 *ptr = waveram_pixel_ptr(1, y, x); - if (x & 1) - { - ptr[0] = (ptr[0] & 0x0000ffff) | (color << 16); - ptr[1] = (ptr[1] & 0x0000ffff) | (depth << 16); - } - else - { - ptr[0] = (ptr[0] & 0xffff0000) | color; - ptr[1] = (ptr[1] & 0xffff0000) | depth; - } + UINT16 *depthptr; + UINT16 *ptr = waveram_pixel_ptr(zeus_renderbase, y, x, &depthptr); + *ptr = color; + *depthptr = depth; } } @@ -143,51 +149,39 @@ INLINE void waveram_plot_check_depth(int y, int x, UINT16 color, UINT16 depth) { if (x >= 0 && x < 400 && y >= 0 && y < 256) { - UINT32 *ptr = waveram_pixel_ptr(1, y, x); - if (x & 1) + UINT16 *depthptr; + UINT16 *ptr = waveram_pixel_ptr(zeus_renderbase, y, x, &depthptr); + if (depth <= *depthptr) { - if (depth <= (ptr[1] >> 16)) - { - ptr[0] = (ptr[0] & 0x0000ffff) | (color << 16); - ptr[1] = (ptr[1] & 0x0000ffff) | (depth << 16); - } - } - else - { - if (depth <= (ptr[1] & 0xffff)) - { - ptr[0] = (ptr[0] & 0xffff0000) | color; - ptr[1] = (ptr[1] & 0xffff0000) | depth; - } + *ptr = color; + *depthptr = depth; } } } -INLINE UINT32 *zeus_pixaddr(void) +INLINE UINT8 get_texel_8bit(const UINT64 *base, int y, int x, int width) { - int bank = (zeusbase[0xb6] >> 31) & 1; - int x = (zeusbase[0xb4] & 0xff) << 1; - int y = ((zeusbase[0xb4] >> 15) & 0xffe) | ((zeusbase[0xb4] >> 8) & 0x01); - return waveram_pixel_ptr(bank, y, x); + const UINT8 *base8 = (const UINT8 *)base; + x &= width - 1; + base8 += BYTE8_XOR_LE((y / 2) * (width * 2) + (x / 4) * 8 + (y & 1) * 4 + (x & 3)); + return *base8; } -INLINE UINT8 get_texel_8bit(const UINT32 *base, int y, int x, int width) +INLINE UINT8 get_texel_4bit(const UINT64 *base, int y, int x, int width) { - if (x >= width) - return 0; - base += (y / 2) * (width / 2) + (x / 4) * 2 + (y & 1); - return *base >> (8 * (x & 3)); + const UINT8 *base8 = (const UINT8 *)base; + x &= (width * 2) - 1; + base8 += BYTE8_XOR_LE((y / 2) * (width * 2) + (x / 8) * 8 + (y & 1) * 4 + ((x / 2) & 3)); + return (*base8 >> (4 * (x & 1))) & 0x0f; } -INLINE UINT8 get_texel_4bit(const UINT32 *base, int y, int x, int width) +INLINE UINT16 get_palette_entry(const UINT64 *palbase, UINT8 texel) { - if (x >= width * 2) - return 0; - base += (y / 2) * (width / 2) + (x / 8) * 2 + (y & 1); - return (*base >> (4 * (x & 7))) & 0x0f; + const UINT16 *base16 = (const UINT16 *)palbase; + return base16[BYTE4_XOR_LE(texel)]; } @@ -203,8 +197,10 @@ VIDEO_START( midzeus ) int i; /* allocate memory for "wave" RAM */ - waveram = auto_malloc(2 * WAVERAM_WIDTH * WAVERAM_HEIGHT * sizeof(*waveram)); - state_save_register_global_pointer(waveram, 2 * WAVERAM_WIDTH * WAVERAM_HEIGHT); + waveram[0] = auto_malloc(WAVERAM_WIDTH * WAVERAM_HEIGHT * sizeof(*waveram)); + waveram[1] = auto_malloc(WAVERAM_WIDTH * WAVERAM_HEIGHT * sizeof(*waveram)); + state_save_register_global_pointer(waveram[0], WAVERAM_WIDTH * WAVERAM_HEIGHT); + state_save_register_global_pointer(waveram[1], WAVERAM_WIDTH * WAVERAM_HEIGHT); /* initialize a 5-5-5 palette */ for (i = 0; i < 32768; i++) @@ -215,21 +211,27 @@ VIDEO_START( midzeus ) /* we need to cleanup on exit */ add_exit_callback(machine, exit_handler); + + zeus_renderbase = waveram[1]; } static void exit_handler(running_machine *machine) { FILE *f = fopen("waveram.dmp", "w"); + int bank; int i; - for (i = 0; i < 2 * WAVERAM_WIDTH * WAVERAM_HEIGHT; i += 2) - { - if (i % 8 == 0) fprintf(f, "%03X%03X: ", (i / 1024), (i / 2) & 0x1ff); - fprintf(f, " %08X %08X ", waveram[i+0], waveram[i+1]); - if (i % 8 == 6) fprintf(f, "\n"); - } + for (bank = 0; bank < 2; bank++) + for (i = 0; i < WAVERAM_WIDTH * WAVERAM_HEIGHT; i++) + { + if (i % 4 == 0) fprintf(f, "%03X%03X: ", i / WAVERAM_WIDTH, i % WAVERAM_WIDTH); + fprintf(f, " %08X %08X ", (UINT32)(waveram[bank][i] >> 32), (UINT32)waveram[bank][i]); + if (i % 4 == 3) fprintf(f, "\n"); + } fclose(f); + + poly_free(poly); } @@ -247,25 +249,20 @@ VIDEO_UPDATE( midzeus ) /* normal update case */ if (!input_code_pressed(KEYCODE_W)) { + UINT64 *base = waveram_ptr_from_expanded_addr(1, zeusbase[0xcc]); for (y = cliprect->min_y; y <= cliprect->max_y; y++) { - UINT32 *src = waveram_pixel_ptr(1, y, 0); UINT16 *dest = (UINT16 *)bitmap->base + y * bitmap->rowpixels; - for (x = cliprect->min_x; x <= cliprect->max_x; x += 2) - { - UINT32 pixels = *src; - dest[x+0] = pixels & 0x7fff; - dest[x+1] = (pixels >> 16) & 0x7fff; - src += 2; - } + for (x = cliprect->min_x; x <= cliprect->max_x; x++) + dest[x] = *waveram_pixel_ptr(base, y, x, NULL); } if (single_step) { int texwshift = ((single_step_val2 >> 6) + single_step_dx) & 7; - const UINT32 *texbase = &waveram[(single_step_val1 << ((7 + single_step_dy) - texwshift)) & 0x3fffff]; int texwidth = 512 >> texwshift; int texdepth = (single_step_val2 & 0x20) ? 8 : 4; + const UINT64 *texbase = waveram_ptr_from_texture_addr(0, single_step_val1, texwidth); int x, y; for (y = 0; y < 256; y++) @@ -274,9 +271,7 @@ VIDEO_UPDATE( midzeus ) for (x = 0; x < 256; x++) { if (x < texwidth) - dest[x] = single_step_extra.palbase[(texdepth == 8) ? - get_texel_8bit(texbase, y, x, texwidth) : - get_texel_4bit(texbase, y, x, texwidth)]; + dest[x] = get_palette_entry(single_step_extra.palbase, (texdepth == 8) ? get_texel_8bit(texbase, y, x, texwidth) : get_texel_4bit(texbase, y, x, texwidth)); else dest[x] = 0; } @@ -297,7 +292,7 @@ VIDEO_UPDATE( midzeus ) { static int yoffs = 0; static int width = 256; - UINT32 *base; + const UINT64 *base; if (input_code_pressed(KEYCODE_DOWN)) yoffs += input_code_pressed(KEYCODE_LSHIFT) ? 0x40 : 1; if (input_code_pressed(KEYCODE_UP)) yoffs -= input_code_pressed(KEYCODE_LSHIFT) ? 0x40 : 1; @@ -305,7 +300,7 @@ VIDEO_UPDATE( midzeus ) if (input_code_pressed(KEYCODE_RIGHT) && width < 512) { width <<= 1; while (input_code_pressed(KEYCODE_RIGHT)) ; } if (yoffs < 0) yoffs = 0; - base = waveram_ptr_from_addr(yoffs << 12); + base = waveram_ptr_from_block_addr(0, yoffs << 12); for (y = cliprect->min_y; y <= cliprect->max_y; y++) { @@ -940,8 +935,8 @@ static void render_poly_4bit(void *dest, INT32 scanline, const poly_extent *exte float doozdx = extent->param[0].dpdx; float duozdx = extent->param[1].dpdx; float dvozdx = extent->param[2].dpdx; - const UINT32 *texbase = extra->texbase; - const UINT32 *palbase = extra->palbase; + const UINT64 *texbase = extra->texbase; + const UINT64 *palbase = extra->palbase; UINT16 transcolor = extra->transcolor; int texwidth = extra->texwidth; int x; @@ -957,8 +952,8 @@ if (extra->alpha < 0x80) UINT8 texel = get_texel_4bit(texbase, v, u, texwidth); if (texel != transcolor) { - UINT16 color = palbase[texel >> 1] >> (16 * (texel & 1)); - INT32 depth = z * 256.0f; + UINT16 color = get_palette_entry(palbase, texel); + INT32 depth = z; if (depth > 0x7fff) depth = 0x7fff; if (depth >= 0) waveram_plot_check_depth(scanline, x, color, depth); @@ -980,8 +975,8 @@ static void render_poly_8bit(void *dest, INT32 scanline, const poly_extent *exte float doozdx = extent->param[0].dpdx; float duozdx = extent->param[1].dpdx; float dvozdx = extent->param[2].dpdx; - const UINT32 *texbase = extra->texbase; - const UINT32 *palbase = extra->palbase; + const UINT64 *texbase = extra->texbase; + const UINT64 *palbase = extra->palbase; UINT16 transcolor = extra->transcolor; int texwidth = extra->texwidth; int x; @@ -997,8 +992,8 @@ if (extra->alpha < 0x80) UINT8 texel = get_texel_8bit(texbase, v, u, texwidth); if (texel != transcolor) { - UINT16 color = palbase[texel >> 1] >> (16 * (texel & 1)); - INT32 depth = z * 256.0f; + UINT16 color = get_palette_entry(palbase, texel); + INT32 depth = z; if (depth > 0x7fff) depth = 0x7fff; if (depth >= 0) waveram_plot_check_depth(scanline, x, color, depth); @@ -1011,13 +1006,20 @@ if (extra->alpha < 0x80) } +static void render_poly_solid(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid) +{ + const poly_extra_data *extra = extradata; + UINT16 color = extra->transcolor; + int x; + + for (x = extent->startx; x < extent->stopx; x++) + waveram_plot_depth(scanline, x, color, 0x7fff); +} + + static void zeus_draw_model(UINT32 addr_and_count, UINT32 texdata, int logcmd) { - static UINT32 *loglist[1000]; - static int loglist_last = 0; - UINT32 *data = waveram_ptr_from_addr(addr_and_count); UINT32 val1, val2; - int i, logit = FALSE; int texwshift; int testbit = 0; @@ -1037,16 +1039,6 @@ static void zeus_draw_model(UINT32 addr_and_count, UINT32 texdata, int logcmd) ); } - if (logcmd) - { - for (i = 0; i < loglist_last; i++) - if (loglist[i] == data) - break; - logit = (i == loglist_last); - if (i == loglist_last) - loglist[loglist_last++] = data; - } - if (input_code_pressed(KEYCODE_Z)) testbit = 1; if (input_code_pressed(KEYCODE_X)) testbit = 2; if (input_code_pressed(KEYCODE_C)) testbit = 3; @@ -1060,65 +1052,81 @@ static void zeus_draw_model(UINT32 addr_and_count, UINT32 texdata, int logcmd) while (1) { - const UINT32 *data = waveram_ptr_from_addr(addr_and_count); - int count = ((addr_and_count >> 24) + 1) * 2; + const UINT64 *data = waveram_ptr_from_block_addr(0, addr_and_count); + int count = (addr_and_count >> 24) + 1; UINT32 next_addr_and_count = 0; int datanum; int length; - for (datanum = 0; datanum < count; datanum += length * 2) + for (datanum = 0; datanum < count; datanum += length) { + UINT8 cmd = data[datanum] >> 24; int offs; - length = ((data[datanum] >> 24) == 0x25 || (data[datanum] >> 24) == 0x30) ? 7 : 1; + length = (cmd == 0x25 || cmd == 0x30) ? 7 : 1; - if (logit) + if (logcmd) { - logerror("\t%08X", data[datanum]); - for (offs = 1; offs < length * 2; offs++) - logerror(" %08X", data[datanum + offs]); + logerror("\t"); + for (offs = 0; offs < length; offs++) + logerror("%08X %08X ", (UINT32)data[datanum + offs], (UINT32)(data[datanum + offs] >> 32)); logerror("\n"); } - if ((data[datanum] >> 24) == 0x25 || (data[datanum] >> 24) == 0x30 /* invasn */) + if (cmd == 0x25 || cmd == 0x30 /* invasn */) { poly_draw_scanline callback; poly_extra_data *extra; + poly_vertex clipvert[8]; poly_vertex vert[4]; + int numverts; int i; callback = (val2 & 0x20) ? render_poly_8bit : render_poly_4bit; for (i = 0; i < 4; i++) { - UINT32 ixy = data[datanum + 2 + 2*i]; - UINT32 iuvz = data[datanum + 3 + 2*i]; + UINT32 ixy = data[datanum + 1 + i]; + UINT32 iuvz = data[datanum + 1 + i] >> 32; INT32 xo = (INT16)ixy; INT32 yo = (INT16)(ixy >> 16); INT32 zo = (INT16)iuvz; UINT8 u = iuvz >> 16; UINT8 v = iuvz >> 24; - float z, ooz; vert[i].x = (xo * zeus_matrix[0][0] + yo * zeus_matrix[0][1] + zo * zeus_matrix[0][2] + zeus_point[0]) * (1.0f / 65536.0f); vert[i].y = (xo * zeus_matrix[1][0] + yo * zeus_matrix[1][1] + zo * zeus_matrix[1][2] + zeus_point[1]) * (1.0f / 65536.0f); - z = (xo * zeus_matrix[2][0] + yo * zeus_matrix[2][1] + zo * zeus_matrix[2][2] + zeus_point[2]) * (1.0f / (512.0f * 65536.0f)); + vert[i].p[0] = (xo * zeus_matrix[2][0] + yo * zeus_matrix[2][1] + zo * zeus_matrix[2][2] + zeus_point[2]) * (1.0f / (512.0f * 65536.0f)); + vert[i].p[1] = u; + vert[i].p[2] = v; + + if (logcmd) + logerror(" (%f,%f,%f) (%02X,%02X)\n", vert[i].x, vert[i].y, vert[i].p[0], (int)vert[i].p[1], (int)vert[i].p[2]); + } - ooz = 1.0f / z; - vert[i].x *= ooz; - vert[i].y *= ooz; - vert[i].p[0] = ooz; - vert[i].p[1] = u * ooz; - vert[i].p[2] = v * ooz; + numverts = poly_zclip_if_less(4, &vert[0], &clipvert[0], 3, 0.0f); + if (numverts < 3) + continue; - vert[i].x += 200.0f; - vert[i].y += 128.0f; + for (i = 0; i < numverts; i++) + { + float ooz = 1.0f / (0.005f + clipvert[i].p[0]); + + clipvert[i].x *= ooz; + clipvert[i].y *= ooz; + clipvert[i].x += 200.0f; + clipvert[i].y += 128.0f; + + ooz *= 1.0f / 512.0f; + clipvert[i].p[0] = ooz; + clipvert[i].p[1] *= ooz; + clipvert[i].p[2] *= ooz; } extra = poly_get_extra_data(poly); extra->transcolor = 0x100; - extra->texbase = &waveram[(val1 << (7 - texwshift)) & 0x3fffff]; extra->texwidth = 512 >> texwshift; + extra->texbase = waveram_ptr_from_texture_addr(0, val1, extra->texwidth); extra->palbase = zeus_palbase; extra->alpha = zeus_blend; @@ -1131,14 +1139,14 @@ static void zeus_draw_model(UINT32 addr_and_count, UINT32 texdata, int logcmd) single_step_advance = FALSE; } - poly_render_quad(poly, NULL, &Machine->screen[0].visarea, callback, 3, &vert[0], &vert[1], &vert[2], &vert[3]); + poly_render_triangle_fan(poly, NULL, &Machine->screen[0].visarea, callback, 3, numverts, &clipvert[0]); poly_wait(poly, "Normal"); if (single_step) while (!single_step_advance) video_frame_update(TRUE); } - else if (data[datanum] == 0x0c018000/* mk4 */ || data[datanum] == 0x0c008000/* invasn */) - next_addr_and_count = data[datanum + 1]; + else if ((UINT32)data[datanum] == 0x0c018000/* mk4 */ || (UINT32)data[datanum] == 0x0c008000/* invasn */) + next_addr_and_count = data[datanum] >> 32; } if (datanum != count) logerror("Overran data\n"); @@ -1183,10 +1191,10 @@ READ32_HANDLER( zeus_r ) break; case 0xf6: // status -- they wait for this & 9 == 0 + // value & $9600 must == $9600 to pass Zeus system test + result = 0x9600; if (zeusbase[0xb6] == 0x80040000) - result = 1; - else - result = 0; + result |= 1; logit = 0; break; } @@ -1252,6 +1260,10 @@ WRITE32_HANDLER( zeus2_w ) static void zeus_write_16bit(offs_t offset, UINT16 data, int logit) { + /* writes to register $CC need to force a partial update */ + if ((offset & ~1) == 0xcc) + video_screen_update_partial(0, video_screen_get_vpos(0)); + /* write to high part on odd addresses */ if (offset & 1) zeusbase[offset & ~1] = (zeusbase[offset & ~1] & 0x0000ffff) | (data << 16); @@ -1272,6 +1284,10 @@ static void zeus_write_16bit(offs_t offset, UINT16 data, int logit) static void zeus_write_32bit(offs_t offset, UINT32 data, int logit) { + /* writes to register $CC need to force a partial update */ + if ((offset & ~1) == 0xcc) + video_screen_update_partial(0, video_screen_get_vpos(0)); + /* always write to low word? */ zeusbase[offset & ~1] = data; @@ -1439,8 +1455,6 @@ static void zeus_process_write(offs_t offset) { if ((zeusbase[0x80] & 0xffffff) == 0x22FCFF) { - int startx, stopx, starty, stopy; - int x, y; // zeusbase[0x00] = color // zeusbase[0x02] = ??? = 0x000C0000 // zeusbase[0x04] = ??? = 0x00000E01 @@ -1463,13 +1477,23 @@ static void zeus_process_write(offs_t offset) // zeusbase[0x46] = ??? = 0x00000000 // zeusbase[0x4c] = ??? = 0x00808080 (brightness?) // zeusbase[0x4e] = ??? = 0x00808080 (brightness?) - startx = (zeusbase[0x08] & 0xffff); - starty = zeusbase[0x08] >> 16; - stopx = (zeusbase[0x0c] & 0xffff); - stopy = zeusbase[0x0c] >> 16; - for (y = starty; y <= stopy; y++) - for (x = startx; x <= stopx; x++) - waveram[(1 * WAVERAM_HEIGHT + (y % WAVERAM_HEIGHT)) * WAVERAM_WIDTH + x] = zeusbase[0x00]; + poly_extra_data *extra = poly_get_extra_data(poly); + poly_vertex vert[4]; + + vert[0].x = (INT16)zeusbase[0x08]; + vert[0].y = (INT16)(zeusbase[0x08] >> 16); + vert[1].x = (INT16)zeusbase[0x0a]; + vert[1].y = (INT16)(zeusbase[0x0a] >> 16); + vert[2].x = (INT16)zeusbase[0x0c]; + vert[2].y = (INT16)(zeusbase[0x0c] >> 16); + vert[3].x = (INT16)zeusbase[0x0e]; + vert[3].y = (INT16)(zeusbase[0x0e] >> 16); + + extra->transcolor = zeusbase[0x00]; + + poly_render_quad(poly, NULL, &Machine->screen[0].visarea, render_poly_solid, 0, &vert[0], &vert[1], &vert[2], &vert[3]); + poly_wait(poly, "Normal"); + single_step = input_code_pressed(KEYCODE_S); if (single_step) popmessage("Single Step"); @@ -1483,18 +1507,18 @@ static void zeus_process_write(offs_t offset) case 0xb2: if ((zeusbase[0xb6] >> 16) != 0) { - UINT32 *dest = zeus_pixaddr(); if ((offset == 0xb0 && (zeusbase[0xb6] & 0x02000000) == 0) || (offset == 0xb2 && (zeusbase[0xb6] & 0x02000000) != 0)) { + UINT16 *dest = (UINT16 *)waveram_ptr_from_expanded_addr(zeusbase[0xb6] >> 31, zeusbase[0xb4]); if (zeusbase[0xb6] & 0x00100000) - dest[0] = (dest[0] & 0xffff0000) | (zeusbase[0xb0] & 0x0000ffff); + dest[BYTE4_XOR_LE(0)] = zeusbase[0xb0]; if (zeusbase[0xb6] & 0x00200000) - dest[0] = (dest[0] & 0x0000ffff) | (zeusbase[0xb0] & 0xffff0000); + dest[BYTE4_XOR_LE(1)] = zeusbase[0xb0] >> 16; if (zeusbase[0xb6] & 0x00400000) - dest[1] = (dest[1] & 0xffff0000) | (zeusbase[0xb2] & 0x0000ffff); + dest[BYTE4_XOR_LE(2)] = zeusbase[0xb2]; if (zeusbase[0xb6] & 0x00800000) - dest[1] = (dest[1] & 0x0000ffff) | (zeusbase[0xb2] & 0xffff0000); + dest[BYTE4_XOR_LE(3)] = zeusbase[0xb2] >> 16; if (zeusbase[0xb6] & 0x00020000) zeusbase[0xb4]++; } @@ -1504,21 +1528,12 @@ static void zeus_process_write(offs_t offset) case 0xb4: if (zeusbase[0xb6] & 0x00010000) { - UINT32 *src = zeus_pixaddr(); - zeusbase[0xb0] = src[0]; - zeusbase[0xb2] = src[1]; + const UINT64 *src = waveram_ptr_from_expanded_addr(zeusbase[0xb6] >> 31, zeusbase[0xb4]); + zeusbase[0xb0] = *src; + zeusbase[0xb2] = *src >> 32; } break; - case 0x84: - /* MK4: Written in tandem with 0xcc */ - /* MK4: Writes either 0x80 (and 0x000000 to 0xcc) or 0x00 (and 0x800000 to 0xcc) */ - break; - - case 0xcc: - /* see 0x84 above */ - break; - case 0x70: zeus_point[0] = zeusbase[0x70] << 16; break; @@ -1534,23 +1549,20 @@ static void zeus_process_write(offs_t offset) case 0x4e: zeus_blend = zeusbase[0x4e]; break; -// if ((zeuscmd_buffer[0] >> 16) == 0x1770) -// zeus_point[0] = zeuscmd_buffer[0] << 16; -// if ((zeuscmd_buffer[0] >> 16) == 0x1772) -// zeus_point[1] = zeuscmd_buffer[0] << 16; -// if ((zeuscmd_buffer[0] >> 16) == 0x1774) -// zeus_point[2] = zeuscmd_buffer[0] << 16; -// if ((zeuscmd_buffer[0] >> 16) == 0x18ce) -// zeus_blend = zeuscmd_buffer[1]; case 0x52: zeusbase[0xb2] = zeusbase[0x52]; break; -// if ((zeuscmd_buffer[0] >> 16) == 0x1752) -// { -// zeusbase[0xb2] = zeuscmd_buffer[0]; -// zeus_enable_logging = 1; -// } + + case 0xcc: + video_screen_update_partial(0, video_screen_get_vpos(0)); + break; + + case 0x84: + /* MK4: Written in tandem with 0xcc */ + /* MK4: Writes either 0x80 (and 0x000000 to 0xcc) or 0x00 (and 0x800000 to 0xcc) */ + zeus_renderbase = waveram_ptr_from_expanded_addr(1, zeusbase[0x84] << 16); + break; case 0xe0: zeuscmd_buffer[zeuscmd_buffer_words++] = zeusbase[0xe0]; @@ -1570,17 +1582,18 @@ static void log_waveram(UINT32 length_and_base) { static struct { - UINT32 lab, checksum; + UINT32 lab; + UINT64 checksum; } recent_entries[100]; UINT32 numoctets = (length_and_base >> 24) + 1; - const UINT32 *ptr = waveram_ptr_from_addr(length_and_base); - UINT32 checksum = length_and_base; + const UINT64 *ptr = waveram_ptr_from_block_addr(0, length_and_base); + UINT64 checksum = length_and_base; int foundit = FALSE; int i; for (i = 0; i < numoctets; i++) - checksum += ptr[i * 2 + 0] + ptr[i * 2 + 1]; + checksum += ptr[i]; for (i = 0; i < ARRAY_LENGTH(recent_entries); i++) if (recent_entries[i].lab == length_and_base && recent_entries[i].checksum == checksum) @@ -1601,14 +1614,14 @@ static void log_waveram(UINT32 length_and_base) return; for (i = 0; i < numoctets; i++) - logerror("\t%02X: %08X %08X\n", i, ptr[i * 2 + 0], ptr[i * 2 + 1]); + logerror("\t%02X: %08X %08X\n", i, (UINT32)ptr[i], (UINT32)(ptr[i] >> 32)); } static void zeuscmd_execute(int words) { static int colorcount; - int logcmd = 1;//input_code_pressed(KEYCODE_L); + int logcmd = input_code_pressed(KEYCODE_L); int wordnum; /* command observations: @@ -1661,6 +1674,9 @@ static void zeuscmd_execute(int words) 25000000 007F0018 01000400 B0F60008 -- during diagnostics screen 25000080 007F0018 01000400 B0F60008 -- alternate frames during text screen + 25008000 0000F833 A8040E4C 0000F8C0 A8FC0BD9 0000F731 08FC0B7F 0000F6A4 08040DF2 21010000 + 25800000 FE58FD0C 00000000 FE58FD10 00000000 FE74FD10 00000000 FE74FD0C 00000000 200C0000 + write to ($60) = 1 after setting up: @@ -1698,7 +1714,7 @@ static void zeuscmd_execute(int words) case 0x00c040: if (logcmd) logerror(" -- setptr(palbase)\n"); - zeus_palbase = waveram_ptr_from_addr(zeuscmd_buffer[1]); + zeus_palbase = waveram_ptr_from_block_addr(0, zeuscmd_buffer[1]); break; case 0x80c0a5: @@ -1833,6 +1849,8 @@ static UINT8 zeuscmd_length(UINT32 word) case 0x25: case 0x30: /* invasn */ + if (word & 0x808000) + return 10; return 4; /* ??? */ case 0x1c: |