diff options
| author | 2008-01-08 09:26:12 +0000 | |
|---|---|---|
| committer | 2008-01-08 09:26:12 +0000 | |
| commit | c846ce37d998dde405f6ccf9d6f1234326f3cbab (patch) | |
| tree | 5e8a9a8b4e042189d7549cf582a8c30f04fcc751 /src | |
| parent | 6f0b1f3e0ffe70698cab10f04f6900e786568ba4 (diff) | |
Added a workaround for umk3059gre and umk3137b5gre.
It's a hack, but a well-understood and clearly documented one.
Maybe smf can fix it for real in the distant future.
Diffstat (limited to 'src')
| -rw-r--r-- | src/mame/machine/midwunit.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/mame/machine/midwunit.c b/src/mame/machine/midwunit.c index 4cb9362565f..5a506062a2c 100644 --- a/src/mame/machine/midwunit.c +++ b/src/mame/machine/midwunit.c @@ -400,6 +400,33 @@ static void init_wunit_generic(void) /********************** Mortal Kombat 3 **********************/ +static UINT16 *umk3_palette; + +static WRITE16_HANDLER( umk3_palette_hack_w ) +{ + /* + UMK3 uses a circular buffer to hold pending palette changes; the buffer holds 17 entries + total, and the buffer is processed/cleared during the video interrupt. Most of the time, + 17 entries is enough. However, when characters are unlocked, or a number of characters are + being displayed, the circular buffer sometimes wraps, losing the first 17 palette changes. + + This bug manifests itself on a real PCB, but only rarely; whereas in MAME, it manifests + itself very frequently. This is due to the fact that the instruction timing for the TMS34010 + is optimistic and assumes that the instruction cache is always fully populated. Without + full cache level emulation of the chip, there is no hope of fixing this issue without a + hack. + + Thus, the hack. To slow down the CPU when it is adding palette entries to the list, we + install this write handler on the memory locations where the start/end circular buffer + pointers live. Each time they are written to, we penalize the main CPU a number of cycles. + Although not realistic, this is sufficient to reduce the frequency of incorrect colors + without significantly impacting the rest of the system. + */ + COMBINE_DATA(&umk3_palette[offset]); + activecpu_adjust_icount(-100); +/* printf("in=%04X%04X out=%04X%04X\n", umk3_palette[3], umk3_palette[2], umk3_palette[1], umk3_palette[0]); */ +} + static void init_mk3_common(void) { /* common init */ @@ -427,11 +454,13 @@ DRIVER_INIT( mk3r10 ) DRIVER_INIT( umk3 ) { init_mk3_common(); + umk3_palette = memory_install_write16_handler(0, ADDRESS_SPACE_PROGRAM, 0x0106a060, 0x0106a09f, 0, 0, umk3_palette_hack_w); } DRIVER_INIT( umk3r11 ) { init_mk3_common(); + umk3_palette = memory_install_write16_handler(0, ADDRESS_SPACE_PROGRAM, 0x0106a060, 0x0106a09f, 0, 0, umk3_palette_hack_w); } |
