From d664b832f84b5130620e78dd87c80d79ef81a139 Mon Sep 17 00:00:00 2001 From: Martin Perner Date: Wed, 12 Jan 2011 16:20:18 +0100 Subject: [PATCH] sim: added extensionmodule support + progger --- 3b_sim/ccpu.cpp | 36 +++++++++++++++++++++++++++++++++--- 3b_sim/ccpu.hpp | 8 ++++++++ 3b_sim/extensions/cprog.hpp | 24 ++++++++++++++++++++++++ 3b_sim/iext.hpp | 27 +++++++++++++++++++++++++++ 3b_sim/sim.cpp | 9 +++++++++ 3c_disasm/iext.hpp | 1 + 6 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 3b_sim/extensions/cprog.hpp create mode 100644 3b_sim/iext.hpp create mode 120000 3c_disasm/iext.hpp diff --git a/3b_sim/ccpu.cpp b/3b_sim/ccpu.cpp index 9cf728b..d2e64e0 100644 --- a/3b_sim/ccpu.cpp +++ b/3b_sim/ccpu.cpp @@ -28,6 +28,10 @@ string CCpu::colorifyInstr(string instr) return boost::regex_replace(instr, e, format, boost::match_default | boost::format_all); } +void CCpu::registerExtension(Iext* ext) +{ + m_exts.push_back(ext); +} void CCpu::tick() { @@ -37,9 +41,15 @@ void CCpu::tick() m_pc = m_pc_next; m_pc_next += 4; Iinstr* instr = this->getProg(m_pc); + if(instr == NULL) { throw string("Out of Instructions!"); } + + for(auto iter = m_exts.begin(); iter != m_exts.end(); ++iter) { + (*iter)->applyTick(); + } + if(this->conditionMet(instr->getCondition())) { cout << color(green,black) << "Executing: " << color(white,black) << colorifyInstr(instr->toString()) << endl; instr->execInstr(); @@ -188,11 +198,31 @@ void CCpu::setRegister(const int addr, CDat data) CDat CCpu::getRAM(const int addr) const { - return m_ram.get(addr); + if((addr & EXT_MODEL_OFFSET) == 0) { + return m_ram.get(addr); + } + else { + CDat result = 0; + for(auto iter = m_exts.begin(); iter != m_exts.end(); ++iter) { + result = (*iter)->readData(addr); + if(result != 0) { + break; + } + } + return result; + } } + void CCpu::setRAM(const int addr, CDat data) { - m_ram.set(addr, data); + if((addr & EXT_MODEL_OFFSET) == 0) { + m_ram.set(addr, data); + } + else { + for(auto iter = m_exts.begin(); iter != m_exts.end(); ++iter) { + (*iter)->loadData(addr, data); + } + } } void CCpu::setProg(int addr, Iinstr* instr) @@ -236,7 +266,7 @@ void CCpu::incPerfBy(short inc) } -CCpu::CCpu(int regs, int ram, int prog) : m_Z(false), m_S(false), m_C(false), m_O(false), m_pc(0), m_pc_next(0), m_perf(0), m_reg(regs), m_ram(ram), m_prog(prog), m_stack(0) +CCpu::CCpu(int regs, int ram, int prog) : m_Z(false), m_S(false), m_C(false), m_O(false), m_pc(0), m_pc_next(0), m_perf(0), m_reg(regs), m_ram(ram), m_prog(prog), m_exts(0), m_stack(0) { } diff --git a/3b_sim/ccpu.hpp b/3b_sim/ccpu.hpp index 4a87240..a9747c9 100644 --- a/3b_sim/ccpu.hpp +++ b/3b_sim/ccpu.hpp @@ -8,7 +8,9 @@ #include "ccolor.h" class Iinstr; +class Iext; +#include "iext.hpp" #include #include "Iinstr.hpp" @@ -22,8 +24,12 @@ class CCpu { CMem m_reg, m_ram; CPMem m_prog; + vector m_exts; + CDat m_stack; + static const int EXT_MODEL_OFFSET = 0x2000; + public: void registerExtension() {}; void tick(); @@ -37,6 +43,8 @@ class CCpu { Iinstr* getProg(const int) const; void setProg(const int, Iinstr*); + void registerExtension(Iext*); + CDat getPerf() const; void setPerf(CDat); void incPerf(); diff --git a/3b_sim/extensions/cprog.hpp b/3b_sim/extensions/cprog.hpp new file mode 100644 index 0000000..82d83cf --- /dev/null +++ b/3b_sim/extensions/cprog.hpp @@ -0,0 +1,24 @@ +#include "../iext.hpp" + +class Cprog : public Iext { + public: + Cprog() : m_writeAddress(0) {}; + void applyTick() {}; + void loadData(const int address, CDat value); + CDat readData(const int) { return 0; } + private: + int m_writeAddress; +}; + +void Cprog::loadData(const int address, CDat value) +{ + if(address == 0x2034) { + m_writeAddress = value; + //adress pointer + } + else if(address == 0x2038) { + this->m_cpu->setProg(m_writeAddress, m_disasm->decodeNum(value)); + m_writeAddress += 4; + //data pointer + } +} diff --git a/3b_sim/iext.hpp b/3b_sim/iext.hpp new file mode 100644 index 0000000..99b0842 --- /dev/null +++ b/3b_sim/iext.hpp @@ -0,0 +1,27 @@ +#ifndef __IEXT_I_ +#define __IEXT_I_ + +class CCpu; + +#include "ccpu.hpp" + +class disasm; + +#include "disasm.h" + + +class Iext { + public: + static void setCPU(CCpu* cpu) {m_cpu = cpu;} + static void setDisasm(disasm* dasm) { m_disasm = dasm; } + + virtual ~Iext() {} + //called by cpu before every tick + virtual void applyTick() = 0; + virtual void loadData(const int address, CDat value) = 0; + virtual CDat readData(const int address) = 0; + static CCpu* m_cpu; + static disasm* m_disasm; +}; + +#endif diff --git a/3b_sim/sim.cpp b/3b_sim/sim.cpp index 6cd72b1..0e1a0ae 100644 --- a/3b_sim/sim.cpp +++ b/3b_sim/sim.cpp @@ -17,6 +17,9 @@ #include "CInstrFactory.hpp" #include "uint32_from_hex.hpp" +#include "iext.hpp" +#include "extensions/cprog.hpp" + #include "SReadline/SReadline.h" using namespace swift; @@ -68,7 +71,9 @@ class CHelpExec void close_prog(const std::vector &); CCpu* Iinstr::m_cpu; +CCpu* Iext::m_cpu; disasm* Iinstr::m_disasm; +disasm* Iext::m_disasm; CCpu* global_cpu = NULL; @@ -536,10 +541,14 @@ int main(int argc, char* argv[]) global_cpu = &cpu; Iinstr::setCPU(&cpu); + Iext::setCPU(&cpu); disasm disasm(instr); Iinstr::setDisasm(&disasm); + Iext::setDisasm(&disasm); + + global_cpu->registerExtension(new Cprog()); vector commentDefer; vector labelDefer; diff --git a/3c_disasm/iext.hpp b/3c_disasm/iext.hpp new file mode 120000 index 0000000..8f17718 --- /dev/null +++ b/3c_disasm/iext.hpp @@ -0,0 +1 @@ +../3b_sim/iext.hpp \ No newline at end of file -- 2.25.1