diff --git a/.gitattributes b/.gitattributes index 035cc548a83..a6dfce2255b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2195,6 +2195,7 @@ src/mame/includes/firetrk.h svneol=native#text/plain src/mame/includes/foodf.h svneol=native#text/plain src/mame/includes/fromance.h svneol=native#text/plain src/mame/includes/gaelco3d.h svneol=native#text/plain +src/mame/includes/gaelcrpt.h svneol=native#text/plain src/mame/includes/galaga.h svneol=native#text/plain src/mame/includes/galaxian.h svneol=native#text/plain src/mame/includes/galaxold.h svneol=native#text/plain @@ -2450,6 +2451,7 @@ src/mame/machine/fd1094.h svneol=native#text/plain src/mame/machine/fddebug.c svneol=native#text/plain src/mame/machine/flstory.c svneol=native#text/plain src/mame/machine/gaelco2.c svneol=native#text/plain +src/mame/machine/gaelcrpt.c svneol=native#text/plain src/mame/machine/galaxold.c svneol=native#text/plain src/mame/machine/gaplus.c svneol=native#text/plain src/mame/machine/harddriv.c svneol=native#text/plain diff --git a/src/mame/drivers/gaelco.c b/src/mame/drivers/gaelco.c index 55223394722..d75f43fc884 100644 --- a/src/mame/drivers/gaelco.c +++ b/src/mame/drivers/gaelco.c @@ -11,6 +11,7 @@ #include "cpu/m68000/m68000.h" #include "sound/okim6295.h" #include "sound/3812intf.h" +#include "gaelcrpt.h" extern UINT16 *gaelco_vregs; extern UINT16 *gaelco_videoram; @@ -655,395 +656,12 @@ static INPUT_PORTS_START( squash ) INPUT_PORTS_END -static int lastpc=0; -static int lastword=0; -static int lastoffset=0; - - -#define CARRY(bit) {carry[bit] = (dst[bit]>>1); dst[bit]&=1;} - -static int decrypt(int game, int key, int high_word, int low_word) -{ - static const int swaps[4][16] = - { - { 5,7,9,12,2,14,13,15,3,6,8,11,4,10,0,1 }, - { 11,2,5,14,8,13,10,4,7,12,0,6,15,9,1,3 }, - { 7,0,11,12,13,1,6,8,9,5,4,10,14,3,15,2 }, - { 3,0,2,1,10,15,8,6,9,13,11,7,12,5,4,14 }, - }; - - int dst[16],carry[16]; - int i; - const int *s = swaps[key & 3]; - int flag1 = BIT(high_word, 9) ^ BIT(high_word, 12) ^ 1; - int flag2 = game ? BIT(high_word, 10) : (BIT(high_word, 9) ^ BIT(high_word, 10)); - - if (game) - flag2 = -flag2; - - for (i = 0; i < 16; i++) - dst[i] = BIT(low_word, s[15-i]); - for (i = 0; i < 16; i++) - carry[i] = 0; - - if (flag1 && flag2) - { - dst[13] += game ? 0 : 1; CARRY(13) - dst[2] += carry[13]; CARRY(2) - dst[15] += 1 + carry[2]; CARRY(15) - dst[4] += - carry[15]; CARRY(4) - dst[6] += 1 - carry[4]; CARRY(6) - dst[7] += carry[6]; CARRY(7) - - dst[14] += game ? BIT(low_word, 9) : BIT(~low_word, 9); CARRY(14) - dst[12] += game ? BIT(low_word, 9) : BIT(~low_word, 9); CARRY(12) - - dst[9] += dst[15] + carry[14]; CARRY(9) - dst[10] += dst[15] + carry[12]; CARRY(10) - - dst[5] += BIT(~low_word, 5) + carry[9]; CARRY(5) - dst[1] += BIT(~low_word, 5) + carry[10]; CARRY(1) - - dst[3] += 1 + dst[7] - carry[5]; CARRY(3) - dst[11] += 1 + dst[7] - carry[1]; CARRY(11) - - dst[8] += 1 + dst[6] + carry[3]; - dst[0] += 1 + dst[6] + carry[11]; - } - else - { - dst[13] += BIT(key,2); CARRY(13) - dst[2] += BIT(key,3) + carry[13]; CARRY(2) - dst[15] += BIT(key,4) + carry[2]; CARRY(15) - dst[4] += BIT(key,5) - carry[15]; CARRY(4) - dst[6] += BIT(key,6) - carry[4]; CARRY(6) - dst[7] += BIT(key,7) + carry[6]; CARRY(7) - - dst[14] += BIT(key,8); CARRY(14) - dst[12] += BIT(key,8); CARRY(12) - - dst[9] += BIT(key,9) + carry[14]; CARRY(9) - dst[10] += BIT(key,9) + carry[12]; CARRY(10) - - dst[5] += BIT(key,10) + carry[9]; CARRY(5) - dst[1] += BIT(key,10) + carry[10]; CARRY(1) - - dst[3] += BIT(key,11) - flag1*dst[2] - flag2*dst[13] - carry[5]; CARRY(3) - dst[11] += BIT(key,11) - flag1*dst[2] - flag2*dst[13] - carry[1]; CARRY(11) - - dst[8] += BIT(key,12) + carry[3]; - dst[0] += BIT(key,12) + carry[11]; - } - - low_word = 0; - for (i = 0; i < 16; i++) - low_word |= (dst[i] & 1) << i; - - switch (game) - { - default: - case 0: - return low_word ^ 0xf626; - case 1: - return low_word ^ 0x8626; - } -} - - -static int get_key(int game, int high_word) -{ - int src[16],dst[16],carry[16]; - int i; - int flag1 = BIT(high_word, 9) ^ BIT(high_word, 12) ^ 1; - int flag2 = game ? BIT(high_word, 10) : (BIT(high_word, 9) ^ BIT(high_word, 10)); - int temp; - - for (i = 0; i < 16; i++) - { - src[i] = BIT(high_word,i); - dst[i] = 0; - carry[i] = 0; - } - - - dst[10] = flag1 ? (src[7] ^ src[12]) : src[5]; - - dst[8] = flag2 ? (1 ^ src[6]) : 0; - - dst[5] = (flag1 ^ flag2) ? (1 ^ src[3]) : (1 ^ (src[5] | src[10]) ^ src[11]); - - if (flag1 == 0 && flag2 == 0) - dst[6] = dst[5] + src[2]; CARRY(6); - if (flag1 == 1 && flag2 == 0) - dst[6] = dst[5] + src[8]; CARRY(6); - if (flag1 == 0 && flag2 == 1) - dst[6] = dst[5] + src[13]; CARRY(6); - - if (game == 0) - { - if (flag1 == 0 && flag2 == 0) - { - dst[7] = src[3]; - dst[7] ^= (1^src[12]) & (1^src[5]) & src[0]; - dst[7] ^= src[14] & src[5] & src[0]; - dst[7] ^= ((1^src[12]) ^ src[11]) & (1^src[2]); - dst[7] ^= src[11] & src[6]; - dst[7] ^= src[12] & src[5] & (1^src[2]); - dst[7] ^= src[12] & (1^src[11]) & (1^src[5]) & (1^src[6]); - } - if (flag1 == 1 && flag2 == 0) - dst[7] = 1 ^ src[15] ^ carry[6] ^ (src[8] & (1^src[3])); - if (flag1 == 0 && flag2 == 1) - dst[7] = 1 ^ src[14] ^ carry[6]; - } - else - { - if (flag1 == 0 && flag2 == 0) - { - dst[7] = src[3]; - dst[7] ^= ((1^src[14]) & (1^src[5])) & src[0]; - dst[7] ^= src[6] ^ (src[14] & (1^src[11])); - dst[7] ^= src[5] & (1^src[6]^src[14]) & (1^src[11]); - dst[7] ^= (src[11] ^ src[5]) & src[2]; - dst[7] ^= src[14] & (src[11] & (1^src[5])); - } - if (flag1 == 1 && flag2 == 0) - dst[7] = 1 ^ src[15] ^ carry[6] ^ (src[8] & (1^src[3])); - if (flag1 == 0 && flag2 == 1) - dst[7] = 1 ^ src[14] ^ carry[6]; - } - - if (game == 0) - { - temp = (src[5] | (src[9] & src[10])); - } - else - { - temp = src[5]; - } - - dst[0] = src[3] ^ (src[6] | ((1^src[11]) & temp)); - - if (game == 0) - { - dst[1] = src[15] - ^ (temp & src[4] & src[3]) - ^ (temp & (src[11] ? (src[6] | src[4]) : (1^src[6]))) - ^ (src[13] ? - (src[6] & (1^temp) & src[4]) ^ ((1^temp) & (1^src[4]) & src[3]) - ^ (src[7] & src[8] & (1^src[9]) & temp & (src[6] ^ src[4] ^ src[3])) - ^ ((1^src[11]) & (1^src[6]) & temp & src[7] & src[8] & (1^src[9])) - ^ (src[10] & src[9] & src[8] & (1 ^ src[4] ^ src[3])) - ^ (src[11] & src[10] & src[9] & src[8] & (1^src[6])) - : - (src[6] & (1^temp) & (1 ^ src[4] ^ src[8])) - ^ ((1^temp) & (src[4] ? ((1^src[3]) & (1^src[8])) : (src[3] & src[8]))) - ^ (src[7] & (1^src[8]) & (1^src[9]) & (1^temp) & (src[6] ^ src[4] ^ src[3])) - ^ (src[10] & src[9] & src[8] & (1 ^ src[4] ^ src[3]) & (1^src[5])) - ^ (src[11] & src[10] & src[9] & src[8] & (1^src[6]) & (1^src[5])) - ) - ; - } - else - { - dst[1] = src[15] - ^ (temp & src[4] & src[3]) - ^ (temp & (src[11] ? (src[6] | src[4]) : (1^src[6]))) - ^ (src[13] ? - (src[6] & (1^temp) & src[4]) ^ ((1^temp) & (1^src[4]) & src[3]) - ^ (src[7] & src[8] & src[9] & temp & (src[6] ^ src[4] ^ src[3])) - ^ ((1^src[11]) & (1^src[6]) & temp & src[7] & src[8] & src[9]) - : - (src[6] & (1^temp) & (1 ^ src[4] ^ src[8])) - ^ ((1^temp) & (src[4] ? ((1^src[3]) & (1^src[8])) : (src[3] & src[8]))) - ^ (src[7] & (1^src[8]) & src[9] & (1^temp) & (src[6] ^ src[4] ^ src[3])) - ); - } - - if (game == 0) - { - if (flag1 == 0 && flag2 == 0) - dst[11] = src[0] ^ (src[5] ? src[14] : src[10]); - if (flag1 == 1 && flag2 == 0) - dst[11] = 0; - if (flag1 == 0 && flag2 == 1) - dst[11] = 0; - } - else - { - if (flag1 == 0 && flag2 == 0) - dst[11] = src[0] ^ (src[5] ? src[10] : (1^src[14])); // note src[10] == 0 - if (flag1 == 1 && flag2 == 0) - dst[11] = 0; - if (flag1 == 0 && flag2 == 1) - dst[11] = 1; - } - - dst[12] = dst[11]; - if (flag1 == 0 && flag2 == 0) - dst[12] ^= src[10]; - if (flag1 == 1 && flag2 == 0) - dst[12] ^= 0; - if (flag1 == 0 && flag2 == 1) - dst[12] ^= src[3] ^ (src[11] ? src[6] : (src[6] | src[5])); - - if (game == 0) - { - if (flag1 == 0 && flag2 == 0) - dst[4] = src[6]; - if (flag1 == 1 && flag2 == 0) - dst[4] = src[0] ^ (src[14] ? (1^src[12]) : src[5]); - if (flag1 == 0 && flag2 == 1) - dst[4] = src[7]; - } - else - { - if (flag1 == 0 && flag2 == 0) - dst[4] = src[6]; - if (flag1 == 1 && flag2 == 0) - dst[4] = src[0] ^ (src[14] ? ((1^src[12]) | (1^src[5])) : (src[12] | src[5])); - if (flag1 == 0 && flag2 == 1) - dst[4] = src[7]; - } - - if (game == 0) - { - if (flag1 == 0 && flag2 == 0) - dst[9] = src[5] ^ (src[12] & (1^src[7])) ^ src[13]; - if (flag1 == 1 && flag2 == 0) - dst[9] = 1 ^ src[4]; - if (flag1 == 0 && flag2 == 1) - dst[9] = src[6] ^ ((1^src[11]) & src[5]); - } - else - { - if (flag1 == 0 && flag2 == 0) - dst[9] = 1 ^ src[5] ^ ((1^src[12]) & src[7]) ^ src[13]; - if (flag1 == 1 && flag2 == 0) - dst[9] = 1 ^ src[4]; - if (flag1 == 0 && flag2 == 1) - dst[9] = src[6] ^ ((1^src[11]) & src[5]); - } - - if (game == 0) - { - if (flag1 == 0 && flag2 == 0) - dst[3] = src[12]; - if (flag1 == 1 && flag2 == 0) - dst[3] = src[0] ^ (src[14] ? src[12] : (1^src[5])); - if (flag1 == 0 && flag2 == 1) - dst[3] = src[8] ^ ((1^src[13]) & (1^src[12]) & (1^src[5])) ^ (src[12] & (src[13] ? (src[7] & src[5]) : ((1^src[7]) & (1^src[5])))); - } - else - { - if (flag1 == 0 && flag2 == 0) - dst[3] = src[12]; - if (flag1 == 1 && flag2 == 0) - dst[3] = src[0] ^ (src[14] ? (src[5] & src[12]) : ((1^src[5]) & (1^src[12]))); - if (flag1 == 0 && flag2 == 1) - dst[3] = src[8] ^ ((1^src[13]) & (src[12]) & (1^src[5])) ^ ((1^src[12]) & (src[13] ? (src[7] & src[5]) : ((1^src[7]) & (1^src[5])))); - } - - if (game == 0) - { - if (flag1 == 0 && flag2 == 0) - dst[2] = src[0]; - if (flag1 == 1 && flag2 == 0) - dst[2] = src[1] - ^ (src[3] & (1^src[2])) - ^ ((1^src[11]) & src[6] & src[5]) - ^ ((1^src[12]) & (1^src[5]) & src[0] & (1^src[14]) & (src[6] ^ src[2] ^ src[3])) - ^ (src[12] & (1^src[6]) & (1^src[5]) & src[3]) - ^ (src[2] & (1^src[5]) & (1^src[6]) & (1^src[12])) - ^ (src[2] & src[5] & (1^src[6]) & src[11]) - ^ ((1 ^ src[2] ^ src[3]) & (1^src[5]) & src[6] & src[12]) - ^ (src[14] & (1^src[12]) & (src[2] ^ src[3] ^ src[6]) & (1^src[5])) - ^ (src[14] & src[12] & src[5] & (1 ^ src[3] ^ src[2] ^ src[11]) & src[0]) - ^ (src[14] & src[12] & src[11] & src[6] & src[5] & src[0]) - ^ (src[12] & (1^src[5]) & src[3]) - ^ (src[12] & (1^src[5]) & src[0] & (1 ^ src[3] ^ src[2] ^ (src[11] & (1^src[6])))) - ^ (src[12] & (1^src[5]) & (1^src[11]) & src[6] & src[2]) - ^ (src[12] & (1^src[5]) & src[11] & (src[6] ^ src[2])) - ; - if (flag1 == 0 && flag2 == 1) - dst[2] = src[5]; - } - else - { - if (flag1 == 0 && flag2 == 0) - dst[2] = src[0]; - if (flag1 == 1 && flag2 == 0) - dst[2] = src[1] - ^ (src[3] & (1^src[2])) - ^ ((1^src[11]) & src[6] & src[5]) - ^ ((1^src[12]) & (1^src[5]) & src[0] & (1^src[14]) & (src[6] ^ src[2] ^ src[3])) - ^ (src[12] & (1^src[6]) & (1^src[5]) & src[3]) - ^ (src[2] & (1^src[5]) & (1^src[6]) & (1^src[12])) - ^ (src[2] & src[5] & (1^src[6]) & src[11]) - ^ ((1 ^ src[2] ^ src[3]) & (1^src[5]) & src[6] & src[12]) - ^ (src[14] & (1^src[12]) & (src[2] ^ src[3] ^ src[6]) & (1^src[5])) - ^ (src[14] & src[12] & src[5] & (1 ^ src[3] ^ src[2] ^ src[11]) & src[0]) - ^ (src[14] & src[12] & src[11] & src[6] & src[5] & src[0]); - if (flag1 == 0 && flag2 == 1) - dst[2] = src[5]; - } - - if (game == 0) - { - dst[10] ^= 1; - dst[4] ^= 1; - dst[2] ^= 1; - } - else - { - dst[10] ^= 1; - dst[8] ^= 1; - dst[4] ^= 1; - } - - - high_word = 0; - for (i = 0; i < 16; i++) - high_word |= (dst[i] & 1) << i; - - if (flag1 == 1 && flag2 == 1) - high_word &= 3; - - return high_word; -} - - -static UINT16 squash_encrypt(int offset, int data, int game) -{ - int thispc = activecpu_get_pc(); - int savedata = data; - - /* check if 2nd half of 32 bit */ - if(lastpc == thispc && offset == lastoffset + 1) - { - lastpc = 0; - data = decrypt(game, get_key(game, lastword), lastword, data); - } - else - { - /* code as 1st word */ - lastword = data; - lastpc = thispc; - lastoffset = offset; - - /* high word returned */ - data = decrypt(game, 0x0000, 0x0400, lastword); - - logerror("%8x : data1 = %4x > %4x @ %8x\n",activecpu_get_pc(),savedata,data,lastoffset); - } - return data; -} static WRITE16_HANDLER( gaelco_vram_encrypted_w ) { // mame_printf_debug("gaelco_vram_encrypted_w!!\n"); - data = squash_encrypt(offset,data,0); + data = gaelco_decrypt(offset, data, 0x0f, 0x4228); COMBINE_DATA(&gaelco_videoram[offset]); tilemap_mark_tile_dirty(gaelco_tilemap[offset >> 11],((offset << 1) & 0x0fff) >> 2); @@ -1054,15 +672,15 @@ static WRITE16_HANDLER(gaelco_encrypted_w) { // mame_printf_debug("gaelco_encrypted_w!!\n"); - data = squash_encrypt(offset,data,0); - COMBINE_DATA(&gaelco_screen[offset]); + data = gaelco_decrypt(offset, data, 0x0f, 0x4228); + COMBINE_DATA(&gaelco_screen[offset]); } static WRITE16_HANDLER( thoop_vram_encrypted_w ) { // mame_printf_debug("gaelco_vram_encrypted_w!!\n"); - data = squash_encrypt(offset,data,1); + data = gaelco_decrypt(offset, data, 0x0e, 0x4228); COMBINE_DATA(&gaelco_videoram[offset]); tilemap_mark_tile_dirty(gaelco_tilemap[offset >> 11],((offset << 1) & 0x0fff) >> 2); @@ -1072,8 +690,8 @@ static WRITE16_HANDLER(thoop_encrypted_w) { // mame_printf_debug("gaelco_encrypted_w!!\n"); - data = squash_encrypt(offset,data,1); - COMBINE_DATA(&gaelco_screen[offset]); + data = gaelco_decrypt(offset, data, 0x0e, 0x4228); + COMBINE_DATA(&gaelco_screen[offset]); } @@ -1336,5 +954,5 @@ ROM_END GAME( 1991, bigkarnk, 0, bigkarnk, bigkarnk, 0, ROT0, "Gaelco", "Big Karnak", 0 ) GAME( 1995, biomtoy, 0, maniacsq, biomtoy, 0, ROT0, "Gaelco", "Biomechanical Toy (unprotected)", 0 ) GAME( 1996, maniacsp, maniacsq, maniacsq, maniacsq, 0, ROT0, "Gaelco", "Maniac Square (prototype)", 0 ) -GAME( 1992, squash, 0, squash, squash, 0, ROT0, "Gaelco", "Squash (Ver. 1.0)", 0 ) -GAME( 1992, thoop, 0, thoop, thoop, 0, ROT0, "Gaelco", "Thunder Hoop (Ver. 1)", 0 ) +GAME( 1992, squash, 0, squash, squash, 0, ROT0, "Gaelco", "Squash (Ver. 1.0)", 0 ) +GAME( 1992, thoop, 0, thoop, thoop, 0, ROT0, "Gaelco", "Thunder Hoop (Ver. 1)", 0 ) diff --git a/src/mame/includes/gaelcrpt.h b/src/mame/includes/gaelcrpt.h new file mode 100644 index 00000000000..168412dbdf3 --- /dev/null +++ b/src/mame/includes/gaelcrpt.h @@ -0,0 +1,2 @@ +UINT16 gaelco_decrypt(int offset, int data, int param1, int param2); + diff --git a/src/mame/machine/gaelcrpt.c b/src/mame/machine/gaelcrpt.c new file mode 100644 index 00000000000..5b1567e69f6 --- /dev/null +++ b/src/mame/machine/gaelcrpt.c @@ -0,0 +1,151 @@ +/* + +Gaelco video RAM encryption + +Thanks to Javier Valero for information on the algorithm. + +*/ + +#include "driver.h" + +static int decrypt(int const param1, int const param2, int const enc_prev_word, int const dec_prev_word, int const enc_word) +{ + int const swap = (BIT(dec_prev_word, 8) << 1) | BIT(dec_prev_word, 7); + int const type = (BIT(dec_prev_word,12) << 1) | BIT(dec_prev_word, 2); + int res=0; + int k=0; + + switch (swap) + { + case 0: res = BITSWAP16(enc_word, 1, 2, 0,14,12,15, 4, 8,13, 7, 3, 6,11, 5,10, 9); break; + case 1: res = BITSWAP16(enc_word, 14,10, 4,15, 1, 6,12,11, 8, 0, 9,13, 7, 3, 5, 2); break; + case 2: res = BITSWAP16(enc_word, 2,13,15, 1,12, 8,14, 4, 6, 0, 9, 5,10, 7, 3,11); break; + case 3: res = BITSWAP16(enc_word, 3, 8, 1,13,14, 4,15, 0,10, 2, 7,12, 6,11, 9, 5); break; + } + + res ^= param2; + + switch (type) + { + case 0: + k = (0 << 0) | + (1 << 1) | + (0 << 2) | + (1 << 3) | + (1 << 4) | + (1 << 5); + break; + + case 1: + k = (BIT(dec_prev_word, 0) << 0) | + (BIT(dec_prev_word, 1) << 1) | + (BIT(dec_prev_word, 1) << 2) | + (BIT(enc_prev_word, 3) << 3) | + (BIT(enc_prev_word, 8) << 4) | + (BIT(enc_prev_word,15) << 5); + break; + + case 2: + k = (BIT(enc_prev_word, 5) << 0) | + (BIT(dec_prev_word, 5) << 1) | + (BIT(enc_prev_word, 7) << 2) | + (BIT(enc_prev_word, 3) << 3) | + (BIT(enc_prev_word,13) << 4) | + (BIT(enc_prev_word,14) << 5); + break; + + case 3: + k = (BIT(enc_prev_word, 0) << 0) | + (BIT(enc_prev_word, 9) << 1) | + (BIT(enc_prev_word, 6) << 2) | + (BIT(dec_prev_word, 4) << 3) | + (BIT(enc_prev_word, 2) << 4) | + (BIT(dec_prev_word,11) << 5); + break; + } + + k ^= param1; + + res = (res & 0xffc0) | ((res + k) & 0x003f); + + res ^= param1; + + switch (type) + { + case 0: + k = (BIT(enc_word, 9) << 0) | + (BIT(res,2) << 1) | + (BIT(enc_word, 5) << 2) | + (BIT(res,5) << 3) | + (BIT(res,4) << 4); + break; + + case 1: + k = (BIT(dec_prev_word, 2) << 0) | // always 1 + (BIT(enc_prev_word, 4) << 1) | + (BIT(dec_prev_word,14) << 2) | + (BIT(res, 1) << 3) | + (BIT(dec_prev_word,12) << 4); // always 0 + break; + + case 2: + k = (BIT(enc_prev_word, 6) << 0) | + (BIT(dec_prev_word, 6) << 1) | + (BIT(dec_prev_word,15) << 2) | + (BIT(res,0) << 3) | + (BIT(dec_prev_word, 7) << 4); + break; + + case 3: + k = (BIT(dec_prev_word, 2) << 0) | // always 1 + (BIT(dec_prev_word, 9) << 1) | + (BIT(enc_prev_word, 5) << 2) | + (BIT(dec_prev_word, 1) << 3) | + (BIT(enc_prev_word,10) << 4); + + break; + } + + k ^= param1; + + res = (res & 0x003f) | + ((res + (k << 6)) & 0x07c0) | + ((res + (k << 11)) & 0xf800); + + res ^= (param1 << 6) | (param1 << 11); + + return BITSWAP16(res, 2,6,0,11,14,12,7,10,5,4,8,3,9,1,13,15); +} + + + +UINT16 gaelco_decrypt(int offset, int data, int param1, int param2) +{ + static int lastpc, lastoffset, lastencword, lastdecword; + + int thispc = activecpu_get_pc(); +// int savedata = data; + + /* check if 2nd half of 32 bit */ + if(lastpc == thispc && offset == lastoffset + 1) + { + lastpc = 0; + data = decrypt(param1, param2, lastencword, lastdecword, data); + } + else + { + /* code as 1st word */ + + lastpc = thispc; + lastoffset = offset; + lastencword = data; + + /* high word returned */ + data = decrypt(param1, param2, 0, 0, data); + + lastdecword = data; + +// logerror("%8x : data1 = %4x > %4x @ %8x\n",activecpu_get_pc(),savedata,data,lastoffset); + } + return data; +} diff --git a/src/mame/mame.mak b/src/mame/mame.mak index b42f820a88a..2f5b86b9107 100644 --- a/src/mame/mame.mak +++ b/src/mame/mame.mak @@ -710,7 +710,7 @@ $(MAMEOBJ)/fuuki.a: \ $(DRIVERS)/fuukifg3.o $(VIDEO)/fuukifg3.o \ $(MAMEOBJ)/gaelco.a: \ - $(DRIVERS)/gaelco.o $(VIDEO)/gaelco.o \ + $(DRIVERS)/gaelco.o $(VIDEO)/gaelco.o $(MACHINE)/gaelcrpt.o \ $(DRIVERS)/gaelco2.o $(MACHINE)/gaelco2.o $(VIDEO)/gaelco2.o \ $(DRIVERS)/gaelco3d.o $(VIDEO)/gaelco3d.o \ $(DRIVERS)/glass.o $(VIDEO)/glass.o \