aboutsummaryrefslogtreecommitdiff
path: root/qtmips_machine/memory.h
diff options
context:
space:
mode:
Diffstat (limited to 'qtmips_machine/memory.h')
-rw-r--r--qtmips_machine/memory.h60
1 files changed, 60 insertions, 0 deletions
diff --git a/qtmips_machine/memory.h b/qtmips_machine/memory.h
new file mode 100644
index 0000000..1df23ae
--- /dev/null
+++ b/qtmips_machine/memory.h
@@ -0,0 +1,60 @@
+#ifndef MEMORY_H
+#define MEMORY_H
+
+#include <QObject>
+#include <vector>
+#include <cstdint>
+#include "qtmipsexception.h"
+
+// Virtual class for common memory access
+class MemoryAccess : public QObject {
+ Q_OBJECT
+public:
+ virtual void write_byte(std::uint32_t offset, std::uint8_t value) = 0;
+ void write_hword(std::uint32_t offset, std::uint16_t value);
+ void write_word(std::uint32_t offset, std::uint32_t value);
+
+ virtual std::uint8_t read_byte(std::uint32_t offset) = 0;
+ std::uint16_t read_hword(std::uint32_t offset);
+ std::uint32_t read_word(std::uint32_t offset);
+
+signals:
+ // TODO trigger
+ void byte_change(std::uint32_t address, std::uint32_t value);
+};
+
+class MemorySection : public MemoryAccess {
+public:
+ MemorySection(std::uint32_t length);
+ ~MemorySection();
+ void write_byte(std::uint32_t offset, std::uint8_t value);
+ std::uint8_t read_byte(std::uint32_t offset);
+private:
+ std::uint32_t length;
+ std::uint8_t *dt;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+/// Some optimalization options
+// How big memory sections will be (2^8=256)
+#define MEMORY_SECTION_BITS 8
+// How deep memory lookup tree will be
+#define MEMORY_TREE_H 4
+//////////////////////////////////////////////////////////////////////////////
+
+union MemoryTree;
+
+class Memory : public MemoryAccess {
+ Q_OBJECT
+public:
+ Memory();
+ ~Memory();
+ MemorySection *get_section(std::uint32_t address, bool create); // returns section containing given address
+ void write_byte(std::uint32_t address, std::uint8_t value);
+ std::uint8_t read_byte(std::uint32_t address);
+private:
+ union MemoryTree *mt_root;
+ static union MemoryTree *allocate_section_tree();
+};
+
+#endif // MEMORY_H