diff --git a/src/mame/drivers/neodrvr.c b/src/mame/drivers/neodrvr.c index 70fac802585..44e20a1d877 100644 --- a/src/mame/drivers/neodrvr.c +++ b/src/mame/drivers/neodrvr.c @@ -5672,13 +5672,10 @@ ROM_START( ms5pcb ) /* Encrypted Set */ /* this contains both an ASIA and JAPAN bios, HARDDIP3 on the PCB selects which to use */ ROM_LOAD16_WORD_SWAP( "268-bios.bin", 0x00000, 0x80000, CRC(b4590283) SHA1(47047ed5b6062babc0a0bebcc30e4b3f021e115a) ) - ROM_REGION( 0x50000, "audio", 0 ) - /* Encrypted, we load it here for reference and replace with decrypted ROM */ + /* Encrypted (slightly different encryption on this single board PCB) */ + ROM_REGION( 0x80000, "audiocrypt", 0 ) ROM_LOAD( "268-m1.bin", 0x00000, 0x10000, CRC(58b107d0) SHA1(cc7fe66ff4f9c026cde4df06f86c848eb21f7af8) ) - /* Decrypted */ - ROM_LOAD( "268-m1_decrypted.bin", 0x00000, 0x10000, CRC(3c0655a7) SHA1(ae839d4c2b87a7aa3dd8e5caddc43eb75ee9b732) ) /* not a 100% match for encrypted version */ - ROM_RELOAD( 0x10000, 0x10000 ) - + ROM_REGION( 0x90000, "audio", ROMREGION_ERASEFF ) ROM_Y_ZOOM @@ -7039,7 +7036,7 @@ static DRIVER_INIT( ms5pcb ) mslug5_decrypt_68k(machine); svcpcb_gfx_decrypt(machine); kof2000_neogeo_gfx_decrypt(machine, 0x19); - //neogeo_cmc50_m1_decrypt(machine, 0x1543); // wrong, or there is some extra address swap first + neogeo_ms5pcb_m1_decrypt(machine); neogeo_fixed_layer_bank_type = 2; svcpcb_s1data_decrypt(machine); diff --git a/src/mame/includes/neogeo.h b/src/mame/includes/neogeo.h index df674a005df..47bd68da90c 100644 --- a/src/mame/includes/neogeo.h +++ b/src/mame/includes/neogeo.h @@ -68,6 +68,7 @@ void neo_pcm2_snk_1999(running_machine *machine, int value); void neo_pcm2_swap(running_machine *machine, int value); void neogeo_cmc50_m1_decrypt(running_machine *machine, UINT16 key); +void neogeo_ms5pcb_m1_decrypt(running_machine *machine); /*----------- defined in machine/neoprot.c -----------*/ diff --git a/src/mame/machine/neocrypt.c b/src/mame/machine/neocrypt.c index 3b7885388cb..3a2df226dd2 100644 --- a/src/mame/machine/neocrypt.c +++ b/src/mame/machine/neocrypt.c @@ -1516,4 +1516,53 @@ void neogeo_cmc50_m1_decrypt(running_machine *machine, UINT16 key) } +/* the ms5pcb encryption is slightly different, there are 2 possible approachs + we can take */ + +#if 1 +// if using key 0x1543 (same as mslug5) we need a different bitswap here +int m1_alt_address_scramble(int address/*, UINT16 key*/) +{ + int block; + int aux; + UINT16 key = 0x1543; + + aux = address ^key; + aux = BITSWAP16(aux, 11,0,2,5,12,7,4,9,10,8,3,14,15,6,13,1); // only 1 64k block, so... + aux ^= m1_address_0_7_xor[(aux>>8)&0xff]; + aux ^= m1_address_8_15_xor[aux&0xff]<<8; + aux = BITSWAP16(aux, 7,15,14,6,5,13,12,4,11,3,10,2,9,1,8,0); + return aux; +} +#else +// using key 0xa528, we can rearrange the rom first.. +int m1_alt_address_scramble(int address/*, UINT16 key */) +{ + UINT16 key = 0xa528; + address = BITSWAP16(address, 1,13,12,4,7,6,2,10,15,5,0,11,8,3,14,9); + return m1_address_scramble(address, key); +} +#endif + + +void neogeo_ms5pcb_m1_decrypt(running_machine *machine/*, UINT16 key*/) +{ + UINT8* rom = memory_region(machine, "audiocrypt"); + size_t rom_size = 0x80000; + UINT8* rom2 = memory_region(machine, "audio"); + + UINT8* buffer = malloc_or_die(rom_size); + + UINT32 i; + + for (i=0; i