diff options
Diffstat (limited to 'src/mame/machine/wrally.c')
-rw-r--r-- | src/mame/machine/wrally.c | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/src/mame/machine/wrally.c b/src/mame/machine/wrally.c new file mode 100644 index 00000000000..a7e2927dd3e --- /dev/null +++ b/src/mame/machine/wrally.c @@ -0,0 +1,154 @@ +/*************************************************************************** + + World Rally + + Functions to emulate general aspects of the machine (RAM, ROM, interrupts, + I/O ports) + +***************************************************************************/ + +#include "driver.h" + +UINT16 *wrally_encr_table[2]; + +/*************************************************************************** + + World Rally Video RAM encryption + +***************************************************************************/ + +static int subxor1(int data,int res) +{ + res ^= 0x0002; + if (BIT(data,0) ^ !BIT(data,5)) + { + res ^= 0x0800; + if (BIT(data,2) ^ BIT(data,3)) res ^= 0x0001; + if (BIT(data,6) && !BIT(data,11) && BIT(data,5)) res ^= 0x0001; + } + + return res; +} + +static int subxor2(int data,int res) +{ + res ^= 0x0020; + if (BIT(data,8) ^ !BIT(data,5)) + { + res ^= 0x0008; + if (BIT(data,4) ^ BIT(data,3)) res ^= 0x0100; + if (BIT(data,6) && !BIT(data,11) && BIT(data,5)) res ^= 0x0100; + } + + return res; +} + +static int wrally_decode_vram(int data) +{ + int res = 0; + + + res = BITSWAP16(data,5,7,9,12,2,14,13,15,3,6,8,11,4,10,0,1); + + res ^= 0x0062; + + if (BIT(data,9)) res ^= 0x5004; + + if ( BIT(data,5) ^ (!BIT(data,9) && BIT(data,7))) res ^= 0x0200; + if (!BIT(data,5) ^ (!BIT(data,9) && BIT(data,12))) res ^= 0x0400; + + if (BIT(data,3) ^ BIT(data,6)) res ^= 0x0101; + + if (BIT(data,3) ^ BIT(data,5)) + { + res ^= 0x0808; + if (BIT(data,2) ^ BIT(data,3)) res ^= 0x0001; + if (BIT(data,4) ^ BIT(data,3)) res ^= 0x0100; + } + + if ((BIT(data,9) && !BIT(data,10)) || BIT(data,5)) + { + res ^= 0x0010; + + if (!BIT(data,11)) res ^= 0x0141; + + if (BIT(data,6) && !BIT(data,11)) + { + res ^= 0x0888; + if (!BIT(data,2)) res ^= 0x0001; + if (!BIT(data,4)) res ^= 0x0100; + } + } + + if (BIT(data,9) && !BIT(data,10)) + { + res ^= 0x8600; + if (!BIT(data,14)) res = subxor1(data,res); + if (!BIT(data,5)) res = subxor2(data,res); + + if (BIT(data,6) && !BIT(data,11)) + { + if (BIT(data,0) && !BIT(data,5)) res ^= 0x0001; + if (BIT(data,8) && !BIT(data,5)) res ^= 0x0100; + } + } + + if (BIT(data,5) ^ BIT(data,14)) + { + if ( BIT(data,14)) res = subxor1(data,res); + if (!BIT(data,9) && BIT(data,12)) res = subxor1(data,res); + } + + if (BIT(data,5) ^ !BIT(data,13)) + { + if ( BIT(data,5)) res = subxor2(data,res); + if ( BIT(data,9) && BIT(data,10)) res = subxor2(data,res); + if (!BIT(data,9) && !BIT(data,7)) res = subxor2(data,res); + } + + return res; +} + +/*************************************************************************** + + World Rally memory handlers + +***************************************************************************/ + +WRITE16_HANDLER( OKIM6295_bankswitch_w ) +{ + UINT8 *RAM = memory_region(REGION_SOUND1); + + if (ACCESSING_LSB){ + memcpy(&RAM[0x30000], &RAM[0x40000 + (data & 0x0f)*0x10000], 0x10000); + } +} + +WRITE16_HANDLER( wrally_coin_counter_w ) +{ + coin_counter_w( (offset >> 3) & 0x01, data & 0x01); +} + +WRITE16_HANDLER( wrally_coin_lockout_w ) +{ + coin_lockout_w( (offset >> 3) & 0x01, ~data & 0x01); +} + +/*************************************************************************** + + World Rally init machine + +***************************************************************************/ + +DRIVER_INIT( wrally ) +{ + int i; + + /* recreate encryption tables on start up */ + wrally_encr_table[0] = (UINT16 *)auto_malloc(0x10000*2); + wrally_encr_table[1] = (UINT16 *)auto_malloc(0x10000*2); + for (i = 0; i < 0x10000; i++){ + wrally_encr_table[0][i] = wrally_decode_vram(i); + wrally_encr_table[1][i] = wrally_decode_vram(i); + } +} |