#include "sim.h"
#include "icsim.h"
-processor_t::processor_t(sim_t* _sim, char* _mem, size_t _memsz)
- : sim(_sim), mmu(_mem,_memsz)
+processor_t::processor_t(sim_t* _sim, mmu_t* _mmu)
+ : sim(_sim), mmu(*_mmu)
{
// a few assumptions about endianness, including freg_t union
static_assert(BYTE_ORDER == LITTLE_ENDIAN);
for (int i=0; i<MAX_UTS; i++)
{
- uts[i] = new processor_t(sim, mmu.mem, mmu.memsz);
+ uts[i] = new processor_t(sim, &mmu);
uts[i]->id = id;
uts[i]->set_sr(uts[i]->sr | SR_EF);
uts[i]->set_sr(uts[i]->sr | SR_EV);
{
take_interrupt();
- #include "dispatch.h"
-
+ mmu_t& _mmu = mmu;
+ insn_t insn;
+ insn_func_t func;
+ reg_t npc = pc;
#define execute_insn(noisy) \
- do { insn_t insn = mmu.load_insn(pc, sr & SR_EC); \
- if(noisy) disasm(insn,pc); \
- pc = dispatch_table[dispatch_index(insn)](this, insn, pc); \
- XPR[0] = 0; } while(0)
+ do { \
+ insn = _mmu.load_insn(npc, sr & SR_EC, &func); \
+ if(noisy) disasm(insn,pc); \
+ npc = func(this, insn, npc); \
+ pc = npc; \
+ } while(0)
if(noisy) for( ; i < n; i++)
execute_insn(true);