extrema.cpp: added preliminary decryption for the rest of the sets

This commit is contained in:
Ivan Vangelista 2021-01-20 22:08:26 +01:00
parent 42a36976f1
commit d29a48b4e9
2 changed files with 199 additions and 36 deletions

View File

@ -15,13 +15,13 @@
TODO:
driver level: everything, just a skeleton for now;
maski: convert image to CHD;
blpearl, grancan, exsafar, maski: need decryption and splitting of the alternate versions;
adults, bloto, extrmth, extrmti, luckshel, strlink and clones: verify if decryption is complete.
all games: verify if decryption is complete;
Some notes on the encryption:
Every game needs a base XOR. Depending on single address bits other XORs are applied.
In all decrypted games the sum of the address bits dependent XORs is always 0xff.
It doesn't appear the encryption utilizes data or address line bitswaps.
All versions of the same game appear to use the same encryption.
*/
#include "emu.h"
@ -42,9 +42,13 @@ public:
void init_adults();
void init_bloto();
void init_blpearl();
void init_exsafar();
void init_extrmth();
void init_extrmti();
void init_grancan();
void init_luckshel();
void init_maski();
void init_strlink();
private:
@ -79,23 +83,37 @@ void extrema_state::extrema(machine_config &config)
}
#define MISSING_DISK \
DISK_REGION( "ata:0:hdd:image" ) \
DISK_IMAGE( "extrema_hdd", 0, NO_DUMP )
ROM_START( maski )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "maskishow_sys_v.42.05.bin", 0x0000, 0x068000, CRC(211e6e34) SHA1(e7b5b2724de2c93c1a61bbb09646204d3e33d975) )
ROM_REGION( 0x100000, "altrevs", 0 ) // alt revisions - split later
ROM_LOAD( "maskishow_sys_v.42.11.bin", 0x0000, 0x068000, CRC(e21b817c) SHA1(2f951c37e617d3b5bc127735069d0e13f27e002a) )
ROM_LOAD( "maski show_sys_v43.07.bin", 0x0000, 0x070000, CRC(4f4b6b05) SHA1(e1b46bf4f40e5ba92d53b9efee426a9700597537) )
ROM_LOAD( "maski show_sys_v43.09.bin", 0x0000, 0x070000, CRC(d0862569) SHA1(e5eb8fcf60ed02d5c9090841e1f859d431ff1138) )
ROM_END
ROM_START( maskia )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "maski show_sys_v43.07.bin", 0x0000, 0x070000, CRC(4f4b6b05) SHA1(e1b46bf4f40e5ba92d53b9efee426a9700597537) )
MISSING_DISK
ROM_END
ROM_START( maskib )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "maskishow_sys_v.42.11.bin", 0x0000, 0x068000, CRC(e21b817c) SHA1(2f951c37e617d3b5bc127735069d0e13f27e002a) )
MISSING_DISK
ROM_END
ROM_START( maskic )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "maskishow_sys_v.42.05.bin", 0x0000, 0x068000, CRC(211e6e34) SHA1(e7b5b2724de2c93c1a61bbb09646204d3e33d975) )
ROM_REGION( 0x2000000, "drive", 0 ) // HDD? (if so convert to CHD)
ROM_LOAD( "maski show 42.05.whx", 0x0000, 0x18bd8dd, CRC(e4c6b921) SHA1(c1349a5d5b6ca457696fbeef7027e75a96f91c37) )
ROM_END
#define MISSING_DISK \
DISK_REGION( "ata:0:hdd:image" ) \
DISK_IMAGE( "extrema_hdd", 0, NO_DUMP )
ROM_START( adults )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "aov43_23.bin", 0x0000, 0x080000, CRC(25eb34ab) SHA1(d92391809764fc2bf4336b81b1f3f2e6d9bcd811) )
@ -126,27 +144,67 @@ ROM_END
ROM_START( blpearl )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "blpearl_sys_42.01.bin", 0x0000, 0x058000, CRC(6e3b3eda) SHA1(7cda7dd7ed487c8fe80967934fe444c80c368768) )
ROM_REGION( 0x100000, "altrevs", 0 ) // alt revisions - split later
ROM_LOAD( "blpearl_sys_42.03.bin", 0x0000, 0x058000, CRC(758bde12) SHA1(adfc4193edc6e0b71b16b20083a9b0635862ef8a) )
ROM_LOAD( "blpearl_sys_45.02.bin", 0x0000, 0x058000, CRC(00e9b39d) SHA1(d2bd7175fef041106b50f52ce71361ccd127ce6c) )
ROM_LOAD( "black pearl_v43.04.bin", 0x0000, 0x058000, CRC(e7c20ff5) SHA1(ef6b63cfe8f1f3a50942f397c5c15e0640e39942) )
MISSING_DISK
ROM_END
ROM_START( blpearla )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "black pearl_v43.07.bin", 0x0000, 0x058000, CRC(6d839184) SHA1(94586b29b35e443c120524ff91cf353c221f30ee) )
MISSING_DISK
ROM_END
ROM_START( blpearlb )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "black pearl_v43.04.bin", 0x0000, 0x058000, CRC(e7c20ff5) SHA1(ef6b63cfe8f1f3a50942f397c5c15e0640e39942) )
MISSING_DISK
ROM_END
ROM_START( blpearlc )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "blpearl_sys_42.03.bin", 0x0000, 0x058000, CRC(758bde12) SHA1(adfc4193edc6e0b71b16b20083a9b0635862ef8a) )
MISSING_DISK
ROM_END
ROM_START( blpearld )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "blpearl_sys_42.01.bin", 0x0000, 0x058000, CRC(6e3b3eda) SHA1(7cda7dd7ed487c8fe80967934fe444c80c368768) )
MISSING_DISK
ROM_END
ROM_START( grancan )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "grand canyon_sys_43.05.bin", 0x0000, 0x068000, CRC(bdf5426b) SHA1(3f7853482c12dd96f7ab67aac8799fdbcf2757b9) )
ROM_REGION( 0x100000, "altrevs", 0 ) // alt revisions - split later
ROM_LOAD( "grand canyon_sys_43.09.bin", 0x0000, 0x068000, CRC(9d27dc85) SHA1(5dce3ab40399a32b2cb7f07fa3d0cc621f3287d9) )
ROM_LOAD( "grcanyon_sys_42.06.bin", 0x0000, 0x068000, CRC(6591e970) SHA1(69d8d8bb074b9a30593072f13e8ab6e0722e2aa3) )
MISSING_DISK
ROM_END
ROM_START( grancana )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "grand canyon_sys_43.05.bin", 0x0000, 0x068000, CRC(bdf5426b) SHA1(3f7853482c12dd96f7ab67aac8799fdbcf2757b9) )
MISSING_DISK
ROM_END
ROM_START( grancanb )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "grcanyon_sys_42.13.bin", 0x0000, 0x068000, CRC(46f4562d) SHA1(01d3d1d3f0d1c3d5bf8f3c87da81ab5ba8356322) )
MISSING_DISK
ROM_END
ROM_START( grancanc )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "grcanyon_sys_42.06.bin", 0x0000, 0x068000, CRC(6591e970) SHA1(69d8d8bb074b9a30593072f13e8ab6e0722e2aa3) )
MISSING_DISK
ROM_END
ROM_START( luckshel )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "luckyshell_v.42.25.bin", 0x0000, 0x068000, CRC(0e89e575) SHA1(60af8390106db28301a24340cd4e79ea8b8bfb5c) )
@ -163,15 +221,32 @@ ROM_END
ROM_START( exsafar )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "safari_sys_v.42.04.bin", 0x0000, 0x070000, CRC(c4fbcd52) SHA1(0e40194909cd9dad49a597df2f2d793c72535544) )
ROM_REGION( 0x100000, "altrevs", 0 ) // alt revisions - split later
ROM_LOAD( "safari_sys_v.42.07.bin", 0x0000, 0x070000, CRC(d4d02370) SHA1(69ca8d074fc2a7a64012cb3db6c82e91ae8ed56f) )
ROM_LOAD( "safari_sys_v43.08.bin", 0x0000, 0x070000, CRC(2a35ab64) SHA1(288624f9bedc57f5229f3d88677b0f2bf141c857) )
ROM_LOAD( "safari_sys_v43.14.bin", 0x0000, 0x070000, CRC(61def527) SHA1(4b60f8c2c5845ece23244f41d5a71d6c6093b19c) )
MISSING_DISK
ROM_END
ROM_START( exsafara )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "safari_sys_v43.08.bin", 0x0000, 0x070000, CRC(2a35ab64) SHA1(288624f9bedc57f5229f3d88677b0f2bf141c857) )
MISSING_DISK
ROM_END
ROM_START( exsafarb )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "safari_sys_v.42.07.bin", 0x0000, 0x070000, CRC(d4d02370) SHA1(69ca8d074fc2a7a64012cb3db6c82e91ae8ed56f) )
MISSING_DISK
ROM_END
ROM_START( exsafarc )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "safari_sys_v.42.04.bin", 0x0000, 0x070000, CRC(c4fbcd52) SHA1(0e40194909cd9dad49a597df2f2d793c72535544) )
MISSING_DISK
ROM_END
ROM_START( strlink )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "strong link_43.48.bin", 0x0000, 0x058000, CRC(fed4610e) SHA1(dd43765c1db9a86b46c56db6f5de4ddf7eb7b5f4) )
@ -238,6 +313,38 @@ void extrema_state::init_bloto()
}
}
void extrema_state::init_blpearl()
{
uint8_t *rom = memregion("maincpu")->base();
for (int i = 0; i < 0x58000; i++)
{
rom[i] ^= 0xb5;
if (BIT(i, 5)) rom[i] ^= 0x01;
if (BIT(i, 6)) rom[i] ^= 0x48;
if (BIT(i, 10)) rom[i] ^= 0x02;
if (BIT(i, 11)) rom[i] ^= 0x90;
if (BIT(i, 13)) rom[i] ^= 0x24;
}
}
void extrema_state::init_exsafar()
{
uint8_t *rom = memregion("maincpu")->base();
for (int i = 0; i < 0x70000; i++)
{
rom[i] ^= 0x41;
if (BIT(i, 0)) rom[i] ^= 0x06;
if (BIT(i, 1)) rom[i] ^= 0x01;
if (BIT(i, 2)) rom[i] ^= 0x80;
if (BIT(i, 4)) rom[i] ^= 0x10;
if (BIT(i, 5)) rom[i] ^= 0x40;
if (BIT(i, 8)) rom[i] ^= 0x08;
if (BIT(i, 10)) rom[i] ^= 0x20;
}
}
void extrema_state::init_extrmth()
{
uint8_t *rom = memregion("maincpu")->base();
@ -272,6 +379,21 @@ void extrema_state::init_extrmti()
}
}
void extrema_state::init_grancan()
{
uint8_t *rom = memregion("maincpu")->base();
for (int i = 0; i < 0x68000; i++)
{
rom[i] ^= 0x25;
if (BIT(i, 2)) rom[i] ^= 0x12;
if (BIT(i, 4)) rom[i] ^= 0x48;
if (BIT(i, 5)) rom[i] ^= 0x01;
if (BIT(i, 9)) rom[i] ^= 0x24;
if (BIT(i, 10)) rom[i] ^= 0x80;
}
}
void extrema_state::init_luckshel()
{
uint8_t *rom = memregion("maincpu")->base();
@ -288,6 +410,21 @@ void extrema_state::init_luckshel()
}
}
void extrema_state::init_maski()
{
uint8_t *rom = memregion("maincpu")->base();
for (int i = 0; i < 0x70000; i++)
{
rom[i] ^= 0xb6;
if (BIT(i, 5)) rom[i] ^= 0x20;
if (BIT(i, 6)) rom[i] ^= 0x09;
if (BIT(i, 10)) rom[i] ^= 0x40;
if (BIT(i, 11)) rom[i] ^= 0x12;
if (BIT(i, 13)) rom[i] ^= 0x84;
}
}
void extrema_state::init_strlink()
{
uint8_t *rom = memregion("maincpu")->base();
@ -307,16 +444,29 @@ void extrema_state::init_strlink()
} // Anonymous namespace
GAME( 200?, maski, 0, extrema, extrema, extrema_state, empty_init, ROT0, "Extrema", "Maski Show (Ukraina)", MACHINE_IS_SKELETON )
GAME( 2003, maski, 0, extrema, extrema, extrema_state, init_maski, ROT0, "Extrema", "Maski Show (Ukraina V. 43.10)", MACHINE_IS_SKELETON )
GAME( 2003, maskia, maski, extrema, extrema, extrema_state, init_maski, ROT0, "Extrema", "Maski Show (Ukraina V. 43.07)", MACHINE_IS_SKELETON )
GAME( 2003, maskib, maski, extrema, extrema, extrema_state, init_maski, ROT0, "Extrema", "Maski Show (Ukraina V. 42.11)", MACHINE_IS_SKELETON )
GAME( 2003, maskic, maski, extrema, extrema, extrema_state, init_maski, ROT0, "Extrema", "Maski Show (Ukraina V. 42.05)", MACHINE_IS_SKELETON )
GAME( 2003, adults, 0, extrema, extrema, extrema_state, init_adults, ROT0, "Extrema", "Adults Only (Ukraina, V. 43.23)", MACHINE_IS_SKELETON )
GAME( 2003, adultsa, adults, extrema, extrema, extrema_state, init_adults, ROT0, "Extrema", "Adults Only (Ukraina, V. 43.17)", MACHINE_IS_SKELETON )
GAME( 200?, bloto, 0, extrema, extrema, extrema_state, init_bloto, ROT0, "Extrema", "Blits Loto (Ukraina, V. 30.16)", MACHINE_IS_SKELETON )
GAME( 200?, blotoa, bloto, extrema, extrema, extrema_state, init_bloto, ROT0, "Extrema", "Blits Loto (Ukraina, V. 30.08)", MACHINE_IS_SKELETON )
GAME( 200?, blpearl, 0, extrema, extrema, extrema_state, empty_init, ROT0, "Extrema", "Black Pearl (Ukraina)", MACHINE_IS_SKELETON )
GAME( 200?, grancan, 0, extrema, extrema, extrema_state, empty_init, ROT0, "Extrema", "Grand Canyon (Ukraina)", MACHINE_IS_SKELETON )
GAME( 2003, blpearl, 0, extrema, extrema, extrema_state, init_blpearl, ROT0, "Extrema", "Black Pearl (Ukraina, V. 45.02)", MACHINE_IS_SKELETON )
GAME( 2003, blpearla, blpearl, extrema, extrema, extrema_state, init_blpearl, ROT0, "Extrema", "Black Pearl (Ukraina, V. 43.07)", MACHINE_IS_SKELETON )
GAME( 2003, blpearlb, blpearl, extrema, extrema, extrema_state, init_blpearl, ROT0, "Extrema", "Black Pearl (Ukraina, V. 43.04)", MACHINE_IS_SKELETON )
GAME( 2003, blpearlc, blpearl, extrema, extrema, extrema_state, init_blpearl, ROT0, "Extrema", "Black Pearl (Ukraina, V. 42.03)", MACHINE_IS_SKELETON )
GAME( 2003, blpearld, blpearl, extrema, extrema, extrema_state, init_blpearl, ROT0, "Extrema", "Black Pearl (Ukraina, V. 42.01)", MACHINE_IS_SKELETON )
GAME( 2003, grancan, 0, extrema, extrema, extrema_state, init_grancan, ROT0, "Extrema", "Grand Canyon (Ukraina, V.43.09)", MACHINE_IS_SKELETON )
GAME( 2003, grancana, grancan, extrema, extrema, extrema_state, init_grancan, ROT0, "Extrema", "Grand Canyon (Ukraina, V.43.05)", MACHINE_IS_SKELETON )
GAME( 2003, grancanb, grancan, extrema, extrema, extrema_state, init_grancan, ROT0, "Extrema", "Grand Canyon (Ukraina, V.42.13)", MACHINE_IS_SKELETON )
GAME( 2003, grancanc, grancan, extrema, extrema, extrema_state, init_grancan, ROT0, "Extrema", "Grand Canyon (Ukraina, V.42.06)", MACHINE_IS_SKELETON )
GAME( 2003, luckshel, 0, extrema, extrema, extrema_state, init_luckshel, ROT0, "Extrema", "Lucky Shell (Ukraina, V. 42.25)", MACHINE_IS_SKELETON )
GAME( 2003, luckshela, luckshel, extrema, extrema, extrema_state, init_luckshel, ROT0, "Extrema", "Lucky Shell (Ukraina, V. 42.10)", MACHINE_IS_SKELETON )
GAME( 200?, exsafar, 0, extrema, extrema, extrema_state, empty_init, ROT0, "Extrema", "Safari (Extrema, Ukraina)", MACHINE_IS_SKELETON )
GAME( 2003, exsafar, 0, extrema, extrema, extrema_state, init_exsafar, ROT0, "Extrema", "Safari (Extrema, Ukraina, V. 43.14)", MACHINE_IS_SKELETON )
GAME( 2003, exsafara, exsafar, extrema, extrema, extrema_state, init_exsafar, ROT0, "Extrema", "Safari (Extrema, Ukraina, V. 43.08)", MACHINE_IS_SKELETON )
GAME( 2003, exsafarb, exsafar, extrema, extrema, extrema_state, init_exsafar, ROT0, "Extrema", "Safari (Extrema, Ukraina, V. 42.07)", MACHINE_IS_SKELETON )
GAME( 2003, exsafarc, exsafar, extrema, extrema, extrema_state, init_exsafar, ROT0, "Extrema", "Safari (Extrema, Ukraina, V. 42.04)", MACHINE_IS_SKELETON )
GAME( 2004, strlink, 0, extrema, extrema, extrema_state, init_strlink, ROT0, "Extrema", "Strong Link (Ukraina, V. 43.48)", MACHINE_IS_SKELETON )
GAME( 2004, strlinka, strlink, extrema, extrema, extrema_state, init_strlink, ROT0, "Extrema", "Strong Link (Ukraina, V. 43.45)", MACHINE_IS_SKELETON )
GAME( 200?, extrmth, 0, extrema, extrema, extrema_state, init_extrmth, ROT0, "Extrema", "Treasure Hunt (Extrema, Ukraina, V. 34.03)", MACHINE_IS_SKELETON ) // other string has it as 3.4.03

