diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 05d0a6cc93e..31bc1a1972c 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -4004,6 +4004,7 @@ files { MAME_DIR .. "src/mame/machine/generalplus_gpl16250.cpp", MAME_DIR .. "src/mame/machine/generalplus_gpl16250.h", MAME_DIR .. "src/mame/drivers/generalplus_gpl32612.cpp", + MAME_DIR .. "src/mame/drivers/generalplus_gpl_unknown.cpp", MAME_DIR .. "src/mame/drivers/xavix.cpp", MAME_DIR .. "src/mame/includes/xavix.h", MAME_DIR .. "src/mame/drivers/xavix_2000.cpp", @@ -4029,8 +4030,7 @@ files { MAME_DIR .. "src/mame/machine/xavix2002_io.h", MAME_DIR .. "src/mame/drivers/xavix2.cpp", MAME_DIR .. "src/mame/drivers/titan_soc.cpp", - MAME_DIR .. "src/mame/drivers/unkmandd.cpp", - MAME_DIR .. "src/mame/drivers/bbl380.cpp", + MAME_DIR .. "src/mame/drivers/unk6502_st2xxx.cpp", MAME_DIR .. "src/mame/drivers/actions_atj2279b.cpp", MAME_DIR .. "src/mame/drivers/pubint_storyreader.cpp", MAME_DIR .. "src/mame/drivers/magiceyes_pollux_vr3520f.cpp", diff --git a/src/mame/drivers/generalplus_gpl_unknown.cpp b/src/mame/drivers/generalplus_gpl_unknown.cpp new file mode 100644 index 00000000000..bc5d3d772b1 --- /dev/null +++ b/src/mame/drivers/generalplus_gpl_unknown.cpp @@ -0,0 +1,192 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood + +// pcp8718 contains unsp code, but no obvious startup code / vectors, so it's probably booting from another device / bootstrapped +// these contain the same game selection as the games in unk6502_st2xxx.cpp but on updated hardware + +// These use SPI ROMs and unSP2.0 instructions, so will be GeneralPlus branded parts, not SunPlus +// possibly the framebuffer based video ones rather than the ones with tile layers + +/* + +for pcp8728 long jumps are done indirect via a call to RAM + +990c 20ec r4 = 20ec +d9dd [1d] = r4 +990c 0007 r4 = 0007 +d9de [1e] = r4 +fe80 28f7 goto 0028f7 + +this suggests the ROM gets copied to RAM at 0x20000, as all offsets need to be adjusted by that (or the device can see SPI directly at 0x20000) +this is logical for unSP2.0 based devices as the CS area typically starts at 0x20000 with everything below that being internal space for internal RAM/ROM/peripherals + +*/ + +#include "emu.h" + +#include "screen.h" +#include "emupal.h" +#include "speaker.h" +#include "cpu/unsp/unsp.h" + + +class pcp8718_state : public driver_device +{ +public: + pcp8718_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_mainram(*this, "mainram"), + m_palette(*this, "palette"), + m_screen(*this, "screen") + { } + + void pcp8718(machine_config &config); + +private: + virtual void machine_start() override; + virtual void machine_reset() override; + + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + required_device m_maincpu; + required_shared_ptr m_mainram; + + required_device m_palette; + required_device m_screen; + + void map(address_map &map); + + uint16_t simulate_28f7_r(); +}; + +uint32_t pcp8718_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + return 0; +} + + + + +void pcp8718_state::machine_start() +{ +} + +static INPUT_PORTS_START( pcp8718 ) +INPUT_PORTS_END + +void pcp8718_state::map(address_map &map) +{ + // there are calls to 01xxx and 02xxx regions + // (RAM populated by internal ROM?, TODO: check to make sure code copied there isn't from SPI ROM like the GPL16250 bootstrap + // does from NAND, it doesn't seem to have a header in the same format at least) + map(0x000000, 0x006fff).ram().share("mainram"); + + // registers at 7xxx are similar to GPL16250, but not identical? (different video system?) + + // there are calls to 0x0f000 (internal ROM?) + map(0x008000, 0x00ffff).rom().region("maincpu", 0x00000); + + // seems to have same memory config registers etc. as GPL16250 so CS Space starts at 0x020000 and the 'bank' is likely at 0x200000 too + map(0x020000, 0x3fffff).rom().region("spi", 0x00000); +} + +uint16_t pcp8718_state::simulate_28f7_r() +{ + // jumps to 28f7 act as a long jump to the address stored in 1d/1e + // (or possibly a data copy + execute??) + + if (!machine().side_effects_disabled()) + { + uint16_t pc = m_maincpu->state_int(UNSP_PC); + uint16_t sr = m_maincpu->state_int(UNSP_SR); + + int realpc = (pc | (sr << 16)) & 0x003fffff; + if (realpc == 0x28f7) + { + address_space& mem = m_maincpu->space(AS_PROGRAM); + int newpc = mem.read_word(0x001d); + int newds = mem.read_word(0x001e); + + sr &= 0xfff0; + sr |= (newds & 0x003f); + + m_maincpu->set_state_int(UNSP_PC, newpc); + m_maincpu->set_state_int(UNSP_SR, sr); + } + } + return m_mainram[0x28f7]; +} + + + + +void pcp8718_state::machine_reset() +{ + // this looks like it might actually be part of the IRQ handler (increase counter at 00 at the very start) rather than where we should end up after startup + // it also looks like (from the pc = 2xxx opcodes) that maybe this code should be being executed in RAM as those don't give correct offsets in the data segment. + m_maincpu->set_state_int(UNSP_PC, 0x0042); + m_maincpu->set_state_int(UNSP_SR, 0x0002); + + uint16_t* ROM = (uint16_t*)memregion("maincpu")->base(); + ROM[0x7000] = 0x9a90; // retf from internal ROM call to 0xf000 (unknown purpose) + + // there doesn't appear to be any code to set the SP, so it must be done by the internal ROM + m_maincpu->set_state_int(UNSP_SP, 0x5fff); + + address_space& mem = m_maincpu->space(AS_PROGRAM); + mem.write_word(0x2a46, 0x9a90); // retf from RAM call (unknown purpose) + + mem.write_word(0x28f7, 0xf165); // goto to RAM, for long jump / call (simulated), could also be 'copy code at this address into RAM to execute' + + m_maincpu->space(AS_PROGRAM).install_read_handler(0x28f7, 0x28f7, read16smo_delegate(*this, FUNC(pcp8718_state::simulate_28f7_r))); + +} + +void pcp8718_state::pcp8718(machine_config &config) +{ + + UNSP_20(config, m_maincpu, 20000000); // unknown CPU, unsp20 based + m_maincpu->set_addrmap(AS_PROGRAM, &pcp8718_state::map); + + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + m_screen->set_refresh_hz(60); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0)); + m_screen->set_size(64*8, 32*8); + m_screen->set_visarea(0*8, 40*8-1, 0*8, 30*8-1); + m_screen->set_screen_update(FUNC(pcp8718_state::screen_update)); + m_screen->set_palette(m_palette); + + PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x200); +} + +ROM_START( pcp8718 ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF ) + ROM_LOAD16_WORD_SWAP( "internal.rom", 0x000000, 0x10000, NO_DUMP ) // exact size unknown + + ROM_REGION16_BE( 0x800000, "spi", ROMREGION_ERASEFF ) + ROM_LOAD16_WORD_SWAP( "8718_en25f32.bin", 0x000000, 0x400000, CRC(cc138db4) SHA1(379af3d94ae840f52c06416d6cf32e25923af5ae) ) // dump needs verifying, dumper mentioned it was possibly bad (unit failed in process) +ROM_END + +ROM_START( pcp8728 ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF ) + ROM_LOAD16_WORD_SWAP( "internal.rom", 0x000000, 0x10000, NO_DUMP ) // exact size unknown + + ROM_REGION16_BE( 0x800000, "spi", ROMREGION_ERASEFF ) + ROM_LOAD16_WORD_SWAP( "pcp 8728 788 in 1.bin", 0x000000, 0x400000, CRC(60115f21) SHA1(e15c39f11e442a76fae3823b6d510178f6166926) ) +ROM_END + +ROM_START( unkunsp ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF ) + ROM_LOAD16_WORD_SWAP( "internal.rom", 0x000000, 0x10000, NO_DUMP ) // exact size unknown + + ROM_REGION16_BE( 0x800000, "spi", ROMREGION_ERASEFF ) + ROM_LOAD16_WORD_SWAP( "fm25q16a.bin", 0x000000, 0x200000, CRC(aeb472ac) SHA1(500c24b725f6d3308ef8cbdf4259f5be556c7c92) ) +ROM_END + + + + +CONS( 200?, pcp8718, 0, 0, pcp8718, pcp8718, pcp8718_state, empty_init, "PCP", "PCP 8718 - 788 in 1", MACHINE_IS_SKELETON ) // "HD 360 degrees rocker palm eyecare console" +CONS( 200?, pcp8728, 0, 0, pcp8718, pcp8718, pcp8718_state, empty_init, "PCP", "PCP 8728 - 788 in 1", MACHINE_IS_SKELETON ) +CONS( 200?, unkunsp, 0, 0, pcp8718, pcp8718, pcp8718_state, empty_init, "", "unknown unSP based handheld", MACHINE_IS_SKELETON ) diff --git a/src/mame/drivers/nes_vt.cpp b/src/mame/drivers/nes_vt.cpp index 2b7680b3051..7ff7dd59aea 100644 --- a/src/mame/drivers/nes_vt.cpp +++ b/src/mame/drivers/nes_vt.cpp @@ -120,6 +120,8 @@ public: void vt_external_space_map_1mbyte(address_map& map); void vt_external_space_map_512kbyte(address_map& map); + void init_protpp(); + protected: required_device m_soc; @@ -135,6 +137,7 @@ public: { } void nes_vt_vh2009(machine_config& config); + void nes_vt_vh2009_1mb(machine_config& config); void nes_vt_vh2009_4mb(machine_config& config); void nes_vt_vh2009_8mb(machine_config& config); @@ -1298,6 +1301,12 @@ void nes_vt_swap_op_d5_d6_state::nes_vt_vh2009(machine_config &config) //m_soc->set_default_palette_mode(PAL_MODE_NEW_VG); // gives better title screens, but worse ingame, must be able to switch } +void nes_vt_swap_op_d5_d6_state::nes_vt_vh2009_1mb(machine_config& config) +{ + nes_vt_vh2009(config); + m_soc->set_addrmap(AS_PROGRAM, &nes_vt_swap_op_d5_d6_state::vt_external_space_map_1mbyte); +} + void nes_vt_swap_op_d5_d6_state::nes_vt_vh2009_4mb(machine_config& config) { nes_vt_vh2009(config); @@ -1835,6 +1844,7 @@ ROM_END + ROM_START( dgun2573 ) // this one lacked a DreamGear logo but was otherwise physically identical, is it a clone product or did DreamGear drop the logo in favor of just using the 'My Arcade' brand? ROM_REGION( 0x2000000, "mainrom", 0 ) ROM_LOAD( "myarcadegamerportable_s29gl256p10tfi01_0001227e.bin", 0x00000, 0x2000000, CRC(8f8c8da7) SHA1(76a18458922e39abe1982f05f184babb5e65acf2) ) @@ -1905,6 +1915,12 @@ ROM_START( techni4 ) ROM_LOAD( "technigame.bin", 0x00000, 0x200000, CRC(3c96b1b1) SHA1(1acc81b26e740327bd6d9faa5a96ab027a48dd77) ) ROM_END + +ROM_START( protpp ) + ROM_REGION( 0x100000, "mainrom", 0 ) + ROM_LOAD( "vpingpong_s29al008d70tfi02_0001225b.bin", 0x00000, 0x100000, CRC(8cf46272) SHA1(298a6341d26712ec1f282e7514e995a7af5ac012) ) +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) ) @@ -1972,6 +1988,26 @@ void nes_vt_cy_lexibook_state::init_lxcmcypp() } } +void nes_vt_state::init_protpp() +{ + // this gets the tiles correct + u8 *src = memregion("mainrom")->base(); + int len = memregion("mainrom")->bytes(); + + std::vector buffer(len); + { + for (int i = 0; i < len; i++) + { + buffer[i] = bitswap<8>(src[i],3,1,2,0,7,5,6,4); + } + + std::copy(buffer.begin(), buffer.end(), &src[0]); + } +} + + + + // earlier version of vdogdemo CONS( 200?, vdogdeme, 0, 0, nes_vt_1mb, nes_vt, nes_vt_state, empty_init, "VRT", "V-Dog (prototype, earlier)", MACHINE_NOT_WORKING ) @@ -2104,6 +2140,8 @@ CONS( 200?, silv35, 0, 0, nes_vt_vh2009_4mb, nes_vt, nes_vt_swap_op_ // die is marked as VH2009, as above, but no scrambled opcodes here CONS( 201?, techni4, 0, 0, nes_vt_pal_2mb, nes_vt, nes_vt_state, empty_init, "Technigame", "Technigame Super 4-in-1 Sports (PAL)", MACHINE_IMPERFECT_GRAPHICS ) + // seems to use PCM for all sound, some garbage at bottom of screen, needs correct inputs (seems to respond to start, and any direction input for 'hit' - check if they're power related) +CONS( 200?, protpp, 0, 0, nes_vt_vh2009_1mb, nes_vt, nes_vt_swap_op_d5_d6_state, init_protpp, "Protocol", "Virtual Ping Pong (Protocol)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) // same encryption as above, but seems like newer hardware (or the above aren't using most of the features) CONS( 200?, lpgm240, 0, 0, nes_vt_vh2009_8mb, nes_vt, nes_vt_swap_op_d5_d6_state, empty_init, "", "Let's Play! Game Machine 240 in 1", MACHINE_NOT_WORKING ) // mini 'retro-arcade' style cabinet diff --git a/src/mame/drivers/spg2xx.cpp b/src/mame/drivers/spg2xx.cpp index 3ffed32cb32..44cfbe5c195 100644 --- a/src/mame/drivers/spg2xx.cpp +++ b/src/mame/drivers/spg2xx.cpp @@ -1655,7 +1655,6 @@ ROM_END ROM_START( ablkickb ) ROM_REGION( 0x1000000, "maincpu", ROMREGION_ERASE00 ) ROM_LOAD16_WORD_SWAP( "ablkickboxing.bin", 0x000000, 0x800000, CRC(61394c45) SHA1(291d28a39edcb32a8f5d776a5e5c05e6fd0abece) ) - ROM_LOAD16_WORD_SWAP( "fm25q16a.bin", 0x800000, 0x200000, CRC(aeb472ac) SHA1(500c24b725f6d3308ef8cbdf4259f5be556c7c92) ) ROM_END ROM_START( lxspidaj ) diff --git a/src/mame/drivers/bbl380.cpp b/src/mame/drivers/unk6502_st2xxx.cpp similarity index 87% rename from src/mame/drivers/bbl380.cpp rename to src/mame/drivers/unk6502_st2xxx.cpp index 78952bcb52f..e64a255872f 100644 --- a/src/mame/drivers/bbl380.cpp +++ b/src/mame/drivers/unk6502_st2xxx.cpp @@ -1,9 +1,13 @@ // license:BSD-3-Clause // copyright-holders:David Haywood +// unknown 6502 based handhelds, possibly ST2205U architecture + // the BBL 380 - 180 in 1 features similar menus / presentation / games to the 'ORB Gaming Retro Arcade Pocket Handheld Games Console with 153 Games' (eg has Matchstick Man, Gang Tie III etc.) // https://www.youtube.com/watch?v=NacY2WHd-CY +// these games were ported to unSP hardware at some point, see generaplus_gpl_unknown.cpp + // BIOS calls are made very frequently to the undumped firmware. // The most common call ($6058 in bbl380, $6062 in ragc153 & dphh8630) seems to involve downloading a snippet of code from Flash and executing it from RAM. // A variant of this call ($60d2 in bbl380, $60e3 in ragc153 & dphh8630) is invoked with jsr. @@ -127,6 +131,12 @@ ROM_START( dphh8630 ) ROM_LOAD( "bg25q16.bin", 0x000000, 0x200000, CRC(277850d5) SHA1(740087842e1e63bf99b4ca9c1b2053361f267269) ) ROM_END +ROM_START( dgun2953 ) + ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF ) + ROM_LOAD( "dgun2953_st2205u.bin", 0x000000, 0x004000, NO_DUMP ) // internal OTPROM BIOS + ROM_LOAD( "dg160_25x32v_ef3016.bin", 0x000000, 0x400000, CRC(2e993bac) SHA1(4b310e326a47df1980aeef38aa9a59018d7fe76f) ) +ROM_END + void bbl380_state::init_ragc153() @@ -142,4 +152,6 @@ void bbl380_state::init_ragc153() CONS( 200?, bbl380, 0, 0, bbl380, bbl380, bbl380_state, empty_init, "BaoBaoLong", "BBL380 - 180 in 1", MACHINE_IS_SKELETON ) CONS( 200?, ragc153, 0, 0, bbl380, bbl380, bbl380_state, init_ragc153, "Orb", "Retro Arcade Game Controller 153-in-1", MACHINE_IS_SKELETON ) -CONS( 200?, dphh8630, 0, 0, bbl380, bbl380, bbl380_state, init_ragc153, "", "Digital Pocket Hand Held System Model: 8630 - 230-in-1", MACHINE_IS_SKELETON ) +CONS( 200?, dphh8630, 0, 0, bbl380, bbl380, bbl380_state, init_ragc153, "PCP", "PCP 8630 - 230-in-1 - Digital Pocket Hand Held System", MACHINE_IS_SKELETON ) // PCP isn't mentioned on packaging +CONS( 200?, dgun2953, 0, 0, bbl380, bbl380, bbl380_state, init_ragc153, "dreamGEAR", "My Arcade Gamer Mini 160-in-1 (DGUN-2953)", MACHINE_IS_SKELETON ) + diff --git a/src/mame/drivers/unkmandd.cpp b/src/mame/drivers/unkmandd.cpp deleted file mode 100644 index 3997fcf14cc..00000000000 --- a/src/mame/drivers/unkmandd.cpp +++ /dev/null @@ -1,72 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood - -// unkmandd contains unsp code, but no obvious startup code / vectors, so it's probably booting from another device / bootstrapped - -#include "emu.h" - -#include "screen.h" -#include "emupal.h" -#include "speaker.h" - -class unkmandd_state : public driver_device -{ -public: - unkmandd_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_palette(*this, "palette"), - m_screen(*this, "screen") - { } - - void unkmandd(machine_config &config); - -private: - virtual void machine_start() override; - virtual void machine_reset() override; - - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - - required_device m_palette; - required_device m_screen; -}; - -uint32_t unkmandd_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - return 0; -} - - - - -void unkmandd_state::machine_start() -{ -} - -void unkmandd_state::machine_reset() -{ -} - -static INPUT_PORTS_START( unkmandd ) -INPUT_PORTS_END - -void unkmandd_state::unkmandd(machine_config &config) -{ - // unknown CPU, unsp based - - SCREEN(config, m_screen, SCREEN_TYPE_RASTER); - m_screen->set_refresh_hz(60); - m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0)); - m_screen->set_size(64*8, 32*8); - m_screen->set_visarea(0*8, 40*8-1, 0*8, 30*8-1); - m_screen->set_screen_update(FUNC(unkmandd_state::screen_update)); - m_screen->set_palette(m_palette); - - PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 0x200); -} - -ROM_START( unkmandd ) - ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF ) - ROM_LOAD( "8718_en25f32.bin", 0x000000, 0x400000, CRC(cc138db4) SHA1(379af3d94ae840f52c06416d6cf32e25923af5ae) ) -ROM_END - -CONS( 200?, unkmandd, 0, 0, unkmandd, unkmandd, unkmandd_state, empty_init, "M&D", "unknown M&D handheld", MACHINE_IS_SKELETON ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 8503aa65cd1..a4020cd0e68 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -3302,11 +3302,6 @@ mechattj // A8002 'MA' (c) 1989 mechattu // A8002 'MA' (c) 1989 mechattu1 // A8002 'MA' (c) 1989 -@source:bbl380.cpp -bbl380 -ragc153 -dphh8630 - @source:bcs3.cpp bcs3 // bcs3a // @@ -14777,6 +14772,11 @@ suprpokr // (c) 1986 Grayhound Electronics suprpokra // (c) 1986 Grayhound Electronics suprpokrb // (c) 1986 Grayhound Electronics +@source:generalplus_gpl_unknown.cpp +pcp8718 +pcp8728 +unkunsp + @source:generalplus_gpl16250_mobigo.cpp mobigo mobigos @@ -32149,6 +32149,7 @@ majgnc sudopptv zudugo ablping +protpp vgpocket vgpmini sy889 @@ -40773,12 +40774,15 @@ uts20 // @source:unixpc.cpp 3b1 // 3B1 "Unix PC" +@source:unk6502_st2xxx.cpp +bbl380 +ragc153 +dphh8630 +dgun2953 + @source:unkhorse.cpp unkhorse // -@source:unkmandd.cpp -unkmandd - @source:unkpoker.cpp unkpoker // diff --git a/src/mame/mess.flt b/src/mame/mess.flt index c33b00ebf21..086302caa13 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -107,7 +107,6 @@ basic52.cpp basssta.cpp bbc.cpp bbcbc.cpp -bbl380.cpp bcs3.cpp bebox.cpp bert.cpp @@ -330,6 +329,7 @@ gamemachine.cpp gamepock.cpp gb.cpp gba.cpp +generalplus_gpl_unknown.cpp generalplus_gpl16250.cpp generalplus_gpl16250_mobigo.cpp generalplus_gpl16250_nand.cpp @@ -1037,7 +1037,7 @@ unior.cpp unistar.cpp univac.cpp unixpc.cpp -unkmandd.cpp +unk6502_st2xxx.cpp ut88.cpp uzebox.cpp v100.cpp