From bebc8f566040097b086b8d775387287da66e44fe Mon Sep 17 00:00:00 2001 From: Dirk Hoffmann Date: Mon, 2 Sep 2024 11:56:20 +0200 Subject: [PATCH] Work on Cartridge extended RAM initialization --- Emulator/Media/Cartridges/Cartridge.cpp | 10 ++++++---- Emulator/Media/Cartridges/Cartridge.h | 10 +++++++++- Emulator/Media/Cartridges/CartridgeBase.cpp | 4 ++-- .../Media/Cartridges/CustomCartridges/EasyFlash.cpp | 2 +- Emulator/Media/Cartridges/CustomCartridges/EasyFlash.h | 2 ++ Emulator/Media/Cartridges/CustomCartridges/Isepic.cpp | 2 +- Emulator/Media/Cartridges/CustomCartridges/Isepic.h | 1 + Emulator/Media/Cartridges/CustomCartridges/Kcs.cpp | 2 +- Emulator/Media/Cartridges/CustomCartridges/PageFox.cpp | 2 +- Emulator/Media/Cartridges/CustomCartridges/PageFox.h | 1 + Emulator/Media/Cartridges/CustomCartridges/Reu.h | 3 +++ 11 files changed, 28 insertions(+), 11 deletions(-) diff --git a/Emulator/Media/Cartridges/Cartridge.cpp b/Emulator/Media/Cartridges/Cartridge.cpp index 91d19f587..a869c6539 100644 --- a/Emulator/Media/Cartridges/Cartridge.cpp +++ b/Emulator/Media/Cartridges/Cartridge.cpp @@ -379,7 +379,7 @@ Cartridge::setRamCapacity(isize size) externalRam = new u8[size]; ramCapacity = (u64)size; - memset(externalRam, 0xFF, size); + eraseRAM(); } } @@ -401,9 +401,11 @@ Cartridge::pokeRAM(u32 addr, u8 value) void Cartridge::eraseRAM(u8 value) { - assert(externalRam != nullptr); - memset(externalRam, value, ramCapacity); - writes += ramCapacity; + if (externalRam) { + + memset(externalRam, value, ramCapacity); + writes += ramCapacity; + } } void diff --git a/Emulator/Media/Cartridges/Cartridge.h b/Emulator/Media/Cartridges/Cartridge.h index a65175197..b573b2044 100644 --- a/Emulator/Media/Cartridges/Cartridge.h +++ b/Emulator/Media/Cartridges/Cartridge.h @@ -368,10 +368,18 @@ class Cartridge : public SubComponent, public Inspectable { */ void setRamCapacity(isize size); + /* Initializes the external RAM with the startup value. This function is + * called during a reset if the cartridge does not back up memory with a + * battery. + */ + virtual void eraseRAM() { eraseRAM(0xFF); } + + // Erases the external RAM with a specific startup value + void eraseRAM(u8 value); + // Reads or write RAM cells u8 peekRAM(u32 addr) const; void pokeRAM(u32 addr, u8 value); - void eraseRAM(u8 value); // diff --git a/Emulator/Media/Cartridges/CartridgeBase.cpp b/Emulator/Media/Cartridges/CartridgeBase.cpp index bac212437..6888f68bc 100644 --- a/Emulator/Media/Cartridges/CartridgeBase.cpp +++ b/Emulator/Media/Cartridges/CartridgeBase.cpp @@ -19,8 +19,8 @@ namespace vc64 { void Cartridge::operator << (SerResetter &worker) { - // Reset external RAM - if (externalRam && !getCartridgeTraits().battery) memset(externalRam, 0xFF, ramCapacity); + // Reset external RAM if no battery is present + if (!getCartridgeTraits().battery) eraseRAM(); // Reset all chip packets for (isize i = 0; i < numPackets; i++) *packet[i] << worker; diff --git a/Emulator/Media/Cartridges/CustomCartridges/EasyFlash.cpp b/Emulator/Media/Cartridges/CustomCartridges/EasyFlash.cpp index 1dd050c67..ce5a229a0 100644 --- a/Emulator/Media/Cartridges/CustomCartridges/EasyFlash.cpp +++ b/Emulator/Media/Cartridges/CustomCartridges/EasyFlash.cpp @@ -34,7 +34,7 @@ EasyFlash::resetCartConfig() void EasyFlash::_didReset(bool hard) { - eraseRAM(0); + // eraseRAM(0); // Make sure peekRomL() and peekRomH() conver the whole range mappedBytesL = 0x2000; diff --git a/Emulator/Media/Cartridges/CustomCartridges/EasyFlash.h b/Emulator/Media/Cartridges/CustomCartridges/EasyFlash.h index 2cb43ffc8..93d22dccf 100644 --- a/Emulator/Media/Cartridges/CustomCartridges/EasyFlash.h +++ b/Emulator/Media/Cartridges/CustomCartridges/EasyFlash.h @@ -137,6 +137,8 @@ class EasyFlash final : public Cartridge { void pokeIO2(u16 addr, u8 value) override; void pokeBankReg(u8 value); void pokeModeReg(u8 value); + + void eraseRAM() override { Cartridge::eraseRAM(0x00); } }; } diff --git a/Emulator/Media/Cartridges/CustomCartridges/Isepic.cpp b/Emulator/Media/Cartridges/CustomCartridges/Isepic.cpp index d825d685c..46c71b560 100644 --- a/Emulator/Media/Cartridges/CustomCartridges/Isepic.cpp +++ b/Emulator/Media/Cartridges/CustomCartridges/Isepic.cpp @@ -47,7 +47,7 @@ Isepic::_dump(Category category, std::ostream& os) const void Isepic::_didReset(bool hard) { - eraseRAM(0); + // eraseRAM(0); page = 0; } diff --git a/Emulator/Media/Cartridges/CustomCartridges/Isepic.h b/Emulator/Media/Cartridges/CustomCartridges/Isepic.h index 65583f1ce..bc1ea7294 100644 --- a/Emulator/Media/Cartridges/CustomCartridges/Isepic.h +++ b/Emulator/Media/Cartridges/CustomCartridges/Isepic.h @@ -103,6 +103,7 @@ class Isepic final : public Cartridge { void poke(u16 addr, u8 value) override; void pokeIO1(u16 addr, u8 value) override; void pokeIO2(u16 addr, u8 value) override; + void eraseRAM() override { Cartridge::eraseRAM(0x00); } // diff --git a/Emulator/Media/Cartridges/CustomCartridges/Kcs.cpp b/Emulator/Media/Cartridges/CustomCartridges/Kcs.cpp index 0361fe725..205c9be1d 100644 --- a/Emulator/Media/Cartridges/CustomCartridges/Kcs.cpp +++ b/Emulator/Media/Cartridges/CustomCartridges/Kcs.cpp @@ -18,7 +18,7 @@ namespace vc64 { void KcsPower::_didReset(bool hard) { - eraseRAM(0xFF); + // eraseRAM(0xFF); } u8 diff --git a/Emulator/Media/Cartridges/CustomCartridges/PageFox.cpp b/Emulator/Media/Cartridges/CustomCartridges/PageFox.cpp index 50f8f83d5..f2298d1ea 100644 --- a/Emulator/Media/Cartridges/CustomCartridges/PageFox.cpp +++ b/Emulator/Media/Cartridges/CustomCartridges/PageFox.cpp @@ -18,7 +18,7 @@ namespace vc64 { void PageFox::_didReset(bool hard) { - eraseRAM(0); + // eraseRAM(0); } void diff --git a/Emulator/Media/Cartridges/CustomCartridges/PageFox.h b/Emulator/Media/Cartridges/CustomCartridges/PageFox.h index 885e98966..17dbe722d 100644 --- a/Emulator/Media/Cartridges/CustomCartridges/PageFox.h +++ b/Emulator/Media/Cartridges/CustomCartridges/PageFox.h @@ -109,6 +109,7 @@ class PageFox final : public Cartridge { u8 peekIO1(u16 addr) override; u8 spypeekIO1(u16 addr) const override; void pokeIO1(u16 addr, u8 value) override; + void eraseRAM() override { Cartridge::eraseRAM(0x00); } void updatePeekPokeLookupTables() override; private: diff --git a/Emulator/Media/Cartridges/CustomCartridges/Reu.h b/Emulator/Media/Cartridges/CustomCartridges/Reu.h index 3e90637d2..f5290d445 100644 --- a/Emulator/Media/Cartridges/CustomCartridges/Reu.h +++ b/Emulator/Media/Cartridges/CustomCartridges/Reu.h @@ -202,6 +202,9 @@ class Reu final : public Cartridge { u8 spypeekIO2(u16 addr) const override; void pokeIO2(u16 addr, u8 value) override; void poke(u16 addr, u8 value) override; + void eraseRAM() override { + Cartridge::eraseRAM(0x00); + } private: