mirror of
https://github.com/holub/mame
synced 2025-04-19 23:12:11 +03:00
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.
This commit is contained in:
parent
6f0b1f3e0f
commit
c846ce37d9
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user