aboutsummaryrefslogtreecommitdiff
path: root/qtmips_machine/qtmipsmachine.cpp
diff options
context:
space:
mode:
authorKarel Kočí <cynerd@email.cz>2017-11-19 21:23:04 +0100
committerKarel Kočí <cynerd@email.cz>2017-11-19 21:23:04 +0100
commitf0ad502e4651243d6a96194b3393bd460c0f7fc9 (patch)
tree4f912c24b5943bd93b5a3378df75f9611de6779b /qtmips_machine/qtmipsmachine.cpp
parent2c6562fa78e884d66b8c2a306f020101e8803f2e (diff)
downloadqtmips-f0ad502e4651243d6a96194b3393bd460c0f7fc9.tar.gz
qtmips-f0ad502e4651243d6a96194b3393bd460c0f7fc9.tar.bz2
qtmips-f0ad502e4651243d6a96194b3393bd460c0f7fc9.zip
Another huge pile of work for about two months
Well I should commit every change instead of this madness. I am not documenting changes as all this is just improvements and implementation progression.
Diffstat (limited to 'qtmips_machine/qtmipsmachine.cpp')
-rw-r--r--qtmips_machine/qtmipsmachine.cpp69
1 files changed, 67 insertions, 2 deletions
diff --git a/qtmips_machine/qtmipsmachine.cpp b/qtmips_machine/qtmipsmachine.cpp
index 0fc207c..3d5ce98 100644
--- a/qtmips_machine/qtmipsmachine.cpp
+++ b/qtmips_machine/qtmipsmachine.cpp
@@ -1,5 +1,70 @@
#include "qtmipsmachine.h"
+#include "programloader.h"
-QtMipsMachine::QtMipsMachine(char *file) {
- this->loader = new ProgramLoader(file);
+QtMipsMachine::QtMipsMachine(const MachineConfig &cc) {
+ ProgramLoader program(cc.elf());
+
+ regs = new Registers();
+ mem = new Memory();
+
+ program.to_memory(mem);
+ program_end = program.end();
+
+ MemoryAccess *coremem;
+ switch (cc.cache()) {
+ case MachineConfig::CCT_NONE:
+ cch = nullptr;
+ coremem = mem;
+ break;
+ case MachineConfig::CCT_ASSOCIATIVE:
+ // TODO
+ coremem = mem;
+ //coremem = cch = new CacheAssociative();
+ break;
+ }
+
+ // TODO pipelined
+ cr = new CoreSingle(regs, coremem);
+
+ run_speed = 1;
+ run_t = new QTimer(this);
+ connect(run_t, SIGNAL(timeout()), this, SLOT(step()));
+}
+
+void QtMipsMachine::set_speed(unsigned val) {
+ run_speed = val;
+}
+
+const Registers *QtMipsMachine::registers() {
+ return regs;
+}
+
+const Memory *QtMipsMachine::memory() {
+ return mem;
+}
+
+const Cache *QtMipsMachine::cache() {
+ return cch;
+}
+
+const Core *QtMipsMachine::core() {
+ return cr;
+}
+
+void QtMipsMachine::play() {
+ run_t->start(run_speed);
+}
+
+void QtMipsMachine::pause() {
+ run_t->stop();
+}
+
+void QtMipsMachine::step() {
+ cr->step();
+ if (regs->read_pc() >= program_end)
+ emit program_exit();
+}
+
+void QtMipsMachine::restart() {
+ // TODO
}