mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
machines promoted to WORKING (Plug & Play / SunPlus - Zone 40) (#5983)
* mostly decrypt zone40 this gets the graphics in the tile viewer to look mostly correct, and there are neat increasing number sequences in ROM there might still be an additional opcode fetch scramble, and also block scramble (I see no vectors) or possible internal ROM use (this came after vt1682, which had internal ROM boot option, but dumps we have don't use it) * move zone40 back to vii.cpp * begin looking at inputs (nw) * input reading method matches zone60 (nw) * machines promoted to WORKING -------- Zone 40 [David Haywood, BeckyRGB] * tidy (nw) * safety (nw) * tidy (nw) * fix sword of warrior (nw) * tidy (nw) * tidy (nw) * tidy (nw) * fix player 2 inputs (nw) * better subclassing (nw)
This commit is contained in:
parent
7918d64c94
commit
2453ae407c
@ -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<uint8_t[]> 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<nvram_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<uint16_t> 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<uint8_t[]>(0x400);
|
||||
if (m_nvram)
|
||||
m_nvram->set_base(&m_serial_eeprom[0], 0x400);
|
||||
if (m_serial_eeprom)
|
||||
{
|
||||
m_serial_eeprom = std::make_unique<uint8_t[]>(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
|
||||
|
||||
|
||||
|
@ -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 )
|
||||
|
@ -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 //
|
||||
|
Loading…
Reference in New Issue
Block a user