X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=calu.git;a=blobdiff_plain;f=3b_sim%2Fccpu.cpp;h=d2e64e030e3024ecb3f495b2055ce88de12d5949;hp=9cf728bcca924f9875797fab4e41ba46ba4c66e0;hb=d664b832f84b5130620e78dd87c80d79ef81a139;hpb=b7b8e941c868a7ebdfcc3fbf15564dac19251ed6 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) { }