From 2b0c7929a6b83048084b26cfaa3166a99d6bccb7 Mon Sep 17 00:00:00 2001 From: David Haywood <28625134+DavidHaywood@users.noreply.github.com> Date: Tue, 17 Mar 2020 17:14:35 +0000 Subject: 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] --- src/devices/video/ppu2c0x.cpp | 110 +++++++++++------ src/devices/video/ppu2c0x.h | 6 + src/devices/video/ppu2c0x_sh6578.cpp | 26 +++- src/devices/video/ppu2c0x_sh6578.h | 7 +- src/mame/drivers/nes_sh6578.cpp | 2 +- src/mame/drivers/nes_vt.cpp | 43 +++++-- src/mame/drivers/spg2xx_zone_32bit.cpp | 220 ++++++++++++++++++++++++++++++++- src/mame/drivers/sunplus_unsp20soc.cpp | 17 ++- src/mame/mame.lst | 4 + 9 files changed, 375 insertions(+), 60 deletions(-) diff --git a/src/devices/video/ppu2c0x.cpp b/src/devices/video/ppu2c0x.cpp index dd895b469f1..39023752c8f 100644 --- a/src/devices/video/ppu2c0x.cpp +++ b/src/devices/video/ppu2c0x.cpp @@ -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); diff --git a/src/devices/video/ppu2c0x.h b/src/devices/video/ppu2c0x.h index e785a605fdb..b95652791f5 100644 --- a/src/devices/video/ppu2c0x.h +++ b/src/devices/video/ppu2c0x.h @@ -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 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 m_palette_ram; /* shouldn't be in main memory! */ diff --git a/src/devices/video/ppu2c0x_sh6578.cpp b/src/devices/video/ppu2c0x_sh6578.cpp index 5cad4d628b5..dc8721c31f8 100644 --- a/src/devices/video/ppu2c0x_sh6578.cpp +++ b/src/devices/video/ppu2c0x_sh6578.cpp @@ -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::draw_sprites(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) { diff --git a/src/devices/video/ppu2c0x_sh6578.h b/src/devices/video/ppu2c0x_sh6578.h index 4690af7bd70..c617198c93b 100644 --- a/src/devices/video/ppu2c0x_sh6578.h +++ b/src/devices/video/ppu2c0x_sh6578.h @@ -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; }; diff --git a/src/mame/drivers/nes_sh6578.cpp b/src/mame/drivers/nes_sh6578.cpp index d3cab64a35c..d7a6aebd456 100644 --- a/src/mame/drivers/nes_sh6578.cpp +++ b/src/mame/drivers/nes_sh6578.cpp @@ -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) diff --git a/src/mame/drivers/nes_vt.cpp b/src/mame/drivers/nes_vt.cpp index de198228a8e..475bda3e0f2 100644 --- a/src/mame/drivers/nes_vt.cpp +++ b/src/mame/drivers/nes_vt.cpp @@ -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) diff --git a/src/mame/drivers/spg2xx_zone_32bit.cpp b/src/mame/drivers/spg2xx_zone_32bit.cpp index be29643c207..c2e16233b3d 100644 --- a/src/mame/drivers/spg2xx_zone_32bit.cpp +++ b/src/mame/drivers/spg2xx_zone_32bit.cpp @@ -28,9 +28,9 @@ protected: required_region_ptr 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, "", "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 ) \ No newline at end of file diff --git a/src/mame/drivers/sunplus_unsp20soc.cpp b/src/mame/drivers/sunplus_unsp20soc.cpp index cf0c6c9cfba..b7245ff9091 100644 --- a/src/mame/drivers/sunplus_unsp20soc.cpp +++ b/src/mame/drivers/sunplus_unsp20soc.cpp @@ -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) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 159e8eef85a..518f74c34e9 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -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 -- cgit v1.2.3