diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mame/drivers/extrema.cpp | 203 | ||||
-rw-r--r-- | src/mame/mame.lst | 5 |
2 files changed, 166 insertions, 42 deletions
diff --git a/src/mame/drivers/extrema.cpp b/src/mame/drivers/extrema.cpp index 2e5b8ab0281..042c8698605 100644 --- a/src/mame/drivers/extrema.cpp +++ b/src/mame/drivers/extrema.cpp @@ -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? + 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 - convert it to CHD + 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; - } - - if (i & 0x02) rom[i] ^= 0x20; - if (i & 0x04) rom[i] ^= 0x10; - if (i & 0x10) rom[i] ^= 0x08; - if (i & 0x100) rom[i] ^= 0x04; + 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_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 diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 3bec4e8c53a..3e2fd42afc6 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -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) |