extrema.cpp: added preliminary decryption for adults, extrmth, extrmti, luckshel, strlink

This commit is contained in:
Ivan Vangelista 2021-01-20 18:05:30 +01:00
parent 4a62556183
commit 2a73c3e642
2 changed files with 166 additions and 42 deletions

View File

@ -1,15 +1,27 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
/* Extrema Russian Video Fruit Machines */
/*
Appear to be Z80 based, some rom scramble?
Maski Show has what appears to be a HDD image in 'WHX' (WinHex Backup) format - convert it to CHD
/*
Extrema Ukrainian video fruit machines
The games appear to be Z80 based. ROMs are scrambled.
Maski Show has what appears to be a HDD image in 'WHX' (WinHex Backup) format
Other games don't seem to have such images, missing.
Roms are strange sizes, they appear to be cut at the end of the last block of data, some sets contain
roms padded to normal sizes.
ROMs are strange sizes, they appear to be cut at the end of the last block of data. Some sets contain
ROMs padded to normal sizes.
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.
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.
*/
#include "emu.h"
@ -28,7 +40,12 @@ public:
void extrema(machine_config &config);
void init_adults();
void init_bloto();
void init_extrmth();
void init_extrmti();
void init_luckshel();
void init_strlink();
private:
required_device<cpu_device> m_maincpu;
@ -37,15 +54,12 @@ private:
};
void extrema_state::extrema_map(address_map &map)
{
map(0x0000, 0x7fff).rom().region("maincpu", 0);
map(0xe000, 0xefff).ram();
}
void extrema_state::extrema_portmap(address_map &map)
{
map.global_mask(0xff);
@ -58,14 +72,13 @@ INPUT_PORTS_END
void extrema_state::extrema(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 6000000);
// basic machine hardware
Z80(config, m_maincpu, 6000000); // guessed clock
m_maincpu->set_addrmap(AS_PROGRAM, &extrema_state::extrema_map);
m_maincpu->set_addrmap(AS_IO, &extrema_state::extrema_portmap);
}
ROM_START( maski )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "maskishow_sys_v.42.05.bin", 0x0000, 0x068000, CRC(211e6e34) SHA1(e7b5b2724de2c93c1a61bbb09646204d3e33d975) )
@ -85,22 +98,32 @@ ROM_END
ROM_START( adults )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "adult only_4317rus.bin", 0x0000, 0x068000, CRC(fecb5f82) SHA1(5f90391a5307edf1957432ea14fd468f33ad6a6b) )
ROM_REGION( 0x100000, "altrevs", 0 ) // alt revisions - split later
ROM_LOAD( "aov43_23.bin", 0x0000, 0x080000, CRC(25eb34ab) SHA1(d92391809764fc2bf4336b81b1f3f2e6d9bcd811) )
MISSING_DISK
ROM_END
ROM_START( adultsa )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "adult only_4317rus.bin", 0x0000, 0x068000, CRC(fecb5f82) SHA1(5f90391a5307edf1957432ea14fd468f33ad6a6b) )
MISSING_DISK
ROM_END
ROM_START( bloto )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "bloto_3008.bin", 0x0000, 0x020000, CRC(dcd46ab5) SHA1(b4817d6e6db6096e8fe2dd3ebad5657c3e72fe9a) )
ROM_REGION( 0x100000, "altrevs", 0 ) // alt revisions - split later
ROM_LOAD( "bloto_3016.bin", 0x0000, 0x020000, CRC(05731d21) SHA1(a12816d79d465649fd3da5ad341caf67831ada65) )
MISSING_DISK
ROM_END
ROM_START( blotoa )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "bloto_3008.bin", 0x0000, 0x020000, CRC(dcd46ab5) SHA1(b4817d6e6db6096e8fe2dd3ebad5657c3e72fe9a) )
MISSING_DISK
ROM_END
ROM_START( blpearl )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "blpearl_sys_42.01.bin", 0x0000, 0x058000, CRC(6e3b3eda) SHA1(7cda7dd7ed487c8fe80967934fe444c80c368768) )
@ -113,7 +136,6 @@ ROM_START( blpearl )
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) )
@ -127,13 +149,18 @@ ROM_END
ROM_START( luckshel )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "luckyshell_v.42.10.bin", 0x0000, 0x068000, CRC(dc8d3d45) SHA1(7a6659f6ed5f0d162f394ed80c39c0cff915ab41) )
ROM_REGION( 0x100000, "altrevs", 0 ) // alt revisions - split later
ROM_LOAD( "luckyshell_v.42.25.bin", 0x0000, 0x068000, CRC(0e89e575) SHA1(60af8390106db28301a24340cd4e79ea8b8bfb5c) )
MISSING_DISK
ROM_END
ROM_START( luckshela )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "luckyshell_v.42.10.bin", 0x0000, 0x068000, CRC(dc8d3d45) SHA1(7a6659f6ed5f0d162f394ed80c39c0cff915ab41) )
MISSING_DISK
ROM_END
ROM_START( exsafar )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "safari_sys_v.42.04.bin", 0x0000, 0x070000, CRC(c4fbcd52) SHA1(0e40194909cd9dad49a597df2f2d793c72535544) )
@ -148,7 +175,12 @@ ROM_END
ROM_START( strlink )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "strong link_43.48.bin", 0x0000, 0x058000, CRC(fed4610e) SHA1(dd43765c1db9a86b46c56db6f5de4ddf7eb7b5f4) )
ROM_REGION( 0x100000, "altrevs", 0 ) // alt revisions - split later
MISSING_DISK
ROM_END
ROM_START( strlinka )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "stronglink_v43.45.bin", 0x0000, 0x058000, CRC(07dcc10b) SHA1(07a99d8ca4ad088177b5593fab49b4bc37a069a4) )
MISSING_DISK
@ -156,13 +188,18 @@ ROM_END
ROM_START( extrmth )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "trhunt_sys_34.02.bin", 0x0000, 0x048000, CRC(961d7011) SHA1(44c527d498061da5d84ed134c16ee7f95ed75376) )
ROM_REGION( 0x100000, "altrevs", 0 ) // alt revisions - split later
ROM_LOAD( "trhunt_sys_34.03.bin", 0x0000, 0x048000, CRC(003639db) SHA1(65d5b530deb424fe575ed51039b7bc4b271423e6) )
MISSING_DISK
ROM_END
ROM_START( extrmtha )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "trhunt_sys_34.02.bin", 0x0000, 0x048000, CRC(961d7011) SHA1(44c527d498061da5d84ed134c16ee7f95ed75376) )
MISSING_DISK
ROM_END
ROM_START( extrmti )
ROM_REGION( 0x100000, "maincpu", 0 )
ROM_LOAD( "tresure island sys v32.49.bin", 0x0000, 0x050000, CRC(73450ee4) SHA1(6b3583461d0aed2d4d6a53d9e18392f94bd7bbd6) )
@ -171,35 +208,117 @@ ROM_START( extrmti )
ROM_END
void extrema_state::init_bloto() // gives good strings for 0x00000-0x0ffff, needs to be checked for 0x10000-0x1ffff. Seem to be 4 0x8000 programs
void extrema_state::init_adults()
{
uint8_t *rom = memregion("maincpu")->base();
for (int i = 0; i < 0x80000; i++)
{
rom[i] ^= 0x92;
if (BIT(i, 2)) rom[i] ^= 0x09;
if (BIT(i, 4)) rom[i] ^= 0x24;
if (BIT(i, 5)) rom[i] ^= 0x80;
if (BIT(i, 9)) rom[i] ^= 0x12;
if (BIT(i, 10)) rom[i] ^= 0x40;
}
}
void extrema_state::init_bloto()
{
uint8_t *rom = memregion("maincpu")->base();
for (int i = 0; i < 0x20000; i++)
{
switch (i & 0x01)
{
case 0x00: rom[i] ^= 0x20; break;
case 0x01: rom[i] ^= 0xe3; break;
}
rom[i] ^= 0x20;
if (BIT(i, 0)) rom[i] ^= 0xc3;
if (BIT(i, 1)) rom[i] ^= 0x20;
if (BIT(i, 2)) rom[i] ^= 0x10;
if (BIT(i, 4)) rom[i] ^= 0x08;
if (BIT(i, 8)) rom[i] ^= 0x04;
}
}
if (i & 0x02) rom[i] ^= 0x20;
if (i & 0x04) rom[i] ^= 0x10;
if (i & 0x10) rom[i] ^= 0x08;
if (i & 0x100) rom[i] ^= 0x04;
void extrema_state::init_extrmth()
{
uint8_t *rom = memregion("maincpu")->base();
for (int i = 0; i < 0x48000; i++)
{
rom[i] ^= 0x57;
if (BIT(i, 5)) rom[i] ^= 0x14;
if (BIT(i, 7)) rom[i] ^= 0x01;
if (BIT(i, 10)) rom[i] ^= 0x28;
if (BIT(i, 11)) rom[i] ^= 0x02;
if (BIT(i, 13)) rom[i] ^= 0x40;
if (BIT(i, 14)) rom[i] ^= 0x80;
}
}
void extrema_state::init_extrmti()
{
uint8_t *rom = memregion("maincpu")->base();
for (int i = 0; i < 0x50000; i++)
{
rom[i] ^= 0x2d;
if (BIT(i, 2)) rom[i] ^= 0x10;
if (BIT(i, 4)) rom[i] ^= 0x40;
if (BIT(i, 5)) rom[i] ^= 0x08;
if (BIT(i, 6)) rom[i] ^= 0x02;
if (BIT(i, 9)) rom[i] ^= 0x20;
if (BIT(i, 10)) rom[i] ^= 0x80;
if (BIT(i, 11)) rom[i] ^= 0x04;
if (BIT(i, 13)) rom[i] ^= 0x01;
}
}
void extrema_state::init_luckshel()
{
uint8_t *rom = memregion("maincpu")->base();
for (int i = 0; i < 0x68000; i++)
{
rom[i] ^= 0x18;
if (BIT(i, 0)) rom[i] ^= 0xe0;
if (BIT(i, 1)) rom[i] ^= 0x10;
if (BIT(i, 3)) rom[i] ^= 0x08;
if (BIT(i, 6)) rom[i] ^= 0x04;
if (BIT(i, 8)) rom[i] ^= 0x01;
if (BIT(i, 12)) rom[i] ^= 0x02;
}
}
void extrema_state::init_strlink()
{
uint8_t *rom = memregion("maincpu")->base();
for (int i = 0; i < 0x58000; i++)
{
rom[i] ^= 0xa2;
if (BIT(i, 1)) rom[i] ^= 0x02;
if (BIT(i, 2)) rom[i] ^= 0x01;
if (BIT(i, 4)) rom[i] ^= 0x08;
if (BIT(i, 5)) rom[i] ^= 0xa0;
if (BIT(i, 8)) rom[i] ^= 0x04;
if (BIT(i, 10)) rom[i] ^= 0x50;
}
}
} // Anonymous namespace
GAME( 200?, maski, 0, extrema, extrema, extrema_state, empty_init, ROT0, "Extrema", "Maski Show (Russia) (Extrema)", MACHINE_IS_SKELETON )
GAME( 200?, adults, 0, extrema, extrema, extrema_state, empty_init, ROT0, "Extrema", "Adults Only (Russia) (Extrema)", MACHINE_IS_SKELETON )
GAME( 200?, bloto, 0, extrema, extrema, extrema_state, init_bloto, ROT0, "Extrema", "Blits Loto (Russia) (Extrema)", MACHINE_IS_SKELETON )
GAME( 200?, blpearl, 0, extrema, extrema, extrema_state, empty_init, ROT0, "Extrema", "Black Pearl (Russia) (Extrema)", MACHINE_IS_SKELETON )
GAME( 200?, grancan, 0, extrema, extrema, extrema_state, empty_init, ROT0, "Extrema", "Grand Canyon (Russia) (Extrema)", MACHINE_IS_SKELETON )
GAME( 200?, luckshel, 0, extrema, extrema, extrema_state, empty_init, ROT0, "Extrema", "Lucky Shell (Russia) (Extrema)", MACHINE_IS_SKELETON )
GAME( 200?, exsafar, 0, extrema, extrema, extrema_state, empty_init, ROT0, "Extrema", "Safari (Russia) (Extrema)", MACHINE_IS_SKELETON )
GAME( 200?, strlink, 0, extrema, extrema, extrema_state, empty_init, ROT0, "Extrema", "Strong Link (Russia) (Extrema)", MACHINE_IS_SKELETON )
GAME( 200?, extrmth, 0, extrema, extrema, extrema_state, empty_init, ROT0, "Extrema", "Treasure Hunt (Russia) (Extrema)", MACHINE_IS_SKELETON )
GAME( 200?, extrmti, 0, extrema, extrema, extrema_state, empty_init, ROT0, "Extrema", "Treasure Island (Russia) (Extrema)", MACHINE_IS_SKELETON )
GAME( 200?, maski, 0, extrema, extrema, extrema_state, empty_init, ROT0, "Extrema", "Maski Show (Ukraina)", 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, 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( 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
GAME( 200?, extrmtha, extrmth, extrema, extrema, extrema_state, init_extrmth, ROT0, "Extrema", "Treasure Hunt (Extrema, Ukraina, V. 34.02)", MACHINE_IS_SKELETON ) // other string has it as 3.4.02
GAME( 200?, extrmti, 0, extrema, extrema, extrema_state, init_extrmti, ROT0, "Extrema", "Treasure Island (Extrema, Ukraina, V. 32.49)", MACHINE_IS_SKELETON ) // other string has it as 3.2.49

View File

@ -13486,15 +13486,20 @@ exterm // (c) 1989 Premier Technology - a Gottlieb game
@source:extrema.cpp
adults // Adults Only (Russia)
adultsa //
bloto // Blits Loto (Russia)
blotoa //
blpearl // Black Pearl (Russia)
exsafar // Safari (Russia)
extrmth // Treasure Hunt (Russia)
extrmtha //
extrmti // Treasure Island (Russia)
grancan // Grand Canyon (Russia)
luckshel // Lucky Shell (Russia)
luckshela //
maski // Maski Show (Russia)
strlink // Strong Link (Russia)
strlinka //
@source:exzisus.cpp
exzisus // B12 (c) 1987 Taito Corporation (Japan)