diff options
| author | 2026-04-09 14:13:03 +0200 | |
|---|---|---|
| committer | 2026-04-14 19:24:38 +0200 | |
| commit | 7c02a94955856f5c269c441245437380534c4efe (patch) | |
| tree | addd262cb70e6c49def06ddf86a1f1398f2dca28 | |
| parent | 4dacbe3ff93c164d94a8da6472a4c25c3b868dac (diff) | |
nintendo/gamecube.cpp: fix startup validation
| -rw-r--r-- | src/mame/nintendo/gamecube.cpp | 40 | ||||
| -rw-r--r-- | src/mame/sega/triforce.cpp | 38 |
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); } |
