diff options
| author | 2025-06-29 19:05:17 -0400 | |
|---|---|---|
| committer | 2025-06-29 19:07:26 -0400 | |
| commit | 2525d3ce17e101ffd7874c9ddece55c210c544e7 (patch) | |
| tree | 0f1af724b9ab5e6d974153798f97c9ba605e7a3c | |
| parent | 09c1c5ad516bfdbbc80f924261600c2f76788368 (diff) | |
hhgc319: Descramble address and data lines; transfer to nes_vt32.cpp driver
| -rw-r--r-- | src/mame/mame.lst | 2 | ||||
| -rw-r--r-- | src/mame/nintendo/nes_vt32.cpp | 50 | ||||
| -rw-r--r-- | src/mame/nintendo/nes_vt369_vtunknown.cpp | 10 |
3 files changed, 43 insertions, 19 deletions
diff --git a/src/mame/mame.lst b/src/mame/mame.lst index f7b69ca586c..60956edbdff 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -35442,6 +35442,7 @@ dgunl3201 dgunl3202 fcpocket g9_666 +hhgc319 lxpcli lxpcsp matet100 @@ -35466,7 +35467,6 @@ egame150 fapocket gcs2mgp gtct885 -hhgc319 hkb502 hkb502a lexi30 diff --git a/src/mame/nintendo/nes_vt32.cpp b/src/mame/nintendo/nes_vt32.cpp index eb405acf115..693d06e8911 100644 --- a/src/mame/nintendo/nes_vt32.cpp +++ b/src/mame/nintendo/nes_vt32.cpp @@ -83,6 +83,7 @@ public: m_soc(*this, "soc") { } + void vt_external_space_map_16mbyte(address_map &map) ATTR_COLD; void vt_external_space_map_32mbyte(address_map &map) ATTR_COLD; protected: @@ -97,6 +98,7 @@ public: { } void nes_vt32_fp(machine_config& config); + void nes_vt32_16mb(machine_config& config); void nes_vt32_32mb(machine_config& config); void nes_vt32_4x16mb(machine_config& config); @@ -104,6 +106,7 @@ public: void init_rfcp168(); void init_g9_666(); + void init_hhgc319(); private: uint8_t vt_rom_banked_r(offs_t offset); @@ -124,6 +127,11 @@ void nes_vt32_base_state::vtspace_w(offs_t offset, uint8_t data) } // VTxx can address 25-bit address space (32MB of ROM) so use maps with mirroring in depending on ROM size +void nes_vt32_state::vt_external_space_map_16mbyte(address_map &map) +{ + map(0x0000000, 0x0ffffff).mirror(0x1000000).r(FUNC(nes_vt32_state::vt_rom_r)); +} + void nes_vt32_state::vt_external_space_map_32mbyte(address_map &map) { map(0x0000000, 0x1ffffff).r(FUNC(nes_vt32_state::vt_rom_r)); @@ -310,6 +318,12 @@ void nes_vt32_unk_state::nes_vt32_4x16mb(machine_config& config) dynamic_cast<nes_vt09_soc_device&>(*m_soc).upper_read_412d_callback().set(FUNC(nes_vt32_unk_state::fcpocket_412d_r)); } +void nes_vt32_unk_state::nes_vt32_16mb(machine_config& config) +{ + nes_vt32_fp(config); + m_soc->set_addrmap(AS_PROGRAM, &nes_vt32_unk_state::vt_external_space_map_16mbyte); +} + void nes_vt32_unk_state::nes_vt32_32mb(machine_config& config) { nes_vt32_fp(config); @@ -398,21 +412,24 @@ ROM_START( lxpcli ) ROM_END ROM_START( rfcp168 ) - ROM_REGION( 0x2000000, "mainrom", 0 ) + ROM_REGION( 0x1000000, "mainrom", 0 ) ROM_LOAD( "winbond_w29gl128c.bin", 0x00000, 0x1000000, CRC(d11caf71) SHA1(64b269cee30a51549a2d0491bbeed07751771559) ) // ROM verified on 2 units - ROM_RELOAD( 0x1000000, 0x1000000 ) ROM_END ROM_START( g9_666 ) - ROM_REGION( 0x2000000, "mainrom", 0 ) + ROM_REGION( 0x1000000, "mainrom", 0 ) ROM_LOAD( "666in1.u1", 0x00000, 0x1000000, CRC(e3a98465) SHA1(dfec3e74e36aef9bfa57ec530c37642015569dc5) ) - ROM_RELOAD( 0x1000000, 0x1000000 ) +ROM_END + +ROM_START( hhgc319 ) + ROM_REGION( 0x1000000, "mainrom", 0 ) + ROM_LOAD( "s29gl128n10tfi01.u3", 0x000000, 0x1000000, CRC(4b51125f) SHA1(bab3981ae1652cf6620c7c6769a6729a1e4d588f) ) ROM_END void nes_vt32_unk_state::init_rfcp168() { uint8_t *romdata = memregion("mainrom")->base(); - for (offs_t i = 0; i < 0x2000000; i += 0x10000) + for (offs_t i = 0; i < 0x1000000; i += 0x10000) { // Swap A12 with A13 and A14 with A15 std::swap_ranges(&romdata[i + 0x1000], &romdata[i + 0x2000], &romdata[i + 0x2000]); @@ -427,13 +444,27 @@ void nes_vt32_unk_state::init_rfcp168() void nes_vt32_unk_state::init_g9_666() { uint8_t *romdata = memregion("mainrom")->base(); - for (offs_t i = 0; i < 0x2000000; i += 2) + for (offs_t i = 0; i < 0x1000000; i += 2) { uint16_t w = get_u16le(&romdata[i]); put_u16le(&romdata[i], (w & 0xf9f9) | (w & 0x0600) >> 8 | (w & 0x0006) << 8); } } +void nes_vt32_unk_state::init_hhgc319() +{ + init_rfcp168(); + + // Even more pairs of address and data lines to swap here... + uint8_t *romdata = memregion("mainrom")->base(); + for (offs_t i = 0; i < 0x1000000; i += 0x800) + std::swap_ranges(&romdata[i + 0x200], &romdata[i + 0x400], &romdata[i + 0x400]); + for (offs_t i = 0; i < 0x1000000; i += 0x20) + std::swap_ranges(&romdata[i + 0x08], &romdata[i + 0x10], &romdata[i + 0x10]); + for (offs_t i = 0; i < 0x1000000; i += 2) + put_u16le(&romdata[i], bitswap<16>(get_u16le(&romdata[i]), 15, 14, 6, 5, 3, 2, 9, 8, 7, 13, 12, 4, 11, 10, 1, 0)); +} + } // anonymous namespace @@ -455,10 +486,13 @@ CONS( 201?, myaass, 0, 0, nes_vt32_32mb, nes_vt32, nes_vt32_unk_state, empt CONS( 201?, myaasa, 0, 0, nes_vt32_32mb, nes_vt32, nes_vt32_unk_state, empty_init, "dreamGEAR", "My Arcade All Star Arena - Pocket Player (307-in-1)", MACHINE_NOT_WORKING ) // lots of accesses to $42xx (could this be a different SoC?) -CONS( 201?, rfcp168, 0, 0, nes_vt32_32mb, nes_vt32, nes_vt32_unk_state, init_rfcp168, "<unknown>", "Retro FC Plus 168 in 1 Handheld", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) // "RETRO_FC_V3.5" +CONS( 201?, rfcp168, 0, 0, nes_vt32_16mb, nes_vt32, nes_vt32_unk_state, init_rfcp168, "<unknown>", "Retro FC Plus 168 in 1 Handheld", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) // "RETRO_FC_V3.5" // many duplicates, real game count to be confirmed, graphical issues in some games, lots of accesses to $42xx -CONS( 202?, g9_666, 0, 0, nes_vt32_32mb, nes_vt32, nes_vt32_unk_state, init_g9_666, "<unknown>", "G9 Game Box 666 Games", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) +CONS( 202?, g9_666, 0, 0, nes_vt32_16mb, nes_vt32, nes_vt32_unk_state, init_g9_666, "<unknown>", "G9 Game Box 666 Games", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) + +// lots of accesses to $42xx, highly scrambled +CONS( 201?, hhgc319, 0, 0, nes_vt32_16mb, nes_vt32, nes_vt32_unk_state, init_hhgc319, "<unknown>", "Handheld Game Console 319-in-1", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) // Some games (eg F22) are scrambled like in myaass diff --git a/src/mame/nintendo/nes_vt369_vtunknown.cpp b/src/mame/nintendo/nes_vt369_vtunknown.cpp index 57492108d22..6963a7f1869 100644 --- a/src/mame/nintendo/nes_vt369_vtunknown.cpp +++ b/src/mame/nintendo/nes_vt369_vtunknown.cpp @@ -24,8 +24,6 @@ #include "emu.h" #include "nes_vt369_vtunknown_soc.h" -#include "nes_vt32_soc.h" - namespace { @@ -1151,11 +1149,6 @@ ROM_START( unk128vt ) ROM_LOAD( "w25q32.bin", 0x00000, 0x400000, CRC(35ccadf6) SHA1(80b25e374a097d1b9380b7e64013d7ac0d5aa2ca) ) ROM_END -ROM_START( hhgc319 ) - ROM_REGION( 0x1000000, "mainrom", 0 ) - ROM_LOAD( "s29gl128n10tfi01.u3", 0x000000, 0x1000000, CRC(4b51125f) SHA1(bab3981ae1652cf6620c7c6769a6729a1e4d588f) ) -ROM_END - ROM_START( 168pcase ) ROM_REGION( 0x400000, "mainrom", 0 ) ROM_LOAD( "25q32.u7", 0x000000, 0x400000, CRC(98e8e97a) SHA1(fd516ef2819a597130f5f7ace9a7838cb99ab08a) ) @@ -1346,9 +1339,6 @@ CONS( 2019, unk2019hh, 0, 0, vt36x_16mb, vt369, vt36x_state, empty_init CONS( 2020, unk2020hh, unk2019hh,0, vt36x_16mb, vt369, vt36x_state, empty_init, "<unknown>", "unknown VTxx based GameBoy style handheld (2020 PCB)", MACHINE_NOT_WORKING ) -// unknown tech level, might be scrambled as default codebank/boot vectors don't seem valid, maybe bad dump -CONS( 201?, hhgc319, 0, 0, vt36x_16mb, vt369, vt36x_state, empty_init, "<unknown>", "Handheld Game Console 319-in-1", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) - // unknown tech, probably from 2021, probably VT369, ROM wouldn't read consistently CONS( 202?, vibes240, 0, 0, vt36x_vibesswap_16mb, vt369, vt36x_state, empty_init, "<unknown>", "Vibes Retro Pocket Gamer 240-in-1", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) |
