From c6e5e1674834c3a610b317df0884bb97aa6e595a Mon Sep 17 00:00:00 2001 From: Aaron Giles Date: Fri, 28 Dec 2007 18:16:09 +0000 Subject: [PATCH] Updated Zeus to handle waveram like the Zeus2 Added save state support to the Zeus games Updated driver flags --- src/mame/drivers/midzeus.c | 10 ++-- src/mame/video/midzeus.c | 109 ++++++++++++++++++++++++------------- src/mame/video/midzeus2.c | 2 +- 3 files changed, 78 insertions(+), 43 deletions(-) diff --git a/src/mame/drivers/midzeus.c b/src/mame/drivers/midzeus.c index 5a5ca058021..a7e9de8d5c9 100644 --- a/src/mame/drivers/midzeus.c +++ b/src/mame/drivers/midzeus.c @@ -1095,8 +1095,8 @@ static DRIVER_INIT( thegrid ) * *************************************/ -GAME( 1997, mk4, 0, midzeus, mk4, mk4, ROT0, "Midway", "Mortal Kombat 4 (3.0)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1997, mk4a, mk4, midzeus, mk4, mk4, ROT0, "Midway", "Mortal Kombat 4 (2.1)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1999, invasn, 0, midzeus, invasn, invasn, ROT0, "Midway", "Invasion (Midway)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1999, crusnexo, 0, midzeus2, crusnexo, crusnexo, ROT0, "Midway", "Cruis'n Exotica", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_NO_SOUND ) -GAME( 2001, thegrid, 0, midzeus2, thegrid, thegrid, ROT0, "Midway", "The Grid (version 1.1)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_NO_SOUND ) +GAME( 1997, mk4, 0, midzeus, mk4, mk4, ROT0, "Midway", "Mortal Kombat 4 (3.0)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) +GAME( 1997, mk4a, mk4, midzeus, mk4, mk4, ROT0, "Midway", "Mortal Kombat 4 (2.1)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) +GAME( 1999, invasn, 0, midzeus, invasn, invasn, ROT0, "Midway", "Invasion (Midway)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) +GAME( 1999, crusnexo, 0, midzeus2, crusnexo, crusnexo, ROT0, "Midway", "Cruis'n Exotica", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) +GAME( 2001, thegrid, 0, midzeus2, thegrid, thegrid, ROT0, "Midway", "The Grid (version 1.1)", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) diff --git a/src/mame/video/midzeus.c b/src/mame/video/midzeus.c index 3ca73400e6a..dd7b54b1750 100644 --- a/src/mame/video/midzeus.c +++ b/src/mame/video/midzeus.c @@ -18,10 +18,13 @@ * *************************************/ -#define DUMP_WAVE_RAM 0 +#define DUMP_WAVE_RAM 0 -#define WAVERAM_WIDTH 512 -#define WAVERAM_HEIGHT 2048 +#define WAVERAM0_WIDTH 512 +#define WAVERAM0_HEIGHT 2048 + +#define WAVERAM1_WIDTH 512 +#define WAVERAM1_HEIGHT 512 @@ -63,12 +66,12 @@ static INT16 zeus_matrix[3][3]; static INT32 zeus_point[3]; static INT16 zeus_light[3]; static void *zeus_renderbase; -static void *zeus_palbase; +static UINT32 zeus_palbase; static int zeus_enable_logging; static UINT32 zeus_objdata; static rectangle zeus_cliprect; -static void *waveram[2]; +static UINT32 *waveram[2]; @@ -105,7 +108,8 @@ static void log_waveram(UINT32 length_and_base); * *************************************/ -#define WAVERAM_BLOCK(bank, blocknum) ((void *)((UINT8 *)waveram[bank] + 8 * (blocknum))) +#define WAVERAM_BLOCK0(blocknum) ((void *)((UINT8 *)waveram[0] + 8 * (blocknum))) +#define WAVERAM_BLOCK1(blocknum) ((void *)((UINT8 *)waveram[1] + 8 * (blocknum))) #define WAVERAM_PTR8(base, bytenum) ((UINT8 *)(base) + BYTE4_XOR_LE(bytenum)) #define WAVERAM_READ8(base, bytenum) (*WAVERAM_PTR8(base, bytenum)) @@ -138,22 +142,28 @@ static void log_waveram(UINT32 length_and_base); * *************************************/ -INLINE void *waveram_ptr_from_block_addr(UINT8 bank, UINT32 addr) +INLINE void *waveram0_ptr_from_block_addr(UINT32 addr) { - UINT32 blocknum = (addr % WAVERAM_WIDTH) + ((addr >> 12) % WAVERAM_HEIGHT) * WAVERAM_WIDTH; - return WAVERAM_BLOCK(bank, blocknum); + UINT32 blocknum = (addr % WAVERAM0_WIDTH) + ((addr >> 12) % WAVERAM0_HEIGHT) * WAVERAM0_WIDTH; + return WAVERAM_BLOCK0(blocknum); } -INLINE void *waveram_ptr_from_expanded_addr(UINT8 bank, UINT32 addr) +INLINE void *waveram0_ptr_from_expanded_addr(UINT32 addr) { - UINT32 blocknum = (addr % WAVERAM_WIDTH) + ((addr >> 16) % WAVERAM_HEIGHT) * WAVERAM_WIDTH; - return WAVERAM_BLOCK(bank, blocknum); + UINT32 blocknum = (addr % WAVERAM0_WIDTH) + ((addr >> 16) % WAVERAM0_HEIGHT) * WAVERAM0_WIDTH; + return WAVERAM_BLOCK0(blocknum); } -INLINE void *waveram_ptr_from_texture_addr(UINT8 bank, UINT32 addr, int width) +INLINE void *waveram1_ptr_from_expanded_addr(UINT32 addr) { - UINT32 blocknum = ((addr & ~1) * width) / 8; - return WAVERAM_BLOCK(bank, blocknum); + UINT32 blocknum = (addr % WAVERAM1_WIDTH) + ((addr >> 16) % WAVERAM1_HEIGHT) * WAVERAM1_WIDTH; + return WAVERAM_BLOCK1(blocknum); +} + +INLINE void *waveram0_ptr_from_texture_addr(UINT32 addr, int width) +{ + UINT32 blocknum = (((addr & ~1) * width) / 8) % (WAVERAM0_WIDTH * WAVERAM0_HEIGHT); + return WAVERAM_BLOCK0(blocknum); } @@ -236,10 +246,8 @@ VIDEO_START( midzeus ) int i; /* allocate memory for "wave" RAM */ - waveram[0] = auto_malloc(WAVERAM_WIDTH * WAVERAM_HEIGHT * 8); - waveram[1] = auto_malloc(WAVERAM_WIDTH * WAVERAM_HEIGHT * 8); - state_save_register_global_pointer(((UINT32 *)waveram[0]), WAVERAM_WIDTH * WAVERAM_HEIGHT * 8/4); - state_save_register_global_pointer(((UINT32 *)waveram[1]), WAVERAM_WIDTH * WAVERAM_HEIGHT * 8/4); + waveram[0] = auto_malloc(WAVERAM0_WIDTH * WAVERAM0_HEIGHT * 8); + waveram[1] = auto_malloc(WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 8); /* initialize a 5-5-5 palette */ for (i = 0; i < 32768; i++) @@ -252,6 +260,21 @@ VIDEO_START( midzeus ) add_exit_callback(machine, exit_handler); zeus_renderbase = waveram[1]; + + /* state saving */ + state_save_register_global_array(zeus_fifo); + state_save_register_global(zeus_fifo_words); + state_save_register_global_2d_array(zeus_matrix); + state_save_register_global_array(zeus_point); + state_save_register_global_array(zeus_light); + state_save_register_global(zeus_palbase); + state_save_register_global(zeus_objdata); + state_save_register_global(zeus_cliprect.min_x); + state_save_register_global(zeus_cliprect.max_x); + state_save_register_global(zeus_cliprect.min_y); + state_save_register_global(zeus_cliprect.max_y); + state_save_register_global_pointer(waveram[0], WAVERAM0_WIDTH * WAVERAM0_HEIGHT * 8 / sizeof(waveram[0][0])); + state_save_register_global_pointer(waveram[1], WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 8 / sizeof(waveram[1][0])); } @@ -259,16 +282,16 @@ static void exit_handler(running_machine *machine) { #if DUMP_WAVE_RAM FILE *f = fopen("waveram.dmp", "w"); - int bank; int i; - 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"); - } + 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); #endif @@ -292,7 +315,7 @@ VIDEO_UPDATE( midzeus ) /* normal update case */ if (!input_code_pressed(KEYCODE_W)) { - const void *base = waveram_ptr_from_expanded_addr(1, zeusbase[0xcc]); + const void *base = waveram1_ptr_from_expanded_addr(zeusbase[0xcc]); int xoffs = machine->screen[screen].visarea.min_x; for (y = cliprect->min_y; y <= cliprect->max_y; y++) { @@ -315,7 +338,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_block_addr(0, yoffs << 12); + base = waveram0_ptr_from_block_addr(yoffs << 12); for (y = cliprect->min_y; y <= cliprect->max_y; y++) { @@ -450,7 +473,7 @@ static void zeus_pointer_w(UINT32 which, UINT32 data, int logit) case 0x00c040: if (logit) logerror(" -- setptr(palbase)\n"); - zeus_palbase = waveram_ptr_from_block_addr(0, data); + zeus_palbase = data; break; @@ -639,7 +662,7 @@ static void zeus_register_update(offs_t offset) 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); + zeus_renderbase = waveram1_ptr_from_expanded_addr(zeusbase[0x84] << 16); break; case 0xb0: @@ -649,7 +672,13 @@ static void zeus_register_update(offs_t offset) if ((offset == 0xb0 && (zeusbase[0xb6] & 0x02000000) == 0) || (offset == 0xb2 && (zeusbase[0xb6] & 0x02000000) != 0)) { - void *dest = waveram_ptr_from_expanded_addr(zeusbase[0xb6] >> 31, zeusbase[0xb4]); + void *dest; + + if (zeusbase[0xb6] & 0x80000000) + dest = waveram1_ptr_from_expanded_addr(zeusbase[0xb4]); + else + dest = waveram0_ptr_from_expanded_addr(zeusbase[0xb4]); + if (zeusbase[0xb6] & 0x00100000) WAVERAM_WRITE16(dest, 0, zeusbase[0xb0]); if (zeusbase[0xb6] & 0x00200000) @@ -667,7 +696,13 @@ static void zeus_register_update(offs_t offset) case 0xb4: if (zeusbase[0xb6] & 0x00010000) { - const UINT32 *src = waveram_ptr_from_expanded_addr(zeusbase[0xb6] >> 31, zeusbase[0xb4]); + const UINT32 *src; + + if (zeusbase[0xb6] & 0x80000000) + src = waveram1_ptr_from_expanded_addr(zeusbase[0xb4]); + else + src = waveram0_ptr_from_expanded_addr(zeusbase[0xb4]); + poly_wait(poly, "vram_read"); zeusbase[0xb0] = WAVERAM_READ32(src, 0); zeusbase[0xb2] = WAVERAM_READ32(src, 1); @@ -933,7 +968,7 @@ static void zeus_draw_model(UINT32 texdata, int logit) while (zeus_objdata != 0 && !model_done) { - const void *base = waveram_ptr_from_block_addr(0, zeus_objdata); + const void *base = waveram0_ptr_from_block_addr(zeus_objdata); int count = zeus_objdata >> 24; int curoffs; @@ -1171,8 +1206,8 @@ if ( extra->alpha = zeusbase[0x4e]; extra->transcolor = ((databuffer[1] >> 16) & 1) ? 0 : 0x100; extra->texwidth = 512 >> texwshift; - extra->texbase = waveram_ptr_from_texture_addr(0, val1, extra->texwidth); - extra->palbase = zeus_palbase; + extra->texbase = waveram0_ptr_from_texture_addr(val1, extra->texwidth); + extra->palbase = waveram0_ptr_from_block_addr(zeus_palbase); poly_render_quad_fan(poly, NULL, &zeus_cliprect, callback, 4, numverts, &clipvert[0]); } @@ -1391,7 +1426,7 @@ static void log_waveram(UINT32 length_and_base) } recent_entries[100]; UINT32 numoctets = (length_and_base >> 24) + 1; - const UINT32 *ptr = waveram_ptr_from_block_addr(0, length_and_base); + const UINT32 *ptr = waveram0_ptr_from_block_addr(length_and_base); UINT32 checksum = length_and_base; int foundit = FALSE; int i; diff --git a/src/mame/video/midzeus2.c b/src/mame/video/midzeus2.c index f683093337c..7f761683516 100644 --- a/src/mame/video/midzeus2.c +++ b/src/mame/video/midzeus2.c @@ -19,7 +19,7 @@ * *************************************/ -#define DUMP_WAVE_RAM 1 +#define DUMP_WAVE_RAM 0 #define WAVERAM0_WIDTH 1024 #define WAVERAM0_HEIGHT 2048