From c5d47cbc19d5f3a48d6d60f4a4a904a135a89b13 Mon Sep 17 00:00:00 2001 From: scawful Date: Sun, 20 Aug 2023 23:46:08 -0400 Subject: [PATCH] Add Observer pattern to Memory for registers --- src/app/emu/mem.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/app/emu/mem.h b/src/app/emu/mem.h index 02317fa9..a7d7bcc6 100644 --- a/src/app/emu/mem.h +++ b/src/app/emu/mem.h @@ -111,6 +111,12 @@ class ROMInfo { // Additional methods and constructors }; +class Observer { + public: + virtual ~Observer() = default; + virtual void Notify(uint32_t address, uint8_t data) = 0; +}; + // memory.h class Memory { public: @@ -224,15 +230,18 @@ class MemoryImpl : public Memory, public Loggable { uint8_t ReadByte(uint16_t address) const override { uint32_t mapped_address = GetMappedAddress(address); + NotifyObservers(mapped_address, /*data=*/0); return memory_.at(mapped_address); } uint16_t ReadWord(uint16_t address) const override { uint32_t mapped_address = GetMappedAddress(address); + NotifyObservers(mapped_address, /*data=*/0); return static_cast(memory_.at(mapped_address)) | (static_cast(memory_.at(mapped_address + 1)) << 8); } uint32_t ReadWordLong(uint16_t address) const override { uint32_t mapped_address = GetMappedAddress(address); + NotifyObservers(mapped_address, /*data=*/0); return static_cast(memory_.at(mapped_address)) | (static_cast(memory_.at(mapped_address + 1)) << 8) | (static_cast(memory_.at(mapped_address + 2)) << 16); @@ -293,6 +302,8 @@ class MemoryImpl : public Memory, public Loggable { (static_cast(mid) << 8) | low; } + void AddObserver(Observer* observer) { observers_.push_back(observer); } + // Stack Pointer access. int16_t SP() const override { return SP_; } void SetSP(int16_t value) override { SP_ = value; } @@ -357,6 +368,14 @@ class MemoryImpl : public Memory, public Loggable { static const uint32_t kOAMStart = 0x218000; static const uint32_t kOAMSize = 0x220; + void NotifyObservers(uint32_t address, uint8_t data) const { + for (auto observer : observers_) { + observer->Notify(address, data); + } + } + + std::vector observers_; + // Memory (64KB) std::vector memory_;