View File

@ -13485,20 +13485,33 @@ wexpressb3 // bootleg
exterm // (c) 1989 Premier Technology - a Gottlieb game
@source:extrema.cpp
adults // Adults Only (Russia)
adults // Adults Only (Ukraine)
adultsa //
bloto // Blits Loto (Russia)
bloto // Blits Loto (Ukraine)
blotoa //
blpearl // Black Pearl (Russia)
exsafar // Safari (Russia)
extrmth // Treasure Hunt (Russia)
blpearl // Black Pearl (Ukraine)
blpearla //
blpearlb //
blpearlc //
blpearld //
exsafar // Safari (Ukraine)
exsafara //
exsafarb //
exsafarc //
extrmth // Treasure Hunt (Ukraine)
extrmtha //
extrmti // Treasure Island (Russia)
grancan // Grand Canyon (Russia)
luckshel // Lucky Shell (Russia)
extrmti // Treasure Island (Ukraine)
grancan // Grand Canyon (Ukraine)
grancana //
grancanb //
grancanc //
luckshel // Lucky Shell (Ukraine)
luckshela //
maski // Maski Show (Russia)
strlink // Strong Link (Russia)
maski // Maski Show (Ukraine)
maskia //
maskib //
maskic //
strlink // Strong Link (Ukraine)
strlinka //
@source:exzisus.cpp