From dff08116da71bd3b0adb9f984fbe4c0bbb9fce46 Mon Sep 17 00:00:00 2001
From: mamehaze <140764005+mamehaze@users.noreply.github.com>
Date: Thu, 27 Mar 2025 02:49:09 +0000
Subject: [PATCH] Plug+Play work (1 working, 8 non-working, 2 softlist, minor
research) (#13497)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- added controls to maxheart (game is playable, but shuts down into power saving after 15 minutes as if no buttons had been pressed) [David Haywood]
- started researching the banking scheme used by atgame40, while several games are now bootable the others appear to use video modes specific to this Genesis clone SoC so fail to display proper gameplay [David Haywood]
new WORKING machines
------------
Millennium Arcade 3D 15-in-1 [TeamEurope, David Haywood]
new NOT WORKING machines
------------
TV Games Baseball (SH6578 hardware) [Ankos, Kryzsiobal]
Chāo Jí Zhī Shi Dà Fù Wēng (vol. 1) [Ankos, Kryzsiobal]
Chāo Jí Zhī Shi Dà Fù Wēng (vol. 2) [Ankos, Kryzsiobal]
My Arcade Tetris (Slurpee) [Sean Riddle]
My Arcade Tetris (DGUNL-7030, Gamer V, with 220 bonus games) [Sean Riddle]
My Arcade Tetris (DGUNL-7027, Pico Player, with 100+ bonus games) [Sean Riddle]
My Arcade All Star Stadium - Pocket Player (307-in-1) [TeamEurope]
Hippo: et la formidable aventure des lettres (France) [TeamEurope, David Haywood]
new NOT WORKING software list entries
--------------
tvgogo.xml:
Snowboarding (Europe) [TeamEurope, David Haywood]
Paintball (Europe) [TeamEurope, David Haywood]
---
hash/tvgogo.xml | 39 ++++--
src/mame/mame.lst | 9 ++
src/mame/nintendo/nes_sh6578.cpp | 43 +++++-
src/mame/nintendo/nes_vt09.cpp | 10 +-
src/mame/nintendo/nes_vt32.cpp | 18 +++
src/mame/nintendo/nes_vt32_soc.cpp | 36 ++++-
src/mame/nintendo/nes_vt32_soc.h | 2 +-
src/mame/nintendo/nes_vt369_vtunknown.cpp | 9 ++
src/mame/sega/megadriv_rad.cpp | 157 ++++++++++++++++++++--
src/mame/tvgames/spg2xx_lexibook.cpp | 7 +
src/mame/tvgames/xavix.cpp | 13 +-
src/mame/tvgames/xavix_2002.cpp | 13 +-
12 files changed, 323 insertions(+), 33 deletions(-)
diff --git a/hash/tvgogo.xml b/hash/tvgogo.xml
index 952da5aefe6..2243ac9ba07 100644
--- a/hash/tvgogo.xml
+++ b/hash/tvgogo.xml
@@ -7,14 +7,15 @@ license:CC0-1.0
Dumped | Dumped | Name |Notes
_(EU)__|__(US)__|____________|_____________________________________
- Y* | Y | 4 in 1 |No controller
- Y | Y | Whac-A-Mole|Hammer-shaped IR motion controller
- Y | Y | Basketball |Ball-shaped motion controller
- Y | | Tennis |Racquet-shaped IR motion controller
- | Y | Dodgeball |Motion controller
- | Y | Baseball |Baseball Bat shaped motion controller
- | | Paintball |Gun controller
- | | Skateboard |Skateboard-shaped motion controller
+ Y* | Y | 4 in 1 |No controller
+ Y | Y | Whac-A-Mole |Hammer-shaped IR motion controller
+ Y | Y | Basketball |Ball-shaped motion controller
+ Y | | Tennis |Racquet-shaped IR motion controller
+ | Y | Dodgeball |Motion controller
+ | Y | Baseball |Baseball Bat shaped motion controller
+ Y | | Paintball |Gun controller
+ Y | | Snowboarding |Snowboard-shaped motion controller
+ | | Skateboard |Skateboard-shaped motion controller
The US carts do not appear to have a language selection screen
@@ -127,4 +128,26 @@ _(EU)__|__(US)__|____________|_____________________________________
+
+ Snowboarding (Europe)
+ 2005
+ Toyquest
+
+
+
+
+
+
+
+
+ Paintball (Europe)
+ 2005
+ Toyquest
+
+
+
+
+
+
+
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index e823052d558..c33b96ab4e4 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -34994,8 +34994,11 @@ nesm8b
m82
@source:nintendo/nes_sh6578.cpp
+6578cjz1
+6578cjz2
bandgpad
bandggcn
+bb6578
cpatrolm
dancmix3
ts_handy11
@@ -35090,6 +35093,7 @@ cybar120
dturbogt
jl2050
joypad65
+matetsl
msiwwe
msiwwea
msidd
@@ -35115,7 +35119,9 @@ dgun2573a
dgunl3201
dgunl3202
fcpocket
+matet220
matet300
+myaass
rminitv
@source:nintendo/nes_vt369_vtunknown.cpp
@@ -35151,6 +35157,7 @@ lxcmcysp
lxcmcysw
lxcyber
matet10
+matet100
mc_cb280
mc_hh210
mog_m320
@@ -46386,6 +46393,7 @@ tvtchspd
tvtchsb
@source:tvgames/spg2xx_lexibook.cpp
+arcade3d
lexizeus
lexiseal
discpal
@@ -46557,6 +46565,7 @@ gungunad
gungunrv
has_wamg
hikara
+hippofr
isinger
jarajal
jpopira
diff --git a/src/mame/nintendo/nes_sh6578.cpp b/src/mame/nintendo/nes_sh6578.cpp
index 386068cc6d5..8ae9c2c874a 100644
--- a/src/mame/nintendo/nes_sh6578.cpp
+++ b/src/mame/nintendo/nes_sh6578.cpp
@@ -59,6 +59,7 @@ protected:
virtual void video_start() override ATTR_COLD;
virtual void io_w(uint8_t data);
+ virtual uint8_t extio_r();
virtual void extio_w(uint8_t data);
bool m_isbanked;
required_memory_bank m_bank;
@@ -164,6 +165,18 @@ protected:
virtual void machine_reset() override ATTR_COLD;
};
+class nes_sh6578_cjz_state : public nes_sh6578_state
+{
+public:
+ nes_sh6578_cjz_state(const machine_config& mconfig, device_type type, const char* tag) :
+ nes_sh6578_state(mconfig, type, tag)
+ { }
+
+protected:
+ // TODO, work out the I/O and anything else specific to this machine
+ virtual uint8_t extio_r() override { return machine().rand(); }
+};
+
uint8_t nes_sh6578_state::bank_r(int bank, uint16_t offset)
{
uint32_t address;
@@ -428,6 +441,12 @@ void nes_sh6578_abl_wikid_state::io_w(uint8_t data)
}
}
+uint8_t nes_sh6578_state::extio_r()
+{
+ logerror("%s: extio_r\n", machine().describe_context());
+ return 0x00;
+}
+
void nes_sh6578_state::extio_w(uint8_t data)
{
logerror("%s: extio_w : %02x\n", machine().describe_context(), data);
@@ -476,7 +495,7 @@ void nes_sh6578_state::nes_sh6578_map(address_map& map)
//4023 read/write joystick,mouse control
//4024 read - mouse port / write - mouse baud
//4025 write - Printer Port
- map(0x4026, 0x4026).w(FUNC(nes_sh6578_state::extio_w));
+ map(0x4026, 0x4026).rw(FUNC(nes_sh6578_state::extio_r), FUNC(nes_sh6578_state::extio_w));
//4027 read/write - DAC data register
map(0x4031, 0x4031).w(FUNC(nes_sh6578_state::initial_startup_w));
@@ -666,6 +685,21 @@ ROM_START( cpatrolm )
ROM_LOAD( "citypatrolman.bin", 0x00000, 0x100000, CRC(4b139c67) SHA1(a5b03f472a94ee879f58bbff201b671fbf4f1ea1) )
ROM_END
+ROM_START( bb6578 )
+ ROM_REGION( 0x80000, "maincpu", 0 )
+ ROM_LOAD( "tv game baseball.bin", 0x00000, 0x80000, CRC(dec862b2) SHA1(fb3d97ccde17ab6ead8eafb4e0aafb72fbb6674c) )
+ROM_END
+
+ROM_START( 6578cjz1 )
+ ROM_REGION( 0x100000, "maincpu", 0 )
+ ROM_LOAD( "tv game1.bin", 0x00000, 0x100000, CRC(161c4119) SHA1(b2ce91b070bcaba73c8a23e7067fe8ba41151a40) )
+ROM_END
+
+ROM_START( 6578cjz2 )
+ ROM_REGION( 0x100000, "maincpu", 0 )
+ ROM_LOAD( "tv game2.bin", 0x00000, 0x100000, CRC(cda1395c) SHA1(b0fdf1d3ebd9b7138ec907a0acdf0ea2d275c990) )
+ROM_END
+
ROM_START( ablwikid )
ROM_REGION( 0x200000, "maincpu", 0 )
ROM_LOAD( "mx29f1610atc.u2", 0x00000, 0x200000, CRC(f16abf79) SHA1(aeccbb40d7fdd451ba8e5cca20464da2cf116461) )
@@ -744,6 +778,13 @@ CONS( 1997, bandggcn, 0, 0, nes_sh6578, nes_sh6578, nes_sh6578_state, i
CONS( 200?, cpatrolm, 0, 0, nes_sh6578_pal, nes_sh6578, nes_sh6578_state, init_nes_sh6578, "TimeTop", "City Patrolman", MACHINE_NOT_WORKING )
+CONS( 200?, bb6578, 0, 0, nes_sh6578, nes_sh6578, nes_sh6578_state, init_nes_sh6578, "DaiDaiXing Electronics", "TV Games Baseball (SH6578 hardware)", MACHINE_NOT_WORKING )
+
+// these don't boot much further than the timetop logo and a splash screen
+// "Super Knowledge Monopoly" is an English translation of the title
+CONS( 200?, 6578cjz1, 0, 0, nes_sh6578, nes_sh6578, nes_sh6578_cjz_state, init_nes_sh6578, "TimeTop", u8"Chāo Jí Zhī Shi Dà Fù Wēng (vol. 1)", MACHINE_NOT_WORKING )
+CONS( 200?, 6578cjz2, 6578cjz1, 0, nes_sh6578, nes_sh6578, nes_sh6578_cjz_state, init_nes_sh6578, "TimeTop", u8"Chāo Jí Zhī Shi Dà Fù Wēng (vol. 2)", MACHINE_NOT_WORKING )
+
// Super Moto 3 https://youtu.be/DR5Y_r6C_qk - has JungleTac copyrights intact, and appears to have the SH6578 versions of the games
// Handy Max 15-in-1 https://youtu.be/jQTUHj1cP-k - has JungleTac copyrights intact, and appears to have the SH6578 versions of the games
diff --git a/src/mame/nintendo/nes_vt09.cpp b/src/mame/nintendo/nes_vt09.cpp
index 93009cd91cd..4d31e3b884c 100644
--- a/src/mame/nintendo/nes_vt09.cpp
+++ b/src/mame/nintendo/nes_vt09.cpp
@@ -542,6 +542,10 @@ ROM_START( wfmotor )
ROM_LOAD( "motorcycle.bin", 0x00000, 0x400000, CRC(978f12f0) SHA1(a0230cfe4398d3971d487ff5d4b7107341799424) )
ROM_END
+ROM_START( matetsl )
+ ROM_REGION( 0x100000, "mainrom", 0 )
+ ROM_LOAD( "slurpeetetris_p25q40sh_856013.bin", 0x00000, 0x80300, CRC(d3b68de8) SHA1(97bcdfcd31bc536b626f9a369afe18de60a399da) )
+ROM_END
} // anonymous namespace
@@ -589,6 +593,8 @@ CONS( 2006, vgtablet, 0, 0, nes_vt09_4mb_rasterhack, nes_vt09, nes_vt09_state
CONS( 200?, jl2050, 0, 0, nes_vt09_16mb,nes_vt09, nes_vt09_state, empty_init, "LexiBook / JungleTac / NiceCode", "Cyber Console Center 200-in-1 (JL2050)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
// might be VT369 based, if so, move
-CONS( 2018, rbbrite, 0, 0, nes_vt09_1mb, nes_vt09, nes_vt09_state, empty_init, "Coleco", "Rainbow Brite (mini-arcade)", MACHINE_NOT_WORKING )
+CONS( 2018, rbbrite, 0, 0, nes_vt09_1mb, nes_vt09, nes_vt09_state, empty_init, "Coleco", "Rainbow Brite (mini-arcade)", MACHINE_NOT_WORKING )
-CONS( 200?, timetp25, 0, 0, nes_vt09_cart, nes_vt09, nes_vt09_cart_state, empty_init, "Timetop", "Super Game 25-in-1 (GM-228)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+CONS( 200?, timetp25, 0, 0, nes_vt09_cart, nes_vt09, nes_vt09_cart_state, empty_init, "Timetop", "Super Game 25-in-1 (GM-228)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+
+CONS( 2021, matetsl, 0, 0, nes_vt09_1mb, nes_vt09, nes_vt09_state, empty_init, "dreamGEAR", "My Arcade Tetris (Slurpee)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) // no bonus games on this model
diff --git a/src/mame/nintendo/nes_vt32.cpp b/src/mame/nintendo/nes_vt32.cpp
index ce3066d0002..2ba38ae5169 100644
--- a/src/mame/nintendo/nes_vt32.cpp
+++ b/src/mame/nintendo/nes_vt32.cpp
@@ -361,6 +361,12 @@ ROM_START( dgunl3202 )
ROM_IGNORE(0x100)
ROM_END
+ROM_START( myaass )
+ ROM_REGION( 0x2000000, "mainrom", 0 )
+ ROM_LOAD( "s29gl256.u2", 0x00000, 0x2000000, CRC(71a3298d) SHA1(5a2441ae5a8bf3e5efe9f22843ad2b8ef2df0f40) )
+ROM_END
+
+
ROM_START( fcpocket )
ROM_REGION( 0x8000000, "mainrom", 0 )
ROM_LOAD( "s29gl01gp.bin", 0x00000, 0x8000000, CRC(8703b18a) SHA1(07943443294e80ca93f83181c8bdbf950b87c52f) ) // 2nd half = 0x00 (so 64MByte of content)
@@ -371,6 +377,12 @@ ROM_START( matet300 )
ROM_LOAD( "tetris.bin", 0x00000, 0x2000000, CRC(73cbd40a) SHA1(5996c97cebd6cec42a0ba1fba9517adf1af00098) )
ROM_END
+ROM_START( matet220 )
+ ROM_REGION( 0x2000000, "mainrom", 0 )
+ ROM_LOAD( "gamervtetris_s29gl128n10tfi01_0001227e.bin", 0x00000, 0x1000000, CRC(ac244e56) SHA1(89897f5f65f55a46bf0d6b5ca534ca31c79a0658) )
+ ROM_IGNORE(0x100)
+ROM_END
+
} // anonymous namespace
@@ -387,7 +399,13 @@ CONS( 201?, dgunl3201, 0, 0, nes_vt32_32mb, nes_vt32, nes_vt32_unk_state, empt
CONS( 201?, dgunl3202, 0, 0, nes_vt32_32mb, nes_vt32, nes_vt32_unk_state, empty_init, "dreamGEAR", "My Arcade Data East Classics - Pixel Player (308-in-1) (DGUNL-3202)", MACHINE_NOT_WORKING ) // from a US unit single 32Mbyte bank!
// There was also a 34-in-1 version of the Data East Classics in a mini-cabinet, NOT running on VT hardware, but using proper arcade ROMs, that one is reportedly running an old MAME build on an ARM SoC (although some sources say FBA)
+// many of the games don't work or have scrambled graphics, it writes 0xc0 to vtfp_411e_encryption_state_w in such cases
+CONS( 201?, myaass, 0, 0, nes_vt32_32mb, nes_vt32, nes_vt32_unk_state, empty_init, "dreamGEAR", "My Arcade All Star Stadium - Pocket Player (307-in-1)", MACHINE_NOT_WORKING )
+
CONS( 2021, matet300, 0, 0, nes_vt32_32mb, nes_vt32, nes_vt32_unk_state, empty_init, "dreamGEAR", "My Arcade Tetris (DGUNL-7029, Go Gamer, with 300 bonus games)", MACHINE_NOT_WORKING )
+// some games (eg F22) are scrambled like in myaass
+CONS( 2021, matet220, 0, 0, nes_vt32_32mb, nes_vt32, nes_vt32_unk_state, empty_init, "dreamGEAR", "My Arcade Tetris (DGUNL-7030, Gamer V, with 220 bonus games)", MACHINE_NOT_WORKING )
+
// Use DIP switch to select console or cartridge, as cartridge is fake and just toggles a GPIO
CONS( 2016, fcpocket, 0, 0, nes_vt32_4x16mb, nes_vt32_fp, nes_vt32_unk_state, empty_init, "", "FC Pocket 600 in 1", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has external banking (2x 32mbyte banks)
diff --git a/src/mame/nintendo/nes_vt32_soc.cpp b/src/mame/nintendo/nes_vt32_soc.cpp
index 5bcab4b1c0b..e76effb2b7f 100644
--- a/src/mame/nintendo/nes_vt32_soc.cpp
+++ b/src/mame/nintendo/nes_vt32_soc.cpp
@@ -46,13 +46,39 @@ uint8_t nes_vt32_soc_device::vtfp_4119_r()
return 0x00;
}
-void nes_vt32_soc_device::vtfp_411e_w(uint8_t data)
+void nes_vt32_soc_device::vtfp_411e_encryption_state_w(uint8_t data)
{
- logerror("411e_w %02x\n", data);
+ logerror("%s: vtfp_411e_encryption_state_w %02x\n", machine().describe_context(), data);
if (data == 0x05)
- downcast(*m_maincpu).set_next_scramble(true);
+ {
+ downcast(*m_maincpu).set_next_scramble(true);
+ }
else if (data == 0x00)
- downcast(*m_maincpu).set_next_scramble(false);
+ {
+ downcast(*m_maincpu).set_next_scramble(false);
+ }
+ else if (data == 0xc0)
+ {
+ /* this seems to turn off the code encryption
+ but turns on some kind of PPU data bitswap? myaass uses it on several games
+
+ in VRAM -> should be in VRAM
+ 80 -> 08
+ 40 -> 20
+ 20- > 40
+ 10 -> 01
+ 08 -> 80
+ 04 -> 02
+ 02 -> 04
+ 01 -> 10
+
+ it is unclear if this affects reads from ROM, or directly alters reads or
+ writes involving the VRAM
+
+ */
+
+ downcast(*m_maincpu).set_next_scramble(false);
+ }
}
void nes_vt32_soc_device::vtfp_4a00_w(uint8_t data)
@@ -103,7 +129,7 @@ void nes_vt32_soc_device::nes_vt_fp_map(address_map &map)
map(0x411d, 0x411d).w(FUNC(nes_vt32_soc_device::vtfp_411d_w));
map(0x4119, 0x4119).r(FUNC(nes_vt32_soc_device::vtfp_4119_r));
- map(0x411e, 0x411e).w(FUNC(nes_vt32_soc_device::vtfp_411e_w)); // encryption toggle
+ map(0x411e, 0x411e).w(FUNC(nes_vt32_soc_device::vtfp_411e_encryption_state_w)); // encryption toggle
map(0x412c, 0x412c).w(FUNC(nes_vt32_soc_device::vtfp_412c_extbank_w)); // GPIO
map(0x412d, 0x412d).r(FUNC(nes_vt32_soc_device::vtfp_412d_r)); // GPIO
diff --git a/src/mame/nintendo/nes_vt32_soc.h b/src/mame/nintendo/nes_vt32_soc.h
index e2180767521..18bf25b272c 100644
--- a/src/mame/nintendo/nes_vt32_soc.h
+++ b/src/mame/nintendo/nes_vt32_soc.h
@@ -30,7 +30,7 @@ protected:
void nes_vt_fp_map(address_map &map) ATTR_COLD;
uint8_t vtfp_4119_r();
- void vtfp_411e_w(uint8_t data);
+ void vtfp_411e_encryption_state_w(uint8_t data);
void vtfp_412c_extbank_w(uint8_t data);
uint8_t vtfp_412d_r();
void vtfp_4242_w(uint8_t data);
diff --git a/src/mame/nintendo/nes_vt369_vtunknown.cpp b/src/mame/nintendo/nes_vt369_vtunknown.cpp
index 5405f6217bf..265ef113607 100644
--- a/src/mame/nintendo/nes_vt369_vtunknown.cpp
+++ b/src/mame/nintendo/nes_vt369_vtunknown.cpp
@@ -938,6 +938,12 @@ ROM_START( matet10 )
ROM_IGNORE(0x300)
ROM_END
+ROM_START( matet100 )
+ ROM_REGION( 0x2000000, "mainrom", 0 )
+ ROM_LOAD( "picotetris_s29gl064n90tfi04_0001227e.bin", 0x00000, 0x800000, CRC(7d9296f2) SHA1(0db5883028d14783d0abff1f7672e59534b0e513) )
+ ROM_IGNORE(0x100)
+ROM_END
+
void nes_vt369_vtunknown_state::init_lxcmcypp()
{
int size = memregion("mainrom")->bytes()/2;
@@ -1129,3 +1135,6 @@ CONS( 2021, unk128vt, 0, 0, nes_vt369_vtunknown_unk_4mb, nes_vt369_vtu
// uses a low res display like the above
CONS( 2021, matet10, 0, 0, nes_vt369_vtunknown_unk_2mb, nes_vt369_vtunknown, nes_vt369_vtunknown_unk_state, empty_init, "dreamGEAR", "My Arcade Tetris (DGUNL-7083, Pixel Pocket, with 10 bonus games)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
+
+// unknown tech level, scrambled opcodes
+CONS( 2021, matet100, 0, 0, nes_vt369_vtunknown_hh_8mb, nes_vt369_vtunknown, nes_vt369_vtunknown_unk_state, empty_init, "dreamGEAR", "My Arcade Tetris (DGUNL-7027, Pico Player, with 100+ bonus games)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) // box says 100+ bonus games
diff --git a/src/mame/sega/megadriv_rad.cpp b/src/mame/sega/megadriv_rad.cpp
index 5f3990726d5..493b04c5a27 100644
--- a/src/mame/sega/megadriv_rad.cpp
+++ b/src/mame/sega/megadriv_rad.cpp
@@ -36,21 +36,21 @@ public:
{ }
protected:
- uint16_t read(offs_t offset);
+ virtual uint16_t read(offs_t offset);
uint16_t read_a13(offs_t offset);
- void megadriv_radica_map(address_map &map) ATTR_COLD;
+ virtual void megadriv_radica_map(address_map &map) ATTR_COLD;
void radica_base_map(address_map &map) ATTR_COLD;
int m_bank;
int m_romsize;
-private:
required_region_ptr m_rom;
};
+
class megadriv_radica_state : public megadriv_radica_state_base
{
public:
@@ -69,6 +69,28 @@ protected:
virtual void machine_reset() override ATTR_COLD;
};
+class megadriv_b010xx_select_state : public megadriv_radica_state
+{
+public:
+ megadriv_b010xx_select_state(const machine_config& mconfig, device_type type, const char* tag) :
+ megadriv_radica_state(mconfig, type, tag)
+ { }
+ void init_atgame40();
+
+private:
+ virtual void machine_reset() override ATTR_COLD;
+
+ virtual uint16_t read(offs_t offset) override;
+
+ virtual void megadriv_radica_map(address_map &map) override ATTR_COLD;
+
+ void bank_high_w(offs_t offset, uint16_t data, uint16_t mem_mask);
+ void bank_low_w(offs_t offset, uint16_t data, uint16_t mem_mask);
+ void bank_upper_w(offs_t offset, uint16_t data, uint16_t mem_mask);
+
+ void b01036_w(offs_t offset, uint16_t data, uint16_t mem_mask);
+};
+
class megadriv_dgunl_state : public megadriv_radica_state
{
@@ -91,7 +113,7 @@ private:
uint16_t read_a16302(offs_t offset, uint16_t mem_mask);
virtual void write_a1630a(offs_t offset, uint16_t data, uint16_t mem_mask);
- void megadriv_dgunl_map(address_map &map) ATTR_COLD;
+ virtual void megadriv_radica_map(address_map &map) override ATTR_COLD;
};
@@ -333,8 +355,55 @@ void megadriv_ra145_state::write_a1630a(offs_t offset, uint16_t data, uint16_t m
m_bank = m_bank / 0x10000;
}
+uint16_t megadriv_b010xx_select_state::read(offs_t offset)
+{
+ return m_rom[((m_bank >> 1) + offset) & (m_romsize - 1)];
+}
-void megadriv_dgunl_state::megadriv_dgunl_map(address_map &map)
+void megadriv_b010xx_select_state::bank_high_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+{
+ data &= 0x7f;
+ mem_mask &= 0x7f;
+
+ m_bank = (m_bank & 0xff80ffff) | (data & mem_mask) << 16;
+ logerror("%s: bank_high_w bank is now %08x\n", machine().describe_context(), m_bank);
+}
+
+void megadriv_b010xx_select_state::bank_low_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+{
+ m_bank = (m_bank & 0xffff0000) | (data & mem_mask);
+ logerror("%s: bank_low_w bank is now %08x\n", machine().describe_context(), m_bank);
+}
+
+void megadriv_b010xx_select_state::bank_upper_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+{
+ // this is handled differently to the other writes, probably some external logic
+ // rather than the same banking
+ // written before bank_high and bank_low
+ m_bank |= 0x800000;
+ logerror("%s: bank_upper_w (%04x %04x) bank is now %08x\n", machine().describe_context(), data, mem_mask, m_bank);
+}
+
+void megadriv_b010xx_select_state::b01036_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+{
+ // all games in atgame40 that fail to display anything write 0x0001 here
+ // could be coincidence, but could also be enabling the alt display mode?
+ logerror("%s: b01036_w %04x %04x (for games with no display?)\n", machine().describe_context(), data, mem_mask);
+}
+
+void megadriv_b010xx_select_state::megadriv_radica_map(address_map &map)
+{
+ radica_base_map(map);
+
+ map(0xa10104, 0xa10105).w(FUNC(megadriv_b010xx_select_state::bank_upper_w)); // read and written
+
+ map(0xb01028, 0xb01029).w(FUNC(megadriv_b010xx_select_state::bank_low_w));
+ map(0xb0102a, 0xb0102b).w(FUNC(megadriv_b010xx_select_state::bank_high_w));
+
+ map(0xb01036, 0xb01037).w(FUNC(megadriv_b010xx_select_state::b01036_w));
+}
+
+void megadriv_dgunl_state::megadriv_radica_map(address_map &map)
{
radica_base_map(map);
@@ -458,6 +527,11 @@ void megadriv_radica_state::machine_reset()
megadriv_radica_state_base::machine_reset();
}
+void megadriv_b010xx_select_state::machine_reset()
+{
+ m_bank = 0;
+ megadriv_radica_state_base::machine_reset();
+}
void megadriv_radica_state::megadriv_radica_3button_ntsc(machine_config &config)
{
@@ -502,7 +576,7 @@ void megadriv_dgunl_state::megadriv_dgunl_ntsc(machine_config &config)
ctrl1_3button(config);
ctrl2_3button(config);
- m_maincpu->set_addrmap(AS_PROGRAM, &megadriv_dgunl_state::megadriv_dgunl_map);
+ m_maincpu->set_addrmap(AS_PROGRAM, &megadriv_dgunl_state::megadriv_radica_map);
}
void megadriv_ra145_state::megadriv_ra145_ntsc(machine_config &config)
@@ -623,13 +697,59 @@ ROM_START( matet )
ROM_IGNORE(0x100)
ROM_END
+/*
+
+As the atgame40 is not running on standard MegaDrive hardware quite a few of these games rely
+on an unsupported video mode (they still play sounds and resond to inputs / do colour fades)
+
+00 Menu located at 00800000 WORKS
+--
+01 Air Hockey located at 0000c800 WORKS
+02 Black Sheep located at 0002935a BOOTS - NO DISPLAY
+03 Bomber located at 000b6f5a WORKS
+04 Bottle Taps Race located at 000d6f5a WORKS
+05 Brain Switch located at 000ec760 BOOTS - NO DISPLAY
+06 Bulls and Cows located at 00800000 BOOTS - NO DISPLAY
+07 Cannon located at 0013e360 WORKS
+08 Checker located at 0016301e WORKS
+09 Chess located at 001aa232 WORKS
+10 Colour Puzzle located at 001f0a32 BOOTS - NO DISPLAY
+11 Cross The Road located at 008a2800 BOOTS - NO DISPLAY
+12 Curling 2010 located at 00953486 BOOTS - NO DISPLAY
+13 Fight or Lose located at 009f002e WORKS
+14 Fire Fly Glow located at 00a09ede BOOTS - NO DISPLAY
+15 Fish Story located at 00aa2ede BOOTS - NO DISPLAY
+16 Flash Memory located at 00285632 BOOTS - NO DISPLAY
+17 Formula Challenge located at 00310232 BOOTS - NO DISPLAY
+18 Hexagons located at 00394a32 WORKS
+19 Jacks Pea located at 003b4a32 BOOTS - NO DISPLAY
+20 Jewel Magic located at 00b4a874 BOOTS - NO DISPLAY
+21 Logic Dial located at 0040b4ac BOOTS - NO DISPLAY
+22 Table Magic located at 00be8f8c BOOTS - NO DISPLAY
+23 Mahjong located at 0049e8ac WORKS
+24 Match Eleven located at 004ae8ac BOOTS - NO DISPLAY
+25 Mega Brain Switch located at 005390ac BOOTS - NO DISPLAY
+26 Memory located at 0058a0ac WORKS
+27 Memory Match located at 00c8538c BOOTS - NO DISPLAY
+28 Mirror Mirror located at 00d2178c BOOTS - NO DISPLAY
+29 Mr Balls located at 0059a0ac WORKS
+30 Navel Power located at 005c0a08 WORKS
+31 Panic Lift located at 00d86f8c BOOTS - NO DISPLAY
+32 Reaction Match located at 00e2038c BOOTS - NO DISPLAY
+33 Snake located at 005dbbd4 WORKS
+34 Space Hunter located at 005ebbd4 BOOTS - NO DISPLAY
+35 Spider located at 006817d4 WORKS
+36 Sudoku Quiz located at 0069efb4 BOOTS - NO DISPLAY
+37 Treasure Hunt located at 00eb9b8c BOOTS - NO DISPLAY
+38 UFO Sighting located at 00f5938c BOOTS - NO DISPLAY
+39 Warehouse Keeper located at 00730fb4 WORKS
+40 Whack a Wolf located at 00740fb4 BOOTS - NO DISPLAY
+*/
ROM_START( atgame40 )
- ROM_REGION( 0x1000000, "rom", 0 )
- ROM_LOAD16_WORD_SWAP( "40bonusgamesin1.bin", 0x000000, 0x1000000, CRC(4eba6e83) SHA1(b8edf1b6ecb70a136b551f1454ba8afa45bd8bc1) )
-
- ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 )
- ROM_COPY( "rom", 0x800000, 0, 0x400000 )
+ ROM_REGION( 0x1000000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "40bonusgamesin1.bin", 0x800000, 0x800000, CRC(4eba6e83) SHA1(b8edf1b6ecb70a136b551f1454ba8afa45bd8bc1) )
+ ROM_CONTINUE(0x000000, 0x800000)
ROM_END
@@ -655,7 +775,11 @@ ROM_START( ra145 )
ROM_LOAD16_WORD_SWAP( "ra145.bin", 0x000000, 0x8000000, BAD_DUMP CRC(30583950) SHA1(855eae232e3830a505f9bc1a26edb3a7d15ce4d1) )
ROM_END
-
+void megadriv_b010xx_select_state::init_atgame40()
+{
+ m_romsize = 0x1000000;
+ init_megadrie();
+}
void megadriv_dgunl_state::init_dgunl3227()
{
@@ -795,14 +919,19 @@ CONS( 2018, msi_sf2, 0, 0, megadriv_radica_6button_ntsc, msi_6button,
CONS( 2018, dgunl3227, 0, 0, megadriv_dgunl_ntsc, dgunl_1player, megadriv_dgunl_state, init_dgunl3227, "dreamGEAR", "My Arcade Pac-Man Pocket Player (DGUNL-3227)", 0 )
CONS( 2018, dgunl3227a, dgunl3227,0, megadriv_dgunl_ntsc, dgunl_1player, megadriv_dgunl_state, init_dgunl3227, "dreamGEAR", "My Arcade Pac-Man Pocket Player (DGUNL-3227, older)", 0 )
-CONS( 2021, matet, 0, 0, megadriv_radica_3button_ntsc, radica_3button, megadriv_radica_state, init_megadriv, "dreamGEAR", "My Arcade Tetris (DGUNL-7028, Pocket Player Pro)", MACHINE_NOT_WORKING)
CONS( 2018, ra145, 0, 0, megadriv_ra145_ntsc, msi_6button, megadriv_ra145_state, init_ra145, "", "Retro Arcade 16 Bits Classic Edition Mini TV Game Console - 145 Classic Games - TV Arcade Plug and Play (Mega Drive bootlegs)", MACHINE_NOT_WORKING )
+
+// Games below have a device at b0102x which appears to either be able to select ROM base on a byte boundary
+// OR maybe are running from RAM instead of ROM (with an auto-copy at the start?) with that being a DMA operation.
+
// Technically this is a MD type cartridge, but it doesn't seem to be designed for use with a standard MD as it contains
// nothing but the 16Mbyte ROM and a 5v to 3.3v converter yet the code clearly requires some extensive banking logic.
// Testing it on a real MD shows nothing, not even the menu.
//
// We don't seem to emulate the system it's designed for, so for now just treat it as its own thing (which may become
// the basis of a driver for that console)
-CONS( 2012, atgame40, 0, 0, megadriv_radica_3button_pal, radica_3button, megadriv_radica_state, init_megadrie, "AtGames", "40 Bonus Games in 1 (AtGames)", MACHINE_NOT_WORKING)
+CONS( 2012, atgame40, 0, 0, megadriv_radica_3button_pal, radica_3button, megadriv_b010xx_select_state, init_atgame40, "AtGames", "40 Bonus Games in 1 (AtGames)", MACHINE_NOT_WORKING)
+
+CONS( 2021, matet, 0, 0, megadriv_radica_3button_ntsc, radica_3button, megadriv_b010xx_select_state, init_megadriv, "dreamGEAR", "My Arcade Tetris (DGUNL-7028, Pocket Player Pro)", MACHINE_NOT_WORKING)
diff --git a/src/mame/tvgames/spg2xx_lexibook.cpp b/src/mame/tvgames/spg2xx_lexibook.cpp
index 22e95d05116..f8cdf5bfafb 100644
--- a/src/mame/tvgames/spg2xx_lexibook.cpp
+++ b/src/mame/tvgames/spg2xx_lexibook.cpp
@@ -343,6 +343,11 @@ ROM_START( lexizeus )
ROM_LOAD16_WORD_SWAP( "lexibook1g900us.bin", 0x0000, 0x800000, CRC(c2370806) SHA1(cbb599c29c09b62b6a9951c724cd9fc496309cf9))
ROM_END
+ROM_START( arcade3d )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "arcade3d.u3", 0x0000, 0x800000, CRC(130843a5) SHA1(f6494a34d162e702121cf71d384a4e57e0113498) )
+ROM_END
+
ROM_START( vsplus )
ROM_REGION( 0x1000000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "vsplus.bin", 0x0000, 0x1000000, CRC(2b13d2cc) SHA1(accae7606d83a313b8ec0232d2d67b63c9c617af) )
@@ -423,6 +428,8 @@ ROM_END
CONS( 200?, lexizeus, 0, 0, lexizeus, lexizeus, spg2xx_lexizeus_game_state, init_zeus, "Lexibook / JungleTac", "Zeus IG900 20-in-1 (US?)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // bad sound and some corrupt bg tilemap entries in Tiger Rescue, verify ROM data (same game runs in Zone 60 without issue)
+CONS( 200?, arcade3d, 0, 0, lexizeus, lexiseal, spg2xx_lexizeus_game_state, init_zeus, "Millennium 2000 GmbH / JungleTac", "Millennium Arcade 3D 15-in-1", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // bad sound and some corrupt bg tilemap entries in Tiger Rescue, verify ROM data (same game runs in Zone 60 without issue)
+
CONS( 200?, vsplus, 0, 0, vsplus, vsplus, spg2xx_vsplus_game_state, init_vsplus, " / JungleTac", "Vs Power Plus 30-in-1", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/tvgames/xavix.cpp b/src/mame/tvgames/xavix.cpp
index 9b36b28177f..ca291e82eff 100644
--- a/src/mame/tvgames/xavix.cpp
+++ b/src/mame/tvgames/xavix.cpp
@@ -42,7 +42,7 @@
Wildest computer robot "Daigander" (Korean version) /TAKARA/Korea - - - - - - -
2001 Ping-pong(Chinese version) /Tenpon/China - - - - - - -
Baseball Korean version /SONOKONG/Korea - - - - - - -
- 1999 ABC Jungle Fun Hippo /VTech/HK, USA, France - - - - - - -
+ 1999 ABC Jungle Fun Hippo VTech/HK (USA and UK versions only, FR is dumped) - - - - - - -
not dumped: no TSOP pads
2003 Beyblade Arcade Challenge 5-in-1 /Hasbro/USA - - - - - - have
@@ -2795,6 +2795,10 @@ ROM_START( tak_beyb )
ROM_LOAD( "beyblade.u2", 0x000000, 0x200000, CRC(bcf6b3a7) SHA1(1c80f1241138b9d7816f1e5285ff8f3c61739c95) )
ROM_END
+ROM_START( hippofr )
+ ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "54-6447-010.u3", 0x000000, 0x200000, CRC(1fb15364) SHA1(ff2bb54f7d6ccd3c83e722599c6f2b213bf35df8) )
+ROM_END
/* XaviX hardware titles (1st Generation)
@@ -2808,6 +2812,13 @@ ROM_END
*/
+// product code 80-32705.
+// Some sites say 1997, but 1999 is what SSD had listed, and seems more fitting.
+// Also exists as
+// 80-32703 Hippo's Alphabet Adventure (UK)
+// 80-32700 ABC Jungle Fun (US?)
+CONS( 1999, hippofr, 0, 0, xavix_2mb, xavix,xavix_state, init_xavix, "VTech", "Hippo: et la formidable aventure des lettres (France)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // needs keyboard emulating
+
// Let's!TVプレイCLASSIC タイトーノスタルジア1
CONS( 2006, taitons1, 0, 0, xavix_i2c_24lc04_2mb, nostalgia,xavix_i2c_state, init_xavix, "Bandai / SSD Company LTD / Taito", "Let's! TV Play Classic - Taito Nostalgia 1 (Japan)", MACHINE_IMPERFECT_SOUND )
diff --git a/src/mame/tvgames/xavix_2002.cpp b/src/mame/tvgames/xavix_2002.cpp
index b0983129dd4..2d18a12f554 100644
--- a/src/mame/tvgames/xavix_2002.cpp
+++ b/src/mame/tvgames/xavix_2002.cpp
@@ -192,6 +192,17 @@ static INPUT_PORTS_START( xavix_i2c )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("i2cmem", FUNC(i2cmem_device::read_sda))
INPUT_PORTS_END
+static INPUT_PORTS_START( maxheart )
+ PORT_INCLUDE(xavix_i2c)
+
+ PORT_MODIFY("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_16WAY
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_16WAY
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_16WAY
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_16WAY
+INPUT_PORTS_END
static INPUT_PORTS_START( epo_tfit )
PORT_INCLUDE(xavix)
@@ -912,7 +923,7 @@ CONS( 2004, epo_tfit, 0, 0, superxavix_i2c_24c04_4mb, epo_tfit, superxavix_
CONS( 2010, epo_rgfj, 0, 0, superxavix_i2c_24c08, xavix_i2c, superxavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Ishikawa Ryou Excite Golf (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
// Let's!TVプレイ ふたりはプリキュアMaxHeart マットでダンス MaxHeartにおどっちゃおう
-CONS( 2004, maxheart, 0, 0, superxavix_i2c_24c04_4mb, xavix_i2c, superxavix_i2c_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Futari wa PreCure MaxHeart Mat de Dance MaxHeart ni Odotchaou (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+CONS( 2004, maxheart, 0, 0, superxavix_i2c_24c04_4mb, maxheart, superxavix_i2c_state, init_xavix, "Bandai / SSD Company LTD", "Let's! TV Play Futari wa PreCure MaxHeart Mat de Dance MaxHeart ni Odotchaou (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
// どこでもドラえもん 日本旅行ゲームDX体感!どこドラグランプリ!
CONS( 2004, epo_doka, 0, 0, xavix2002_4mb, xavix, superxavix_state, init_epo_doka, "Epoch / SSD Company LTD", "Doko Demo Doraemon Nihon Ryokou Game DX Taikan! Doko Dora Grand Prix! (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )