Add Observer pattern to Memory for registers

This commit is contained in:
scawful
2023-08-20 23:46:08 -04:00
parent d538317629
commit c5d47cbc19

View File

@@ -111,6 +111,12 @@ class ROMInfo {
// Additional methods and constructors // Additional methods and constructors
}; };
class Observer {
public:
virtual ~Observer() = default;
virtual void Notify(uint32_t address, uint8_t data) = 0;
};
// memory.h // memory.h
class Memory { class Memory {
public: public:
@@ -224,15 +230,18 @@ class MemoryImpl : public Memory, public Loggable {
uint8_t ReadByte(uint16_t address) const override { uint8_t ReadByte(uint16_t address) const override {
uint32_t mapped_address = GetMappedAddress(address); uint32_t mapped_address = GetMappedAddress(address);
NotifyObservers(mapped_address, /*data=*/0);
return memory_.at(mapped_address); return memory_.at(mapped_address);
} }
uint16_t ReadWord(uint16_t address) const override { uint16_t ReadWord(uint16_t address) const override {
uint32_t mapped_address = GetMappedAddress(address); uint32_t mapped_address = GetMappedAddress(address);
NotifyObservers(mapped_address, /*data=*/0);
return static_cast<uint16_t>(memory_.at(mapped_address)) | return static_cast<uint16_t>(memory_.at(mapped_address)) |
(static_cast<uint16_t>(memory_.at(mapped_address + 1)) << 8); (static_cast<uint16_t>(memory_.at(mapped_address + 1)) << 8);
} }
uint32_t ReadWordLong(uint16_t address) const override { uint32_t ReadWordLong(uint16_t address) const override {
uint32_t mapped_address = GetMappedAddress(address); uint32_t mapped_address = GetMappedAddress(address);
NotifyObservers(mapped_address, /*data=*/0);
return static_cast<uint32_t>(memory_.at(mapped_address)) | return static_cast<uint32_t>(memory_.at(mapped_address)) |
(static_cast<uint32_t>(memory_.at(mapped_address + 1)) << 8) | (static_cast<uint32_t>(memory_.at(mapped_address + 1)) << 8) |
(static_cast<uint32_t>(memory_.at(mapped_address + 2)) << 16); (static_cast<uint32_t>(memory_.at(mapped_address + 2)) << 16);
@@ -293,6 +302,8 @@ class MemoryImpl : public Memory, public Loggable {
(static_cast<uint32_t>(mid) << 8) | low; (static_cast<uint32_t>(mid) << 8) | low;
} }
void AddObserver(Observer* observer) { observers_.push_back(observer); }
// Stack Pointer access. // Stack Pointer access.
int16_t SP() const override { return SP_; } int16_t SP() const override { return SP_; }
void SetSP(int16_t value) override { SP_ = value; } 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 kOAMStart = 0x218000;
static const uint32_t kOAMSize = 0x220; 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<Observer*> observers_;
// Memory (64KB) // Memory (64KB)
std::vector<uint8_t> memory_; std::vector<uint8_t> memory_;