From f3fde82da421c3d1904111b4c432b5899a98bbb6 Mon Sep 17 00:00:00 2001 From: DavidHaywood <28625134+DavidHaywood@users.noreply.github.com> Date: Tue, 22 Jan 2019 19:59:37 +0000 Subject: [PATCH 01/16] new NOT WORKING ---- Doraemon Computer Megaphone (Japan) [Sean Riddle, Peter Wilhelmsen] --- src/mame/drivers/xavix.cpp | 21 ++++++++++++++++----- src/mame/includes/xavix.h | 1 + src/mame/machine/xavix.cpp | 3 ++- src/mame/mame.lst | 1 + 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp index 036e943d2a6..f83bd6c6ae5 100644 --- a/src/mame/drivers/xavix.cpp +++ b/src/mame/drivers/xavix.cpp @@ -1017,7 +1017,6 @@ void xavix_state::xavix(machine_config &config) m_sound->add_route(1, "rspeaker", 1.0); } - void xavix_i2c_state::xavix_i2c_24lc02(machine_config &config) { xavix(config); @@ -1025,6 +1024,12 @@ void xavix_i2c_state::xavix_i2c_24lc02(machine_config &config) I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x100); // 24LC02 (taiko) } +void xavix_i2c_state::xavix_i2c_24c02(machine_config &config) +{ + xavix(config); + + I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x100); // 24C02 +} void xavix_i2c_state::xavix_i2c_24lc04(machine_config &config) { @@ -1317,6 +1322,10 @@ ROM_START( epo_guru ) ROM_LOAD("gururinworld.bin", 0x000000, 0x400000, CRC(e5ae4523) SHA1(0e39ef8f94203d34e49422081667805f50a339a1) ) ROM_END +ROM_START( epo_dmon ) // Doraemon has a phototransistor, microphone and 24LC02, PCB says XaviX 2002 + ROM_REGION(0x400000, "bios", ROMREGION_ERASE00) + ROM_LOAD("doraemon.bin", 0x000000, 0x400000, CRC(d8f5412f) SHA1(11a4c017ed400f7aa585be744d9693efe734c192) ) +ROM_END ROM_START( rad_rh ) ROM_REGION(0x200000, "bios", ROMREGION_ERASE00) @@ -1445,6 +1454,8 @@ CONS( 200?, epo_efdx, 0, 0, xavix_i2c_24c08, epo_efdx, xavix_i2c_sta CONS( 2005, epo_guru, 0, 0, xavix, xavix, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Gururin World (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2002, epo_dmon, 0, 0, xavix_i2c_24c02, xavix, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Doraemon Computer Megaphone (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // full / proper title? + CONS( 200?, has_wamg, 0, 0, xavix, xavix, xavix_state, init_xavix, "Hasbro / Milton Bradley / SSD Company LTD", "TV Wild Adventure Mini Golf (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) @@ -1455,9 +1466,9 @@ CONS( 200?, has_wamg, 0, 0, xavix, xavix, xavix_state, CONS( 2000, ekara, 0, 0, xavix_cart_ekara, ekara, xavix_ekara_state, init_xavix, "Takara / SSD Company LTD / Hasbro", "e-kara (US?, NTSC, set 1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND /*| MACHINE_IS_BIOS_ROOT*/ ) // shows "Please insert a cartridge before turn it on" without cart CONS( 2000, ekaraa, ekara, 0, xavix_cart_ekara, ekara, xavix_ekara_state, init_xavix, "Takara / SSD Company LTD / Hasbro", "e-kara (US?, NTSC, set 2)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND /*| MACHINE_IS_BIOS_ROOT*/ ) // shows "Please insert a cartridge before turning on e-kara" without cart CONS( 2000, ekaraj, ekara, 0, xavix_cart_ekara, ekara, xavix_ekara_state, init_xavix, "Takara / SSD Company LTD", "e-kara (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND /*| MACHINE_IS_BIOS_ROOT*/ ) // shows Japanese message without cart +CONS( 2002, ekarag, ekara, 0, xavix_cart_ekara, ekara, xavix_ekara_state, init_xavix, "Takara / SSD Company LTD", "e-kara (Germany?, includes 3 songs)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND /*| MACHINE_IS_BIOS_ROOT*/ ) // found in Germany, could just be a Europe-wide model tho?, NOT a headset model, but still has 3 songs. // the 'e-kara pro headset' has 3 songs built in for the US release. The Japanese release of this appears to be called 'e-kara H.S.' and it is unclear if it also has built in songs. The Canadian box says 'cartridge contains' instead of 'songs included' but is likely a printing error. -CONS( 2002, ekaraphs, 0, 0, xavix_cart_ekara, ekara, xavix_ekara_state, init_xavix, "Takara / SSD Company LTD", "e-kara Pro Headset (US, includes 3 songs)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND /*| MACHINE_IS_BIOS_ROOT*/ ) -CONS( 2002, ekarag, ekaraphs, 0, xavix_cart_ekara, ekara, xavix_ekara_state, init_xavix, "Takara / SSD Company LTD", "e-kara (Germany?, includes 3 songs)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND /*| MACHINE_IS_BIOS_ROOT*/ ) // found in Germany, could just be a Europe-wide model tho?, verify if regular or headset type +CONS( 2002, ekaraphs, ekara, 0, xavix_cart_ekara, ekara, xavix_ekara_state, init_xavix, "Takara / SSD Company LTD", "e-kara Pro Headset (US, includes 3 songs)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND /*| MACHINE_IS_BIOS_ROOT*/ ) CONS( 2001, ddrfammt, 0, 0, xavix_cart_ddrfammt,ddrfammt, xavix_cart_state, init_xavix, "Takara / Konami / SSD Company LTD", "Dance Dance Revolution Family Mat (Japan)", MACHINE_IMPERFECT_SOUND/*|MACHINE_IS_BIOS_ROOT*/ ) @@ -1519,7 +1530,7 @@ CONS( 2003, drgqst, 0, 0, xavix2000_i2c_24c02, xavix , xavix_i2c_lotr_state, /* The 'XaviXPORT' isn't a real console, more of a TV adapter, all the actual hardware (CPU including video hw, sound hw) is in the cartridges and controllers and can vary between games, see notes at top of driver. - The 'Dyomos' console released in France appears to be nearly identical to XaviXPORT + The 'Domyos Interactive System (DiS)' released in France by Decathlon appears to be identical to XaviXPORT (but for PAL regions, and with an entirely different software range) */ ROM_START( xavtenni ) @@ -1548,6 +1559,6 @@ CONS( 2004, xavbaseb, 0, 0, xavix2000_i2c_24c04, xavix, xavix_i2c_state, init_xa // TODO: check SEEPROM type and hookup, banking! CONS( 2005, xavjmat, 0, 0, xavix2000_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "Jackie Chan J-Mat Fitness (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // TODO: does it have an SEEPROM? why does it hang? full title? -CONS( 2005, tmy_thom, 0, 0, xavix2000_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD / Tomy", "Thomas and Friends (Tomy)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, tmy_thom, 0, 0, xavix2000_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "Tomy / SSD Company LTD", "Thomas and Friends (Tomy)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/includes/xavix.h b/src/mame/includes/xavix.h index 7cce8c64683..4597d3f9d63 100644 --- a/src/mame/includes/xavix.h +++ b/src/mame/includes/xavix.h @@ -578,6 +578,7 @@ public: void xavix_i2c_24lc02(machine_config &config); void xavix_i2c_24lc04(machine_config &config); + void xavix_i2c_24c02(machine_config &config); void xavix_i2c_24c08(machine_config &config); void xavix2000_i2c_24c04(machine_config &config); diff --git a/src/mame/machine/xavix.cpp b/src/mame/machine/xavix.cpp index 5f783570354..e7b66de909c 100644 --- a/src/mame/machine/xavix.cpp +++ b/src/mame/machine/xavix.cpp @@ -467,7 +467,8 @@ TIMER_CALLBACK_MEMBER(xavix_state::interrupt_gen) m_screen->update_partial(m_screen->vpos()); } - m_interrupt_timer->adjust(attotime::never, 0); +// m_interrupt_timer->adjust(attotime::never, 0); + m_interrupt_timer->adjust(m_screen->time_until_pos(m_posirq_y[0], m_posirq_x[0]), 0); // epo_dmon expects it to keep firing without being reloaded? check this doesn't break anything else! } diff --git a/src/mame/mame.lst b/src/mame/mame.lst index fe33a50e8c2..6db3a21494d 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -39756,6 +39756,7 @@ epo_epp // epo_efdx // epo_sdb // epo_guru // +epo_dmon // rad_rh // has_wamg // ekara // From b8a750711df98be06e9868e0dbbe7761266f4fa1 Mon Sep 17 00:00:00 2001 From: DavidHaywood <28625134+DavidHaywood@users.noreply.github.com> Date: Tue, 22 Jan 2019 20:18:38 +0000 Subject: [PATCH 02/16] new NOT WORKING --- Domyos Fitness Exercises (Domyos Interactive System) [Sean Riddle, Peter Wilhelmsen] Domyos Fitness Adventure (Domyos Interactive System) [Sean Riddle, Peter Wilhelmsen] Domyos Fitness Adventure looks like it might be an entirely different architecture, we'll see once Sean cleans the CPU die and takes a look. Possibly a 32-bit CPU, haven't managed to identify it as anything I recognize tho. Dump should be valid tho. --- src/mame/drivers/xavix.cpp | 48 ++++++++++++++++++++++++++++++++------ src/mame/mame.lst | 2 ++ 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp index f83bd6c6ae5..6564e686cc0 100644 --- a/src/mame/drivers/xavix.cpp +++ b/src/mame/drivers/xavix.cpp @@ -556,14 +556,14 @@ static INPUT_PORTS_START( taikodp ) PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) INPUT_PORTS_END -/* + static INPUT_PORTS_START( xavixp ) PORT_INCLUDE(xavix) PORT_MODIFY("REGION") // PAL/NTSC flag PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_CUSTOM ) INPUT_PORTS_END -*/ + /* Test mode lists the following @@ -1533,6 +1533,12 @@ CONS( 2003, drgqst, 0, 0, xavix2000_i2c_24c02, xavix , xavix_i2c_lotr_state, The 'Domyos Interactive System (DiS)' released in France by Decathlon appears to be identical to XaviXPORT (but for PAL regions, and with an entirely different software range) */ +ROM_START( tmy_thom ) + ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 ) + ROM_LOAD( "thomastank.bin", 0x000000, 0x800000, CRC(a52a23be) SHA1(e5b3500239d9e56eb5405f7585982959e5a162da) ) +ROM_END + +// XaviXPORT ROM_START( xavtenni ) ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 ) ROM_LOAD( "xavixtennis.bin", 0x000000, 0x800000, CRC(23a1d918) SHA1(2241c59e8ea8328013e55952ebf9060ea0a4675b) ) @@ -1548,17 +1554,45 @@ ROM_START( xavjmat ) ROM_LOAD( "xpjmat.bin", 0x000000, 0x1000000, CRC(71a51eef) SHA1(41fd2c3013d1c86756046ec9174e94400f8fa06d) ) ROM_END -ROM_START( tmy_thom ) - ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 ) - ROM_LOAD( "thomastank.bin", 0x000000, 0x800000, CRC(a52a23be) SHA1(e5b3500239d9e56eb5405f7585982959e5a162da) ) +// Domyos DiS (XaviX 2002 based titles) + +ROM_START( domfitex ) + ROM_REGION( 0x1000000, "bios", ROMREGION_ERASE00 ) + ROM_LOAD( "xpfitnessexercise.bin", 0x000000, 0x1000000, CRC(f1089229) SHA1(803df8ba0a05cb004a4238c6c71ea1ffa4428990) ) ROM_END +// TODO: does it have an SEEPROM? why does it hang? full title? +CONS( 2005, tmy_thom, 0, 0, xavix2000_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "Tomy / SSD Company LTD", "Thomas and Friends (Tomy)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) + CONS( 2004, xavtenni, 0, 0, xavix2000_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Tennis (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) CONS( 2004, xavbaseb, 0, 0, xavix2000_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Baseball (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // TODO: check SEEPROM type and hookup, banking! CONS( 2005, xavjmat, 0, 0, xavix2000_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "Jackie Chan J-Mat Fitness (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -// TODO: does it have an SEEPROM? why does it hang? full title? -CONS( 2005, tmy_thom, 0, 0, xavix2000_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "Tomy / SSD Company LTD", "Thomas and Friends (Tomy)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +// https://arnaudmeyer.wordpress.com/domyos-interactive-system/ +// Domyos Fitness Adventure +// Domyos Fitness Challenge +// Domyos Fitness Exercises +// Domyos Fit Race +// Domyos Soft Fitness +// Domyos Fitness Dance +// Domyos Fitness Play +// Domyos Fitness Training +// Domyos Bike Concept (not listed on site above) + +// Has SEEPROM and an RTC. Exercise has some leftover PC buffer stuff. (TODO, check SEEPROM type, RTC type, banking) +CONS( 200?, domfitex, 0, 0, xavix2000_i2c_24c04, xavixp, xavix_i2c_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Exercises (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) + +// Domyos DiS (unknown hardware, or bad dumps) +// This DOES NOT look like a 6502 based Xavix / Super Xavix! maybe XaviX 2, the cartridges contain the entire system (CPU,Video,Sound,ROM) so that is possible. +// Seems to have 32-bit looking stuff, possible vectors at start? + +ROM_START( domfitad ) + ROM_REGION( 0x1000000, "bios", ROMREGION_ERASE00 ) + ROM_LOAD( "xpfitnessadventure.bin", 0x000000, 0x1000000, CRC(a7917081) SHA1(95ae5dc6e64a78ae060cb0e61d8b0af34a93c4ce) ) +ROM_END + +// Has SEEPROM and an RTC. Adventure has the string DOMYSSDCOLTD a couple of times. +CONS( 2008, domfitad, 0, 0, xavix2000_i2c_24c04, xavixp, xavix_i2c_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Adventure (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 6db3a21494d..fbe4874ea16 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -39775,6 +39775,8 @@ xavtenni // xavbaseb // xavjmat // tmy_thom // +domfitex // +domfitad // @source:xbox.cpp From 205fc516ea07eb453dde2669824334f000511322 Mon Sep 17 00:00:00 2001 From: DavidHaywood <28625134+DavidHaywood@users.noreply.github.com> Date: Tue, 22 Jan 2019 23:02:43 +0000 Subject: [PATCH 03/16] new NOT WORKING Domyos Fitness Challenge (Domyos Interactive System) [Sean Riddle, Peter Wilhelmsen] --- src/mame/drivers/xavix.cpp | 10 ++++++++-- src/mame/mame.lst | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp index 6564e686cc0..5de0f94b0e5 100644 --- a/src/mame/drivers/xavix.cpp +++ b/src/mame/drivers/xavix.cpp @@ -1561,6 +1561,11 @@ ROM_START( domfitex ) ROM_LOAD( "xpfitnessexercise.bin", 0x000000, 0x1000000, CRC(f1089229) SHA1(803df8ba0a05cb004a4238c6c71ea1ffa4428990) ) ROM_END +ROM_START( domfitch ) + ROM_REGION( 0x1000000, "bios", ROMREGION_ERASE00 ) + ROM_LOAD( "xpfitnesschallenge.bin", 0x000000, 0x1000000, CRC(e0a4093d) SHA1(2692ac03f8be4f86a4777ad0c365cbab7b469e3b) ) +ROM_END + // TODO: does it have an SEEPROM? why does it hang? full title? CONS( 2005, tmy_thom, 0, 0, xavix2000_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "Tomy / SSD Company LTD", "Thomas and Friends (Tomy)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) @@ -1582,8 +1587,9 @@ CONS( 2005, xavjmat, 0, 0, xavix2000_i2c_24c04, xavix, xavix_i2c_state, init_xa // Domyos Bike Concept (not listed on site above) -// Has SEEPROM and an RTC. Exercise has some leftover PC buffer stuff. (TODO, check SEEPROM type, RTC type, banking) -CONS( 200?, domfitex, 0, 0, xavix2000_i2c_24c04, xavixp, xavix_i2c_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Exercises (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +// Has SEEPROM and an RTC. Exercise has some leftover PC buffer stuff. (TODO, check SEEPROM type, RTC type, banking) (both Exercises and Challenge are identical PCBs) +CONS( 2008, domfitex, 0, 0, xavix2000_i2c_24c04, xavixp, xavix_i2c_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Exercises (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2008, domfitch, 0, 0, xavix2000_i2c_24c04, xavixp, xavix_i2c_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Challenge (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Domyos DiS (unknown hardware, or bad dumps) // This DOES NOT look like a 6502 based Xavix / Super Xavix! maybe XaviX 2, the cartridges contain the entire system (CPU,Video,Sound,ROM) so that is possible. diff --git a/src/mame/mame.lst b/src/mame/mame.lst index fbe4874ea16..a8a8aefe7e1 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -39776,6 +39776,7 @@ xavbaseb // xavjmat // tmy_thom // domfitex // +domfitch // domfitad // From efc721357cd35bdef3a9daecad87f87a439b4893 Mon Sep 17 00:00:00 2001 From: DavidHaywood <28625134+DavidHaywood@users.noreply.github.com> Date: Wed, 23 Jan 2019 02:13:43 +0000 Subject: [PATCH 04/16] progress (nw) --- src/mame/drivers/xavix.cpp | 26 +++++++++++++++++++----- src/mame/includes/xavix.h | 28 ++++++++++++++++++++++++++ src/mame/machine/xavix.cpp | 41 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 5 deletions(-) diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp index 5de0f94b0e5..a977a57aab2 100644 --- a/src/mame/drivers/xavix.cpp +++ b/src/mame/drivers/xavix.cpp @@ -399,6 +399,10 @@ void xavix_state::superxavix_lowbus_map(address_map &map) map(0x6c00, 0x6cff).ram().w(FUNC(xavix_state::bmp_palram_sh_w)).share("bmp_palram_sh"); map(0x6d00, 0x6dff).ram().w(FUNC(xavix_state::bmp_palram_l_w)).share("bmp_palram_l"); + map(0x7a10, 0x7a12).ram().rw(FUNC(xavix_state::pio_dir_r), FUNC(xavix_state::pio_dir_w)); + map(0x7a20, 0x7a22).ram().rw(FUNC(xavix_state::pio_out_r), FUNC(xavix_state::pio_out_w)); + map(0x7a30, 0x7a32).ram().r(FUNC(xavix_state::pio_in_r)); + map(0x6fb0, 0x6fc7).ram().share("bmp_base"); } @@ -1076,6 +1080,14 @@ void xavix_state::xavix2000(machine_config &config) m_palette->set_entries(512); } +void xavix_i2c_jmat_state::xavix_i2c_jmat(machine_config &config) +{ + xavix2000(config); + + I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x200); // ? +} + + void xavix_state::xavix2000_nv(machine_config &config) { xavix2000(config); @@ -1573,7 +1585,7 @@ CONS( 2004, xavtenni, 0, 0, xavix2000_i2c_24c04, xavix, xavix_i2c_state, init_xa CONS( 2004, xavbaseb, 0, 0, xavix2000_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Baseball (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // TODO: check SEEPROM type and hookup, banking! -CONS( 2005, xavjmat, 0, 0, xavix2000_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "Jackie Chan J-Mat Fitness (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, xavjmat, 0, 0, xavix_i2c_jmat, xavix, xavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "Jackie Chan J-Mat Fitness (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // https://arnaudmeyer.wordpress.com/domyos-interactive-system/ // Domyos Fitness Adventure @@ -1588,12 +1600,12 @@ CONS( 2005, xavjmat, 0, 0, xavix2000_i2c_24c04, xavix, xavix_i2c_state, init_xa // Domyos Bike Concept (not listed on site above) // Has SEEPROM and an RTC. Exercise has some leftover PC buffer stuff. (TODO, check SEEPROM type, RTC type, banking) (both Exercises and Challenge are identical PCBs) -CONS( 2008, domfitex, 0, 0, xavix2000_i2c_24c04, xavixp, xavix_i2c_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Exercises (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -CONS( 2008, domfitch, 0, 0, xavix2000_i2c_24c04, xavixp, xavix_i2c_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Challenge (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2008, domfitex, 0, 0, xavix_i2c_jmat, xavixp, xavix_i2c_jmat_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Exercises (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2008, domfitch, 0, 0, xavix_i2c_jmat, xavixp, xavix_i2c_jmat_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Challenge (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Domyos DiS (unknown hardware, or bad dumps) // This DOES NOT look like a 6502 based Xavix / Super Xavix! maybe XaviX 2, the cartridges contain the entire system (CPU,Video,Sound,ROM) so that is possible. -// Seems to have 32-bit looking stuff, possible vectors at start? +// Seems to have 32-bit looking stuff, possible vectors at start? possible ARM THUMB mode code ROM_START( domfitad ) ROM_REGION( 0x1000000, "bios", ROMREGION_ERASE00 ) @@ -1601,4 +1613,8 @@ ROM_START( domfitad ) ROM_END // Has SEEPROM and an RTC. Adventure has the string DOMYSSDCOLTD a couple of times. -CONS( 2008, domfitad, 0, 0, xavix2000_i2c_24c04, xavixp, xavix_i2c_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Adventure (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2008, domfitad, 0, 0, xavix_i2c_jmat, xavixp, xavix_i2c_jmat_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Adventure (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) + + + + diff --git a/src/mame/includes/xavix.h b/src/mame/includes/xavix.h index 4597d3f9d63..25e97b2d81d 100644 --- a/src/mame/includes/xavix.h +++ b/src/mame/includes/xavix.h @@ -564,6 +564,18 @@ private: required_device m_sound; DECLARE_READ8_MEMBER(sound_regram_read_cb); + +protected: + // additional SuperXaviX / XaviX2002 stuff + uint8_t m_sx_pio_dir[3]; + uint8_t m_sx_pio_out[3]; + + DECLARE_WRITE8_MEMBER(pio_dir_w); + DECLARE_READ8_MEMBER(pio_dir_r); + + virtual DECLARE_WRITE8_MEMBER(pio_out_w); + virtual DECLARE_READ8_MEMBER(pio_out_r); + virtual DECLARE_READ8_MEMBER(pio_in_r); }; class xavix_i2c_state : public xavix_state @@ -601,6 +613,22 @@ private: int hackaddress2; }; +class xavix_i2c_jmat_state : public xavix_state +{ +public: + xavix_i2c_jmat_state(const machine_config &mconfig, device_type type, const char *tag) + : xavix_state(mconfig, type, tag), + m_i2cmem(*this, "i2cmem") + { } + + void xavix_i2c_jmat(machine_config &config); + +private: + + required_device m_i2cmem; +}; + + class xavix_i2c_lotr_state : public xavix_i2c_state { public: diff --git a/src/mame/machine/xavix.cpp b/src/mame/machine/xavix.cpp index e7b66de909c..aefe9612060 100644 --- a/src/mame/machine/xavix.cpp +++ b/src/mame/machine/xavix.cpp @@ -1077,6 +1077,9 @@ void xavix_state::machine_start() save_item(NAME(m_timer_baseval)); save_item(NAME(m_spritereg)); save_item(NAME(m_barrel_params)); + + save_item(NAME(m_sx_pio_dir)); + save_item(NAME(m_sx_pio_out)); } void xavix_state::machine_reset() @@ -1155,6 +1158,13 @@ void xavix_state::machine_reset() m_barrel_params[0] = 0x00; m_barrel_params[1] = 0x00; + // SuperXaviX + for (int i = 0; i < 3; i++) + { + m_sx_pio_dir[i] = 0x00; + m_sx_pio_out[i] = 0x00; + } + } typedef device_delegate xavix_interrupt_vector_delegate; @@ -1182,3 +1192,34 @@ int16_t xavix_state::get_vectors(int which, int half) } +// additional SuperXaviX / XaviX2002 stuff + +WRITE8_MEMBER(xavix_state::pio_dir_w) +{ + LOG("%s: pio_dir_w (port %d) %02x\n", machine().describe_context(), offset, data); + m_sx_pio_dir[offset] = data; +} + +READ8_MEMBER(xavix_state::pio_dir_r) +{ + LOG("%s: pio_dir_r (port %d)\n", machine().describe_context(), offset); + return m_sx_pio_dir[offset]; +} + +WRITE8_MEMBER(xavix_state::pio_out_w) +{ + LOG("%s: pio_out_w (port %d) %02x\n", machine().describe_context(), offset, data); + m_sx_pio_out[offset] = data; +} + +READ8_MEMBER(xavix_state::pio_out_r) +{ + LOG("%s: pio_out_r (port %d)\n", machine().describe_context(), offset); + return m_sx_pio_out[offset]; +} + +READ8_MEMBER(xavix_state::pio_in_r) +{ + LOG("%s: pio_in_r (port %d)\n", machine().describe_context(), offset); + return 0x00; +} From a751f2eead0fd562f9fddb4f3f98277ec534e9e2 Mon Sep 17 00:00:00 2001 From: DavidHaywood <28625134+DavidHaywood@users.noreply.github.com> Date: Wed, 23 Jan 2019 02:32:39 +0000 Subject: [PATCH 05/16] (nw) --- src/mame/drivers/xavix.cpp | 7 +++++++ src/mame/includes/xavix.h | 6 ++++++ src/mame/machine/xavix.cpp | 23 +++++++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp index a977a57aab2..c0c682d0163 100644 --- a/src/mame/drivers/xavix.cpp +++ b/src/mame/drivers/xavix.cpp @@ -399,11 +399,18 @@ void xavix_state::superxavix_lowbus_map(address_map &map) map(0x6c00, 0x6cff).ram().w(FUNC(xavix_state::bmp_palram_sh_w)).share("bmp_palram_sh"); map(0x6d00, 0x6dff).ram().w(FUNC(xavix_state::bmp_palram_l_w)).share("bmp_palram_l"); + // extended external bus stuff (possible banking control?) + map(0x7909, 0x7909).w(FUNC(xavix_state::extended_extbus_reg0_w)); + map(0x790b, 0x790b).w(FUNC(xavix_state::extended_extbus_reg1_w)); + map(0x790d, 0x790d).w(FUNC(xavix_state::extended_extbus_reg2_w)); + map(0x7a10, 0x7a12).ram().rw(FUNC(xavix_state::pio_dir_r), FUNC(xavix_state::pio_dir_w)); map(0x7a20, 0x7a22).ram().rw(FUNC(xavix_state::pio_out_r), FUNC(xavix_state::pio_out_w)); map(0x7a30, 0x7a32).ram().r(FUNC(xavix_state::pio_in_r)); map(0x6fb0, 0x6fc7).ram().share("bmp_base"); + + map(0x7ffd, 0x7ffd).nopw(); // looks like a watchdog? } static INPUT_PORTS_START( xavix ) diff --git a/src/mame/includes/xavix.h b/src/mame/includes/xavix.h index 25e97b2d81d..2bcab562aea 100644 --- a/src/mame/includes/xavix.h +++ b/src/mame/includes/xavix.h @@ -576,6 +576,12 @@ protected: virtual DECLARE_WRITE8_MEMBER(pio_out_w); virtual DECLARE_READ8_MEMBER(pio_out_r); virtual DECLARE_READ8_MEMBER(pio_in_r); + + uint8_t m_sx_extended_extbus[3]; + + DECLARE_WRITE8_MEMBER(extended_extbus_reg0_w); + DECLARE_WRITE8_MEMBER(extended_extbus_reg1_w); + DECLARE_WRITE8_MEMBER(extended_extbus_reg2_w); }; class xavix_i2c_state : public xavix_state diff --git a/src/mame/machine/xavix.cpp b/src/mame/machine/xavix.cpp index aefe9612060..51adb7be722 100644 --- a/src/mame/machine/xavix.cpp +++ b/src/mame/machine/xavix.cpp @@ -1080,6 +1080,7 @@ void xavix_state::machine_start() save_item(NAME(m_sx_pio_dir)); save_item(NAME(m_sx_pio_out)); + save_item(NAME(m_sx_extended_extbus)); } void xavix_state::machine_reset() @@ -1165,6 +1166,10 @@ void xavix_state::machine_reset() m_sx_pio_out[i] = 0x00; } + for (int i = 0; i < 3; i++) + { + m_sx_extended_extbus[i] = 0x00; + } } typedef device_delegate xavix_interrupt_vector_delegate; @@ -1223,3 +1228,21 @@ READ8_MEMBER(xavix_state::pio_in_r) LOG("%s: pio_in_r (port %d)\n", machine().describe_context(), offset); return 0x00; } + +WRITE8_MEMBER(xavix_state::extended_extbus_reg0_w) +{ + LOG("%s: extended_extbus_reg0_w %02x\n", machine().describe_context(), data); + m_sx_extended_extbus[0] = data; +} + +WRITE8_MEMBER(xavix_state::extended_extbus_reg1_w) +{ + LOG("%s: extended_extbus_reg1_w %02x\n", machine().describe_context(), data); + m_sx_extended_extbus[1] = data; +} + +WRITE8_MEMBER(xavix_state::extended_extbus_reg2_w) +{ + LOG("%s: extended_extbus_reg2_w %02x\n", machine().describe_context(), data); + m_sx_extended_extbus[2] = data; +} From 749a131993af40e59229ac3302f3f43d7f16fec7 Mon Sep 17 00:00:00 2001 From: DavidHaywood <28625134+DavidHaywood@users.noreply.github.com> Date: Wed, 23 Jan 2019 12:38:35 +0000 Subject: [PATCH 06/16] unrelated c+p error (nw) --- src/mame/machine/rad_eu3a05gpio.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mame/machine/rad_eu3a05gpio.h b/src/mame/machine/rad_eu3a05gpio.h index b7d55ad2ef4..a46a654d09d 100644 --- a/src/mame/machine/rad_eu3a05gpio.h +++ b/src/mame/machine/rad_eu3a05gpio.h @@ -1,8 +1,8 @@ // license:BSD-3-Clause // copyright-holders:David Haywood -#ifndef MAME_AUDIO_RAD_EU3A05GPIO_H -#define MAME_AUDIO_RAD_EU3A05GPIO_H +#ifndef MAME_MACHINE_RAD_EU3A05GPIO_H +#define MAME_MACHINE_RAD_EU3A05GPIO_H class radica6502_gpio_device : public device_t @@ -40,4 +40,4 @@ private: DECLARE_DEVICE_TYPE(RADICA6502_GPIO, radica6502_gpio_device) -#endif // MAME_AUDIO_RAD_EU3A05GPIO_H +#endif // MAME_MACHINE_RAD_EU3A05GPIO_H From c52b2b78a9ff2ac8ef33b905845c1482b24e5f62 Mon Sep 17 00:00:00 2001 From: DavidHaywood <28625134+DavidHaywood@users.noreply.github.com> Date: Wed, 23 Jan 2019 20:28:55 +0000 Subject: [PATCH 07/16] new NOT WORKING --- XaviX Bass Fishing (XaviXPORT) [Sean Riddle, Peter Wilhelmsen] and refactor a bit --- scripts/target/mame/mess.lua | 2 + src/devices/cpu/m6502/xavix2000.cpp | 99 ++++++------------------ src/devices/cpu/m6502/xavix2000.h | 8 ++ src/mame/drivers/xavix.cpp | 61 +++++++++++---- src/mame/includes/xavix.h | 23 +++--- src/mame/machine/xavix.cpp | 37 --------- src/mame/machine/xavix2002_io.cpp | 115 ++++++++++++++++++++++++++++ src/mame/machine/xavix2002_io.h | 49 ++++++++++++ src/mame/mame.lst | 1 + 9 files changed, 256 insertions(+), 139 deletions(-) create mode 100644 src/mame/machine/xavix2002_io.cpp create mode 100644 src/mame/machine/xavix2002_io.h diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 2b08275346e..472bab12efd 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -3501,6 +3501,8 @@ files { MAME_DIR .. "src/mame/machine/xavix_mtrk_wheel.h", MAME_DIR .. "src/mame/machine/xavix_madfb_ball.cpp", MAME_DIR .. "src/mame/machine/xavix_madfb_ball.h", + MAME_DIR .. "src/mame/machine/xavix2002_io.cpp", + MAME_DIR .. "src/mame/machine/xavix2002_io.h", } createMESSProjects(_target, _subtarget, "ultimachine") diff --git a/src/devices/cpu/m6502/xavix2000.cpp b/src/devices/cpu/m6502/xavix2000.cpp index 0c928ce159d..fdd5b8a2dfb 100644 --- a/src/devices/cpu/m6502/xavix2000.cpp +++ b/src/devices/cpu/m6502/xavix2000.cpp @@ -7,8 +7,8 @@ The dies for these are marked SSD 2000 NEC 85605-621 - and possibly - SSD 2002 NEC 85054-611 (although this might use even more opcodes and need it's own file) + + SSD 2002 NEC 85054-611 6502 with custom opcodes integrated gfx / sound @@ -17,77 +17,12 @@ see xavix.cpp for basic notes - the machines using the '2000' series chips seem to have more extra - opcodes, so presumably these were only available in those models. - of note, push x / push y and pull x / pull y + the 2000 chip has more opcodes than the 97/98 chips in xavix.cpp, and + is a similar die structure to the 2002 chip, but doesn't seem to have any + additional capabilities. - Dirt Rebel MX, which is confirmed as 2000 type however seems to require - some of the documented but 'undocumented' opcodes on the 6502 to have additonal - meaning for one specific function on startup - - this just seems to be some very buggy checksum code where the games don't even care about the result... - (actually it looks like some games might be using it as a PRNG seed?) - - a is 80 when entering here? - - 01BC37: A0 3F ldy #$3f - 01BC39: B2 clr a // clear acculuator - 01BC3A: 1B spa0 a // store 'accumulator' into byte 0 of PA 'address' register - 01BC3B: 9B spa2 a // store 'accumulator' into byte 2 of PA 'address' register - - -- loop point 2 - 01BC3C: 98 tya // y -> a (3f on first run of loop) - 01BC3D: 5B spa1 a // store 'accumulator' into byte 1 of PA 'address' register (003f00 on first loop?) - - -- loop point 1 - 01BC3E: A3 ldal0 a // read byte 0 of 32-bit 'long' register into accumulator - 01BC3F: 73 adcpa // adc ($Address PA) - 01BC40: 83 stal0 a // store accumulator back in byte 0 of 32-bit 'long' register (even byte checksum?) - 01BC41: FB incpa // increase 'address' register PA - 01BC42: A7 ldal1 a // read byte 1 of 32-bit 'long' register into accumulator - 01BC43: 73 adcpa // adc ($Address PA) - 01BC44: 87 stal1 a // store accumulator back in byte 0 of 32-bit 'long' register (odd byte checksum?) - 01BC45: FB incpa // increase 'address' register PA - 01BC46: D0 F6 bne $1bc3e // (branch based on PA increase, so PA must set flags?, probably overflows after 0xffff if upper byte is 'bank'? or at 0xff if this really is a mirror of the function below - - 01BC48: 88 dey // decrease y, which contained 3f at the start - 01BC49: 10 F1 bpl $1bc3c // branch back to loop point 2 to reload counter - - // contains the odd byte checksum once we drop out the loop - 01BC4B: 8D FB 00 sta $00fb // store it in zero page memory - 01BC4E: A3 ldal0 a // get the even byte checksum from byte 0 of 32-bit 'long' register - 01BC4F: 8D FA 00 sta $00fa // store it in zero page memory - 01BC52: 07 oral1 a // why do we want to do this? (routine below does it too) - 01BC53: D0 03 bne $1bc58 - 01BC55: CE FA 00 dec $00fa - 01BC58: 80 retf - - this is presumably meant to be similar to the function found in Namco - Nostalgia 2 - - // A is 80 on entry - 09FFD8: A9 3F lda #$3f - 09FFDA: 85 01 sta $01 // set upper bit of pointer at 0x0000 to 3f (it completely fails to initialize the ram at 00, we currently init it to ff, but should probably be 0?) - 09FFDC: A0 00 ldy #$00 // clear inner loop counter - -- loop point 1 and 2 - 09FFDE: AD FA 00 lda $00fa // read current even byte checksum value from zero page ram fa (game also completely fails to initialize this) - 09FFE1: 71 00 adc ($00), y // so 3f00 + y first outer loop, 3e00 + y second outer loop with y increasing in inner loop (add byte read to even checksum byte?) - 09FFE3: 8D FA 00 sta $00fa // store even checksum at 0xfa in zero page ram - 09FFE6: C8 iny // increase counter y - 09FFE7: AD FB 00 lda $00fb // read current odd byte checksum value from zero page ram fb (likewise never initialized!) - 09FFEA: 71 00 adc ($00), y // 3f00 + y (add byte read to odd checksum byte) - 09FFEC: 8D FB 00 sta $00fb // store odd checksum byte at 0xfb in zero page ram - 09FFEF: C8 iny // increase y - 09FFF0: D0 EC bne $9ffde // branch back if y hasn't overflowed (so work on 0x100 bytes, looping back 0x7f times) - 09FFF2: C6 01 dec $01 // decrease accumulator (started at 3f) (inner loop counter already 0 because it overflowed) - 09FFF4: 10 E8 bpl $9ffde // branch back - - // checksums are already in place after loop so no need to copy them like in above - 09FFF6: 0D FA 00 ora $00fa // same weird 'or' call - -- - 09FFF9: D0 03 bne $9fffe - 09FFFB: CE FA 00 dec $00fa - 09FFFE: 80 retf + the 2002 chip seems to be the one that was officially dubbed 'SuperXaviX' + and has additional video capabilities on top of the extended opcodes. ***************************************************************************/ @@ -96,10 +31,13 @@ #include "xavix2000.h" #include "xavix2000d.h" -DEFINE_DEVICE_TYPE(XAVIX2000, xavix2000_device, "xavix2000", "XaviX (SSD 2000 / 2002)") +DEFINE_DEVICE_TYPE(XAVIX2000, xavix2000_device, "xavix2000", "XaviX (SSD 2000)") +DEFINE_DEVICE_TYPE(XAVIX2002, xavix2002_device, "xavix2002", "XaviX (SSD 2002) (SuperXaviX)") -xavix2000_device::xavix2000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - xavix_device(mconfig, XAVIX2000, tag, owner, clock) + + +xavix2000_device::xavix2000_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + xavix_device(mconfig, type, tag, owner, clock) { program_config.m_addr_width = 24; program_config.m_logaddr_width = 24; @@ -107,6 +45,17 @@ xavix2000_device::xavix2000_device(const machine_config &mconfig, const char *ta sprogram_config.m_logaddr_width = 24; } +xavix2000_device::xavix2000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + xavix2000_device(mconfig, XAVIX2000, tag, owner, clock) +{ +} + +xavix2002_device::xavix2002_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + xavix2000_device(mconfig, XAVIX2002, tag, owner, clock) +{ +} + + void xavix2000_device::device_start() { xavix_device::device_start(); diff --git a/src/devices/cpu/m6502/xavix2000.h b/src/devices/cpu/m6502/xavix2000.h index 6eec3db88d5..2275e762938 100644 --- a/src/devices/cpu/m6502/xavix2000.h +++ b/src/devices/cpu/m6502/xavix2000.h @@ -15,6 +15,7 @@ class xavix2000_device : public xavix_device { public: xavix2000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + xavix2000_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); virtual std::unique_ptr create_disassembler() override; virtual void do_exec_full() override; @@ -160,6 +161,13 @@ enum { SXAVIX_PB }; +class xavix2002_device : public xavix2000_device { +public: + xavix2002_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); +}; + + DECLARE_DEVICE_TYPE(XAVIX2000, xavix2000_device) +DECLARE_DEVICE_TYPE(XAVIX2002, xavix2002_device) #endif // MAME_CPU_M6502_XAVIX2000_H diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp index c0c682d0163..79e0425d74b 100644 --- a/src/mame/drivers/xavix.cpp +++ b/src/mame/drivers/xavix.cpp @@ -404,9 +404,9 @@ void xavix_state::superxavix_lowbus_map(address_map &map) map(0x790b, 0x790b).w(FUNC(xavix_state::extended_extbus_reg1_w)); map(0x790d, 0x790d).w(FUNC(xavix_state::extended_extbus_reg2_w)); - map(0x7a10, 0x7a12).ram().rw(FUNC(xavix_state::pio_dir_r), FUNC(xavix_state::pio_dir_w)); - map(0x7a20, 0x7a22).ram().rw(FUNC(xavix_state::pio_out_r), FUNC(xavix_state::pio_out_w)); - map(0x7a30, 0x7a32).ram().r(FUNC(xavix_state::pio_in_r)); + map(0x7a10, 0x7a12).rw("xavix2002io", FUNC(xavix2002_io_device::pio_dir_r), FUNC(xavix2002_io_device::pio_dir_w)); + map(0x7a20, 0x7a22).rw("xavix2002io", FUNC(xavix2002_io_device::pio_out_r), FUNC(xavix2002_io_device::pio_out_w)); + map(0x7a30, 0x7a32).r("xavix2002io", FUNC(xavix2002_io_device::pio_in_r)); map(0x6fb0, 0x6fc7).ram().share("bmp_base"); @@ -1078,7 +1078,7 @@ void xavix_state::xavix2000(machine_config &config) XAVIX2000(config.replace(), m_maincpu, MAIN_CLOCK); m_maincpu->set_addrmap(AS_PROGRAM, &xavix_state::xavix_map); - m_maincpu->set_addrmap(5, &xavix_state::superxavix_lowbus_map); + m_maincpu->set_addrmap(5, &xavix_state::xavix_lowbus_map); m_maincpu->set_addrmap(6, &xavix_state::xavix_extbus_map); m_maincpu->disable_cache(); m_maincpu->set_vblank_int("screen", FUNC(xavix_state::interrupt)); @@ -1087,9 +1087,26 @@ void xavix_state::xavix2000(machine_config &config) m_palette->set_entries(512); } -void xavix_i2c_jmat_state::xavix_i2c_jmat(machine_config &config) +void xavix_state::xavix2002(machine_config &config) { - xavix2000(config); + xavix(config); + + XAVIX2002(config.replace(), m_maincpu, MAIN_CLOCK); + m_maincpu->set_addrmap(AS_PROGRAM, &xavix_state::xavix_map); + m_maincpu->set_addrmap(5, &xavix_state::superxavix_lowbus_map); // has extra video, io etc. + m_maincpu->set_addrmap(6, &xavix_state::xavix_extbus_map); + m_maincpu->disable_cache(); + m_maincpu->set_vblank_int("screen", FUNC(xavix_state::interrupt)); + m_maincpu->set_vector_callback(FUNC(xavix_state::get_vectors)); + + m_palette->set_entries(512); + + XAVIX2002IO(config, "xavix2002io", 0); +} + +void xavix_i2c_jmat_state::xavix2002_i2c_jmat(machine_config &config) +{ + xavix2002(config); I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x200); // ? } @@ -1201,6 +1218,14 @@ void xavix_cart_state::xavix_cart_ddrfammt(machine_config &config) //SOFTWARE_LIST(config, "cart_list_japan_sp").set_original("ekara_japan_sp"); // not for this system, but unlike other carts, actually tells you this if inserted rather than crashing the system } + +void xavix_i2c_state::xavix2002_i2c_24c04(machine_config &config) +{ + xavix2002(config); + + I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x200); // 24C04 +} + void xavix_state::init_xavix() { m_rgnlen = memregion("bios")->bytes(); @@ -1568,13 +1593,17 @@ ROM_START( xavbaseb ) ROM_LOAD( "xpbaseball.bin", 0x000000, 0x800000, CRC(e9ed692d) SHA1(537e390e972156dc7da66ee127ae4c8052038ee5) ) ROM_END +ROM_START( xavbassf ) + ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 ) + ROM_LOAD( "xpbassfishing.bin", 0x000000, 0x800000, CRC(09ab2f29) SHA1(616254176315d0947002e9ae5a6371a3ffa2e8eb) ) +ROM_END + ROM_START( xavjmat ) ROM_REGION( 0x1000000, "bios", ROMREGION_ERASE00 ) ROM_LOAD( "xpjmat.bin", 0x000000, 0x1000000, CRC(71a51eef) SHA1(41fd2c3013d1c86756046ec9174e94400f8fa06d) ) ROM_END // Domyos DiS (XaviX 2002 based titles) - ROM_START( domfitex ) ROM_REGION( 0x1000000, "bios", ROMREGION_ERASE00 ) ROM_LOAD( "xpfitnessexercise.bin", 0x000000, 0x1000000, CRC(f1089229) SHA1(803df8ba0a05cb004a4238c6c71ea1ffa4428990) ) @@ -1586,13 +1615,15 @@ ROM_START( domfitch ) ROM_END // TODO: does it have an SEEPROM? why does it hang? full title? -CONS( 2005, tmy_thom, 0, 0, xavix2000_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "Tomy / SSD Company LTD", "Thomas and Friends (Tomy)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, tmy_thom, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "Tomy / SSD Company LTD", "Thomas and Friends (Tomy)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -CONS( 2004, xavtenni, 0, 0, xavix2000_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Tennis (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -CONS( 2004, xavbaseb, 0, 0, xavix2000_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Baseball (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2004, xavtenni, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Tennis (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2004, xavbaseb, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Baseball (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +// Bass Fishing PCB is just like Tennis except with an RF daughterboard. +CONS( 2004, xavbassf, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Bass Fishing (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // TODO: check SEEPROM type and hookup, banking! -CONS( 2005, xavjmat, 0, 0, xavix_i2c_jmat, xavix, xavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "Jackie Chan J-Mat Fitness (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, xavjmat, 0, 0, xavix2002_i2c_jmat, xavix, xavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "Jackie Chan J-Mat Fitness (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // https://arnaudmeyer.wordpress.com/domyos-interactive-system/ // Domyos Fitness Adventure @@ -1607,12 +1638,12 @@ CONS( 2005, xavjmat, 0, 0, xavix_i2c_jmat, xavix, xavix_i2c_jmat_state, init_xa // Domyos Bike Concept (not listed on site above) // Has SEEPROM and an RTC. Exercise has some leftover PC buffer stuff. (TODO, check SEEPROM type, RTC type, banking) (both Exercises and Challenge are identical PCBs) -CONS( 2008, domfitex, 0, 0, xavix_i2c_jmat, xavixp, xavix_i2c_jmat_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Exercises (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -CONS( 2008, domfitch, 0, 0, xavix_i2c_jmat, xavixp, xavix_i2c_jmat_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Challenge (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2008, domfitex, 0, 0, xavix2002_i2c_jmat, xavixp, xavix_i2c_jmat_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Exercises (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2008, domfitch, 0, 0, xavix2002_i2c_jmat, xavixp, xavix_i2c_jmat_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Challenge (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // Domyos DiS (unknown hardware, or bad dumps) // This DOES NOT look like a 6502 based Xavix / Super Xavix! maybe XaviX 2, the cartridges contain the entire system (CPU,Video,Sound,ROM) so that is possible. -// Seems to have 32-bit looking stuff, possible vectors at start? possible ARM THUMB mode code +// Seems to have 32-bit looking stuff, possible vectors at start? ROM_START( domfitad ) ROM_REGION( 0x1000000, "bios", ROMREGION_ERASE00 ) @@ -1620,7 +1651,7 @@ ROM_START( domfitad ) ROM_END // Has SEEPROM and an RTC. Adventure has the string DOMYSSDCOLTD a couple of times. -CONS( 2008, domfitad, 0, 0, xavix_i2c_jmat, xavixp, xavix_i2c_jmat_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Adventure (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2008, domfitad, 0, 0, xavix2002_i2c_jmat, xavixp, xavix_i2c_jmat_state, init_xavix, "Decathlon / SSD Company LTD", "Domyos Fitness Adventure (Domyos Interactive System)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/includes/xavix.h b/src/mame/includes/xavix.h index 2bcab562aea..34e8783dd65 100644 --- a/src/mame/includes/xavix.h +++ b/src/mame/includes/xavix.h @@ -18,7 +18,7 @@ #include "machine/xavix_mtrk_wheel.h" #include "machine/xavix_madfb_ball.h" - +#include "machine/xavix2002_io.h" class xavix_sound_device : public device_t, public device_sound_interface { @@ -99,7 +99,8 @@ public: m_palette(*this, "palette"), m_region(*this, "REGION"), m_gfxdecode(*this, "gfxdecode"), - m_sound(*this, "xavix_sound") + m_sound(*this, "xavix_sound"), + m_xavix2002io(*this, "xavix2002io") { } void xavix(machine_config &config); @@ -108,6 +109,8 @@ public: void xavix_nv(machine_config &config); void xavix2000_nv(machine_config &config); + void xavix2002(machine_config &config); + void init_xavix(); DECLARE_WRITE_LINE_MEMBER(ioevent_trg01); @@ -563,19 +566,13 @@ private: int get_current_address_byte(); required_device m_sound; + + optional_device m_xavix2002io; + DECLARE_READ8_MEMBER(sound_regram_read_cb); protected: // additional SuperXaviX / XaviX2002 stuff - uint8_t m_sx_pio_dir[3]; - uint8_t m_sx_pio_out[3]; - - DECLARE_WRITE8_MEMBER(pio_dir_w); - DECLARE_READ8_MEMBER(pio_dir_r); - - virtual DECLARE_WRITE8_MEMBER(pio_out_w); - virtual DECLARE_READ8_MEMBER(pio_out_r); - virtual DECLARE_READ8_MEMBER(pio_in_r); uint8_t m_sx_extended_extbus[3]; @@ -602,6 +599,8 @@ public: void xavix2000_i2c_24c04(machine_config &config); void xavix2000_i2c_24c02(machine_config &config); + void xavix2002_i2c_24c04(machine_config &config); + void init_epo_efdx() { init_xavix(); @@ -627,7 +626,7 @@ public: m_i2cmem(*this, "i2cmem") { } - void xavix_i2c_jmat(machine_config &config); + void xavix2002_i2c_jmat(machine_config &config); private: diff --git a/src/mame/machine/xavix.cpp b/src/mame/machine/xavix.cpp index 51adb7be722..505e43ac159 100644 --- a/src/mame/machine/xavix.cpp +++ b/src/mame/machine/xavix.cpp @@ -1078,8 +1078,6 @@ void xavix_state::machine_start() save_item(NAME(m_spritereg)); save_item(NAME(m_barrel_params)); - save_item(NAME(m_sx_pio_dir)); - save_item(NAME(m_sx_pio_out)); save_item(NAME(m_sx_extended_extbus)); } @@ -1160,11 +1158,6 @@ void xavix_state::machine_reset() m_barrel_params[1] = 0x00; // SuperXaviX - for (int i = 0; i < 3; i++) - { - m_sx_pio_dir[i] = 0x00; - m_sx_pio_out[i] = 0x00; - } for (int i = 0; i < 3; i++) { @@ -1199,36 +1192,6 @@ int16_t xavix_state::get_vectors(int which, int half) // additional SuperXaviX / XaviX2002 stuff -WRITE8_MEMBER(xavix_state::pio_dir_w) -{ - LOG("%s: pio_dir_w (port %d) %02x\n", machine().describe_context(), offset, data); - m_sx_pio_dir[offset] = data; -} - -READ8_MEMBER(xavix_state::pio_dir_r) -{ - LOG("%s: pio_dir_r (port %d)\n", machine().describe_context(), offset); - return m_sx_pio_dir[offset]; -} - -WRITE8_MEMBER(xavix_state::pio_out_w) -{ - LOG("%s: pio_out_w (port %d) %02x\n", machine().describe_context(), offset, data); - m_sx_pio_out[offset] = data; -} - -READ8_MEMBER(xavix_state::pio_out_r) -{ - LOG("%s: pio_out_r (port %d)\n", machine().describe_context(), offset); - return m_sx_pio_out[offset]; -} - -READ8_MEMBER(xavix_state::pio_in_r) -{ - LOG("%s: pio_in_r (port %d)\n", machine().describe_context(), offset); - return 0x00; -} - WRITE8_MEMBER(xavix_state::extended_extbus_reg0_w) { LOG("%s: extended_extbus_reg0_w %02x\n", machine().describe_context(), data); diff --git a/src/mame/machine/xavix2002_io.cpp b/src/mame/machine/xavix2002_io.cpp new file mode 100644 index 00000000000..7fc69e4b95d --- /dev/null +++ b/src/mame/machine/xavix2002_io.cpp @@ -0,0 +1,115 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood + +// has separate input / output addresses but still uses direction registers, or I've misunderstood this entirely. + +#include "emu.h" +#include "xavix2002_io.h" + +#define VERBOSE 0 +#include "logmacro.h" + +DEFINE_DEVICE_TYPE(XAVIX2002IO, xavix2002_io_device, "xavix2002io", "XaviX 2002 IO") + +xavix2002_io_device::xavix2002_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, XAVIX2002IO, tag, owner, clock) + , m_space_read0_cb(*this) + , m_space_read1_cb(*this) + , m_space_read2_cb(*this) + , m_out0_cb(*this) + , m_out1_cb(*this) + , m_out2_cb(*this) +{ +} + +void xavix2002_io_device::device_start() +{ + m_space_read0_cb.resolve_safe(0xff); + m_space_read1_cb.resolve_safe(0xff); + m_space_read2_cb.resolve_safe(0xff); + + m_out0_cb.resolve_safe(); + m_out1_cb.resolve_safe(); + m_out2_cb.resolve_safe(); + + save_item(NAME(m_sx_pio_dir)); + save_item(NAME(m_sx_pio_out)); +} + +void xavix2002_io_device::device_reset() +{ + for (int i = 0; i < 3; i++) + { + m_sx_pio_dir[i] = 0; + m_sx_pio_out[i] = 0; + } +} + +WRITE8_MEMBER(xavix2002_io_device::pio_dir_w) +{ + LOG("%s: superxavix pio_dir_w (port %d) %02x\n", machine().describe_context(), offset, data); + + if (offset < 3) + { + m_sx_pio_dir[offset] = data; + // update port? + } +} + +READ8_MEMBER(xavix2002_io_device::pio_dir_r) +{ + LOG("%s: superxavix pio_dir_r (port %d)\n", machine().describe_context(), offset); + + uint8_t ret = 0x00; + + if (offset < 3) + { + ret = m_sx_pio_dir[offset]; + } + + return ret; +} + +WRITE8_MEMBER(xavix2002_io_device::pio_out_w) +{ + LOG("%s: superxavix pio_out_w (port %d) %02x\n", machine().describe_context(), offset, data); + + if (offset < 3) + { + m_sx_pio_out[offset] = data; + + // look at direction register and output + } +} + +READ8_MEMBER(xavix2002_io_device::pio_out_r) +{ + LOG("%s: superxavix pio_out_r (port %d)\n", machine().describe_context(), offset); + + uint8_t ret = 0x00; + + if (offset<3) + ret = m_sx_pio_out[offset]; + + return ret; +} + + +READ8_MEMBER(xavix2002_io_device::pio_in_r) +{ + LOG("%s: superxavix pio_in_r (port %d)\n", machine().describe_context(), offset); + + uint8_t ret = 0x00; + + switch (offset) + { + case 0: ret = m_space_read0_cb(); + case 1: ret = m_space_read1_cb(); + case 2: ret = m_space_read2_cb(); + default: ret = 0x00; + } + + // mask with direction register before returning + + return ret; +} diff --git a/src/mame/machine/xavix2002_io.h b/src/mame/machine/xavix2002_io.h new file mode 100644 index 00000000000..bfddd799194 --- /dev/null +++ b/src/mame/machine/xavix2002_io.h @@ -0,0 +1,49 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood + +#ifndef MAME_MACHINE_XAVIX2002_IO_H +#define MAME_MACHINE_XAVIX2002_IO_H + + +class xavix2002_io_device : public device_t +{ +public: + xavix2002_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + auto read_0_callback() { return m_space_read0_cb.bind(); } + auto read_1_callback() { return m_space_read1_cb.bind(); } + auto read_2_callback() { return m_space_read2_cb.bind(); } + + auto write_0_callback() { return m_out0_cb.bind(); } + auto write_1_callback() { return m_out1_cb.bind(); } + auto write_2_callback() { return m_out2_cb.bind(); } + + DECLARE_WRITE8_MEMBER(pio_dir_w); + DECLARE_READ8_MEMBER(pio_dir_r); + + DECLARE_WRITE8_MEMBER(pio_out_w); + DECLARE_READ8_MEMBER(pio_out_r); + + DECLARE_READ8_MEMBER(pio_in_r); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + +private: + devcb_read8 m_space_read0_cb; + devcb_read8 m_space_read1_cb; + devcb_read8 m_space_read2_cb; + + devcb_write8 m_out0_cb; + devcb_write8 m_out1_cb; + devcb_write8 m_out2_cb; + + uint8_t m_sx_pio_dir[3]; + uint8_t m_sx_pio_out[3]; +}; + +DECLARE_DEVICE_TYPE(XAVIX2002IO, xavix2002_io_device) + +#endif // MAME_MACHINE_XAVIX2002_IO_H diff --git a/src/mame/mame.lst b/src/mame/mame.lst index a8a8aefe7e1..7467b8807ca 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -39773,6 +39773,7 @@ ttv_mx // drgqst // xavtenni // xavbaseb // +xavbassf // xavjmat // tmy_thom // domfitex // From 24daffc1840e46a79a668644f93d2b8894f40e31 Mon Sep 17 00:00:00 2001 From: DavidHaywood <28625134+DavidHaywood@users.noreply.github.com> Date: Wed, 23 Jan 2019 22:05:33 +0000 Subject: [PATCH 08/16] refactoring (nw) --- scripts/target/mame/mess.lua | 2 + src/mame/drivers/xavix.cpp | 61 +++++++++--- src/mame/includes/xavix.h | 50 ++++------ src/mame/machine/xavix.cpp | 156 ++++-------------------------- src/mame/machine/xavix2002_io.cpp | 18 ++-- src/mame/machine/xavix2002_io.h | 12 +-- src/mame/machine/xavix_io.cpp | 106 ++++++++++++++++++++ src/mame/machine/xavix_io.h | 42 ++++++++ 8 files changed, 254 insertions(+), 193 deletions(-) create mode 100644 src/mame/machine/xavix_io.cpp create mode 100644 src/mame/machine/xavix_io.h diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 472bab12efd..4d84da56315 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -3501,6 +3501,8 @@ files { MAME_DIR .. "src/mame/machine/xavix_mtrk_wheel.h", MAME_DIR .. "src/mame/machine/xavix_madfb_ball.cpp", MAME_DIR .. "src/mame/machine/xavix_madfb_ball.h", + MAME_DIR .. "src/mame/machine/xavix_io.cpp", + MAME_DIR .. "src/mame/machine/xavix_io.h", MAME_DIR .. "src/mame/machine/xavix2002_io.cpp", MAME_DIR .. "src/mame/machine/xavix2002_io.h", } diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp index 79e0425d74b..6822a463649 100644 --- a/src/mame/drivers/xavix.cpp +++ b/src/mame/drivers/xavix.cpp @@ -314,20 +314,15 @@ void xavix_state::xavix_lowbus_map(address_map &map) map(0x75f0, 0x75f1).rw(FUNC(xavix_state::sound_startstop_r), FUNC(xavix_state::sound_startstop_w)); // r/w tested read/written 8 times in a row map(0x75f2, 0x75f3).rw(FUNC(xavix_state::sound_updateenv_r), FUNC(xavix_state::sound_updateenv_w)); map(0x75f4, 0x75f5).r(FUNC(xavix_state::sound_sta16_r)); // related to 75f0 / 75f1 (read after writing there - rad_mtrk) - // taitons1 after 75f7/75f8 map(0x75f6, 0x75f6).rw(FUNC(xavix_state::sound_volume_r), FUNC(xavix_state::sound_volume_w)); // r/w tested - // taitons1 written as a pair map(0x75f7, 0x75f7).w(FUNC(xavix_state::sound_regbase_w)); map(0x75f8, 0x75f8).rw(FUNC(xavix_state::sound_75f8_r), FUNC(xavix_state::sound_75f8_w)); // r/w tested - // taitons1 written after 75f6, then read map(0x75f9, 0x75f9).rw(FUNC(xavix_state::sound_75f9_r), FUNC(xavix_state::sound_75f9_w)); - // at another time map(0x75fa, 0x75fa).rw(FUNC(xavix_state::sound_timer0_r), FUNC(xavix_state::sound_timer0_w)); // r/w tested map(0x75fb, 0x75fb).rw(FUNC(xavix_state::sound_timer1_r), FUNC(xavix_state::sound_timer1_w)); // r/w tested map(0x75fc, 0x75fc).rw(FUNC(xavix_state::sound_timer2_r), FUNC(xavix_state::sound_timer2_w)); // r/w tested map(0x75fd, 0x75fd).rw(FUNC(xavix_state::sound_timer3_r), FUNC(xavix_state::sound_timer3_w)); // r/w tested map(0x75fe, 0x75fe).rw(FUNC(xavix_state::sound_irqstatus_r), FUNC(xavix_state::sound_irqstatus_w)); - // taitons1 written other 75xx operations map(0x75ff, 0x75ff).w(FUNC(xavix_state::sound_75ff_w)); // Slot Registers @@ -343,10 +338,8 @@ void xavix_state::xavix_lowbus_map(address_map &map) map(0x7986, 0x7987).ram().w(FUNC(xavix_state::rom_dmalen_w)).share("rom_dma_len"); // IO Ports - map(0x7a00, 0x7a00).rw(FUNC(xavix_state::io0_data_r), FUNC(xavix_state::io0_data_w)); - map(0x7a01, 0x7a01).rw(FUNC(xavix_state::io1_data_r), FUNC(xavix_state::io1_data_w)); - map(0x7a02, 0x7a02).rw(FUNC(xavix_state::io0_direction_r), FUNC(xavix_state::io0_direction_w)); - map(0x7a03, 0x7a03).rw(FUNC(xavix_state::io1_direction_r), FUNC(xavix_state::io1_direction_w)); + map(0x7a00, 0x7a01).rw("xavixio", FUNC(xavix_io_device::xav_7a0x_dat_r), FUNC(xavix_io_device::xav_7a0x_dat_w)); + map(0x7a02, 0x7a03).rw("xavixio", FUNC(xavix_io_device::xav_7a0x_dir_r), FUNC(xavix_io_device::xav_7a0x_dir_w)); // IO Event Interrupt control map(0x7a80, 0x7a80).rw(FUNC(xavix_state::ioevent_enable_r), FUNC(xavix_state::ioevent_enable_w)); @@ -1014,6 +1007,10 @@ void xavix_state::xavix(machine_config &config) PALETTE(config, m_palette, palette_device::BLACK, 256); + XAVIXIO(config, m_xavio, 0); + m_xavio->read_0_callback().set_ioport("IN0"); + m_xavio->read_1_callback().set_ioport("IN1"); + /* sound hardware */ //SPEAKER(config, "mono").front_center(); @@ -1032,6 +1029,9 @@ void xavix_i2c_state::xavix_i2c_24lc02(machine_config &config) { xavix(config); + m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); + m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); + I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x100); // 24LC02 (taiko) } @@ -1039,6 +1039,9 @@ void xavix_i2c_state::xavix_i2c_24c02(machine_config &config) { xavix(config); + m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); + m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); + I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x100); // 24C02 } @@ -1046,6 +1049,9 @@ void xavix_i2c_state::xavix_i2c_24lc04(machine_config &config) { xavix(config); + m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); + m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); + // according to http://ww1.microchip.com/downloads/en/devicedoc/21708k.pdf 'the master transmits up to 16 data bytes' however this breaks the Nostalgia games // of note Galplus Phalanx on Namco Nostalgia 2, which will hang between stages unable to properly access the device, but with no page support it doesn't hang and scores save I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x200); // 24LC04 on Nostalgia games, 24C04 on others @@ -1055,6 +1061,9 @@ void xavix_i2c_state::xavix_i2c_24c08(machine_config &config) { xavix(config); + m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); + m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); + I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x400); // 24C08 (Excite Fishing DX) } @@ -1123,6 +1132,9 @@ void xavix_i2c_state::xavix2000_i2c_24c04(machine_config &config) { xavix2000(config); + m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); + m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); + I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x200); // 24C04 } @@ -1130,9 +1142,20 @@ void xavix_i2c_state::xavix2000_i2c_24c02(machine_config &config) { xavix2000(config); + m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); + m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); + I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x100); // 24C02 } +void xavix_i2c_lotr_state::xavix2000_i2c_24c02_lotr(machine_config &config) +{ + xavix2000_i2c_24c02(config); + + m_xavio->read_1_callback().set(FUNC(xavix_i2c_lotr_state::read_lotr_io1)); +} + + void xavix_mtrk_state::xavix_mtrk(machine_config &config) { xavix(config); @@ -1173,10 +1196,13 @@ void xavix_i2c_cart_state::xavix_i2c_taiko(machine_config &config) SOFTWARE_LIST(config, "cart_list_japan_d").set_original("ekara_japan_d"); SOFTWARE_LIST(config, "cart_list_japan_sp").set_original("ekara_japan_sp"); + m_xavio->read_1_callback().set(FUNC(xavix_i2c_cart_state::read_cart_io1)); + m_xavio->write_1_callback().set(FUNC(xavix_i2c_cart_state::write_cart_io1)); + // do any of the later G/P series carts with SEEPROM work with this too? check } -void xavix_cart_state::xavix_cart_ekara(machine_config &config) +void xavix_ekara_state::xavix_cart_ekara(machine_config &config) { xavix_cart(config); @@ -1192,6 +1218,10 @@ void xavix_cart_state::xavix_cart_ekara(machine_config &config) SOFTWARE_LIST(config, "cart_list_japan_en").set_original("ekara_japan_en"); SOFTWARE_LIST(config, "cart_list_japan_sp").set_original("ekara_japan_sp"); SOFTWARE_LIST(config, "cart_list_japan_web").set_original("ekara_japan_web"); + + m_xavio->write_0_callback().set(FUNC(xavix_ekara_state::write_ekara_io0)); + m_xavio->read_1_callback().set(FUNC(xavix_ekara_state::read_ekara_io1)); + m_xavio->write_1_callback().set(FUNC(xavix_ekara_state::write_ekara_io1)); } void xavix_cart_state::xavix_cart_popira(machine_config &config) @@ -1223,6 +1253,9 @@ void xavix_i2c_state::xavix2002_i2c_24c04(machine_config &config) { xavix2002(config); + m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); + m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); + I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x200); // 24C04 } @@ -1558,10 +1591,10 @@ ROM_END CONS( 2004, epo_sdb, 0, 0, xavix2000_nv, epo_sdb, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Super Dash Ball (Japan)", MACHINE_IMPERFECT_SOUND ) -CONS( 2005, ttv_sw, 0, 0, xavix2000_i2c_24c02, xavix, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Star Wars Saga Edition - Lightsaber Battle Game", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 2005, ttv_lotr, 0, 0, xavix2000_i2c_24c02, xavix, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Lord Of The Rings - Warrior of Middle-Earth", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 2005, ttv_mx, 0, 0, xavix2000_i2c_24c04, ttv_mx, xavix_i2c_state, init_xavix, "Tiger / SSD Company LTD", "MX Dirt Rebel", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 2003, drgqst, 0, 0, xavix2000_i2c_24c02, xavix , xavix_i2c_lotr_state, init_xavix, "Square Enix / SSD Company LTD", "Kenshin Dragon Quest: Yomigaerishi Densetsu no Ken", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, ttv_sw, 0, 0, xavix2000_i2c_24c02_lotr, xavix, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Star Wars Saga Edition - Lightsaber Battle Game", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, ttv_lotr, 0, 0, xavix2000_i2c_24c02_lotr, xavix, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Lord Of The Rings - Warrior of Middle-Earth", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, ttv_mx, 0, 0, xavix2000_i2c_24c04, ttv_mx, xavix_i2c_state, init_xavix, "Tiger / SSD Company LTD", "MX Dirt Rebel", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2003, drgqst, 0, 0, xavix2000_i2c_24c02_lotr, xavix, xavix_i2c_lotr_state, init_xavix, "Square Enix / SSD Company LTD", "Kenshin Dragon Quest: Yomigaerishi Densetsu no Ken", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) /* SuperXaviX (XaviX 2002 type CPU) hardware titles (3rd XaviX generation?) diff --git a/src/mame/includes/xavix.h b/src/mame/includes/xavix.h index 34e8783dd65..3ff2a63637b 100644 --- a/src/mame/includes/xavix.h +++ b/src/mame/includes/xavix.h @@ -19,6 +19,7 @@ #include "machine/xavix_mtrk_wheel.h" #include "machine/xavix_madfb_ball.h" #include "machine/xavix2002_io.h" +#include "machine/xavix_io.h" class xavix_sound_device : public device_t, public device_sound_interface { @@ -76,6 +77,7 @@ public: m_mouse1x(*this, "MOUSE1X"), m_mouse1y(*this, "MOUSE1Y"), m_maincpu(*this, "maincpu"), + m_xavio(*this, "xavixio"), m_nvram(*this, "nvram"), m_screen(*this, "screen"), m_lowbus(*this, "lowbus"), @@ -170,10 +172,10 @@ public: protected: - virtual uint8_t read_io0(uint8_t direction); - virtual uint8_t read_io1(uint8_t direction); - virtual void write_io0(uint8_t data, uint8_t direction); - virtual void write_io1(uint8_t data, uint8_t direction); + //virtual uint8_t read_io0(uint8_t direction); + //virtual uint8_t read_io1(uint8_t direction); + //virtual void write_io0(uint8_t data, uint8_t direction); + //virtual void write_io1(uint8_t data, uint8_t direction); required_ioport m_in0; required_ioport m_in1; required_ioport_array<8> m_an_in; @@ -182,6 +184,10 @@ protected: optional_ioport m_mouse1x; optional_ioport m_mouse1y; required_device m_maincpu; + required_device m_xavio; + + + optional_device m_nvram; required_device m_screen; required_device m_lowbus; @@ -303,21 +309,6 @@ private: DECLARE_WRITE8_MEMBER(spritefragment_dma_trg_w); DECLARE_READ8_MEMBER(spritefragment_dma_status_r); - DECLARE_READ8_MEMBER(io0_data_r); - DECLARE_READ8_MEMBER(io1_data_r); - DECLARE_WRITE8_MEMBER(io0_data_w); - DECLARE_WRITE8_MEMBER(io1_data_w); - - DECLARE_READ8_MEMBER(io0_direction_r); - DECLARE_READ8_MEMBER(io1_direction_r); - DECLARE_WRITE8_MEMBER(io0_direction_w); - DECLARE_WRITE8_MEMBER(io1_direction_w); - - uint8_t m_io0_data; - uint8_t m_io1_data; - uint8_t m_io0_direction; - uint8_t m_io1_direction; - uint8_t m_adc_inlatch; DECLARE_READ8_MEMBER(nmi_vector_lo_r); @@ -608,8 +599,8 @@ public: hackaddress2 = 0x8524; } protected: - virtual uint8_t read_io1(uint8_t direction) override; - virtual void write_io1(uint8_t data, uint8_t direction) override; + DECLARE_READ8_MEMBER(read_io1); + DECLARE_WRITE8_MEMBER(write_io1); required_device m_i2cmem; @@ -641,9 +632,10 @@ public: : xavix_i2c_state(mconfig, type, tag) { } + void xavix2000_i2c_24c02_lotr(machine_config &config); + protected: - virtual uint8_t read_io1(uint8_t direction) override; - //virtual void write_io1(uint8_t data, uint8_t direction) override; + DECLARE_READ8_MEMBER(read_lotr_io1); }; @@ -689,7 +681,6 @@ public: { } void xavix_cart(machine_config &config); - void xavix_cart_ekara(machine_config &config); void xavix_cart_popira(machine_config &config); void xavix_cart_ddrfammt(machine_config &config); @@ -851,8 +842,8 @@ public: void xavix_i2c_taiko(machine_config &config); protected: - virtual uint8_t read_io1(uint8_t direction) override; - virtual void write_io1(uint8_t data, uint8_t direction) override; + DECLARE_READ8_MEMBER(read_cart_io1); + DECLARE_WRITE8_MEMBER(write_cart_io1); required_device m_i2cmem; }; @@ -870,15 +861,16 @@ public: { } // void xavix_ekara(machine_config &config); + void xavix_cart_ekara(machine_config &config); protected: required_ioport m_extra0; required_ioport m_extra1; - virtual uint8_t read_io1(uint8_t direction) override; - virtual void write_io0(uint8_t data, uint8_t direction) override; - virtual void write_io1(uint8_t data, uint8_t direction) override; + DECLARE_READ8_MEMBER(read_ekara_io1); + DECLARE_WRITE8_MEMBER(write_ekara_io0); + DECLARE_WRITE8_MEMBER(write_ekara_io1); uint8_t m_extraioselect; uint8_t m_extraiowrite; diff --git a/src/mame/machine/xavix.cpp b/src/mame/machine/xavix.cpp index 505e43ac159..2925eb47c9d 100644 --- a/src/mame/machine/xavix.cpp +++ b/src/mame/machine/xavix.cpp @@ -488,42 +488,15 @@ WRITE8_MEMBER(xavix_state::dispctrl_posirq_y_w) /* Per Game IO port callbacks */ -uint8_t xavix_state::read_io0(uint8_t direction) -{ - // no special handling - return m_in0->read(); -} - -uint8_t xavix_state::read_io1(uint8_t direction) -{ - // no special handling - return m_in1->read(); -} - -void xavix_state::write_io0(uint8_t data, uint8_t direction) -{ - // no special handling -} - -void xavix_state::write_io1(uint8_t data, uint8_t direction) -{ - // no special handling -} - -uint8_t xavix_i2c_state::read_io1(uint8_t direction) +READ8_MEMBER(xavix_i2c_state::read_io1) { uint8_t ret = m_in1->read(); - - if (!(direction & 0x08)) - { - ret &= ~0x08; - ret |= (m_i2cmem->read_sda() & 1) << 3; - } - + ret &= ~0x08; + ret |= (m_i2cmem->read_sda() & 1) << 3; return ret; } -void xavix_i2c_state::write_io1(uint8_t data, uint8_t direction) +WRITE8_MEMBER(xavix_i2c_state::write_io1) { // ignore these writes so that epo_edfx can send read requests to the ee-prom and doesn't just report an error // TODO: check if these writes shouldn't be happening (the first is a direct write, the 2nd is from a port direction change) @@ -532,46 +505,28 @@ void xavix_i2c_state::write_io1(uint8_t data, uint8_t direction) if ((m_maincpu->pc() == hackaddress1) || (m_maincpu->pc() == hackaddress2)) return; - if (direction & 0x08) - { - m_i2cmem->write_sda((data & 0x08) >> 3); - } - - if (direction & 0x10) - { - m_i2cmem->write_scl((data & 0x10) >> 4); - } + m_i2cmem->write_sda((data & 0x08) >> 3); + m_i2cmem->write_scl((data & 0x10) >> 4); } + // for taikodp -uint8_t xavix_i2c_cart_state::read_io1(uint8_t direction) +READ8_MEMBER(xavix_i2c_cart_state::read_cart_io1) { uint8_t ret = m_in1->read(); - - if (!(direction & 0x08)) - { - ret &= ~0x08; - ret |= (m_i2cmem->read_sda() & 1) << 3; - } - + ret &= ~0x08; + ret |= (m_i2cmem->read_sda() & 1) << 3; return ret; } -void xavix_i2c_cart_state::write_io1(uint8_t data, uint8_t direction) +WRITE8_MEMBER(xavix_i2c_cart_state::write_cart_io1) { - if (direction & 0x08) - { - m_i2cmem->write_sda((data & 0x08) >> 3); - } - - if (direction & 0x10) - { - m_i2cmem->write_scl((data & 0x10) >> 4); - } + m_i2cmem->write_sda((data & 0x08) >> 3); + m_i2cmem->write_scl((data & 0x10) >> 4); } -uint8_t xavix_i2c_lotr_state::read_io1(uint8_t direction) +READ8_MEMBER(xavix_i2c_lotr_state::read_lotr_io1) { uint8_t ret = m_in1->read(); @@ -579,16 +534,13 @@ uint8_t xavix_i2c_lotr_state::read_io1(uint8_t direction) ret ^= (machine().rand() & 0x02); ret ^= (machine().rand() & 0x04); - if (!(direction & 0x08)) - { - ret &= ~0x08; - ret |= (m_i2cmem->read_sda() & 1) << 3; - } + ret &= ~0x08; + ret |= (m_i2cmem->read_sda() & 1) << 3; return ret; } -uint8_t xavix_ekara_state::read_io1(uint8_t direction) +READ8_MEMBER(xavix_ekara_state::read_ekara_io1) { uint8_t extrainlatch0 = 0x00; uint8_t extrainlatch1 = 0x00; @@ -635,74 +587,18 @@ uint8_t xavix_ekara_state::read_io1(uint8_t direction) return ret; } -void xavix_ekara_state::write_io0(uint8_t data, uint8_t direction) +WRITE8_MEMBER(xavix_ekara_state::write_ekara_io0) { // is bit 0x80 an enable for something else? LED? Microphone? it doesn't seem related to the multiplexing - m_extraioselect = data & direction; + m_extraioselect = data; } -void xavix_ekara_state::write_io1(uint8_t data, uint8_t direction) +WRITE8_MEMBER(xavix_ekara_state::write_ekara_io1) { - uint8_t extraiowrite = data & direction; + uint8_t extraiowrite = data; m_extraiowrite = extraiowrite; } -/* General IO port handling */ - -READ8_MEMBER(xavix_state::io0_data_r) -{ - uint8_t ret = read_io0(m_io0_direction) & ~m_io0_direction; - ret |= m_io0_data & m_io0_direction; - return ret; -} - -READ8_MEMBER(xavix_state::io1_data_r) -{ - uint8_t ret = read_io1(m_io1_direction) & ~m_io1_direction; - ret |= m_io1_data & m_io1_direction; - return ret; -} - -READ8_MEMBER(xavix_state::io0_direction_r) -{ - return m_io0_direction; -} - -READ8_MEMBER(xavix_state::io1_direction_r) -{ - return m_io1_direction; -} - - -WRITE8_MEMBER(xavix_state::io0_data_w) -{ - m_io0_data = data; - write_io0(data, m_io0_direction); - LOG("%s: io0_data_w %02x\n", machine().describe_context(), data); -} - -WRITE8_MEMBER(xavix_state::io1_data_w) -{ - m_io1_data = data; - write_io1(data, m_io1_direction); - LOG("%s: io1_data_w %02x\n", machine().describe_context(), data); -} - - -WRITE8_MEMBER(xavix_state::io0_direction_w) -{ - m_io0_direction = data; - LOG("%s: io0_direction_w %02x\n", machine().describe_context(), data); - io0_data_w(space, 0, m_io0_data); -} - -WRITE8_MEMBER(xavix_state::io1_direction_w) -{ - m_io1_direction = data; - LOG("%s: io1_direction_w %02x\n", machine().describe_context(), data); - io1_data_w(space, 0, m_io1_data); // requires this for i2cmem to work, is it correct tho? -} - /* Arena (Visible Area + hblank?) handling */ READ8_MEMBER(xavix_state::arena_start_r) @@ -1040,10 +936,6 @@ void xavix_state::machine_start() save_item(NAME(m_extbusctrl)); save_item(NAME(m_ioevent_enable)); save_item(NAME(m_ioevent_active)); - save_item(NAME(m_io0_data)); - save_item(NAME(m_io1_data)); - save_item(NAME(m_io0_direction)); - save_item(NAME(m_io1_direction)); save_item(NAME(m_adc_control)); save_item(NAME(m_sound_irqstatus)); save_item(NAME(m_soundreg16_0)); @@ -1127,12 +1019,6 @@ void xavix_state::machine_reset() //m_lowbus->set_bank(0); - m_io0_data = 0x00; - m_io1_data = 0x00; - - m_io0_direction = 0x00; - m_io1_direction = 0x00; - m_irqsource = 0x00; m_timer_control = 0x00; diff --git a/src/mame/machine/xavix2002_io.cpp b/src/mame/machine/xavix2002_io.cpp index 7fc69e4b95d..e05bac792e4 100644 --- a/src/mame/machine/xavix2002_io.cpp +++ b/src/mame/machine/xavix2002_io.cpp @@ -13,9 +13,9 @@ DEFINE_DEVICE_TYPE(XAVIX2002IO, xavix2002_io_device, "xavix2002io", "XaviX 2002 xavix2002_io_device::xavix2002_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, XAVIX2002IO, tag, owner, clock) - , m_space_read0_cb(*this) - , m_space_read1_cb(*this) - , m_space_read2_cb(*this) + , m_in0_cb(*this) + , m_in1_cb(*this) + , m_in2_cb(*this) , m_out0_cb(*this) , m_out1_cb(*this) , m_out2_cb(*this) @@ -24,9 +24,9 @@ xavix2002_io_device::xavix2002_io_device(const machine_config &mconfig, const ch void xavix2002_io_device::device_start() { - m_space_read0_cb.resolve_safe(0xff); - m_space_read1_cb.resolve_safe(0xff); - m_space_read2_cb.resolve_safe(0xff); + m_in0_cb.resolve_safe(0xff); + m_in1_cb.resolve_safe(0xff); + m_in2_cb.resolve_safe(0xff); m_out0_cb.resolve_safe(); m_out1_cb.resolve_safe(); @@ -103,9 +103,9 @@ READ8_MEMBER(xavix2002_io_device::pio_in_r) switch (offset) { - case 0: ret = m_space_read0_cb(); - case 1: ret = m_space_read1_cb(); - case 2: ret = m_space_read2_cb(); + case 0: ret = m_in0_cb(); + case 1: ret = m_in1_cb(); + case 2: ret = m_in2_cb(); default: ret = 0x00; } diff --git a/src/mame/machine/xavix2002_io.h b/src/mame/machine/xavix2002_io.h index bfddd799194..9f9ba9339ef 100644 --- a/src/mame/machine/xavix2002_io.h +++ b/src/mame/machine/xavix2002_io.h @@ -10,9 +10,9 @@ class xavix2002_io_device : public device_t public: xavix2002_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - auto read_0_callback() { return m_space_read0_cb.bind(); } - auto read_1_callback() { return m_space_read1_cb.bind(); } - auto read_2_callback() { return m_space_read2_cb.bind(); } + auto read_0_callback() { return m_in0_cb.bind(); } + auto read_1_callback() { return m_in1_cb.bind(); } + auto read_2_callback() { return m_in2_cb.bind(); } auto write_0_callback() { return m_out0_cb.bind(); } auto write_1_callback() { return m_out1_cb.bind(); } @@ -32,9 +32,9 @@ protected: virtual void device_reset() override; private: - devcb_read8 m_space_read0_cb; - devcb_read8 m_space_read1_cb; - devcb_read8 m_space_read2_cb; + devcb_read8 m_in0_cb; + devcb_read8 m_in1_cb; + devcb_read8 m_in2_cb; devcb_write8 m_out0_cb; devcb_write8 m_out1_cb; diff --git a/src/mame/machine/xavix_io.cpp b/src/mame/machine/xavix_io.cpp new file mode 100644 index 00000000000..792a57fc372 --- /dev/null +++ b/src/mame/machine/xavix_io.cpp @@ -0,0 +1,106 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood + +#include "emu.h" +#include "xavix_io.h" + +#define VERBOSE 0 +#include "logmacro.h" + +DEFINE_DEVICE_TYPE(XAVIXIO, xavix_io_device, "xavixio", "XaviX IO") + +xavix_io_device::xavix_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, XAVIXIO, tag, owner, clock) + , m_in0_cb(*this) + , m_in1_cb(*this) + , m_out0_cb(*this) + , m_out1_cb(*this) +{ +} + +void xavix_io_device::device_start() +{ + m_in0_cb.resolve_safe(0xff); + m_in1_cb.resolve_safe(0xff); + + m_out0_cb.resolve_safe(); + m_out1_cb.resolve_safe(); + + save_item(NAME(m_dir)); + save_item(NAME(m_dat)); +} + +void xavix_io_device::device_reset() +{ + for (int i = 0; i < 2; i++) + { + m_dir[i] = 0; + m_dat[i] = 0; + } +} + +// direction: 1 is out, 0 is in + +WRITE8_MEMBER(xavix_io_device::xav_7a0x_dir_w) +{ + LOG("%s: xavix IO xav_7a0x_dir_w (port %d) %02x\n", machine().describe_context(), offset, data); + if (offset < 2) + { + m_dir[offset] = data; + + // write out again in case of direction changes + uint8_t outdata = m_dat[offset] & m_dir[offset]; + + switch (offset) + { + case 0x0: m_out0_cb(space, 0, outdata); break; + case 0x1: m_out1_cb(space, 0, outdata); break; + } + } +} + +WRITE8_MEMBER(xavix_io_device::xav_7a0x_dat_w) +{ + LOG("%s: xavix IO xav_7a0x_dat_w (port %d) %02x\n", machine().describe_context(), offset, data); + if (offset < 2) + { + m_dat[offset] = data; + + uint8_t outdata = m_dat[offset] & m_dir[offset]; + + switch (offset) + { + case 0x0: m_out0_cb(space, 0, outdata); break; + case 0x1: m_out1_cb(space, 0, outdata); break; + } + } +} + +READ8_MEMBER(xavix_io_device::xav_7a0x_dir_r) +{ + uint8_t ret = 0x00; + LOG("%s: xavix IO xav_7a0x_dir_r (port %d)\n", machine().describe_context(), offset); + if (offset < 2) + { + ret = m_dir[offset]; + } + return ret; +} + +READ8_MEMBER(xavix_io_device::xav_7a0x_dat_r) +{ + uint8_t ret = 0x00; + LOG("%s: xavix IO xav_7a0x_dat_r (port %d)\n", machine().describe_context(), offset); + if (offset < 2) + { + switch (offset) + { + case 0x0: ret = m_in0_cb(space, 0); break; + case 0x1: ret = m_in1_cb(space, 0); break; + } + + ret &= ~m_dir[offset]; + ret |= m_dat[offset] & m_dir[offset]; + } + return ret; +} diff --git a/src/mame/machine/xavix_io.h b/src/mame/machine/xavix_io.h new file mode 100644 index 00000000000..31bb695d3f5 --- /dev/null +++ b/src/mame/machine/xavix_io.h @@ -0,0 +1,42 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood + +#ifndef MAME_MACHINE_XAVIX_IO_H +#define MAME_MACHINE_XAVIX_IO_H + +class xavix_io_device : public device_t +{ +public: + xavix_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + auto read_0_callback() { return m_in0_cb.bind(); } + auto read_1_callback() { return m_in1_cb.bind(); } + + auto write_0_callback() { return m_out0_cb.bind(); } + auto write_1_callback() { return m_out1_cb.bind(); } + + DECLARE_WRITE8_MEMBER(xav_7a0x_dir_w); + DECLARE_WRITE8_MEMBER(xav_7a0x_dat_w); + + DECLARE_READ8_MEMBER(xav_7a0x_dir_r); + DECLARE_READ8_MEMBER(xav_7a0x_dat_r); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + +private: + devcb_read8 m_in0_cb; + devcb_read8 m_in1_cb; + + devcb_write8 m_out0_cb; + devcb_write8 m_out1_cb; + + uint8_t m_dir[2]; + uint8_t m_dat[2]; +}; + +DECLARE_DEVICE_TYPE(XAVIXIO, xavix_io_device) + +#endif // MAME_MACHINE_XAVIX_IO_H From 17c00cc3c4a91ecaec92134fcabea4e30475dc1e Mon Sep 17 00:00:00 2001 From: DavidHaywood <28625134+DavidHaywood@users.noreply.github.com> Date: Wed, 23 Jan 2019 22:31:31 +0000 Subject: [PATCH 09/16] new NOT WORKING --- XaviX Bowling (XaviXPORT) [Sean Riddle, Peter Wilhelmsen] --- src/mame/drivers/xavix.cpp | 6 ++++++ src/mame/machine/xavix2002_io.cpp | 8 ++++---- src/mame/mame.lst | 1 + 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp index 6822a463649..473a5557c6e 100644 --- a/src/mame/drivers/xavix.cpp +++ b/src/mame/drivers/xavix.cpp @@ -1626,6 +1626,11 @@ ROM_START( xavbaseb ) ROM_LOAD( "xpbaseball.bin", 0x000000, 0x800000, CRC(e9ed692d) SHA1(537e390e972156dc7da66ee127ae4c8052038ee5) ) ROM_END +ROM_START( xavbowl ) + ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 ) + ROM_LOAD( "xpbowling.bin", 0x000000, 0x800000, CRC(2873460b) SHA1(ea8e2392f5a12961a23eb66dca8e07dec81ce8c8) ) +ROM_END + ROM_START( xavbassf ) ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 ) ROM_LOAD( "xpbassfishing.bin", 0x000000, 0x800000, CRC(09ab2f29) SHA1(616254176315d0947002e9ae5a6371a3ffa2e8eb) ) @@ -1652,6 +1657,7 @@ CONS( 2005, tmy_thom, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xa CONS( 2004, xavtenni, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Tennis (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) CONS( 2004, xavbaseb, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Baseball (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2004, xavbowl, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Bowling (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has IR 'Camera' // Bass Fishing PCB is just like Tennis except with an RF daughterboard. CONS( 2004, xavbassf, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Bass Fishing (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/machine/xavix2002_io.cpp b/src/mame/machine/xavix2002_io.cpp index e05bac792e4..63cc244fdfb 100644 --- a/src/mame/machine/xavix2002_io.cpp +++ b/src/mame/machine/xavix2002_io.cpp @@ -103,10 +103,10 @@ READ8_MEMBER(xavix2002_io_device::pio_in_r) switch (offset) { - case 0: ret = m_in0_cb(); - case 1: ret = m_in1_cb(); - case 2: ret = m_in2_cb(); - default: ret = 0x00; + case 0: ret = m_in0_cb(); break; + case 1: ret = m_in1_cb(); break; + case 2: ret = m_in2_cb(); break; + default: ret = 0x00; break; } // mask with direction register before returning diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 7467b8807ca..20256f51e55 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -39774,6 +39774,7 @@ drgqst // xavtenni // xavbaseb // xavbassf // +xavbowl // xavjmat // tmy_thom // domfitex // From 77bb2145a32c52849964f4d23ed6814584b354c1 Mon Sep 17 00:00:00 2001 From: DavidHaywood <28625134+DavidHaywood@users.noreply.github.com> Date: Thu, 24 Jan 2019 00:56:40 +0000 Subject: [PATCH 10/16] (nw) --- src/mame/machine/xavix_io.cpp | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/mame/machine/xavix_io.cpp b/src/mame/machine/xavix_io.cpp index 792a57fc372..9aaba17999f 100644 --- a/src/mame/machine/xavix_io.cpp +++ b/src/mame/machine/xavix_io.cpp @@ -47,16 +47,10 @@ WRITE8_MEMBER(xavix_io_device::xav_7a0x_dir_w) if (offset < 2) { m_dir[offset] = data; - - // write out again in case of direction changes - uint8_t outdata = m_dat[offset] & m_dir[offset]; - - switch (offset) - { - case 0x0: m_out0_cb(space, 0, outdata); break; - case 0x1: m_out1_cb(space, 0, outdata); break; - } + // write back to the port + xav_7a0x_dat_w(space,offset,m_dat[offset]); } + } WRITE8_MEMBER(xavix_io_device::xav_7a0x_dat_w) From 10bb978312fb0a4627273ed9521e64a2e848c82a Mon Sep 17 00:00:00 2001 From: DavidHaywood <28625134+DavidHaywood@users.noreply.github.com> Date: Thu, 24 Jan 2019 10:56:31 +0000 Subject: [PATCH 11/16] new NOT WORKING --- XaviX Boxing (XaviXPORT) [Sean Riddle, Peter Wilhelmsen] + some notes by Sean on the cameras --- src/devices/cpu/m6502/oxavix2000.lst | 8 ++++++-- src/mame/drivers/xavix.cpp | 27 +++++++++++++++++++++++++++ src/mame/mame.lst | 1 + 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/devices/cpu/m6502/oxavix2000.lst b/src/devices/cpu/m6502/oxavix2000.lst index c51b0263e1a..46456d6b7ea 100644 --- a/src/devices/cpu/m6502/oxavix2000.lst +++ b/src/devices/cpu/m6502/oxavix2000.lst @@ -448,8 +448,12 @@ asr_zpg prefetch(); asr_aba - fatalerror("unhandled opcode %02x%04x: %02x\n", m_codebank, PPC, inst_state); - read_pc_noinc(); + TMP = read_pc(); + TMP = set_h(TMP, read_pc()); + TMP2 = read(TMP); + write(TMP, TMP2); + TMP2 = do_asr(TMP2); // used by xavbox, see 14e8 + write(TMP, TMP2); prefetch(); asr_zpx diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp index 473a5557c6e..17dd120a926 100644 --- a/src/mame/drivers/xavix.cpp +++ b/src/mame/drivers/xavix.cpp @@ -201,12 +201,32 @@ Fitness Dance has an Atmel H93864C (maybe SEEPROM?) a Microchip DSPIC 33FJ12GP202 and two JRC 2740 dual op amps. Music and Circuit has a 24CS64, two UTC324 quad op amps, a 74HC14, a 74HCT04, and an 8-pin SOIC labeled 61545, which is likely an M61545 dual electronic volume control. + It looks like the sensors (cameras) are from ETOMS + They are all 32x32 arrays except Fitness Play, which is 64x64. Most of the PCBs are marked CIS. + Bowling and Boxing look identical. + LOTR and SW look identical + DQ looks similar to LOTR + Real Swing Golf (different driver) and Fitness Play look different from all the others. + + The sensor dies for Bowling, Boxing, Star Wars and DQ are labeled CU5501A. + LOTR is CU5501 + Real Swing Golf is CU5502 + Fitness Play is S-5300A SLH2039H and does not have ETOMS on it. + The Fitness Play main PCB has an extra glob next to the ribbon cable to the camera. + Most of the camera PCBs connect to the main PCB with an 18-20 wire ribbon cable. + + Real Swing Golf just has 6 wires, Its camera PCB is the only one with a ceramic resonator + Maybe the CU5502 chip offloads some processing from the CPU? + + + NOTES: Play TV Monster Truck runs off an entirely different codebase to everything else, presumably coded by the developer from scratch rather than using code supplied by SSD Company LTD Play TV Rescue Heroes fails to display any kind of XaviX logo or SSD Copyright, it is the only XaviX based game so far to not show these details anywhere in the game. + ***************************************************************************/ #include "emu.h" @@ -1636,6 +1656,12 @@ ROM_START( xavbassf ) ROM_LOAD( "xpbassfishing.bin", 0x000000, 0x800000, CRC(09ab2f29) SHA1(616254176315d0947002e9ae5a6371a3ffa2e8eb) ) ROM_END +ROM_START( xavbox ) + ROM_REGION( 0x800000, "bios", ROMREGION_ERASE00 ) + ROM_LOAD( "xpboxing.bin", 0x000000, 0x800000, CRC(b61e7717) SHA1(162b9c53ac8c9d7b6972db44f7bc1cb0a7837b70) ) +ROM_END + + ROM_START( xavjmat ) ROM_REGION( 0x1000000, "bios", ROMREGION_ERASE00 ) ROM_LOAD( "xpjmat.bin", 0x000000, 0x1000000, CRC(71a51eef) SHA1(41fd2c3013d1c86756046ec9174e94400f8fa06d) ) @@ -1658,6 +1684,7 @@ CONS( 2005, tmy_thom, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xa CONS( 2004, xavtenni, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Tennis (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) CONS( 2004, xavbaseb, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Baseball (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) CONS( 2004, xavbowl, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Bowling (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has IR 'Camera' +CONS( 2004, xavbox, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Boxing (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has IR 'Camera' // Bass Fishing PCB is just like Tennis except with an RF daughterboard. CONS( 2004, xavbassf, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Bass Fishing (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 20256f51e55..10e740ae681 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -39775,6 +39775,7 @@ xavtenni // xavbaseb // xavbassf // xavbowl // +xavbox // xavjmat // tmy_thom // domfitex // From 10b63ef454a48aec103381ea1657754b639cbf5a Mon Sep 17 00:00:00 2001 From: DavidHaywood <28625134+DavidHaywood@users.noreply.github.com> Date: Thu, 24 Jan 2019 12:05:14 +0000 Subject: [PATCH 12/16] revert some refactoring changes for now, cause more problems than they solve (nw) --- src/mame/drivers/xavix.cpp | 56 +++---------- src/mame/includes/xavix.h | 49 +++++++----- src/mame/machine/xavix.cpp | 156 ++++++++++++++++++++++++++++++++----- 3 files changed, 173 insertions(+), 88 deletions(-) diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp index 17dd120a926..18587b22731 100644 --- a/src/mame/drivers/xavix.cpp +++ b/src/mame/drivers/xavix.cpp @@ -358,8 +358,10 @@ void xavix_state::xavix_lowbus_map(address_map &map) map(0x7986, 0x7987).ram().w(FUNC(xavix_state::rom_dmalen_w)).share("rom_dma_len"); // IO Ports - map(0x7a00, 0x7a01).rw("xavixio", FUNC(xavix_io_device::xav_7a0x_dat_r), FUNC(xavix_io_device::xav_7a0x_dat_w)); - map(0x7a02, 0x7a03).rw("xavixio", FUNC(xavix_io_device::xav_7a0x_dir_r), FUNC(xavix_io_device::xav_7a0x_dir_w)); + map(0x7a00, 0x7a00).rw(FUNC(xavix_state::io0_data_r), FUNC(xavix_state::io0_data_w)); + map(0x7a01, 0x7a01).rw(FUNC(xavix_state::io1_data_r), FUNC(xavix_state::io1_data_w)); + map(0x7a02, 0x7a02).rw(FUNC(xavix_state::io0_direction_r), FUNC(xavix_state::io0_direction_w)); + map(0x7a03, 0x7a03).rw(FUNC(xavix_state::io1_direction_r), FUNC(xavix_state::io1_direction_w)); // IO Event Interrupt control map(0x7a80, 0x7a80).rw(FUNC(xavix_state::ioevent_enable_r), FUNC(xavix_state::ioevent_enable_w)); @@ -1027,10 +1029,6 @@ void xavix_state::xavix(machine_config &config) PALETTE(config, m_palette, palette_device::BLACK, 256); - XAVIXIO(config, m_xavio, 0); - m_xavio->read_0_callback().set_ioport("IN0"); - m_xavio->read_1_callback().set_ioport("IN1"); - /* sound hardware */ //SPEAKER(config, "mono").front_center(); @@ -1049,9 +1047,6 @@ void xavix_i2c_state::xavix_i2c_24lc02(machine_config &config) { xavix(config); - m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); - m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); - I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x100); // 24LC02 (taiko) } @@ -1059,9 +1054,6 @@ void xavix_i2c_state::xavix_i2c_24c02(machine_config &config) { xavix(config); - m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); - m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); - I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x100); // 24C02 } @@ -1069,9 +1061,6 @@ void xavix_i2c_state::xavix_i2c_24lc04(machine_config &config) { xavix(config); - m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); - m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); - // according to http://ww1.microchip.com/downloads/en/devicedoc/21708k.pdf 'the master transmits up to 16 data bytes' however this breaks the Nostalgia games // of note Galplus Phalanx on Namco Nostalgia 2, which will hang between stages unable to properly access the device, but with no page support it doesn't hang and scores save I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x200); // 24LC04 on Nostalgia games, 24C04 on others @@ -1081,9 +1070,6 @@ void xavix_i2c_state::xavix_i2c_24c08(machine_config &config) { xavix(config); - m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); - m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); - I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x400); // 24C08 (Excite Fishing DX) } @@ -1152,9 +1138,6 @@ void xavix_i2c_state::xavix2000_i2c_24c04(machine_config &config) { xavix2000(config); - m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); - m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); - I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x200); // 24C04 } @@ -1162,20 +1145,9 @@ void xavix_i2c_state::xavix2000_i2c_24c02(machine_config &config) { xavix2000(config); - m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); - m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); - I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x100); // 24C02 } -void xavix_i2c_lotr_state::xavix2000_i2c_24c02_lotr(machine_config &config) -{ - xavix2000_i2c_24c02(config); - - m_xavio->read_1_callback().set(FUNC(xavix_i2c_lotr_state::read_lotr_io1)); -} - - void xavix_mtrk_state::xavix_mtrk(machine_config &config) { xavix(config); @@ -1216,13 +1188,10 @@ void xavix_i2c_cart_state::xavix_i2c_taiko(machine_config &config) SOFTWARE_LIST(config, "cart_list_japan_d").set_original("ekara_japan_d"); SOFTWARE_LIST(config, "cart_list_japan_sp").set_original("ekara_japan_sp"); - m_xavio->read_1_callback().set(FUNC(xavix_i2c_cart_state::read_cart_io1)); - m_xavio->write_1_callback().set(FUNC(xavix_i2c_cart_state::write_cart_io1)); - // do any of the later G/P series carts with SEEPROM work with this too? check } -void xavix_ekara_state::xavix_cart_ekara(machine_config &config) +void xavix_cart_state::xavix_cart_ekara(machine_config &config) { xavix_cart(config); @@ -1238,10 +1207,6 @@ void xavix_ekara_state::xavix_cart_ekara(machine_config &config) SOFTWARE_LIST(config, "cart_list_japan_en").set_original("ekara_japan_en"); SOFTWARE_LIST(config, "cart_list_japan_sp").set_original("ekara_japan_sp"); SOFTWARE_LIST(config, "cart_list_japan_web").set_original("ekara_japan_web"); - - m_xavio->write_0_callback().set(FUNC(xavix_ekara_state::write_ekara_io0)); - m_xavio->read_1_callback().set(FUNC(xavix_ekara_state::read_ekara_io1)); - m_xavio->write_1_callback().set(FUNC(xavix_ekara_state::write_ekara_io1)); } void xavix_cart_state::xavix_cart_popira(machine_config &config) @@ -1273,9 +1238,6 @@ void xavix_i2c_state::xavix2002_i2c_24c04(machine_config &config) { xavix2002(config); - m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); - m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); - I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x200); // 24C04 } @@ -1611,10 +1573,10 @@ ROM_END CONS( 2004, epo_sdb, 0, 0, xavix2000_nv, epo_sdb, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Super Dash Ball (Japan)", MACHINE_IMPERFECT_SOUND ) -CONS( 2005, ttv_sw, 0, 0, xavix2000_i2c_24c02_lotr, xavix, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Star Wars Saga Edition - Lightsaber Battle Game", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 2005, ttv_lotr, 0, 0, xavix2000_i2c_24c02_lotr, xavix, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Lord Of The Rings - Warrior of Middle-Earth", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 2005, ttv_mx, 0, 0, xavix2000_i2c_24c04, ttv_mx, xavix_i2c_state, init_xavix, "Tiger / SSD Company LTD", "MX Dirt Rebel", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 2003, drgqst, 0, 0, xavix2000_i2c_24c02_lotr, xavix, xavix_i2c_lotr_state, init_xavix, "Square Enix / SSD Company LTD", "Kenshin Dragon Quest: Yomigaerishi Densetsu no Ken", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, ttv_sw, 0, 0, xavix2000_i2c_24c02, xavix, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Star Wars Saga Edition - Lightsaber Battle Game", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, ttv_lotr, 0, 0, xavix2000_i2c_24c02, xavix, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Lord Of The Rings - Warrior of Middle-Earth", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, ttv_mx, 0, 0, xavix2000_i2c_24c04, ttv_mx, xavix_i2c_state, init_xavix, "Tiger / SSD Company LTD", "MX Dirt Rebel", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2003, drgqst, 0, 0, xavix2000_i2c_24c02, xavix , xavix_i2c_lotr_state, init_xavix, "Square Enix / SSD Company LTD", "Kenshin Dragon Quest: Yomigaerishi Densetsu no Ken", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) /* SuperXaviX (XaviX 2002 type CPU) hardware titles (3rd XaviX generation?) diff --git a/src/mame/includes/xavix.h b/src/mame/includes/xavix.h index 3ff2a63637b..2e617787190 100644 --- a/src/mame/includes/xavix.h +++ b/src/mame/includes/xavix.h @@ -77,7 +77,6 @@ public: m_mouse1x(*this, "MOUSE1X"), m_mouse1y(*this, "MOUSE1Y"), m_maincpu(*this, "maincpu"), - m_xavio(*this, "xavixio"), m_nvram(*this, "nvram"), m_screen(*this, "screen"), m_lowbus(*this, "lowbus"), @@ -172,10 +171,10 @@ public: protected: - //virtual uint8_t read_io0(uint8_t direction); - //virtual uint8_t read_io1(uint8_t direction); - //virtual void write_io0(uint8_t data, uint8_t direction); - //virtual void write_io1(uint8_t data, uint8_t direction); + virtual uint8_t read_io0(uint8_t direction); + virtual uint8_t read_io1(uint8_t direction); + virtual void write_io0(uint8_t data, uint8_t direction); + virtual void write_io1(uint8_t data, uint8_t direction); required_ioport m_in0; required_ioport m_in1; required_ioport_array<8> m_an_in; @@ -184,10 +183,6 @@ protected: optional_ioport m_mouse1x; optional_ioport m_mouse1y; required_device m_maincpu; - required_device m_xavio; - - - optional_device m_nvram; required_device m_screen; required_device m_lowbus; @@ -309,6 +304,21 @@ private: DECLARE_WRITE8_MEMBER(spritefragment_dma_trg_w); DECLARE_READ8_MEMBER(spritefragment_dma_status_r); + DECLARE_READ8_MEMBER(io0_data_r); + DECLARE_READ8_MEMBER(io1_data_r); + DECLARE_WRITE8_MEMBER(io0_data_w); + DECLARE_WRITE8_MEMBER(io1_data_w); + + DECLARE_READ8_MEMBER(io0_direction_r); + DECLARE_READ8_MEMBER(io1_direction_r); + DECLARE_WRITE8_MEMBER(io0_direction_w); + DECLARE_WRITE8_MEMBER(io1_direction_w); + + uint8_t m_io0_data; + uint8_t m_io1_data; + uint8_t m_io0_direction; + uint8_t m_io1_direction; + uint8_t m_adc_inlatch; DECLARE_READ8_MEMBER(nmi_vector_lo_r); @@ -599,8 +609,8 @@ public: hackaddress2 = 0x8524; } protected: - DECLARE_READ8_MEMBER(read_io1); - DECLARE_WRITE8_MEMBER(write_io1); + virtual uint8_t read_io1(uint8_t direction) override; + virtual void write_io1(uint8_t data, uint8_t direction) override; required_device m_i2cmem; @@ -632,10 +642,9 @@ public: : xavix_i2c_state(mconfig, type, tag) { } - void xavix2000_i2c_24c02_lotr(machine_config &config); - protected: - DECLARE_READ8_MEMBER(read_lotr_io1); + virtual uint8_t read_io1(uint8_t direction) override; + //virtual void write_io1(uint8_t data, uint8_t direction) override; }; @@ -681,6 +690,7 @@ public: { } void xavix_cart(machine_config &config); + void xavix_cart_ekara(machine_config &config); void xavix_cart_popira(machine_config &config); void xavix_cart_ddrfammt(machine_config &config); @@ -842,8 +852,8 @@ public: void xavix_i2c_taiko(machine_config &config); protected: - DECLARE_READ8_MEMBER(read_cart_io1); - DECLARE_WRITE8_MEMBER(write_cart_io1); + virtual uint8_t read_io1(uint8_t direction) override; + virtual void write_io1(uint8_t data, uint8_t direction) override; required_device m_i2cmem; }; @@ -861,16 +871,15 @@ public: { } // void xavix_ekara(machine_config &config); - void xavix_cart_ekara(machine_config &config); protected: required_ioport m_extra0; required_ioport m_extra1; - DECLARE_READ8_MEMBER(read_ekara_io1); - DECLARE_WRITE8_MEMBER(write_ekara_io0); - DECLARE_WRITE8_MEMBER(write_ekara_io1); + virtual uint8_t read_io1(uint8_t direction) override; + virtual void write_io0(uint8_t data, uint8_t direction) override; + virtual void write_io1(uint8_t data, uint8_t direction) override; uint8_t m_extraioselect; uint8_t m_extraiowrite; diff --git a/src/mame/machine/xavix.cpp b/src/mame/machine/xavix.cpp index 2925eb47c9d..505e43ac159 100644 --- a/src/mame/machine/xavix.cpp +++ b/src/mame/machine/xavix.cpp @@ -488,15 +488,42 @@ WRITE8_MEMBER(xavix_state::dispctrl_posirq_y_w) /* Per Game IO port callbacks */ -READ8_MEMBER(xavix_i2c_state::read_io1) +uint8_t xavix_state::read_io0(uint8_t direction) +{ + // no special handling + return m_in0->read(); +} + +uint8_t xavix_state::read_io1(uint8_t direction) +{ + // no special handling + return m_in1->read(); +} + +void xavix_state::write_io0(uint8_t data, uint8_t direction) +{ + // no special handling +} + +void xavix_state::write_io1(uint8_t data, uint8_t direction) +{ + // no special handling +} + +uint8_t xavix_i2c_state::read_io1(uint8_t direction) { uint8_t ret = m_in1->read(); - ret &= ~0x08; - ret |= (m_i2cmem->read_sda() & 1) << 3; + + if (!(direction & 0x08)) + { + ret &= ~0x08; + ret |= (m_i2cmem->read_sda() & 1) << 3; + } + return ret; } -WRITE8_MEMBER(xavix_i2c_state::write_io1) +void xavix_i2c_state::write_io1(uint8_t data, uint8_t direction) { // ignore these writes so that epo_edfx can send read requests to the ee-prom and doesn't just report an error // TODO: check if these writes shouldn't be happening (the first is a direct write, the 2nd is from a port direction change) @@ -505,28 +532,46 @@ WRITE8_MEMBER(xavix_i2c_state::write_io1) if ((m_maincpu->pc() == hackaddress1) || (m_maincpu->pc() == hackaddress2)) return; - m_i2cmem->write_sda((data & 0x08) >> 3); - m_i2cmem->write_scl((data & 0x10) >> 4); + if (direction & 0x08) + { + m_i2cmem->write_sda((data & 0x08) >> 3); + } + + if (direction & 0x10) + { + m_i2cmem->write_scl((data & 0x10) >> 4); + } } - // for taikodp -READ8_MEMBER(xavix_i2c_cart_state::read_cart_io1) +uint8_t xavix_i2c_cart_state::read_io1(uint8_t direction) { uint8_t ret = m_in1->read(); - ret &= ~0x08; - ret |= (m_i2cmem->read_sda() & 1) << 3; + + if (!(direction & 0x08)) + { + ret &= ~0x08; + ret |= (m_i2cmem->read_sda() & 1) << 3; + } + return ret; } -WRITE8_MEMBER(xavix_i2c_cart_state::write_cart_io1) +void xavix_i2c_cart_state::write_io1(uint8_t data, uint8_t direction) { - m_i2cmem->write_sda((data & 0x08) >> 3); - m_i2cmem->write_scl((data & 0x10) >> 4); + if (direction & 0x08) + { + m_i2cmem->write_sda((data & 0x08) >> 3); + } + + if (direction & 0x10) + { + m_i2cmem->write_scl((data & 0x10) >> 4); + } } -READ8_MEMBER(xavix_i2c_lotr_state::read_lotr_io1) +uint8_t xavix_i2c_lotr_state::read_io1(uint8_t direction) { uint8_t ret = m_in1->read(); @@ -534,13 +579,16 @@ READ8_MEMBER(xavix_i2c_lotr_state::read_lotr_io1) ret ^= (machine().rand() & 0x02); ret ^= (machine().rand() & 0x04); - ret &= ~0x08; - ret |= (m_i2cmem->read_sda() & 1) << 3; + if (!(direction & 0x08)) + { + ret &= ~0x08; + ret |= (m_i2cmem->read_sda() & 1) << 3; + } return ret; } -READ8_MEMBER(xavix_ekara_state::read_ekara_io1) +uint8_t xavix_ekara_state::read_io1(uint8_t direction) { uint8_t extrainlatch0 = 0x00; uint8_t extrainlatch1 = 0x00; @@ -587,18 +635,74 @@ READ8_MEMBER(xavix_ekara_state::read_ekara_io1) return ret; } -WRITE8_MEMBER(xavix_ekara_state::write_ekara_io0) +void xavix_ekara_state::write_io0(uint8_t data, uint8_t direction) { // is bit 0x80 an enable for something else? LED? Microphone? it doesn't seem related to the multiplexing - m_extraioselect = data; + m_extraioselect = data & direction; } -WRITE8_MEMBER(xavix_ekara_state::write_ekara_io1) +void xavix_ekara_state::write_io1(uint8_t data, uint8_t direction) { - uint8_t extraiowrite = data; + uint8_t extraiowrite = data & direction; m_extraiowrite = extraiowrite; } +/* General IO port handling */ + +READ8_MEMBER(xavix_state::io0_data_r) +{ + uint8_t ret = read_io0(m_io0_direction) & ~m_io0_direction; + ret |= m_io0_data & m_io0_direction; + return ret; +} + +READ8_MEMBER(xavix_state::io1_data_r) +{ + uint8_t ret = read_io1(m_io1_direction) & ~m_io1_direction; + ret |= m_io1_data & m_io1_direction; + return ret; +} + +READ8_MEMBER(xavix_state::io0_direction_r) +{ + return m_io0_direction; +} + +READ8_MEMBER(xavix_state::io1_direction_r) +{ + return m_io1_direction; +} + + +WRITE8_MEMBER(xavix_state::io0_data_w) +{ + m_io0_data = data; + write_io0(data, m_io0_direction); + LOG("%s: io0_data_w %02x\n", machine().describe_context(), data); +} + +WRITE8_MEMBER(xavix_state::io1_data_w) +{ + m_io1_data = data; + write_io1(data, m_io1_direction); + LOG("%s: io1_data_w %02x\n", machine().describe_context(), data); +} + + +WRITE8_MEMBER(xavix_state::io0_direction_w) +{ + m_io0_direction = data; + LOG("%s: io0_direction_w %02x\n", machine().describe_context(), data); + io0_data_w(space, 0, m_io0_data); +} + +WRITE8_MEMBER(xavix_state::io1_direction_w) +{ + m_io1_direction = data; + LOG("%s: io1_direction_w %02x\n", machine().describe_context(), data); + io1_data_w(space, 0, m_io1_data); // requires this for i2cmem to work, is it correct tho? +} + /* Arena (Visible Area + hblank?) handling */ READ8_MEMBER(xavix_state::arena_start_r) @@ -936,6 +1040,10 @@ void xavix_state::machine_start() save_item(NAME(m_extbusctrl)); save_item(NAME(m_ioevent_enable)); save_item(NAME(m_ioevent_active)); + save_item(NAME(m_io0_data)); + save_item(NAME(m_io1_data)); + save_item(NAME(m_io0_direction)); + save_item(NAME(m_io1_direction)); save_item(NAME(m_adc_control)); save_item(NAME(m_sound_irqstatus)); save_item(NAME(m_soundreg16_0)); @@ -1019,6 +1127,12 @@ void xavix_state::machine_reset() //m_lowbus->set_bank(0); + m_io0_data = 0x00; + m_io1_data = 0x00; + + m_io0_direction = 0x00; + m_io1_direction = 0x00; + m_irqsource = 0x00; m_timer_control = 0x00; From 85ce5818c1171001062d9d27d53f1b93cbdbb608 Mon Sep 17 00:00:00 2001 From: DavidHaywood <28625134+DavidHaywood@users.noreply.github.com> Date: Thu, 24 Jan 2019 12:09:15 +0000 Subject: [PATCH 13/16] (nw) --- src/mame/machine/xavix.cpp | 25 ++++++------------------- src/mame/machine/xavix_io.cpp | 3 +++ 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/src/mame/machine/xavix.cpp b/src/mame/machine/xavix.cpp index 505e43ac159..ce54e995846 100644 --- a/src/mame/machine/xavix.cpp +++ b/src/mame/machine/xavix.cpp @@ -513,13 +513,8 @@ void xavix_state::write_io1(uint8_t data, uint8_t direction) uint8_t xavix_i2c_state::read_io1(uint8_t direction) { uint8_t ret = m_in1->read(); - - if (!(direction & 0x08)) - { - ret &= ~0x08; - ret |= (m_i2cmem->read_sda() & 1) << 3; - } - + ret &= ~0x08; + ret |= (m_i2cmem->read_sda() & 1) << 3; return ret; } @@ -547,13 +542,8 @@ void xavix_i2c_state::write_io1(uint8_t data, uint8_t direction) uint8_t xavix_i2c_cart_state::read_io1(uint8_t direction) { uint8_t ret = m_in1->read(); - - if (!(direction & 0x08)) - { - ret &= ~0x08; - ret |= (m_i2cmem->read_sda() & 1) << 3; - } - + ret &= ~0x08; + ret |= (m_i2cmem->read_sda() & 1) << 3; return ret; } @@ -579,11 +569,8 @@ uint8_t xavix_i2c_lotr_state::read_io1(uint8_t direction) ret ^= (machine().rand() & 0x02); ret ^= (machine().rand() & 0x04); - if (!(direction & 0x08)) - { - ret &= ~0x08; - ret |= (m_i2cmem->read_sda() & 1) << 3; - } + ret &= ~0x08; + ret |= (m_i2cmem->read_sda() & 1) << 3; return ret; } diff --git a/src/mame/machine/xavix_io.cpp b/src/mame/machine/xavix_io.cpp index 9aaba17999f..e08a8cecc31 100644 --- a/src/mame/machine/xavix_io.cpp +++ b/src/mame/machine/xavix_io.cpp @@ -1,6 +1,9 @@ // license:BSD-3-Clause // copyright-holders:David Haywood +// TODO: hook this back up, and work out why taikodp eeprom breaks when it is hooked up. epo_efdx breakage is expected because that requires an ugly hack to get to the title +// note, eeproms don't work properly in most games at the moment, but no behavioral change was expected with taikodp + #include "emu.h" #include "xavix_io.h" From 6bdb818a728ce8e68f9d8deb060947750d5abf23 Mon Sep 17 00:00:00 2001 From: DavidHaywood <28625134+DavidHaywood@users.noreply.github.com> Date: Thu, 24 Jan 2019 13:45:53 +0000 Subject: [PATCH 14/16] some refactor (nw) --- src/mame/drivers/xavix.cpp | 90 +++++++++++++++++++++++++++++++------- src/mame/includes/xavix.h | 20 +++++++-- src/mame/machine/xavix.cpp | 29 ------------ 3 files changed, 90 insertions(+), 49 deletions(-) diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp index 18587b22731..8f041d0865e 100644 --- a/src/mame/drivers/xavix.cpp +++ b/src/mame/drivers/xavix.cpp @@ -428,6 +428,28 @@ void xavix_state::superxavix_lowbus_map(address_map &map) map(0x7ffd, 0x7ffd).nopw(); // looks like a watchdog? } + + +CUSTOM_INPUT_MEMBER(xavix_i2c_state::i2c_r) +{ + return m_i2cmem->read_sda(); +} + +CUSTOM_INPUT_MEMBER(xavix_i2c_cart_state::i2c_r) +{ + return m_i2cmem->read_sda(); +} + +CUSTOM_INPUT_MEMBER(xavix_i2c_lotr_state::camera_r) // seems to be some kind of camera status bits +{ + return machine().rand(); +} + +CUSTOM_INPUT_MEMBER(xavix_i2c_bowl_state::camera_r) // seems to be some kind of camera status bits +{ + return machine().rand(); +} + static INPUT_PORTS_START( xavix ) PORT_START("IN0") PORT_DIPNAME( 0x01, 0x00, "IN0" ) @@ -533,6 +555,30 @@ static INPUT_PORTS_START( xavix_an ) PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_SENSITIVITY(100) PORT_KEYDELTA(20) INPUT_PORTS_END +static INPUT_PORTS_START( xavix_i2c ) + PORT_INCLUDE(xavix) + + PORT_MODIFY("IN1") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_i2c_state,i2c_r, nullptr) +INPUT_PORTS_END + +static INPUT_PORTS_START( ttv_lotr ) + PORT_INCLUDE(xavix) + + PORT_MODIFY("IN1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_i2c_lotr_state,camera_r, nullptr) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_i2c_lotr_state,camera_r, nullptr) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_i2c_state,i2c_r, nullptr) +INPUT_PORTS_END + +static INPUT_PORTS_START( xavix_bowl ) + PORT_INCLUDE(xavix) + + PORT_MODIFY("IN1") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_i2c_bowl_state,camera_r, nullptr) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_i2c_bowl_state,camera_r, nullptr) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_i2c_state,i2c_r, nullptr) +INPUT_PORTS_END static INPUT_PORTS_START( epo_sdb ) PORT_INCLUDE(xavix) @@ -580,6 +626,9 @@ static INPUT_PORTS_START( taikodp ) PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_MODIFY("AN6") // 12 PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_MODIFY("IN1") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_i2c_cart_state,i2c_r, nullptr) INPUT_PORTS_END @@ -855,7 +904,7 @@ static INPUT_PORTS_START( rad_pingp ) INPUT_PORTS_END static INPUT_PORTS_START( nostalgia ) - PORT_INCLUDE(xavix) + PORT_INCLUDE(xavix_i2c) PORT_MODIFY("IN0") // mappings based on Dragon Buster button list, inputs don't seem to work properly in some games, probably because bad EEPROM support means all buttons are mapped to the same thing? PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) // Fire4 @@ -891,7 +940,7 @@ static INPUT_PORTS_START( rad_bb2 ) INPUT_PORTS_END static INPUT_PORTS_START( ttv_mx ) - PORT_INCLUDE(xavix) + PORT_INCLUDE(xavix_i2c) PORT_MODIFY("IN0") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) // Accel @@ -935,7 +984,7 @@ static INPUT_PORTS_START( rad_rh ) INPUT_PORTS_END static INPUT_PORTS_START( epo_efdx ) - PORT_INCLUDE(xavix) + PORT_INCLUDE(xavix_i2c) PORT_MODIFY("IN0") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) // select @@ -947,6 +996,13 @@ static INPUT_PORTS_START( epo_efdx ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) INPUT_PORTS_END +static INPUT_PORTS_START( has_wamg ) + PORT_INCLUDE(xavix) + + PORT_MODIFY("IN1") + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) // waits for this after fading out title, what is it? +INPUT_PORTS_END + /* correct, 4bpp gfxs */ static const gfx_layout charlayout = { @@ -1513,9 +1569,9 @@ CONS( 200?, epo_efdx, 0, 0, xavix_i2c_24c08, epo_efdx, xavix_i2c_sta CONS( 2005, epo_guru, 0, 0, xavix, xavix, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Gururin World (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 2002, epo_dmon, 0, 0, xavix_i2c_24c02, xavix, xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Doraemon Computer Megaphone (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // full / proper title? +CONS( 2002, epo_dmon, 0, 0, xavix_i2c_24c02, xavix_i2c,xavix_i2c_state, init_xavix, "Epoch / SSD Company LTD", "Doraemon Computer Megaphone (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // full / proper title? -CONS( 200?, has_wamg, 0, 0, xavix, xavix, xavix_state, init_xavix, "Hasbro / Milton Bradley / SSD Company LTD", "TV Wild Adventure Mini Golf (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 200?, has_wamg, 0, 0, xavix, has_wamg, xavix_state, init_xavix, "Hasbro / Milton Bradley / SSD Company LTD", "TV Wild Adventure Mini Golf (NTSC)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) /* Music titles: Emulation note: @@ -1571,12 +1627,12 @@ ROM_START( drgqst ) ROM_LOAD( "dragonquest.bin", 0x000000, 0x800000, CRC(3d24413f) SHA1(1677e81cedcf349de7bf091a232dc82c6424efba) ) ROM_END -CONS( 2004, epo_sdb, 0, 0, xavix2000_nv, epo_sdb, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Super Dash Ball (Japan)", MACHINE_IMPERFECT_SOUND ) +CONS( 2004, epo_sdb, 0, 0, xavix2000_nv, epo_sdb, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Super Dash Ball (Japan)", MACHINE_IMPERFECT_SOUND ) -CONS( 2005, ttv_sw, 0, 0, xavix2000_i2c_24c02, xavix, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Star Wars Saga Edition - Lightsaber Battle Game", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 2005, ttv_lotr, 0, 0, xavix2000_i2c_24c02, xavix, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Lord Of The Rings - Warrior of Middle-Earth", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 2005, ttv_mx, 0, 0, xavix2000_i2c_24c04, ttv_mx, xavix_i2c_state, init_xavix, "Tiger / SSD Company LTD", "MX Dirt Rebel", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 2003, drgqst, 0, 0, xavix2000_i2c_24c02, xavix , xavix_i2c_lotr_state, init_xavix, "Square Enix / SSD Company LTD", "Kenshin Dragon Quest: Yomigaerishi Densetsu no Ken", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, ttv_sw, 0, 0, xavix2000_i2c_24c02, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Star Wars Saga Edition - Lightsaber Battle Game", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, ttv_lotr, 0, 0, xavix2000_i2c_24c02, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Lord Of The Rings - Warrior of Middle-Earth", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, ttv_mx, 0, 0, xavix2000_i2c_24c04, ttv_mx, xavix_i2c_state, init_xavix, "Tiger / SSD Company LTD", "MX Dirt Rebel", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2003, drgqst, 0, 0, xavix2000_i2c_24c02, ttv_lotr, xavix_i2c_lotr_state, init_xavix, "Square Enix / SSD Company LTD", "Kenshin Dragon Quest: Yomigaerishi Densetsu no Ken", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) /* SuperXaviX (XaviX 2002 type CPU) hardware titles (3rd XaviX generation?) @@ -1641,17 +1697,17 @@ ROM_START( domfitch ) ROM_END // TODO: does it have an SEEPROM? why does it hang? full title? -CONS( 2005, tmy_thom, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "Tomy / SSD Company LTD", "Thomas and Friends (Tomy)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, tmy_thom, 0, 0, xavix2002_i2c_24c04, xavix_i2c, xavix_i2c_state, init_xavix, "Tomy / SSD Company LTD", "Thomas and Friends (Tomy)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -CONS( 2004, xavtenni, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Tennis (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -CONS( 2004, xavbaseb, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Baseball (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) -CONS( 2004, xavbowl, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Bowling (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has IR 'Camera' -CONS( 2004, xavbox, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Boxing (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has IR 'Camera' +CONS( 2004, xavtenni, 0, 0, xavix2002_i2c_24c04, xavix_i2c, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Tennis (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2004, xavbaseb, 0, 0, xavix2002_i2c_24c04, xavix_i2c, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Baseball (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2004, xavbowl, 0, 0, xavix2002_i2c_24c04, xavix_bowl, xavix_i2c_bowl_state, init_xavix, "SSD Company LTD", "XaviX Bowling (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has IR 'Camera' +CONS( 2004, xavbox, 0, 0, xavix2002_i2c_24c04, xavix_i2c, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Boxing (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // has IR 'Camera' // Bass Fishing PCB is just like Tennis except with an RF daughterboard. -CONS( 2004, xavbassf, 0, 0, xavix2002_i2c_24c04, xavix, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Bass Fishing (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2004, xavbassf, 0, 0, xavix2002_i2c_24c04, xavix_i2c, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Bass Fishing (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // TODO: check SEEPROM type and hookup, banking! -CONS( 2005, xavjmat, 0, 0, xavix2002_i2c_jmat, xavix, xavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "Jackie Chan J-Mat Fitness (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, xavjmat, 0, 0, xavix2002_i2c_jmat, xavix, xavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "Jackie Chan J-Mat Fitness (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // https://arnaudmeyer.wordpress.com/domyos-interactive-system/ // Domyos Fitness Adventure diff --git a/src/mame/includes/xavix.h b/src/mame/includes/xavix.h index 2e617787190..24d5ba50fb8 100644 --- a/src/mame/includes/xavix.h +++ b/src/mame/includes/xavix.h @@ -608,8 +608,10 @@ public: hackaddress1 = 0x958a; hackaddress2 = 0x8524; } + + DECLARE_CUSTOM_INPUT_MEMBER(i2c_r); + protected: - virtual uint8_t read_io1(uint8_t direction) override; virtual void write_io1(uint8_t data, uint8_t direction) override; required_device m_i2cmem; @@ -642,11 +644,22 @@ public: : xavix_i2c_state(mconfig, type, tag) { } + DECLARE_CUSTOM_INPUT_MEMBER(camera_r); + protected: - virtual uint8_t read_io1(uint8_t direction) override; //virtual void write_io1(uint8_t data, uint8_t direction) override; }; +class xavix_i2c_bowl_state : public xavix_i2c_state +{ +public: + xavix_i2c_bowl_state(const machine_config &mconfig, device_type type, const char *tag) + : xavix_i2c_state(mconfig, type, tag) + { } + + DECLARE_CUSTOM_INPUT_MEMBER(camera_r); +}; + class xavix_mtrk_state : public xavix_state @@ -851,8 +864,9 @@ public: void xavix_i2c_taiko(machine_config &config); + DECLARE_CUSTOM_INPUT_MEMBER(i2c_r); + protected: - virtual uint8_t read_io1(uint8_t direction) override; virtual void write_io1(uint8_t data, uint8_t direction) override; required_device m_i2cmem; diff --git a/src/mame/machine/xavix.cpp b/src/mame/machine/xavix.cpp index ce54e995846..9348ca4722b 100644 --- a/src/mame/machine/xavix.cpp +++ b/src/mame/machine/xavix.cpp @@ -510,14 +510,6 @@ void xavix_state::write_io1(uint8_t data, uint8_t direction) // no special handling } -uint8_t xavix_i2c_state::read_io1(uint8_t direction) -{ - uint8_t ret = m_in1->read(); - ret &= ~0x08; - ret |= (m_i2cmem->read_sda() & 1) << 3; - return ret; -} - void xavix_i2c_state::write_io1(uint8_t data, uint8_t direction) { // ignore these writes so that epo_edfx can send read requests to the ee-prom and doesn't just report an error @@ -539,14 +531,6 @@ void xavix_i2c_state::write_io1(uint8_t data, uint8_t direction) } // for taikodp -uint8_t xavix_i2c_cart_state::read_io1(uint8_t direction) -{ - uint8_t ret = m_in1->read(); - ret &= ~0x08; - ret |= (m_i2cmem->read_sda() & 1) << 3; - return ret; -} - void xavix_i2c_cart_state::write_io1(uint8_t data, uint8_t direction) { if (direction & 0x08) @@ -561,19 +545,6 @@ void xavix_i2c_cart_state::write_io1(uint8_t data, uint8_t direction) } -uint8_t xavix_i2c_lotr_state::read_io1(uint8_t direction) -{ - uint8_t ret = m_in1->read(); - - // some kind of comms with the IR sensor? - ret ^= (machine().rand() & 0x02); - ret ^= (machine().rand() & 0x04); - - ret &= ~0x08; - ret |= (m_i2cmem->read_sda() & 1) << 3; - - return ret; -} uint8_t xavix_ekara_state::read_io1(uint8_t direction) { From f15c6daa43169942e5efdeb056c8c09d31ba9d58 Mon Sep 17 00:00:00 2001 From: DavidHaywood <28625134+DavidHaywood@users.noreply.github.com> Date: Thu, 24 Jan 2019 13:57:32 +0000 Subject: [PATCH 15/16] refactor (nw) --- src/mame/drivers/xavix.cpp | 24 +-------- src/mame/includes/xavix.h | 4 +- src/mame/machine/xavix.cpp | 106 ++++++++++++++++++++----------------- 3 files changed, 62 insertions(+), 72 deletions(-) diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp index 8f041d0865e..0859b38667a 100644 --- a/src/mame/drivers/xavix.cpp +++ b/src/mame/drivers/xavix.cpp @@ -430,26 +430,6 @@ void xavix_state::superxavix_lowbus_map(address_map &map) -CUSTOM_INPUT_MEMBER(xavix_i2c_state::i2c_r) -{ - return m_i2cmem->read_sda(); -} - -CUSTOM_INPUT_MEMBER(xavix_i2c_cart_state::i2c_r) -{ - return m_i2cmem->read_sda(); -} - -CUSTOM_INPUT_MEMBER(xavix_i2c_lotr_state::camera_r) // seems to be some kind of camera status bits -{ - return machine().rand(); -} - -CUSTOM_INPUT_MEMBER(xavix_i2c_bowl_state::camera_r) // seems to be some kind of camera status bits -{ - return machine().rand(); -} - static INPUT_PORTS_START( xavix ) PORT_START("IN0") PORT_DIPNAME( 0x01, 0x00, "IN0" ) @@ -785,8 +765,8 @@ static INPUT_PORTS_START( ekara ) PORT_INCLUDE(xavix) PORT_MODIFY("IN1") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) // multiplexed input - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_CUSTOM ) // multiplexed input + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_ekara_state,ekara_multi0_r, nullptr) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(DEVICE_SELF, xavix_ekara_state,ekara_multi1_r, nullptr) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_POWER_OFF ) PORT_NAME("Power Switch") // pressing this will turn the game off. diff --git a/src/mame/includes/xavix.h b/src/mame/includes/xavix.h index 24d5ba50fb8..58d5fee1a0f 100644 --- a/src/mame/includes/xavix.h +++ b/src/mame/includes/xavix.h @@ -884,6 +884,9 @@ public: m_extraiowrite(0) { } + DECLARE_CUSTOM_INPUT_MEMBER(ekara_multi0_r); + DECLARE_CUSTOM_INPUT_MEMBER(ekara_multi1_r); + // void xavix_ekara(machine_config &config); protected: @@ -891,7 +894,6 @@ protected: required_ioport m_extra0; required_ioport m_extra1; - virtual uint8_t read_io1(uint8_t direction) override; virtual void write_io0(uint8_t data, uint8_t direction) override; virtual void write_io1(uint8_t data, uint8_t direction) override; diff --git a/src/mame/machine/xavix.cpp b/src/mame/machine/xavix.cpp index 9348ca4722b..55e9653948a 100644 --- a/src/mame/machine/xavix.cpp +++ b/src/mame/machine/xavix.cpp @@ -488,6 +488,63 @@ WRITE8_MEMBER(xavix_state::dispctrl_posirq_y_w) /* Per Game IO port callbacks */ + +CUSTOM_INPUT_MEMBER(xavix_i2c_state::i2c_r) +{ + return m_i2cmem->read_sda(); +} + +CUSTOM_INPUT_MEMBER(xavix_i2c_cart_state::i2c_r) +{ + return m_i2cmem->read_sda(); +} + +CUSTOM_INPUT_MEMBER(xavix_i2c_lotr_state::camera_r) // seems to be some kind of camera status bits +{ + return machine().rand(); +} + +CUSTOM_INPUT_MEMBER(xavix_i2c_bowl_state::camera_r) // seems to be some kind of camera status bits +{ + return machine().rand(); +} + +CUSTOM_INPUT_MEMBER(xavix_ekara_state::ekara_multi0_r) +{ + switch (m_extraioselect & 0x7f) + { + case 0x01: return (m_extra0->read() & 0x01) >> 0; break; + case 0x02: return (m_extra0->read() & 0x04) >> 2; break; + case 0x04: return (m_extra0->read() & 0x10) >> 4; break; + case 0x08: return (m_extra0->read() & 0x40) >> 6; break; + case 0x10: return (m_extra1->read() & 0x01) >> 0; break; + case 0x20: return (m_extra1->read() & 0x04) >> 2; break; + case 0x40: return (m_extra1->read() & 0x10) >> 4; break; + default: + LOG("latching inputs with invalid m_extraioselect value of %02x\n", m_extraioselect); + return 0x00; + } + return 0x00; +} + +CUSTOM_INPUT_MEMBER(xavix_ekara_state::ekara_multi1_r) +{ + switch (m_extraioselect & 0x7f) + { + case 0x01: return (m_extra0->read() & 0x02) >> 1; + case 0x02: return (m_extra0->read() & 0x08) >> 3; + case 0x04: return (m_extra0->read() & 0x20) >> 5; + case 0x08: return (m_extra0->read() & 0x80) >> 7; + case 0x10: return (m_extra1->read() & 0x02) >> 1; + case 0x20: return (m_extra1->read() & 0x08) >> 3; + case 0x40: return (m_extra1->read() & 0x20) >> 5; + default: + LOG("latching inputs with invalid m_extraioselect value of %02x\n", m_extraioselect); + return 0x00; + } + return 0x00; +} + uint8_t xavix_state::read_io0(uint8_t direction) { // no special handling @@ -544,55 +601,6 @@ void xavix_i2c_cart_state::write_io1(uint8_t data, uint8_t direction) } } - - -uint8_t xavix_ekara_state::read_io1(uint8_t direction) -{ - uint8_t extrainlatch0 = 0x00; - uint8_t extrainlatch1 = 0x00; - - switch (m_extraioselect & 0x7f) - { - case 0x01: - extrainlatch0 = (m_extra0->read() & 0x01) >> 0; - extrainlatch1 = (m_extra0->read() & 0x02) >> 1; - break; - case 0x02: - extrainlatch0 = (m_extra0->read() & 0x04) >> 2; - extrainlatch1 = (m_extra0->read() & 0x08) >> 3; - break; - case 0x04: - extrainlatch0 = (m_extra0->read() & 0x10) >> 4; - extrainlatch1 = (m_extra0->read() & 0x20) >> 5; - break; - case 0x08: - extrainlatch0 = (m_extra0->read() & 0x40) >> 6; - extrainlatch1 = (m_extra0->read() & 0x80) >> 7; - break; - case 0x10: - extrainlatch0 = (m_extra1->read() & 0x01) >> 0; - extrainlatch1 = (m_extra1->read() & 0x02) >> 1; - break; - case 0x20: - extrainlatch0 = (m_extra1->read() & 0x04) >> 2; - extrainlatch1 = (m_extra1->read() & 0x08) >> 3; - break; - case 0x40: - extrainlatch0 = (m_extra1->read() & 0x10) >> 4; - extrainlatch1 = (m_extra1->read() & 0x20) >> 5; - break; - default: - LOG("latching inputs with invalid m_extraioselect value of %02x\n", m_extraioselect); - break; - } - - uint8_t ret = m_in1->read(); - ret &= 0xfc; - ret |= extrainlatch0 << 0; - ret |= extrainlatch1 << 1; - return ret; -} - void xavix_ekara_state::write_io0(uint8_t data, uint8_t direction) { // is bit 0x80 an enable for something else? LED? Microphone? it doesn't seem related to the multiplexing From c8eb725b7cc7399bcc9fe52725eec365f264e263 Mon Sep 17 00:00:00 2001 From: DavidHaywood <28625134+DavidHaywood@users.noreply.github.com> Date: Thu, 24 Jan 2019 14:56:25 +0000 Subject: [PATCH 16/16] restore behavior (nw) --- src/mame/drivers/xavix.cpp | 13 ++++++++-- src/mame/includes/xavix.h | 16 +++++++----- src/mame/machine/xavix.cpp | 41 ++++++++++++++++++++++++------- src/mame/machine/xavix2002_io.cpp | 24 +++++++++++++----- 4 files changed, 71 insertions(+), 23 deletions(-) diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp index 0859b38667a..a32d2038607 100644 --- a/src/mame/drivers/xavix.cpp +++ b/src/mame/drivers/xavix.cpp @@ -1152,14 +1152,23 @@ void xavix_state::xavix2002(machine_config &config) m_palette->set_entries(512); - XAVIX2002IO(config, "xavix2002io", 0); + XAVIX2002IO(config, m_xavix2002io, 0); } + + void xavix_i2c_jmat_state::xavix2002_i2c_jmat(machine_config &config) { xavix2002(config); I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x200); // ? + + m_xavix2002io->read_0_callback().set(FUNC(xavix_i2c_jmat_state::read_extended_io0)); + m_xavix2002io->write_0_callback().set(FUNC(xavix_i2c_jmat_state::write_extended_io0)); + m_xavix2002io->read_1_callback().set(FUNC(xavix_i2c_jmat_state::read_extended_io1)); + m_xavix2002io->write_1_callback().set(FUNC(xavix_i2c_jmat_state::write_extended_io1)); + m_xavix2002io->read_2_callback().set(FUNC(xavix_i2c_jmat_state::read_extended_io2)); + m_xavix2002io->write_2_callback().set(FUNC(xavix_i2c_jmat_state::write_extended_io2)); } @@ -1687,7 +1696,7 @@ CONS( 2004, xavbox, 0, 0, xavix2002_i2c_24c04, xavix_i2c, xavix_i2c_state, CONS( 2004, xavbassf, 0, 0, xavix2002_i2c_24c04, xavix_i2c, xavix_i2c_state, init_xavix, "SSD Company LTD", "XaviX Bass Fishing (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // TODO: check SEEPROM type and hookup, banking! -CONS( 2005, xavjmat, 0, 0, xavix2002_i2c_jmat, xavix, xavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "Jackie Chan J-Mat Fitness (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, xavjmat, 0, 0, xavix2002_i2c_jmat, xavix_i2c, xavix_i2c_jmat_state, init_xavix, "SSD Company LTD", "Jackie Chan J-Mat Fitness (XaviXPORT)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // https://arnaudmeyer.wordpress.com/domyos-interactive-system/ // Domyos Fitness Adventure diff --git a/src/mame/includes/xavix.h b/src/mame/includes/xavix.h index 58d5fee1a0f..a2ccd147eac 100644 --- a/src/mame/includes/xavix.h +++ b/src/mame/includes/xavix.h @@ -568,11 +568,12 @@ private: required_device m_sound; - optional_device m_xavix2002io; DECLARE_READ8_MEMBER(sound_regram_read_cb); protected: + optional_device m_xavix2002io; + // additional SuperXaviX / XaviX2002 stuff uint8_t m_sx_extended_extbus[3]; @@ -621,19 +622,22 @@ private: int hackaddress2; }; -class xavix_i2c_jmat_state : public xavix_state +class xavix_i2c_jmat_state : public xavix_i2c_state { public: xavix_i2c_jmat_state(const machine_config &mconfig, device_type type, const char *tag) - : xavix_state(mconfig, type, tag), - m_i2cmem(*this, "i2cmem") + : xavix_i2c_state(mconfig, type, tag) { } void xavix2002_i2c_jmat(machine_config &config); private: - - required_device m_i2cmem; + READ8_MEMBER(read_extended_io0); + READ8_MEMBER(read_extended_io1); + READ8_MEMBER(read_extended_io2); + WRITE8_MEMBER(write_extended_io0); + WRITE8_MEMBER(write_extended_io1); + WRITE8_MEMBER(write_extended_io2); }; diff --git a/src/mame/machine/xavix.cpp b/src/mame/machine/xavix.cpp index 55e9653948a..bcf68c280b1 100644 --- a/src/mame/machine/xavix.cpp +++ b/src/mame/machine/xavix.cpp @@ -590,15 +590,8 @@ void xavix_i2c_state::write_io1(uint8_t data, uint8_t direction) // for taikodp void xavix_i2c_cart_state::write_io1(uint8_t data, uint8_t direction) { - if (direction & 0x08) - { - m_i2cmem->write_sda((data & 0x08) >> 3); - } - - if (direction & 0x10) - { - m_i2cmem->write_scl((data & 0x10) >> 4); - } + m_i2cmem->write_sda((data & 0x08) >> 3); + m_i2cmem->write_scl((data & 0x10) >> 4); } void xavix_ekara_state::write_io0(uint8_t data, uint8_t direction) @@ -613,6 +606,36 @@ void xavix_ekara_state::write_io1(uint8_t data, uint8_t direction) m_extraiowrite = extraiowrite; } +/* SuperXavix IO port handliner (per game) */ + +READ8_MEMBER(xavix_i2c_jmat_state::read_extended_io0) +{ + return 0x00; +} + +READ8_MEMBER(xavix_i2c_jmat_state::read_extended_io1) +{ + return 0x00; +} + +READ8_MEMBER(xavix_i2c_jmat_state::read_extended_io2) +{ + return 0x00; +} + +WRITE8_MEMBER(xavix_i2c_jmat_state::write_extended_io0) +{ +} + +WRITE8_MEMBER(xavix_i2c_jmat_state::write_extended_io1) +{ +} + +WRITE8_MEMBER(xavix_i2c_jmat_state::write_extended_io2) +{ +} + + /* General IO port handling */ READ8_MEMBER(xavix_state::io0_data_r) diff --git a/src/mame/machine/xavix2002_io.cpp b/src/mame/machine/xavix2002_io.cpp index 63cc244fdfb..dba15cd36e0 100644 --- a/src/mame/machine/xavix2002_io.cpp +++ b/src/mame/machine/xavix2002_io.cpp @@ -59,7 +59,6 @@ WRITE8_MEMBER(xavix2002_io_device::pio_dir_w) READ8_MEMBER(xavix2002_io_device::pio_dir_r) { LOG("%s: superxavix pio_dir_r (port %d)\n", machine().describe_context(), offset); - uint8_t ret = 0x00; if (offset < 3) @@ -78,20 +77,33 @@ WRITE8_MEMBER(xavix2002_io_device::pio_out_w) { m_sx_pio_out[offset] = data; - // look at direction register and output + // TODO: look at direction register + + uint8_t outdata = m_sx_pio_out[offset]; + + switch (offset) + { + case 0: m_out0_cb(space,0,outdata); break; + case 1: m_out1_cb(space,0,outdata); break; + case 2: m_out2_cb(space,0,outdata); break; + default: break; + } } } READ8_MEMBER(xavix2002_io_device::pio_out_r) { + // what does this actually read? + LOG("%s: superxavix pio_out_r (port %d)\n", machine().describe_context(), offset); + return 0x00; - uint8_t ret = 0x00; +// uint8_t ret = 0x00; - if (offset<3) - ret = m_sx_pio_out[offset]; +// if (offset<3) +// ret = m_sx_pio_out[offset]; - return ret; +// return ret; }