summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ariedlmayer@gmail.com>2025-06-29 19:05:17 -0400
committer AJR <ariedlmayer@gmail.com>2025-06-29 19:07:26 -0400
commit2525d3ce17e101ffd7874c9ddece55c210c544e7 (patch)
tree0f1af724b9ab5e6d974153798f97c9ba605e7a3c
parent09c1c5ad516bfdbbc80f924261600c2f76788368 (diff)
hhgc319: Descramble address and data lines; transfer to nes_vt32.cpp driver
-rw-r--r--src/mame/mame.lst2
-rw-r--r--src/mame/nintendo/nes_vt32.cpp50
-rw-r--r--src/mame/nintendo/nes_vt369_vtunknown.cpp10
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 )