sim: added extensionmodule support + progger
[calu.git] / 3b_sim / ccpu.cpp
index 9cf728bcca924f9875797fab4e41ba46ba4c66e0..d2e64e030e3024ecb3f495b2055ce88de12d5949 100644 (file)
@@ -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)
 {
 }