Plug and Play work (#6451)

* sh6578 sprite work (nw)

* sh6578 masks fewer bits, fixes jewel master and some others (nw)

* sprite fixes for sh6578

* new NOT WORKING clones
-----
Fun 2 Learn Smart Fit Park (UK) [Sean Riddle, David Haywood]

works as well as the Spanish set (mostly playable without sound)

* new NOT WORKING
----
OPlayer Mobile Game Console (MGS03-white) (Family Sport 100-in-1) [Sean Riddle, David Haywood]

(all games are actually playable, just need to get rid of the low battery indicator and remove some hacks)

* notes about some other units (nw)

* swap oplayer uppper address lines after discussion with sean (nw)

new NOT WORKING
---
Denver Game Console GMP-240C 150-in-1 [TeamEurope]

some kind of VT? based system, enhanced chipset we don't support tho, bank write is unhandled by the looks of things (nw)

* new WORKING machine
----
Technigame Super 4-in-1 Sports (PAL) [Sean Riddle, David Haywood]
This commit is contained in:
David Haywood 2020-03-17 17:14:35 +00:00 committed by GitHub
parent c3d6be7a60
commit 2b0c7929a6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 375 additions and 60 deletions

View File

@ -123,6 +123,8 @@ ppu2c0x_device::ppu2c0x_device(const machine_config& mconfig, device_type type,
m_space_config("videoram", ENDIANNESS_LITTLE, 8, 17, 0, internal_map),
m_cpu(*this, finder_base::DUMMY_TAG),
m_scanline(0), // reset the scanline count
m_videoram_addr_mask(0x3fff),
m_global_refresh_mask(0x7fff),
m_line_write_increment_large(32),
m_paletteram_in_ppuspace(false),
m_tile_page(0),
@ -803,6 +805,65 @@ void ppu2c0x_device::read_extra_sprite_bits(int sprite_index)
// needed for some clones
}
bool ppu2c0x_device::is_spritepixel_opaque(int pixel_data, int color)
{
if (pixel_data)
return true;
else
return false;
}
void ppu2c0x_device::draw_sprite_pixel_low(bitmap_rgb32& bitmap, int pixel_data, int pixel, int sprite_xpos, int color, int sprite_index, uint8_t* line_priority)
{
if (is_spritepixel_opaque(pixel_data, color))
{
/* has the background (or another sprite) already been drawn here? */
if ((sprite_xpos + pixel) < VISIBLE_SCREEN_WIDTH)
{
if (!line_priority[sprite_xpos + pixel])
{
/* no, draw */
draw_sprite_pixel(sprite_xpos, color, pixel, pixel_data, bitmap);
}
/* indicate that a sprite was drawn at this location, even if it's not seen */
line_priority[sprite_xpos + pixel] |= 0x01;
}
}
/* set the "sprite 0 hit" flag if appropriate */
if (sprite_index == 0 && (pixel_data & 0x03) && ((sprite_xpos + pixel) < 255) && (line_priority[sprite_xpos + pixel] & 0x02))
m_regs[PPU_STATUS] |= PPU_STATUS_SPRITE0_HIT;
}
void ppu2c0x_device::draw_sprite_pixel_high(bitmap_rgb32& bitmap, int pixel_data, int pixel, int sprite_xpos, int color, int sprite_index, uint8_t* line_priority)
{
if (is_spritepixel_opaque(pixel_data, color))
{
if ((sprite_xpos + pixel) < VISIBLE_SCREEN_WIDTH)
{
/* has another sprite been drawn here? */
if (!(line_priority[sprite_xpos + pixel] & 0x01))
{
/* no, draw */
draw_sprite_pixel(sprite_xpos, color, pixel, pixel_data, bitmap);
line_priority[sprite_xpos + pixel] |= 0x01;
}
}
}
/* set the "sprite 0 hit" flag if appropriate */
if (sprite_index == 0 && (pixel_data & 0x03) && ((sprite_xpos + pixel) < 255) && (line_priority[sprite_xpos + pixel] & 0x02))
m_regs[PPU_STATUS] |= PPU_STATUS_SPRITE0_HIT;
}
int ppu2c0x_device::apply_sprite_pattern_page(int index1, int size)
{
if (size == 8)
index1 += ((m_sprite_page == 0) ? 0 : 0x1000);
return index1;
}
void ppu2c0x_device::draw_sprites(uint8_t* line_priority)
{
bitmap_rgb32& bitmap = *m_bitmap;
@ -881,8 +942,8 @@ void ppu2c0x_device::draw_sprites(uint8_t* line_priority)
}
index1 = tile * 16;
if (size == 8)
index1 += ((m_sprite_page == 0) ? 0 : 0x1000);
index1 = apply_sprite_pattern_page(index1, size);
read_sprite_plane_data(index1 + sprite_line);
@ -913,24 +974,7 @@ void ppu2c0x_device::draw_sprites(uint8_t* line_priority)
/* is this pixel non-transparent? */
if (sprite_xpos + pixel >= first_pixel)
{
if (pixel_data)
{
/* has the background (or another sprite) already been drawn here? */
if ((sprite_xpos + pixel) < VISIBLE_SCREEN_WIDTH)
{
if (!line_priority[sprite_xpos + pixel])
{
/* no, draw */
draw_sprite_pixel(sprite_xpos, color, pixel, pixel_data, bitmap);
}
/* indicate that a sprite was drawn at this location, even if it's not seen */
line_priority[sprite_xpos + pixel] |= 0x01;
}
}
/* set the "sprite 0 hit" flag if appropriate */
if (sprite_index == 0 && (pixel_data & 0x03) && ((sprite_xpos + pixel) < 255) && (line_priority[sprite_xpos + pixel] & 0x02))
m_regs[PPU_STATUS] |= PPU_STATUS_SPRITE0_HIT;
draw_sprite_pixel_low(bitmap, pixel_data, pixel, sprite_xpos, color, sprite_index, line_priority);
}
}
}
@ -945,23 +989,7 @@ void ppu2c0x_device::draw_sprites(uint8_t* line_priority)
/* is this pixel non-transparent? */
if (sprite_xpos + pixel >= first_pixel)
{
if (pixel_data)
{
if ((sprite_xpos + pixel) < VISIBLE_SCREEN_WIDTH)
{
/* has another sprite been drawn here? */
if (!(line_priority[sprite_xpos + pixel] & 0x01))
{
/* no, draw */
draw_sprite_pixel(sprite_xpos, color, pixel, pixel_data, bitmap);
line_priority[sprite_xpos + pixel] |= 0x01;
}
}
}
/* set the "sprite 0 hit" flag if appropriate */
if (sprite_index == 0 && (pixel_data & 0x03) && ((sprite_xpos + pixel) < 255) && (line_priority[sprite_xpos + pixel] & 0x02))
m_regs[PPU_STATUS] |= PPU_STATUS_SPRITE0_HIT;
draw_sprite_pixel_high(bitmap, pixel_data, pixel, sprite_xpos, color, sprite_index, line_priority);
}
}
}
@ -1292,7 +1320,7 @@ void ppu2c0x_device::write(offs_t offset, uint8_t data)
else
{
/* first write */
m_refresh_latch &= 0x7fe0;
m_refresh_latch &= (0xffe0 & m_global_refresh_mask);
m_refresh_latch |= (data & 0xf8) >> 3;
m_x_fine = data & 7;
@ -1306,7 +1334,7 @@ void ppu2c0x_device::write(offs_t offset, uint8_t data)
if (m_toggle)
{
/* second write */
m_refresh_latch &= 0x7f00;
m_refresh_latch &= (0xff00 & m_global_refresh_mask);
m_refresh_latch |= data;
m_refresh_data = m_refresh_latch;
@ -1317,7 +1345,7 @@ void ppu2c0x_device::write(offs_t offset, uint8_t data)
{
/* first write */
m_refresh_latch &= 0x00ff;
m_refresh_latch |= (data & 0x3f) << 8;
m_refresh_latch |= (data & (m_videoram_addr_mask >>8) ) << 8;
//logerror("vram addr write 1: %02x, %04x (scanline: %d)\n", data, m_refresh_latch, m_scanline);
}
@ -1326,7 +1354,7 @@ void ppu2c0x_device::write(offs_t offset, uint8_t data)
case PPU_DATA: /* 7 */
{
int tempAddr = m_videomem_addr & 0x3fff;
int tempAddr = m_videomem_addr & m_videoram_addr_mask;
if (!m_latch.isnull())
m_latch(tempAddr);

View File

@ -91,8 +91,12 @@ public:
virtual void read_sprite_plane_data(int address);
virtual void make_sprite_pixel_data(uint8_t &pixel_data, int flipx);
virtual void draw_sprite_pixel(int sprite_xpos, int color, int pixel, uint8_t pixel_data, bitmap_rgb32 &bitmap);
virtual bool is_spritepixel_opaque(int pixel_data, int color);
virtual void draw_sprite_pixel_low(bitmap_rgb32& bitmap, int pixel_data, int pixel, int sprite_xpos, int color, int sprite_index, uint8_t* line_priority);
virtual void draw_sprite_pixel_high(bitmap_rgb32& bitmap, int pixel_data, int pixel, int sprite_xpos, int color, int sprite_index, uint8_t* line_priority);
virtual void read_extra_sprite_bits(int sprite_index);
virtual int apply_sprite_pattern_page(int index1, int size);
virtual void draw_sprites(uint8_t *line_priority);
void render_scanline();
virtual void scanline_increment_fine_ycounter();
@ -189,6 +193,8 @@ protected:
int m_scanline; /* scanline count */
std::unique_ptr<uint8_t[]> m_spriteram; /* sprite ram */
int m_videoram_addr_mask;
int m_global_refresh_mask;
int m_line_write_increment_large;
bool m_paletteram_in_ppuspace; // sh6578 doesn't have the palette in PPU space, so various side-effects don't apply
std::vector<uint8_t> m_palette_ram; /* shouldn't be in main memory! */

View File

@ -23,6 +23,8 @@ ppu_sh6578_device::ppu_sh6578_device(const machine_config& mconfig, device_type
{
m_paletteram_in_ppuspace = false;
m_line_write_increment_large = 32;
m_videoram_addr_mask = 0xffff;
m_global_refresh_mask = 0xffff;
}
ppu_sh6578_device::ppu_sh6578_device(const machine_config& mconfig, const char* tag, device_t* owner, uint32_t clock) :
@ -85,6 +87,11 @@ void ppu_sh6578_device::scanline_increment_fine_ycounter()
}
}
void ppu_sh6578_device::draw_sprite_pixel(int sprite_xpos, int color, int pixel, uint8_t pixel_data, bitmap_rgb32& bitmap)
{
uint8_t palval = m_palette_ram[(pixel_data | color << 2)] & 0x3f;
bitmap.pix32(m_scanline, sprite_xpos + pixel) = this->pen(palval);
}
void ppu_sh6578_device::read_tile_plane_data(int address, int color)
{
@ -134,7 +141,8 @@ void ppu_sh6578_device::draw_tile(uint8_t* line_priority, int color_byte, int co
}
else
{
pen = back_pen;
uint8_t palval = m_palette_ram[0x0] & 0x3f;
pen = this->pen(palval);
}
*dest = pen;
@ -245,10 +253,24 @@ void ppu_sh6578_device::draw_background(uint8_t* line_priority)
}
}
void ppu_sh6578_device::read_sprite_plane_data(int address)
{
m_planebuf[0] = readbyte((address + 0) & 0x3fff);
m_planebuf[1] = readbyte((address + 8) & 0x3fff);
}
int ppu_sh6578_device::apply_sprite_pattern_page(int index1, int size)
{
index1 += (((m_colsel_pntstart >> 2) & 0x3) * 0x1000);
return index1;
}
/*
void ppu_sh6578_device::draw_sprites(uint8_t* line_priority)
{
}
*/
void ppu_sh6578_device::write(offs_t offset, uint8_t data)
{

View File

@ -35,9 +35,12 @@ private:
void read_tile_plane_data(int address, int color) override;
void draw_tile(uint8_t* line_priority, int color_byte, int color_bits, int address, int start_x, pen_t back_pen, uint32_t*& dest, const pen_t* color_table) override;
virtual void draw_sprites(uint8_t* line_priority) override;
virtual void draw_sprite_pixel(int sprite_xpos, int color, int pixel, uint8_t pixel_data, bitmap_rgb32& bitmap) override;
//virtual void draw_sprites(uint8_t* line_priority) override;
virtual void draw_background(uint8_t* line_priority) override;
virtual int apply_sprite_pattern_page(int index1, int size) override;
virtual void read_sprite_plane_data(int address) override;
uint8_t m_extplanebuf[2];
uint8_t m_colsel_pntstart;
};

View File

@ -159,7 +159,7 @@ void nes_sh6578_state::bank_w(int bank, uint16_t offset, uint8_t data)
WRITE8_MEMBER(nes_sh6578_state::sprite_dma_w)
{
// int source = (data & 7);
m_ppu->spriteram_dma(space, data);
}
READ8_MEMBER(nes_sh6578_state::bankswitch_r)

View File

@ -2666,11 +2666,22 @@ ROM_START( mc_tv200 )
ROM_LOAD( "s29gl064n90.bin", 0x00000, 0x800000, CRC(ae1905d2) SHA1(11582055713ba937c1ad32c4ada8683eebc1c83c) )
ROM_END
ROM_START( techni4 )
ROM_REGION( 0x200000, "mainrom", 0 )
ROM_LOAD( "technigame.bin", 0x00000, 0x200000, CRC(3c96b1b1) SHA1(1acc81b26e740327bd6d9faa5a96ab027a48dd77) )
ROM_END
ROM_START( unkra200 ) // "Winbond 25Q64FVSIG 1324" SPI ROM
ROM_REGION( 0x800000, "mainrom", 0 )
ROM_LOAD( "retro_machine_rom", 0x00000, 0x800000, CRC(0e824aa7) SHA1(957e98868559ecc22b3fa42c76692417b76bf132) )
ROM_END
ROM_START( denv150 )
ROM_REGION( 0x1000000, "mainrom", 0 )
ROM_LOAD( "denver150in1.bin", 0x00000, 0x1000000, CRC(6b3819d7) SHA1(b0039945ce44a52ea224ab736d5f3c6980409b5d) ) // 2nd half is blank
ROM_END
ROM_START( ppgc200g )
ROM_REGION( 0x800000, "mainrom", 0 )
ROM_LOAD( "m29dw641.u2", 0x00000, 0x800000, CRC(b16dc677) SHA1(c1984fde4caf9345d41d127db946d1c21ec43ae0) )
@ -2782,13 +2793,27 @@ CONS( 200?, lxcmcyfz, 0, 0, nes_vt_cy, nes_vt, nes_vt_cy_lexibook_state, empt
CONS( 200?, lxcmcydp, 0, 0, nes_vt_cy, nes_vt, nes_vt_cy_lexibook_state, empty_init, "Lexibook", "Lexibook Compact Cyber Arcade - Disney Princess", MACHINE_NOT_WORKING )
CONS( 2016, rtvgc300, 0, 0, nes_vt_cy, nes_vt, nes_vt_cy_lexibook_state, empty_init, "Lexibook", "Lexibook Retro TV Game Console - 300 Games", MACHINE_NOT_WORKING )
// Also Lexibook Compact Cyber Arcade - Cars
// Lexibook Compact Cyber Arcade - Paw Patrol
// Lexibook Compact Cyber Arcade - Barbie
// Lexibook Compact Cyber Arcade - Finding Dory
// Lexibook Compact Cyber Arcade - Marvel Ultimate Spiderman
// Lexibook Compact Cyber Arcade - PJ Masks
// more?
/* The following are also confirmed to be NES/VT derived units, most having a standard set of games with a handful of lazy graphic mods thrown in to fit the unit theme
(handhekd units, use standard AAA batteries)
Lexibook Compact Cyber Arcade - Cars
Lexibook Compact Cyber Arcade - Paw Patrol
Lexibook Compact Cyber Arcade - Barbie
Lexibook Compact Cyber Arcade - Finding Dory
Lexibook Compact Cyber Arcade - Marvel Ultimate Spiderman
Lexibook Compact Cyber Arcade - PJ Masks
(Handheld units, but different form factor to Compact Cyber Arcade, charged via USB)
Lexibook Console Colour - Minnie Mouse
Lexibook Console Colour - Disney's Planes
Lexibook Console Colour - Barbie
(units for use with TV)
Lexibook Retro TV Game Console (300 Games) - Cars
Lexibook Retro TV Game Console (300 Games) - Frozen
(more?)
*/
// intial code isn't valid? scrambled?
CONS( 201?, red5mam, 0, 0, nes_vt_cy, nes_vt, nes_vt_cy_lexibook_state, empty_init, "Red5", "Mini Arcade Machine (Red5)", MACHINE_NOT_WORKING )
@ -2800,12 +2825,14 @@ CONS( 201?, red5mam, 0, 0, nes_vt_cy, nes_vt, nes_vt_cy_lexibook_state, empty
// some menu gfx broken, probably because this is a bad dump
CONS( 2015, dgun2573, 0, 0, nes_vt_fp, nes_vt, nes_vt_hh_state, empty_init, "dreamGEAR", "My Arcade Gamer V Portable Gaming System (DGUN-2573)", MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
CONS( 201?, denv150, 0, 0, nes_vt_fp, nes_vt, nes_vt_hh_state, empty_init, "Denver", "Denver Game Console GMP-240C 150-in-1", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
// CPU die is marked 'VH2009' There's also a 62256 RAM chip on the PCB, some scrambled opcodes
CONS( 200?, polmega, 0, 0, nes_vt_vh2009, nes_vt, nes_vt_vh2009_state, empty_init, "Polaroid", "Megamax GPD001SDG", MACHINE_NOT_WORKING )
CONS( 200?, silv35, 0, 0, nes_vt_vh2009, nes_vt, nes_vt_vh2009_state, empty_init, "SilverLit", "35 in 1 Super Twins", MACHINE_NOT_WORKING )
// die is marked as VH2009, as above, but no scrambled opcodes here
CONS( 201?, techni4, 0, 0, nes_vt_base_pal, nes_vt, nes_vt_state, empty_init, "Technigame", "Technigame Super 4-in-1 Sports (PAL)", MACHINE_IMPERFECT_GRAPHICS )
// same encryption as above, but seems like newer hardware (or the above aren't using most of the features)

View File

@ -28,9 +28,9 @@ protected:
required_region_ptr<uint16_t> m_romregion;
DECLARE_READ16_MEMBER(porta_r);
DECLARE_READ16_MEMBER(portb_r);
DECLARE_READ16_MEMBER(portc_r);
virtual DECLARE_READ16_MEMBER(porta_r);
virtual DECLARE_READ16_MEMBER(portb_r);
virtual DECLARE_READ16_MEMBER(portc_r);
virtual DECLARE_WRITE16_MEMBER(porta_w) override;
virtual DECLARE_WRITE16_MEMBER(portb_w) override;
@ -59,6 +59,24 @@ protected:
virtual void machine_reset() override;
};
class oplayer_100in1_state : public mywicodx_state
{
public:
oplayer_100in1_state(const machine_config& mconfig, device_type type, const char* tag) :
mywicodx_state(mconfig, type, tag)
{ }
void init_oplayer();
protected:
virtual DECLARE_READ16_MEMBER(porta_r) override;
virtual DECLARE_READ16_MEMBER(portb_r) override;
virtual DECLARE_READ16_MEMBER(portc_r) override;
};
void zon32bit_state::device_post_load()
{
// load state can change the bank, so we must invalide cache
@ -227,6 +245,21 @@ WRITE16_MEMBER(zon32bit_state::portc_w)
}
READ16_MEMBER(oplayer_100in1_state::portc_r)
{
return m_io_p3->read();
}
READ16_MEMBER(oplayer_100in1_state::portb_r)
{
return m_io_p2->read();
}
READ16_MEMBER(oplayer_100in1_state::porta_r)
{
return 0x0ff8 | (machine().rand()&1);
}
void zon32bit_state::mem_map_zon32bit(address_map &map)
{
map(0x000000, 0x3fffff).r(FUNC(zon32bit_state::z32_rom_r));
@ -428,6 +461,120 @@ static INPUT_PORTS_START( zon32bit )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
INPUT_PORTS_END
static INPUT_PORTS_START( oplayer )
PORT_START("P1")
PORT_DIPNAME( 0x0001, 0x0001, "P1" )
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_START("P2")
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
PORT_BIT( 0x0002, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
PORT_BIT( 0x0004, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 )
PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 )
PORT_BIT( 0x0040, IP_ACTIVE_HIGH, IPT_BUTTON3 )
PORT_BIT( 0xff80, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("P3")
PORT_DIPNAME( 0x0001, 0x0001, "P3" )
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
INPUT_PORTS_END
void zon32bit_state::zon32bit(machine_config &config)
{
SPG24X(config, m_maincpu, XTAL(27'000'000), m_screen);
@ -460,6 +607,72 @@ ROM_START( zon32bit )
ROM_END
/*
Following pinout was used for dumping
+------------------+
VCC -|01 70|- VCC
A23 -|02 69|- A21
VCC -|03 68|- A22
A18 -|04 67|- A08
A24 -|05 66|- A09
A07 -|06 65|- A10
A06 -|07 64|- A11
A05 -|08 63|- A12
A04 -|09 62|- A13
A03 -|10 61|- A14
A02 -|11 60|- A15
A01 -|12 59|- A16
A00 -|13 58|- A17
NC -|14 57|- A20
NC -|15 56|- A19
/CE -|16 55|- VCC (/BYTE)
NC -|17 54|- NC
GND -|18 55LV512 53|- GND
NC -|19 52|- NC
NC -|20 51|- NC
NC -|21 50|- NC
NC -|22 49|- NC
NC -|23 48|- NC
/OE -|24 47|- NC
NC -|25 46|- NC
D08 -|26 45|- NC
D09 -|27 44|- D00
D10 -|28 43|- D01
D11 -|29 42|- D02
NC -|30 41|- D03
D12 -|31 40|- D04
D13 -|32 39|- D05
D14 -|33 38|- D06
D15 -|34 37|- D07
GND -|35 36|- VCC
+------------------+
*/
// Sunplus QL8041C die
ROM_START( oplayer )
ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "oplayer.bin", 0x0000000, 0x4000000, CRC(aa09c358) SHA1(df2855cdfdf2b693636cace8768e579b9d5bc657) )
ROM_END
void oplayer_100in1_state::init_oplayer()
{
// TODO: remove these hacks
uint16_t* rom = (uint16_t*)memregion("maincpu")->base();
// port a checks when starting a game in any given bank / starting the system
rom[0x0f851 + (0x0000000 / 2)] = 0xf165;
rom[0xaad1e + (0x1000000 / 2)] = 0xf165;
rom[0x47d2d + (0x2000000 / 2)] = 0xf165;
rom[0x1fb00 + (0x3000000 / 2)] = 0xf165;
// port a checks when exiting a game in any given bank
rom[0x7a506 + (0x0000000 / 2)] = 0xf165;
rom[0xad051 + (0x1000000 / 2)] = 0xf165;
rom[0xc351e + (0x3000000 / 2)] = 0xf165;
}
// Box advertises this as '40 Games Included' but the cartridge, which was glued directly to the PCB, not removable, is a 41-in-1. Maybe some versions exist with a 40 game selection.
CONS( 200?, zon32bit, 0, 0, zon32bit, zon32bit, zon32bit_state, empty_init, "Jungle Soft / Ultimate Products (HK) Ltd", "Zone 32-bit Gaming Console System (Family Sport 41-in-1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
// My Wico Deluxe was also available under the MiWi brand (exact model unknown, but it was a cart there instead of built in)
@ -467,3 +680,4 @@ CONS( 200?, zon32bit, 0, 0, zon32bit, zon32bit, zon32bit_state, empty_init,
// The Mi Guitar menu contains 24 games, but they're dupes, and just counting those would exclude the other Mi Fit and Mi Papacon menus (which also contain dupes)
CONS( 200?, mywicodx, 0, 0, zon32bit, zon32bit, mywicodx_state, empty_init, "<unknown>", "My Wico Deluxe (Family Sport 85-in-1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
CONS( 200?, oplayer, 0, 0, zon32bit, oplayer, oplayer_100in1_state, init_oplayer, "OPlayer", "OPlayer Mobile Game Console (MGS03-white) (Family Sport 100-in-1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )

View File

@ -1287,12 +1287,22 @@ static INPUT_PORTS_START( paccon ) // for Test Mode hold buttons 1+2 until the s
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
INPUT_PORTS_END
ROM_START( smartfp )
//ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 ) // not on this model? (or at least not this size, as CS base is different)
//ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP )
ROM_REGION(0x800000, "maincpu", ROMREGION_ERASE00)
ROM_LOAD16_WORD_SWAP("smartfitpark.bin", 0x000000, 0x800000, CRC(ada84507) SHA1(a3a80bf71fae62ebcbf939166a51d29c24504428))
ROM_LOAD16_WORD_SWAP("smartfitparkuk.bin", 0x000000, 0x800000, CRC(2072d7d0) SHA1(eaa4f254d6dee3a7eac64ae2204dd6291e4d27cc) )
ROM_END
ROM_START( smartfps )
//ROM_REGION16_BE( 0x40000, "maincpu:internal", ROMREGION_ERASE00 ) // not on this model? (or at least not this size, as CS base is different)
//ROM_LOAD16_WORD_SWAP( "internal.rom", 0x00000, 0x40000, NO_DUMP )
ROM_REGION(0x800000, "maincpu", ROMREGION_ERASE00)
ROM_LOAD16_WORD_SWAP("smartfitpark.bin", 0x000000, 0x800000, CRC(ada84507) SHA1(a3a80bf71fae62ebcbf939166a51d29c24504428) )
ROM_END
ROM_START( gormiti )
@ -1591,8 +1601,9 @@ ROM_START( beambox )
ROM_END
// the JAKKS ones of these seem to be known as 'Generalplus GPAC500' hardware?
CONS(2009, smartfp, 0, 0, base, smartfp, gcm394_game_state, empty_init, "Fisher-Price", "Fun 2 Learn Smart Fit Park (Spain)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
CONS(200?, tkmag220, 0, 0, tkmag220, tkmag220, tkmag220_game_state, empty_init, "TaiKee", "Mini Arcade Games Console (Family Sport 220-in-1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
CONS(2009, smartfp, 0, 0, base, smartfp, gcm394_game_state, empty_init, "Fisher-Price", "Fun 2 Learn Smart Fit Park (UK)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
CONS(2009, smartfps, smartfp, 0, base, smartfp, gcm394_game_state, empty_init, "Fisher-Price", "Fun 2 Learn Smart Fit Park (Spain)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)
CONS(200?, tkmag220, 0, 0, tkmag220, tkmag220, tkmag220_game_state, empty_init, "TaiKee", "Mini Arcade Games Console (Family Sport 220-in-1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
// die on this one is 'GCM420'
CONS(2013, gormiti, 0, 0, base, gormiti, gcm394_game_state, empty_init, "Giochi Preziosi", "Gormiti Game Arena (Spain)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND)

View File

@ -31506,6 +31506,8 @@ mog_m320
fapocket
zdog
otrail
denv150
techni4
@source:vt1682.cpp
ii8in1
@ -37307,6 +37309,7 @@ lx_jg7415 //
@source:spg2xx_zone_32bit.cpp
mywicodx //
zon32bit // Zone 32-bit
oplayer
@source:spiders.cpp
spiders // (c) 1981 Sigma Ent. Inc.
@ -37891,6 +37894,7 @@ jak_tink
jak_totm
jak_ths
smartfp // Smart Fit Park
smartfps
gormiti
wlsair60 // Wireless Air 60
wrlshunt // Wireless: Hunting Video Game System