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()
{
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();
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)
}
-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)
{
}