summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <lordkale4@gmail.com>2026-04-09 14:13:03 +0200
committer angelosa <lordkale4@gmail.com>2026-04-14 19:24:38 +0200
commit7c02a94955856f5c269c441245437380534c4efe (patch)
treeaddd262cb70e6c49def06ddf86a1f1398f2dca28
parent4dacbe3ff93c164d94a8da6472a4c25c3b868dac (diff)
nintendo/gamecube.cpp: fix startup validation
-rw-r--r--src/mame/nintendo/gamecube.cpp40
-rw-r--r--src/mame/sega/triforce.cpp38
2 files changed, 55 insertions, 23 deletions
diff --git a/src/mame/nintendo/gamecube.cpp b/src/mame/nintendo/gamecube.cpp
index c3b29075ed3..7efa2b32cd8 100644
--- a/src/mame/nintendo/gamecube.cpp
+++ b/src/mame/nintendo/gamecube.cpp
@@ -12,6 +12,7 @@
#include "emu.h"
#include "cpu/powerpc/ppc.h"
+#include "screen.h"
namespace {
@@ -29,26 +30,44 @@ public:
void gc(machine_config &config);
void ppc_mem(address_map &map) ATTR_COLD;
+
protected:
virtual void machine_start() override ATTR_COLD;
virtual void machine_reset() override ATTR_COLD;
+ virtual void video_start() override ATTR_COLD;
private:
void decrypt(uint8_t *data, unsigned size);
- required_device<cpu_device> m_cpu;
+ required_device<ppc_device> m_cpu;
+
+ uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
};
+void gamecube_state::video_start()
+{
+}
+
+uint32_t gamecube_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
//**************************************************************************
// ADDRESS MAPS
//**************************************************************************
+// 8000'0000 cached logical access
+// c000'0000 non cached logical access
+// c800'0000 EFB logical access
+// cc00'0000 HW regs logical access
void gamecube_state::ppc_mem(address_map &map)
{
- map(0x00000000, 0x017fffff).ram(); // 24 MB main memory
- map(0x08000000, 0x081fffff).ram(); // 2 MB embedded framebuffer
- map(0xfff00000, 0xffffffff).bankr("boot");
+ map(0x0000'0000, 0x017f'ffff).ram().share("workram"); // 24 MB main memory (physical)
+ map(0x0800'0000, 0x081f'ffff).ram(); // 2 MB embedded framebuffer (EFB)
+ map(0x0c00'6800, 0x0c00'683f).lr8(NAME([] () { return 0; })).nopw(); // EXI External Interface
+// map(0xe000'0000, 0xe000'3fff).ram(); // L2 cache
+ map(0xfff0'0000, 0xffff'ffff).bankr("boot");
}
@@ -56,7 +75,7 @@ void gamecube_state::ppc_mem(address_map &map)
// INPUTS
//**************************************************************************
-INPUT_PORTS_START( gc )
+static INPUT_PORTS_START( gc )
INPUT_PORTS_END
@@ -119,6 +138,8 @@ void gamecube_state::decrypt(uint8_t *data, unsigned size)
void gamecube_state::machine_start()
{
+ m_cpu->ppcdrc_set_options(PPCDRC_COMPATIBLE_OPTIONS);
+
decrypt(memregion("ipl")->base() + 0x100, 0x1afe00);
// swap endianess after decryption
@@ -146,8 +167,15 @@ void gamecube_state::machine_reset()
void gamecube_state::gc(machine_config &config)
{
- PPC603(config, m_cpu, 485000000 / 100); // 485 MHz IBM "Gekko" (750CXe/750FX based)
+ PPC603(config, m_cpu, 485'000'000); // 485 MHz IBM "Gekko" (750CXe/750FX based)
+ m_cpu->set_bus_frequency(200'000'000); // 200 MHz 64-bit bus width to main memory
m_cpu->set_addrmap(AS_PROGRAM, &gamecube_state::ppc_mem);
+
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_refresh_hz(60);
+ screen.set_size(640, 480);
+ screen.set_visarea(0, 639, 0, 479);
+ screen.set_screen_update(FUNC(gamecube_state::screen_update));
}
diff --git a/src/mame/sega/triforce.cpp b/src/mame/sega/triforce.cpp
index 3b09bd4ad79..07127540d73 100644
--- a/src/mame/sega/triforce.cpp
+++ b/src/mame/sega/triforce.cpp
@@ -475,18 +475,33 @@ public:
void triforcegd(machine_config &config);
void triforce_base(machine_config &config);
+protected:
+ virtual void machine_start() override ATTR_COLD;
+ virtual void video_start() override ATTR_COLD;
+
private:
+ required_device<ppc_device> m_maincpu;
+
+ void gc_map(address_map &map) ATTR_COLD;
+
uint64_t gc_pi_r();
void gc_pi_w(uint64_t data);
uint64_t gc_exi_r();
void gc_exi_w(uint64_t data);
- virtual void machine_start() override ATTR_COLD;
- virtual void video_start() override ATTR_COLD;
- uint32_t screen_update_triforce(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- required_device<ppc_device> m_maincpu;
- void gc_map(address_map &map) ATTR_COLD;
+
+ uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
};
+void triforce_state::video_start()
+{
+}
+
+uint32_t triforce_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ return 0;
+}
+
+
uint64_t triforce_state::gc_pi_r()
{
return 0;
@@ -513,16 +528,6 @@ void triforce_state::gc_map(address_map &map)
map(0xfff00000, 0xffffffff).rom().region("maincpu", 0); /* Program ROM */
}
-
-void triforce_state::video_start()
-{
-}
-
-uint32_t triforce_state::screen_update_triforce(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
-{
- return 0;
-}
-
static INPUT_PORTS_START( triforce )
INPUT_PORTS_END
@@ -597,13 +602,12 @@ void triforce_state::triforce_base(machine_config &config)
config.set_maximum_quantum(attotime::from_hz(6000));
-
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_size(640, 480);
screen.set_visarea(0, 639, 0, 479);
- screen.set_screen_update(FUNC(triforce_state::screen_update_triforce));
+ screen.set_screen_update(FUNC(triforce_state::screen_update));
PALETTE(config, "palette").set_entries(65536);
}