diff options
author | Karel Kočí <cynerd@email.cz> | 2017-11-19 21:23:04 +0100 |
---|---|---|
committer | Karel Kočí <cynerd@email.cz> | 2017-11-19 21:23:04 +0100 |
commit | f0ad502e4651243d6a96194b3393bd460c0f7fc9 (patch) | |
tree | 4f912c24b5943bd93b5a3378df75f9611de6779b /qtmips_machine/qtmipsmachine.cpp | |
parent | 2c6562fa78e884d66b8c2a306f020101e8803f2e (diff) | |
download | qtmips-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.cpp | 69 |
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 } |