summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/misc/extrema.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/misc/extrema.cpp')
-rw-r--r--src/mame/misc/extrema.cpp474
1 files changed, 474 insertions, 0 deletions
diff --git a/src/mame/misc/extrema.cpp b/src/mame/misc/extrema.cpp
new file mode 100644
index 00000000000..09e16cb2f22
--- /dev/null
+++ b/src/mame/misc/extrema.cpp
@@ -0,0 +1,474 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+/*
+ 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.
+
+ TODO:
+ driver level: everything, just a skeleton for now;
+ maski: convert image to CHD;
+ 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"
+#include "cpu/z80/z80.h"
+
+
+namespace {
+
+class extrema_state : public driver_device
+{
+public:
+ extrema_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ { }
+
+ void extrema(machine_config &config);
+
+ 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:
+ required_device<cpu_device> m_maincpu;
+ void extrema_map(address_map &map) ATTR_COLD;
+ void extrema_portmap(address_map &map) ATTR_COLD;
+};
+
+
+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);
+}
+
+
+static INPUT_PORTS_START( extrema )
+INPUT_PORTS_END
+
+
+void extrema_state::extrema(machine_config &config)
+{
+ // 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);
+}
+
+
+#define MISSING_DISK \
+ DISK_REGION( "ata:0:hdd" ) \
+ DISK_IMAGE( "extrema_hdd", 0, NO_DUMP )
+
+ROM_START( maski )
+ ROM_REGION( 0x100000, "maincpu", 0 )
+ 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
+
+ROM_START( adults )
+ ROM_REGION( 0x100000, "maincpu", 0 )
+ 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_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_45.02.bin", 0x0000, 0x058000, CRC(00e9b39d) SHA1(d2bd7175fef041106b50f52ce71361ccd127ce6c) )
+
+ 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.09.bin", 0x0000, 0x068000, CRC(9d27dc85) SHA1(5dce3ab40399a32b2cb7f07fa3d0cc621f3287d9) )
+
+ 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) )
+
+ 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_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) )
+
+ 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
+ROM_END
+
+ROM_START( extrmth )
+ ROM_REGION( 0x100000, "maincpu", 0 )
+ 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) )
+
+ MISSING_DISK
+ROM_END
+
+
+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++)
+ {
+ 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;
+ }
+}
+
+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();
+
+ 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_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();
+
+ 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_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();
+
+ 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( 2003, maski, 0, extrema, extrema, extrema_state, init_maski, ROT0, "Extrema", "Maski Show (Ukraine V. 43.10)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2003, maskia, maski, extrema, extrema, extrema_state, init_maski, ROT0, "Extrema", "Maski Show (Ukraine V. 43.07)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2003, maskib, maski, extrema, extrema, extrema_state, init_maski, ROT0, "Extrema", "Maski Show (Ukraine V. 42.11)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2003, maskic, maski, extrema, extrema, extrema_state, init_maski, ROT0, "Extrema", "Maski Show (Ukraine V. 42.05)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2003, adults, 0, extrema, extrema, extrema_state, init_adults, ROT0, "Extrema", "Adults Only (Ukraine, V. 43.23)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2003, adultsa, adults, extrema, extrema, extrema_state, init_adults, ROT0, "Extrema", "Adults Only (Ukraine, V. 43.17)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 200?, bloto, 0, extrema, extrema, extrema_state, init_bloto, ROT0, "Extrema", "Blits Loto (Ukraine, V. 30.16)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 200?, blotoa, bloto, extrema, extrema, extrema_state, init_bloto, ROT0, "Extrema", "Blits Loto (Ukraine, V. 30.08)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2003, blpearl, 0, extrema, extrema, extrema_state, init_blpearl, ROT0, "Extrema", "Black Pearl (Ukraine, V. 45.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2003, blpearla, blpearl, extrema, extrema, extrema_state, init_blpearl, ROT0, "Extrema", "Black Pearl (Ukraine, V. 43.07)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2003, blpearlb, blpearl, extrema, extrema, extrema_state, init_blpearl, ROT0, "Extrema", "Black Pearl (Ukraine, V. 43.04)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2003, blpearlc, blpearl, extrema, extrema, extrema_state, init_blpearl, ROT0, "Extrema", "Black Pearl (Ukraine, V. 42.03)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2003, blpearld, blpearl, extrema, extrema, extrema_state, init_blpearl, ROT0, "Extrema", "Black Pearl (Ukraine, V. 42.01)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2003, grancan, 0, extrema, extrema, extrema_state, init_grancan, ROT0, "Extrema", "Grand Canyon (Ukraine, V. 43.09)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2003, grancana, grancan, extrema, extrema, extrema_state, init_grancan, ROT0, "Extrema", "Grand Canyon (Ukraine, V. 43.05)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2003, grancanb, grancan, extrema, extrema, extrema_state, init_grancan, ROT0, "Extrema", "Grand Canyon (Ukraine, V. 42.13)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2003, grancanc, grancan, extrema, extrema, extrema_state, init_grancan, ROT0, "Extrema", "Grand Canyon (Ukraine, V. 42.06)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2003, luckshel, 0, extrema, extrema, extrema_state, init_luckshel, ROT0, "Extrema", "Lucky Shell (Ukraine, V. 42.25)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2003, luckshela, luckshel, extrema, extrema, extrema_state, init_luckshel, ROT0, "Extrema", "Lucky Shell (Ukraine, V. 42.10)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2003, exsafar, 0, extrema, extrema, extrema_state, init_exsafar, ROT0, "Extrema", "Safari (Extrema, Ukraine, V. 43.14)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2003, exsafara, exsafar, extrema, extrema, extrema_state, init_exsafar, ROT0, "Extrema", "Safari (Extrema, Ukraine, V. 43.08)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2003, exsafarb, exsafar, extrema, extrema, extrema_state, init_exsafar, ROT0, "Extrema", "Safari (Extrema, Ukraine, V. 42.07)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2003, exsafarc, exsafar, extrema, extrema, extrema_state, init_exsafar, ROT0, "Extrema", "Safari (Extrema, Ukraine, V. 42.04)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2004, strlink, 0, extrema, extrema, extrema_state, init_strlink, ROT0, "Extrema", "Strong Link (Ukraine, V. 43.48)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 2004, strlinka, strlink, extrema, extrema, extrema_state, init_strlink, ROT0, "Extrema", "Strong Link (Ukraine, V. 43.45)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+GAME( 200?, extrmth, 0, extrema, extrema, extrema_state, init_extrmth, ROT0, "Extrema", "Treasure Hunt (Extrema, Ukraine, V. 34.03)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) // other string has it as 3.4.03
+GAME( 200?, extrmtha, extrmth, extrema, extrema, extrema_state, init_extrmth, ROT0, "Extrema", "Treasure Hunt (Extrema, Ukraine, V. 34.02)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) // other string has it as 3.4.02
+GAME( 200?, extrmti, 0, extrema, extrema, extrema_state, init_extrmti, ROT0, "Extrema", "Treasure Island (Extrema, Ukraine, V. 32.49)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) // other string has it as 3.2.49