diff --git a/src/mame/drivers/vii.cpp b/src/mame/drivers/vii.cpp index be5ccf4485c..b2fd65f68d5 100644 --- a/src/mame/drivers/vii.cpp +++ b/src/mame/drivers/vii.cpp @@ -186,7 +186,6 @@ public: void jakks(machine_config &config); void jakks_i2c(machine_config &config); void walle(machine_config &config); - void wireless60(machine_config &config); void rad_skat(machine_config &config); void rad_skatp(machine_config &config); void rad_sktv(machine_config &config); @@ -197,7 +196,6 @@ public: void init_crc(); void init_zeus(); - void init_zone40(); void init_taikeegr(); protected: @@ -210,9 +208,6 @@ protected: DECLARE_READ8_MEMBER(eeprom_r); DECLARE_READ16_MEMBER(jakks_porta_r); - DECLARE_WRITE16_MEMBER(wireless60_porta_w); - DECLARE_WRITE16_MEMBER(wireless60_portb_w); - DECLARE_READ16_MEMBER(wireless60_porta_r); DECLARE_READ16_MEMBER(rad_porta_r); DECLARE_READ16_MEMBER(rad_portb_r); @@ -232,13 +227,9 @@ protected: virtual void mem_map_2m(address_map &map); virtual void mem_map_1m(address_map &map); - - uint32_t m_current_bank; std::unique_ptr m_serial_eeprom; - uint8_t m_w60_controller_input; - uint16_t m_w60_porta_data; uint16_t m_walle_portc_data; @@ -249,6 +240,58 @@ protected: optional_device m_nvram; }; +class wireless60_state : public spg2xx_game_state +{ +public: + wireless60_state(const machine_config& mconfig, device_type type, const char* tag) : + spg2xx_game_state(mconfig, type, tag) + { } + + void wireless60(machine_config& config); + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + + uint8_t m_w60_controller_input; + uint16_t m_w60_porta_data; + uint16_t m_w60_p1_ctrl_mask; + uint16_t m_w60_p2_ctrl_mask; + + DECLARE_WRITE16_MEMBER(wireless60_porta_w); + DECLARE_WRITE16_MEMBER(wireless60_portb_w); + DECLARE_READ16_MEMBER(wireless60_porta_r); + +private: +}; + + +class zone40_state : public wireless60_state +{ +public: + zone40_state(const machine_config& mconfig, device_type type, const char* tag) : + wireless60_state(mconfig, type, tag), + m_romregion(*this, "maincpu") + { } + + void zone40(machine_config &config); + + void init_zone40(); + + +protected: + virtual void machine_start() override; + virtual void machine_reset() override; + +private: + virtual void mem_map_z40(address_map &map); + DECLARE_READ16_MEMBER(z40_rom_r); + DECLARE_READ16_MEMBER(zone40_porta_r); + DECLARE_WRITE16_MEMBER(zone40_porta_w); + required_region_ptr m_romregion; + uint8_t m_z40_rombase; +}; + class pvmil_state : public spg2xx_game_state { public: @@ -594,9 +637,9 @@ READ8_MEMBER(spg2xx_game_state::eeprom_r) return m_serial_eeprom[offset & 0x3ff]; } -WRITE16_MEMBER(spg2xx_game_state::wireless60_porta_w) +WRITE16_MEMBER(wireless60_state::wireless60_porta_w) { - m_w60_porta_data = data & 0xf00; + m_w60_porta_data = (data & 0x300) | m_w60_p1_ctrl_mask | m_w60_p2_ctrl_mask; switch (m_w60_porta_data & 0x300) { case 0x300: @@ -611,18 +654,36 @@ WRITE16_MEMBER(spg2xx_game_state::wireless60_porta_w) uint16_t temp1 = m_io_p1->read(); uint16_t temp2 = m_io_p2->read(); uint16_t temp3 = 1 << m_w60_controller_input; - if (temp1 & temp3) m_w60_porta_data ^= 0x400; - if (temp2 & temp3) m_w60_porta_data ^= 0x800; + if (temp1 & temp3) m_w60_porta_data ^= m_w60_p1_ctrl_mask; + if (temp2 & temp3) m_w60_porta_data ^= m_w60_p2_ctrl_mask; break; } } -READ16_MEMBER(spg2xx_game_state::wireless60_porta_r) +WRITE16_MEMBER(zone40_state::zone40_porta_w) +{ + wireless60_porta_w(space, offset, data); + + if ((data & 0x00ff) != m_z40_rombase) + { + m_z40_rombase = data & 0x00ff; + m_maincpu->invalidate_cache(); + } +} + +READ16_MEMBER(wireless60_state::wireless60_porta_r) { return m_w60_porta_data; } -WRITE16_MEMBER(spg2xx_game_state::wireless60_portb_w) +READ16_MEMBER(zone40_state::zone40_porta_r) +{ + uint16_t ret = wireless60_porta_r(space, offset) & (0x0300 | m_w60_p1_ctrl_mask | m_w60_p2_ctrl_mask); + ret = (ret & 0xff00) | m_z40_rombase; + return ret; +} + +WRITE16_MEMBER(wireless60_state::wireless60_portb_w) { switch_bank(data & 7); } @@ -891,6 +952,18 @@ void sentx6p_state::mem_map_2m_texas(address_map &map) map(0x3f0000, 0x3f7fff).ram(); } +READ16_MEMBER(zone40_state::z40_rom_r) +{ + // due to granularity of rom bank this manual method is safer + return m_romregion[(offset + (m_z40_rombase * 0x20000)) & 0x1ffffff]; +} + +void zone40_state::mem_map_z40(address_map &map) +{ + map(0x000000, 0x3fffff).r(FUNC(zone40_state::z40_rom_r)); +} + + void spg2xx_game_state::mem_map_1m(address_map &map) { map(0x000000, 0x0fffff).mirror(0x300000).bankr("cartbank"); @@ -1241,6 +1314,7 @@ static INPUT_PORTS_START( wirels60 ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_NAME("Start") INPUT_PORTS_END + static INPUT_PORTS_START( rad_skat ) PORT_START("P1") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Full Left") @@ -2433,27 +2507,68 @@ void vii_state::machine_reset() void spg2xx_game_state::machine_start() { - m_bank->configure_entries(0, (memregion("maincpu")->bytes() + 0x7fffff) / 0x800000, memregion("maincpu")->base(), 0x800000); - m_bank->set_entry(0); + if (m_bank) + { + m_bank->configure_entries(0, (memregion("maincpu")->bytes() + 0x7fffff) / 0x800000, memregion("maincpu")->base(), 0x800000); + m_bank->set_entry(0); + } - m_serial_eeprom = std::make_unique(0x400); - if (m_nvram) - m_nvram->set_base(&m_serial_eeprom[0], 0x400); + if (m_serial_eeprom) + { + m_serial_eeprom = std::make_unique(0x400); + if (m_nvram) + m_nvram->set_base(&m_serial_eeprom[0], 0x400); + } save_item(NAME(m_current_bank)); - save_item(NAME(m_w60_controller_input)); - save_item(NAME(m_w60_porta_data)); save_item(NAME(m_walle_portc_data)); } void spg2xx_game_state::machine_reset() { m_current_bank = 0; +} + + +void wireless60_state::machine_start() +{ + spg2xx_game_state::machine_start(); + + save_item(NAME(m_w60_controller_input)); + save_item(NAME(m_w60_porta_data)); + + m_w60_p1_ctrl_mask = 0x0400; + m_w60_p2_ctrl_mask = 0x0800; +} + +void zone40_state::machine_start() +{ + wireless60_state::machine_start(); + + save_item(NAME(m_z40_rombase)); + + m_z40_rombase = 0xe0; + m_w60_p1_ctrl_mask = 0x0400; + m_w60_p2_ctrl_mask = 0x1000; +} + +void wireless60_state::machine_reset() +{ + spg2xx_game_state::machine_reset(); m_w60_controller_input = -1; m_w60_porta_data = 0; } +void zone40_state::machine_reset() +{ + wireless60_state::machine_reset(); + m_z40_rombase = 0xe0; + m_maincpu->invalidate_cache(); + m_maincpu->reset(); +} + + void vii_state::poll_controls() { int32_t x = m_io_motionx ? ((int32_t)m_io_motionx->read() - 0x200) : 0; @@ -2491,7 +2606,7 @@ DEVICE_IMAGE_LOAD_MEMBER(vii_state::cart_load_vii) image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size"); return image_init_result::FAIL; } - + m_cart->rom_alloc(size, GENERIC_ROM16_WIDTH, ENDIANNESS_LITTLE); m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom"); @@ -2630,18 +2745,30 @@ void tvgogo_state::tvgogo(machine_config &config) } -void spg2xx_game_state::wireless60(machine_config &config) +void wireless60_state::wireless60(machine_config &config) { SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen); - m_maincpu->set_addrmap(AS_PROGRAM, &spg2xx_game_state::mem_map_4m); + m_maincpu->set_addrmap(AS_PROGRAM, &wireless60_state::mem_map_4m); spg2xx_base(config); - m_maincpu->porta_out().set(FUNC(spg2xx_game_state::wireless60_porta_w)); - m_maincpu->portb_out().set(FUNC(spg2xx_game_state::wireless60_portb_w)); - m_maincpu->porta_in().set(FUNC(spg2xx_game_state::wireless60_porta_r)); + m_maincpu->porta_out().set(FUNC(wireless60_state::wireless60_porta_w)); + m_maincpu->portb_out().set(FUNC(wireless60_state::wireless60_portb_w)); + m_maincpu->porta_in().set(FUNC(wireless60_state::wireless60_porta_r)); } +void zone40_state::zone40(machine_config &config) +{ + SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen); + m_maincpu->set_addrmap(AS_PROGRAM, &zone40_state::mem_map_z40); + + spg2xx_base(config); + + m_maincpu->porta_out().set(FUNC(zone40_state::zone40_porta_w)); + m_maincpu->porta_in().set(FUNC(zone40_state::zone40_porta_r)); +} + + void spg2xx_game_state::jakks(machine_config &config) { SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen); @@ -3601,13 +3728,33 @@ void spg2xx_game_state::init_taikeegr() std::copy(buffer.begin(), buffer.end(), &src[0]); } +void zone40_state::init_zone40() +{ + uint16_t *ROM = (uint16_t*)memregion("maincpu")->base(); + int size = memregion("maincpu")->bytes(); + + for (int i = 0; i < size/2; i++) + { + ROM[i] = ROM[i] ^ 0xbb88; + + ROM[i] = bitswap<16>(ROM[i], 11, 10, 3, 2, 4, 12, 5, 13, + 9, 1, 8, 0, 6, 7, 14, 15); + } +} + +ROM_START( zone40 ) + ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 ) + ROM_LOAD16_WORD_SWAP( "zone40.bin", 0x0000, 0x4000000, CRC(4ba1444f) SHA1(de83046ab93421486668a247972ad6d3cda19440) ) +ROM_END + // year, name, parent, compat, machine, input, class, init, company, fullname, flags // Jungle Soft TV games -CONS( 2007, vii, 0, 0, vii, vii, vii_state, empty_init, "Jungle Soft / KenSingTon / Siatronics", "Vii", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // motion controls are awkward, but playable for the most part -CONS( 2010, zone60, 0, 0, wireless60, wirels60, spg2xx_game_state, empty_init, "Jungle's Soft / Ultimate Products (HK) Ltd", "Zone 60", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) -CONS( 2010, wirels60, 0, 0, wireless60, wirels60, spg2xx_game_state, empty_init, "Jungle Soft / Kids Station Toys Inc", "Wireless 60", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) +CONS( 2007, vii, 0, 0, vii, vii, vii_state, empty_init, "Jungle Soft / KenSingTon / Siatronics", "Vii", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // motion controls are awkward, but playable for the most part +CONS( 2009, zone40, 0, 0, zone40, wirels60, zone40_state, init_zone40, "Jungle Soft / Ultimate Products (HK) Ltd", "Zone 40", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) +CONS( 2010, zone60, 0, 0, wireless60, wirels60, wireless60_state, empty_init, "Jungle's Soft / Ultimate Products (HK) Ltd", "Zone 60", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) +CONS( 2010, wirels60, 0, 0, wireless60, wirels60, wireless60_state, empty_init, "Jungle Soft / Kids Station Toys Inc", "Wireless 60", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // JAKKS Pacific Inc TV games CONS( 2004, jak_batm, 0, 0, jakks, batman, spg2xx_game_state, empty_init, "JAKKS Pacific Inc / HotGen Ltd", "The Batman (JAKKS Pacific TV Game)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) @@ -3646,7 +3793,7 @@ CONS( 2006, rad_skat, 0, 0, rad_skat, rad_skat, spg2xx_game_state, ini CONS( 2006, rad_skatp, rad_skat, 0, rad_skatp,rad_skatp, spg2xx_game_state, init_crc, "Radica", "Connectv Skateboarder (PAL)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) CONS( 2006, rad_crik, 0, 0, rad_crik, rad_crik, spg2xx_game_state, init_crc, "Radica", "Connectv Cricket (PAL)", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // Version 3.00 20/03/06 is listed in INTERNAL TEST CONS( 2007, rad_sktv, 0, 0, rad_sktv, rad_sktv, spg2xx_game_state, init_crc, "Radica", "Skannerz TV", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) -CONS( 2007, rad_fb2, 0, 0, rad_skat, rad_fb2, spg2xx_game_state, init_crc, "Radica", "Play TV Football 2", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) +CONS( 2007, rad_fb2, 0, 0, rad_skat, rad_fb2, spg2xx_game_state, init_crc, "Radica", "Play TV Football 2", MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // offers a 2 player option in menus, but seems to have only been programmed for, and released as, a single player unit, P2 controls appear unfinished. // Mattel games CONS( 2005, mattelcs, 0, 0, rad_skat, mattelcs, spg2xx_game_state, empty_init, "Mattel", "Mattel Classic Sports", MACHINE_IMPERFECT_SOUND ) @@ -3662,7 +3809,7 @@ CONS( 2006, icanpian, 0, 0, icanpian, icanpian, icanpian_state, empty_ CONS( 2005, tvgogo, 0, 0, tvgogo, tvgogo, tvgogo_state, empty_init, "Toyquest", "TV Go Go", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // Similar, SPG260?, scrambled -CONS( 200?, lexizeus, 0, 0, lexizeus, lexizeus, spg2xx_game_state, init_zeus, "Lexibook", "Zeus IG900 20-in-1 (US?)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) +CONS( 200?, lexizeus, 0, 0, lexizeus, lexizeus, spg2xx_game_state, init_zeus, "Lexibook", "Zeus IG900 20-in-1 (US?)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // bad sound and some corrupt bg tilemap entries in Tiger Rescue, verify ROM data (same game runs in Zone 60 without issue) // there are other regions of this, including a Finnish version "Haluatko miljonääriksi?" (see https://millionaire.fandom.com/wiki/Haluatko_miljon%C3%A4%C3%A4riksi%3F_(Play_Vision_game) ) CONS( 2006, pvmil, 0, 0, pvmil, pvmil, pvmil_state, empty_init, "Play Vision", "Who Wants to Be a Millionaire? (Play Vision, Plug and Play, UK)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) @@ -3676,3 +3823,4 @@ CONS( 2007, taikeegr, 0, 0, taikeegr, taikeegr, spg2xx_game_st // a 'deluxe' version of this also exists with extra game modes CONS( 2004, sentx6p, 0, 0, sentx6p, sentx6p, sentx6p_state, empty_init, "Senario / Play Vision", "Vs Maxx Texas Hold'em TV Poker - 6 Player Edition (UK)", MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // from a UK Play Vision branded box, values in GBP + diff --git a/src/mame/drivers/vt1682.cpp b/src/mame/drivers/vt1682.cpp index 7bbd58c9284..1a4a8444e42 100644 --- a/src/mame/drivers/vt1682.cpp +++ b/src/mame/drivers/vt1682.cpp @@ -623,19 +623,6 @@ private: required_ioport m_io_p4; }; -class zone40_state : public vt_vt1682_state -{ -public: - zone40_state(const machine_config& mconfig, device_type type, const char* tag) : - vt_vt1682_state(mconfig, type, tag) - { } - - void init_zone40(); - -protected: - -private: -}; void vt_vt1682_state::video_start() { @@ -5422,9 +5409,6 @@ static INPUT_PORTS_START( intec ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END -static INPUT_PORTS_START( zone40 ) -INPUT_PORTS_END - // this controller code is just designed to feed the games with data they're happy with, it probably has no grounds in reality // as I don't know how they really work. presumably wireless with timeouts, sending signals for brief periods that need to be // picked up on, although that said, there are some very short (128 read on status) timeout loops in the code that will force @@ -5521,8 +5505,6 @@ WRITE8_MEMBER(intec_interact_state::portb_w) - - void intec_interact_state::intech_interact(machine_config& config) { vt_vt1682_state::vt_vt1682(config); @@ -5572,26 +5554,3 @@ CONS( 200?, ii32in1, 0, 0, intech_interact, intec, intec_interact_state, // Intec Interact Infrazone 15 Shooting Games, 42 Mi kara, 96 Arcade Games + more should run here too // MiWi(2?) and other Mi Kara units should fit here as well - - -void zone40_state::init_zone40() -{ - uint16_t *ROM = (uint16_t*)memregion("mainrom")->base(); - int size = memregion("mainrom")->bytes(); - - for (int i = 0; i < size/2; i++) - { - ROM[i] = ROM[i] ^ 0xbb88; - } -} - -ROM_START( zone40 ) - ROM_REGION( 0x4000000, "mainrom", ROMREGION_ERASE00 ) - ROM_LOAD16_WORD_SWAP( "zone40.bin", 0x0000, 0x4000000, CRC(4ba1444f) SHA1(de83046ab93421486668a247972ad6d3cda19440) ) - - // possible undumped internal ROM -ROM_END - -// this has higher resolution version (320 pixel width) of many of the same games, and twice the usual capacity vt1682 can address, so while it can't be vt1682 it's most likely something related -// probably an evolution of it even if the first 0x8000 block is blanked out like many SunPlus systems -CONS( 2009, zone40, 0, 0, vt_vt1682, zone40, zone40_state, init_zone40, "Jungle Soft / Ultimate Products (HK) Ltd", "Zone 40", MACHINE_NO_SOUND | MACHINE_NOT_WORKING ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 9c8e8108ba8..4a9918cda4e 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -31129,7 +31129,6 @@ zdog @source:vt1682.cpp ii8in1 ii32in1 -zone40 // Zone 40 @source:newbrain.cpp newbrain // @@ -39587,6 +39586,7 @@ jak_sbfc // lexizeus // Lexibook vii // KenSingTon / Jungle Soft / Siatronics Vii wirels60 // Wireless 60 +zone40 // Zone 40 zone60 // Zone 60 rad_skat // rad_skatp //